Помогите разобраться!

 

Всем привет. Пожалуйста, помогите разобраться с совой. Работает на МАСД нескольких ТФ - когда МАКДы на 6 таймфреймах идут в 1 сторону - он открывать позу. Входит вроде бы нормально,  но при закрытии по тейку открывается вновь ну и соответственно ловит откат и лосей. Хочу сделать, чтобы он открывал сделку  по сигналу, закрывался по тейк или стопу и потом мог открыть новый ордер на этой паре не раньше скажем чем через час. Желательно этот параметр регулировать во внешних переменных. Код прилагаю:

 

//+------------------------------------------------------------------+

//|                                                  MACD_MTF_EA.mq4 |

//+------------------------------------------------------------------+



 extern string com          = "Параметры торговли";

 extern double lots         = 0.01;

 extern int    stoploss     = 20;

 extern int    takeprofit   = 30;

 extern int    slippage     = 1;

 extern int    magic        = 654321;

 extern string comment      = "My_EA";

  extern string com7         = "Данные MACD на m1";

 extern int  FastEMA1m      =12;

 extern int  SlowEMA1m      =26;

 extern int SignalSMA1m       =9;

 extern string com1         = "Данные MACD на m5";

 extern int  FastEMA        =12;

 extern int  SlowEMA        =26;

 extern int SignalSMA       =9;

 extern string com2         = "Данные MACD на m15";

 extern int FastEMA15       =12;

 extern int SlowEMA15       =26;

 extern int SignalSMA15     =9;

 extern string com3         = "Данные MACD на m30";

 extern int FastEMA30       =12;

 extern int SlowEMA30       =26;

 extern int SignalSMA30     =9;

 extern string com4         = "Данные MACD на н1";

 extern int FastEMAh1       =12;

 extern int SlowEMAh1       =26;

 extern int SignalSMAh1     =9;

 extern string com5         = "Данные MACD на h4";

 extern int FastEMAh4       =12;

 extern int SlowEMAh4       =26;

 extern int SignalSMAh4     =9;

//+------------------------------------------------------------------+

//| expert initialization function                                   |

//+------------------------------------------------------------------+



double SL,TP;

int ticket;





int init()

  {

if (Digits == 3 || Digits ==5) // проверяем 5 или 4 знак

{

takeprofit *=10;

stoploss   *=10;

slippage   *=10;

}

   return(0);

  }





int deinit()

  {



   return(0);

  }





int start()

  {

  int kolpos = 0; // счетчик ордеров

  //MACD 1m

   double  macd1osn  = iMACD(Symbol(),PERIOD_M1,FastEMA1m,SlowEMA1m,SignalSMA1m,PRICE_CLOSE,MODE_MAIN,0);

  double  macd1sign = iMACD(Symbol(),PERIOD_M1,FastEMA1m,SlowEMA1m,SignalSMA1m,PRICE_CLOSE,MODE_SIGNAL,0);

  //MACD 5m

  double  macd5osn  = iMACD(Symbol(),PERIOD_M5,FastEMA,SlowEMA,SignalSMA,PRICE_CLOSE,MODE_MAIN,0);

  double  macd5sign = iMACD(Symbol(),PERIOD_M5,FastEMA,SlowEMA,SignalSMA,PRICE_CLOSE,MODE_SIGNAL,0);

  //MACD 15m

  double  macd15osn  = iMACD(Symbol(),PERIOD_M15,FastEMA15,SlowEMA15,SignalSMA15,PRICE_CLOSE,MODE_MAIN,0);

  double  macd15sign = iMACD(Symbol(),PERIOD_M15,FastEMA15,SlowEMA15,SignalSMA15,PRICE_CLOSE,MODE_SIGNAL,0);  

   //MACD 30m

  double  macd30osn  = iMACD(Symbol(),PERIOD_M30,FastEMA30,SlowEMA30,SignalSMA30,PRICE_CLOSE,MODE_MAIN,0);

  double  macd30sign = iMACD(Symbol(),PERIOD_M30,FastEMA30,SlowEMA30,SignalSMA30,PRICE_CLOSE,MODE_SIGNAL,0);  

  //MACD h1

  double  macdh1osn  = iMACD(Symbol(),PERIOD_H1,FastEMAh1,SlowEMAh1,SignalSMAh1,PRICE_CLOSE,MODE_MAIN,0);

  double  macdh1sign = iMACD(Symbol(),PERIOD_H1,FastEMAh1,SlowEMAh1,SignalSMAh1,PRICE_CLOSE,MODE_SIGNAL,0);  

  //MACD h4

  double  macdh4osn  = iMACD(Symbol(),PERIOD_H4,FastEMAh4,SlowEMAh4,SignalSMAh4,PRICE_CLOSE,MODE_MAIN,0);

  double  macdh4sign = iMACD(Symbol(),PERIOD_H4,FastEMAh4,SlowEMAh4,SignalSMAh4,PRICE_CLOSE,MODE_SIGNAL,0); 

  

// учитываем ордера для иднтифицирования своих сделок



 for (int pos = 0; pos < OrdersTotal (); pos ++)

 {

 OrderSelect (pos, SELECT_BY_POS, MODE_TRADES);

 if (OrderSymbol () == Symbol ()&& OrderMagicNumber() == magic)

     kolpos ++;  

 }

 if (kolpos == 0)

 {

     

 // Покупка

 

 if (macd1sign<macd1osn && macd5sign<macd5osn &&  macd15sign<macd15osn && macd30sign<macd30osn && macdh1sign<macdh1osn && macdh4sign<macdh4osn)

 {

      SL = NormalizeDouble (Ask - stoploss*Point,Digits);

      TP = NormalizeDouble (Ask + takeprofit*Point,Digits);

     ticket = OrderSend (Symbol(),OP_BUY,lots,Ask,slippage, 0,0,comment,magic,0,Green);

   

      

       if (ticket>0)

        {

   

   if (OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES) ==true)   // выбираем открытый ордер для модификации Сл и ТП

       OrderModify (ticket,OrderOpenPrice(),SL,TP,0);   // Модифицируем для установки Сл и ТП для ЕСН счетов

      

       }

     }

 }

 

 // ---------------------Продажа

 

 if (kolpos == 0)

 {

 if (macd1sign>macd1osn && macd5sign>macd5osn &&  macd15sign>macd15osn && macd30sign>macd30osn && macdh1sign>macdh1osn && macdh4sign>macdh4osn)

 {

       SL = NormalizeDouble(Bid + stoploss * Point,Digits);

       TP = NormalizeDouble(Bid - takeprofit * Point,Digits);

       ticket = OrderSend (Symbol(),OP_SELL,lots,Bid,slippage, 0,0,comment,magic,0,Red);

   

      

       if (ticket>0)

   {

   

   if (OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES) ==true)   // выбираем открытый ордер для модификации Сл и ТП

       OrderModify (ticket,OrderOpenPrice(),SL,TP,0);   // Модифицируем для установки Сл и ТП для ЕСН счетов

      

       }

     }

 }

 

 

   return(0);

  }

