droba
Droba

 
Уровень 8

  Торгую в компаниях:


Группа "Стол заказов MQL"

Рейтинг 2091



РЕКОМЕНДУЮ



Прошу написать советник по сетке Фибо.

Прошу написать советник по сетке ФИБО.
1. Натягиваем сетку Фибо, после чего советник открывает ордера на уровнях 38.2, 50.0, 61.8 на выбор трейдера (true, false).
2. StopLoss на уровне 100.0 +- Spred
3. TP = Ask + distan_Buy.
TP = Bid — distan_Sell.
distan_Buy = ur0 — ur100;
distan_Sell = ur100 — ur0; (это часть кода из существующего советника).
4. Модификация рыночных ордеров:
а) Если цена закрытия свечи выше уровня 100.0, то все ордера переносим в без убыток на уровень 23.6;
б) Если Low свечи коснулся уровня 76.4 (в случае Buy) или High (в случае Sell), то ордера закрываются на последующих уровнях
(как пример, ордер открывшийся на уровне 61.8 закрывается на уровне 50.0 и т.д.).
5. После перевода ордеров в без убыток натягиваем новую сетку и советник работает по новой сетке.

  • 0
  • Просмотров: 3203
  • 1 июня 2021, 06:28
  • droba
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
закрыватель по бу.
Следующая запись в группе  
Советник для выставления сетки
30 мая 2021
01 июня 2021

Комментарии (17)

+
0
Натягиваем сетку Фибо


сетка вручную ставится или как?
avatar

  34  AM2 Сообщений: 15903 - Андрей

  • 1 июня 2021, 19:41
комментарий был удален 2021-06-02 05:22:13 droba

+
0
Да сетка ставиться в ручную.
Есть код такого советника, если надо могу сбросить, для примера.
avatar

  8  droba Автор Сообщений: 217 - Droba

  • 2 июня 2021, 05:20
комментарий был удален 2021-06-02 05:21:57 droba

+
0
в базе есть с десяток фибо советников. какой ближе всего подходит, дайте ссылку.
avatar

  34  AM2 Сообщений: 15903 - Андрей

  • 2 июня 2021, 22:38
+
0
Вот этот — www.opentraders.ru/downloads/2279/
Только сетку буду натягивать сам.
И вот в этом сове цикл фибо реализован не плохо.
Я его уже маленько подправил изменил ТП на большее мозгов не хватает.

#property copyright ""
#property link ""
#property version «1.1»
#property strict

extern int MAGICMA = 52453453;
//extern double inLot = 0.1;
input double RiskPercent = 2; //Риск на сделку
enum takeP {ur0, ur23};
enum stopL {ur76, ur100};
extern takeP lvlTP = ur0; // ТП уровень
extern stopL lvlSL = ur100; // СЛ уровень
extern bool thrdLvl = false; // Закрытие на следующем уровне

extern bool op_38 = true; // Открывать на уровне 38%?
extern bool op_50 = true; // Открывать на уровне 50%?
extern bool op_61 = true; // Открывать на уровне 61%?