//+------------------------------------------------------------------+



 
 

Если, я Вас правильно понял.

P.S. Попутно оптимизировал код.

Файлы:
 
TarasBY:

Если, я Вас правильно понял.

P.S. Попутно оптимизировал код.


Спасибо! Я, как начинающий, но амбициозный программист, искренне Вас благодарю, о, уважаемый!
 
Реклама удалена.
 
TarasBY:

Если, я Вас правильно понял.

P.S. Попутно оптимизировал код.


Я так понимаю, параметр SleepOnBarAfterTrade = 1;

отвечает за количество баров, которые должны пройти после одной сделки, чтобы можно было сделать следующую.

Но он не работает.  Поставил сову на м1,    SleepOnBarAfterTrade = 240;  (т.е. 4 часа). Сделка открылась, закрылась по стопу и тут снова сова открыла ордер. Хотя не должна. Пожалуйста, посмотрите что там с ней. Мне немного трудно в чужом коде разобраться. Заранее спасибо!

 
remon:


Я так понимаю, параметр SleepOnBarAfterTrade = 1;

отвечает за количество баров, которые должны пройти после одной сделки, чтобы можно было сделать следующую.

Но он не работает.  Поставил сову на м1,    SleepOnBarAfterTrade = 240;  (т.е. 4 часа). Сделка открылась, закрылась по стопу и тут снова сова открыла ордер. Хотя не должна. Пожалуйста, посмотрите что там с ней. Мне немного трудно в чужом коде разобраться. Заранее спасибо!

Да, по привычке не учёл 0-вой бар. Эту строчку:

    if (li_Bars > 0) if (li_Bars < SleepOnBarAfterTrade) return;

запишите так:

    if (li_Bars >= 0) if (li_Bars < SleepOnBarAfterTrade) return;

должно работать.

P.S. И ещё одну досадную ошибку нашёл. Теперь работает.

Файлы:
 
TarasBY:

Да, по привычке не учёл 0-вой бар. Эту строчку:

запишите так:

должно работать.

P.S. И ещё одну досадную ошибку нашёл. Теперь работает.


Спасибо!

Скажите, а в чем разница этих параметров?

extern int    SleepOnBarAfterTrade = 1;
extern int    SignalSendOnBar      = 1;      // На каком баре (от текущего) получаем сигнал на открытие
 
extern int    SleepOnBarAfterTrade = 1;

- параметр относительно от предыдущей сделки.

extern int    SignalSendOnBar      = 1;

- параметр относительно текущего бара.

У них разная относительность. :)))

 
TarasBY:

- параметр относительно от предыдущей сделки.

- параметр относительно текущего бара.

У них разная относительность. :)))


ясно. еще раз срасибо!