string comment = StringConcatenate(«1 [»,Symbol()," / ",Period(),"]");
string name;
int res;

datetime timess = Time[1];
double ur0=0,ur23=0,ur38=0,ur50=0,ur61=0,ur76=0,ur100=0,SLur,TPur,distan_B=0,distan_S=0;
datetime urtm0, urtm100;
int lBar=0,is38=0,is50=0,is61=0;
int sord38=0,sord50=0,sord61=0,bord38=0,bord50=0,bord61=0;

//±-----------------------------------------------------------------+
void OnInit(){

OnTick();
}
//±-----------------------------------------------------------------+
void OnTick()
{
double Ppunkts = 0,Lpunkts = 0;
Comment("");
//Проверим что есть трендовая линия и она в единственном экземпляре:
if(ObjectsTotal(OBJ_FIBO)!=1){
Comment(" » Нарисуйте сетку Фибо!");
}else{
//Получим ИМЯ трендовой линии:
for(int i=0;i<ObjectsTotal();i++)
{name=ObjectName(i);
if(ObjectType(name)==OBJ_FIBO) break;}
//Print(name);
// Получим уровни сетки
double oldUr0 = ur0;
datetime oldUrtm0 = urtm0;
ur0 = NormalizeDouble(ObjectGet(name,OBJPROP_PRICE2),Digits);
ur100 = NormalizeDouble(ObjectGet(name,OBJPROP_PRICE1),Digits);
distan_B = ur0 — ur100;
distan_S = ur100 — ur0;
// urtm0 = ObjectGet(name,OBJPROP_TIME2);
// urtm100 = ObjectGet(name,OBJPROP_TIME1);
if(Bid > ur0 && ur0 > ur100){
ObjectSet(name, OBJPROP_PRICE2, Bid);
ObjectSet(name, OBJPROP_TIME2, Time[0]);
if(is38) ObjectDelete(0, name);
}
if(Ask < ur0 && ur0 < ur100){
ObjectSet(name, OBJPROP_PRICE2, Bid);
ObjectSet(name, OBJPROP_TIME2, Time[0]);
if(is38) ObjectDelete(0, name);
}
if(oldUr0 != ur0 || oldUrtm0 != urtm0 || oldUr0 == 0){
GetLevelsUr();
lBar = iBarShift(NULL,0,urtm0);
is38=0;is50=0;is61=0;
if(lvlTP == 0)TPur = ur0;
if(lvlTP == 1)TPur = ur23;
if(lvlSL == 0)SLur = ur76;
if(lvlSL == 1)SLur = ur100;
}
// Получаем бар на уровне 0
for(int i=lBar; i>=0; i--){
if(ur0 > ur100 && Bid < ur0){ // действие на покупки — восходящий фибо
// открытие ордеров на уровнях
if(Bid < ur38 && is38 == 0 && op_38){
bord38=OrderSend(Symbol(),OP_BUY,CalculateLot(Ask — (SLur — 30*Point)),Ask ,30,SLur — 30*Point,NormalizeDouble((Ask + distan_B),Digits) ,comment,MAGICMA,0,clrBlue);
is38 = 1;}
if(Bid < ur50 && is50 == 0 && op_50){
bord50=OrderSend(Symbol(),OP_BUY,CalculateLot(Ask — (SLur — 30*Point)),Ask ,30,SLur — 30*Point,NormalizeDouble((Ask + distan_B),Digits),comment,MAGICMA,0,clrBlue);
is50 = 1;}
if(Bid < ur61 && is61 == 0 && op_61){
bord61=OrderSend(Symbol(),OP_BUY,CalculateLot(Ask — (SLur — 30*Point)),Ask ,30,SLur — 30*Point,NormalizeDouble((Ask + distan_B),Digits),comment,MAGICMA,0,clrBlue);
is61 = 1;}
// закрытие ордеров на последующих уровнях
if(thrdLvl && Low[i] < ur76){
if(Ask > ur23 && is38){is38 = -1; if(OrderClose(bord38,OrderLots(),NormalizeDouble(Bid,Digits),3,clrRed))Print(«ордер закрыт»);}
if(Ask > ur38 && is50){is50 = -1; if(OrderClose(bord50,OrderLots(),NormalizeDouble(Bid,Digits),3,clrRed))Print(«ордер закрыт»);}
if(Ask > ur50 && is61){is61 = -1; if(OrderClose(bord61,OrderLots(),NormalizeDouble(Bid,Digits),3,clrRed))Print(«ордер закрыт»);}
}
// закрытие ордеров по TP
if(Ask > TPur){
if(is38>0){
is38 = -1;
ObjectDelete(0, name);
}
if(is50>0){
is50 = -1;
ObjectDelete(0, name);
}
if(is61>0){
is61 = -1;
ObjectDelete(0, name);
}
}
// закрытие ордеров по SL
if(Ask < SLur){ // цена ушла за пределы фибо — фиксируем убыток
ObjectDelete(0, name);
if(is38>0){
is38 = -1;
}
if(is50>0){
is50 = -1;
}
if(is61>0){
is61 = -1;
}
}
}
if(ur0 < ur100 && Low[i] > ur0){ // действие на продажи — нисходящий фибо
// открытие ордеров на уровнях
if(Ask > ur38 && is38 == 0 && op_38){
sord38=OrderSend(Symbol(),OP_SELL,CalculateLot((SLur + 30*Point) — Bid),Bid,30,SLur + 30*Point,NormalizeDouble((Bid — distan_S),Digits),comment,MAGICMA,0,clrRed);
is38 = 1;}
if(Ask > ur50 && is50 == 0 && op_50){
sord50=OrderSend(Symbol(),OP_SELL,CalculateLot((SLur + 30*Point) — Bid),Bid,30,SLur + 30*Point,NormalizeDouble((Bid — distan_S),Digits),comment,MAGICMA,0,clrRed);
is50 = 1;}
if(Ask > ur61 && is61 == 0 && op_61){
sord61=OrderSend(Symbol(),OP_SELL,CalculateLot((SLur + 30*Point) — Bid),Bid,30,SLur + 30*Point,NormalizeDouble((Bid — distan_S),Digits),comment,MAGICMA,0,clrRed);
is61 = 1;}
// закрытие ордеров на последующих уровнях
if(thrdLvl){
if(Bid < ur23 && is38){is38 = -1; if(OrderClose(sord38,OrderLots(),NormalizeDouble(Ask,Digits),3,clrRed))Print(«ордер закрыт»);}
if(Bid < ur38 && is50){is50 = -1; if(OrderClose(sord50,OrderLots(),NormalizeDouble(Ask,Digits),3,clrRed))Print(«ордер закрыт»);}
if(Bid < ur50 && is61){is61 = -1; if(OrderClose(sord61,OrderLots(),NormalizeDouble(Ask,Digits),3,clrRed))Print(«ордер закрыт»);}
}
// закрытие ордеров по TP
if(Bid < TPur){
if(is38>0){
ObjectDelete(0, name);
is38 = -1;
}
if(is50>0){
ObjectDelete(0, name);
is50 = -1;
}
if(is61>0){
ObjectDelete(0, name);
is61 = -1;
}
}
// закрытие ордеров по SL
if(Bid > SLur){ // цена ушла за пределы СЛ фибо — фиксируем убыток
ObjectDelete(0, name);
if(is38>0){
is38 = -1;
}
if(is50>0){
is50 = -1;
}
if(is61>0){
is61 = -1;
}
}
}
}
}
}
//±-----------------------------------------------------------------+
double CalculateLot(double _stop) {
double loss = _stop / MarketInfo(_Symbol, MODE_TICKSIZE) * MarketInfo(_Symbol, MODE_TICKVALUE);
double lots = AccountBalance() * RiskPercent / 100 / loss;
return (NormalizeDouble(MathMin(MarketInfo(_Symbol, MODE_MAXLOT), MathMax(MarketInfo(_Symbol, MODE_MINLOT), lots)), 2));
}
//±-----------------------------------------------------------------+
// обновление уровней при заданных 0 и 100
void GetLevelsUr(){
if(ur0 > ur100){
ur23 = NormalizeDouble(ur0-(ur0-ur100)*0.236,Digits);
ur38 = NormalizeDouble(ur0-(ur0-ur100)*0.382,Digits);
ur50 = NormalizeDouble(ur0-(ur0-ur100)*0.50,Digits);
ur61 = NormalizeDouble(ur0-(ur0-ur100)*0.618,Digits);
ur76 = NormalizeDouble(ur0-(ur0-ur100)*0.764,Digits);
}else{
ur23 = NormalizeDouble(ur0+(ur100-ur0)*0.236,Digits);
ur38 = NormalizeDouble(ur0+(ur100-ur0)*0.382,Digits);
ur50 = NormalizeDouble(ur0+(ur100-ur0)*0.50,Digits);
ur61 = NormalizeDouble(ur0+(ur100-ur0)*0.618,Digits);
ur76 = NormalizeDouble(ur0+(ur100-ur0)*0.764,Digits);
}
}
avatar

  8  droba Автор Сообщений: 217 - Droba

  • 3 июня 2021, 06:08
+
0
сегодня буду смотреть
avatar

  34  AM2 Сообщений: 15903 - Андрей

  • 3 июня 2021, 18:19
+
0
сделал набросок:



1. советник сам ставит сетку при установке на график.
2. 0 должен быть внизу.
3. сетка должна называться Fibo, если будете удалять созданную.
4. при пересечении уровня открывается бай или селл, в зависимости вверх или вниз.
5. если уровень 0 он отключен.

вот от этого наброска можно плясать дальше.


//+------------------------------------------------------------------+
//|                                                        Fibo8.mq4 |
//|                                              Copyright 2021, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double Lots       = 0.1;      // лот
extern double KLot       = 2;        // умножение лота
extern double MaxLot     = 5;        // максимальный лот
extern double Level1     = 0.382;    // уровень 1
extern double Level2     = 0.5;      // уровень 2
extern double Level3     = 0.618;    // уровень 3
extern int StopLoss      = 500;      // лось
extern int TakeProfit    = 280;      // язь
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик

datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
   int hi = iHighest(NULL,0,MODE_HIGH,33,0);
   int lo = iLowest(NULL,0,MODE_LOW,33,0);
   double up = High[iHighest(NULL,0,MODE_HIGH,33,0)];
   double dn = Low[iLowest(NULL,0,MODE_LOW,33,0)];
   PutFibo("Fibo",Time[hi],up,Time[lo],dn);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)
         sl=NormalizeDouble(price+StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price-TakeProfit*_Point,_Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)
         sl=NormalizeDouble(price-StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price+TakeProfit*_Point,_Digits);
     }

   r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,_Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderProfit()>0)
               break;
            if(OrderProfit()<0)
              {
               lot=OrderLots()*KLot;
               break;
              }
           }
        }
     }
   if(lot>MaxLot)
      lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutFibo(string name,datetime time1,double price1,datetime time2,double price2)
  {
   ObjectDelete(0,name);
   ObjectCreate(0,name,OBJ_FIBO,0,time1,price1,time2,price2);
//--- установим цвет
   ObjectSetInteger(0,name,OBJPROP_COLOR,Red);
//--- установим стиль линии
   ObjectSetInteger(0,name,OBJPROP_STYLE,0);
//--- установим толщину линии
   ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
//--- успешное выполнение
   return;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double l0=ObjectGetDouble(0,"Fibo",OBJPROP_PRICE2);
   double l100=ObjectGetDouble(0,"Fibo",OBJPROP_PRICE1);

   double delta=MathAbs(l0-l100);
   double l382=l0+delta*Level1;
   double l500=l0+delta*Level2;
   double l618=l0+delta*Level3;

   if(t!=Time[0])
     {
      if(Open[1]<l382 && Close[1]>l382 && Level1>0)
         PutOrder(0,Ask);
      if(Open[1]<l500 && Close[1]>l500 && Level2>0)
         PutOrder(0,Ask);
      if(Open[1]<l618 && Close[1]>l618 && Level3>0)
         PutOrder(0,Ask);

      if(Open[1]>l382 && Close[1]<l382 && Level1>0)
         PutOrder(1,Bid);
      if(Open[1]>l500 && Close[1]<l500 && Level2>0)
         PutOrder(1,Bid);
      if(Open[1]>l618 && Close[1]<l618 && Level3>0)
         PutOrder(1,Bid);
         
      t=Time[0];
     }

   Comment("\n 0.0 ",l0,
           "\n 100.0 ",l100,
           "\n 38.2 ",l382,
           "\n 50.0 ",l500,
           "\n 61.8 ",l618);
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15903 - Андрей

  • 3 июня 2021, 20:53
+
0
Я так понял в независимости от направления рынка, т.е. тренд бычий или медвежий он открывает BUY если уровень пересекает с низу в верх и если уровень пересекает с верху в низ то SELL. Что то хрень какая та ни какого анализа. Фибо должно натягиваться по тренду. А в коде наверно это реализовать сложно, поэтому я и оставил вариант установки фибо вручную. А что в коде нельзя что ли прописать смену нуля (ну когда торгуем вверх ноль в низу, когда в низ — ноль в верху), а я бы сетку переворачивал в ручную не удаляя её.
avatar

  8  droba Автор Сообщений: 217 - Droba

  • 4 июня 2021, 06:43
+
0
прописать можно что угодно. вы не указали в тз каким именно образом будет натягиваться фиба, поэтому я сделал как мне проще
avatar

  34  AM2 Сообщений: 15903 - Андрей

  • 4 июня 2021, 18:29
+
0
Андрей, по моему Фибо всегда натягивается с лева на право это в трейдинге так принято по умолчанию.
Если импульс бычий ноль в верху сто в низу, ну и для медвежьего импульса соответственно наоборот.
И к стати на скрине показано как натягивается фибо.
avatar

  8  droba Автор Сообщений: 217 - Droba

  • 4 июня 2021, 19:19
+
0
Я не сторонник ТР и SL выставлять в пунктах. Всё должно быть по рынку, импульс ТР равен величине импульса, SL выставляется там где ожидаем смену тренда.
И любая стратегия строится по логике импульс, коррекция, вход, ТР, SL.
Редактирован: 4 июня 2021, 06:59
avatar

  8  droba Автор Сообщений: 217 - Droba

  • 4 июня 2021, 06:56
+
0
у вас довольно таки объемистое задание. сделал то что можно было быстро сделать. далее в следующих топиках
avatar

  34  AM2 Сообщений: 15903 - Андрей

  • 4 июня 2021, 20:52
+
0
Андрей, а Вы смотрели как работает советник который я Вам отправлял. Он сам обновляет сетку фибо выставленную в ручную. Выставляет ордера в нужную сторону по сетке фибо. Выставляет ТР и SL там где надо. Нужно только сделать модификацию ордеров.
4. Модификация рыночных ордеров:
а) Если цена закрытия свечи выше уровня ноль, то все ордера переносим в без убыток на уровень 23.6;
б) Если Low свечи коснулся уровня 76.4 (в случае Buy) или High (в случае Sell), то ордера закрываются на последующих уровнях
(как пример, ордер открывшийся на уровне 61.8 закрывается на уровне 50.0 и т.д.).
Это просто как пример в дополнение к ТЗ.
Редактирован: 6 июня 2021, 18:51
avatar

  8  droba Автор Сообщений: 217 - Droba

  • 6 июня 2021, 17:45
+
0
с чужим кодом не работаю
avatar

  34  AM2 Сообщений: 15903 - Андрей

  • 6 июня 2021, 17:58
+
0
Я же не прошу его редактировать или еще что то просто посмотрите как он работает и мне надо примерно тоже самое.
avatar

  8  droba Автор Сообщений: 217 - Droba

  • 6 июня 2021, 18:14
+
0
все посмотрю, но в следующем топике
avatar

  34  AM2 Сообщений: 15903 - Андрей

  • 7 июня 2021, 00:38

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари