Не выполняется функция после запрета

 

Добрый день. Не как не могу понять в чем дело

 Опишу ситуацию.

 

Что мне нужно было сделать:


Когда срабатывал 4ый ордер, я хотел запретить сове открывать сделки в течении текущего и следующего часа.


if (consecutive_loss==4)   

         {

            ticket = OrderSend(Symbol(), OP_BUY, lotd, Ask, 3, 0, 0, "", magicnumber, 0, Blue); 

            BlockedTrade1 = Hour()+1; 

         } 


Объявил переменную вначале кода : int BlockedTrade1 = 0;


Запретил выполнять следующую функцию пока блокрейд не станет меньше текущего часа:


if (consecutive_loss==5 && Hour() > BlockedTrade1)   

         {

            ticket = OrderSend(Symbol(), OP_BUY, lotd, Ask, 3, 0, 0, "", magicnumber, 0, Blue); 

            BlockedTrade1 = Hour()+1; 

         } 



Так же я пробовал сделать проверку отдельно, т.е если текущий час больше BlockedTrade1  я объявлял переменную BlockedTrade1  = 0.  Ну и соответственно проверку изменял  if (consecutive_loss==5 &&  BlockedTrade1 == 0)   


if (Hour() == BlockedTrade1)

           {

           BlockedTrade1 = 0;

           }


На экран выводил значения BlockedTrade1 , все работает тоесть он обнуляется.



Что у меня получилось: 


Сделки открываться перестали после того как срабатывала функция  BlockedTrade1 = Hour()+1;  , но после как проходило нужное время сделки больше не открывались вообще  

 

Если вечером открылись, скажем в 22 часа, а между 23 и 24 условия входа не выполнялись, то утром никак не произойдет открытие, потому-что час меньше часа из переменной.

BlockedTrade1 = Hour()+1; 

заменить на

BlockedTrade1 = TimeCurrent()+3600; 

А проверку 

Hour() > BlockedTrade1

 Заменить на

TimeCurrent() > BlockedTrade1
 

Dmitry Fedoseev

 Сделал как вы сказали.

Вначале кода так же объявляю переменную:

int BlockedTrade1 = 0; 

 Начало кода проверки выглядит теперь так:

if (TimeCurrent() > BlockedTrade1 && eventSellClosed_SL > 0)

         {

         if (consecutive_loss==1)    

 


Ордер на котором добавляю значение к переменной выглядит так:

 if (consecutive_loss==4)   

            {

            ticket = OrderSend(Symbol(), OP_BUY, lotd, Ask, 3, 0, 0, "", magicnumber, 0, Blue); 

            BlockedTrade1 = TimeCurrent()+3600; 

            }  

 Но в итоге так же, после того как задается переменная BlockedTrade1  (код выше) торговля прекращается , проходит час и сделки больше не открываются, ждал и след. дня результата нет.

Вывел для проверки comment BlockedTrade1 

 

 

 

Сделка должна была открыться сразу

 

Очень надеюсь на вашу помощь 

 

сделайте хотя бы TimeToString(BlockedTrade1 )

так удобнее смотреть 

 
xjasond:


Очень надеюсь на вашу помощь 

Есть функции Print(), Comment(). Смотрите значения переменных, результаты сравнений. 
 
xjasond:

Dmitry Fedoseev

 Сделал как вы сказали.

Вначале кода так же объявляю переменную:

int BlockedTrade1 = 0; 

 Начало кода проверки выглядит теперь так:

if (TimeCurrent() > BlockedTrade1 && eventSellClosed_SL > 0)

         {

         if (consecutive_loss==1)    

 


Ордер на котором добавляю значение к переменной выглядит так:

 if (consecutive_loss==4)   

            {

            ticket = OrderSend(Symbol(), OP_BUY, lotd, Ask, 3, 0, 0, "", magicnumber, 0, Blue); 

            BlockedTrade1 = TimeCurrent()+3600; 

            }  

 Но в итоге так же, после того как задается переменная BlockedTrade1  (код выше) торговля прекращается , проходит час и сделки больше не открываются, ждал и след. дня результата нет.

Вывел для проверки comment BlockedTrade1 

 

 

 

Сделка должна была открыться сразу

 

Очень надеюсь на вашу помощь 

Простите, я не Дмитрий, но попробую предложить:
А вы попробуйте проверять не время, а количество часовых свечей прошедших после закрытия последнего ордера и, если он четвёртый по счёту из разрешённых, то если часовой бар его закрытия меньше, либо равен 2, то запрет на открытие. Иначе - можно открываться.
 

Проверил  через print 

 

Print(TimeToString(BlockedTrade1));

     

 

 

Еще раз код добавления

 

if (consecutive_loss==4)  

             { 

           ticket = OrderSend(Symbol(), OP_SELL, lot, Bid, 3, 0, 0, "", magicnumber, 0, Red);

          BlockedTrade1 = TimeCurrent()+3600; 

             } 

 
Наверно переменная BlockedTrade1 в функции объявлена. Надо в начале файла, но не в функции. Если в функции, то в начале объявления добавить static.
 

Теперь переменная объявляется правильно

 

 

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

 

Функция проверки: 

 if ( eventBuyClosed_SL > 0 && TimeCurrent() > BlockedTrade1)

         {  

         if (consecutive_loss==1)   

           ticket = OrderSend(Symbol(), OP_SELL, lota, Bid, 3, 0, 0, "", magicnumber, 0, Red); 

 

Может ли быть проблема из за того что функцию eventBuyClosed_SL > 0 , подключена через инклуд? 

 При компиляции выходят варнинги

 

варнинг: possible loss of data due to type conversion 3_13_v2.mq4 307 27

выдается на строку:

  

BlockedTrade1 = TimeCurrent()+3600; 

 
xjasond:
...

варнинг: possible loss of data due to type conversion 3_13_v2.mq4 307 27

выдается на строку:

  

BlockedTrade1 = TimeCurrent()+3600; 

Переменная  BlockedTrade1 у вас имеет тип int. А TimeCurrent() - datetime.


P./S.: По приведению типов и преобразованию данных, если оно нужно, можно посмотреть инфу в Справочнике по MQL4/MQL5 в таких разделах как: Приведение типов и/или Преобразование данных.


 
Dina Paches:
Переменная  BlockedTrade1 у вас имеет тип int. А TimeCurrent() - datetime.

Варнингов больше нет.

 

Но проблема все та-же. Сделки перестают открываться как проходит нужное время. Может return или повтор функции какой то сделать, я уже не знаю  даже. 

Еще раз распишу все: 

При запуске  советника объявляется  время 

datetime BlockedTrade1 = 0; 

После идет функция с проверкой:

if ( eventBuyClosed_SL > 0 && TimeCurrent() > BlockedTrade1)

         {  

    if (consecutive_loss==1)   

           ticket = OrderSend(Symbol(), OP_SELL, lot1, Bid, 3, 0, 0, "", magicnumber, 0, Red);

             if (consecutive_loss==2)   

           ticket = OrderSend(Symbol(), OP_SELL, lot2, Bid, 3, 0, 0, "", magicnumber, 0, Red);

             if (consecutive_loss==3)   

           ticket = OrderSend(Symbol(), OP_SELL, lot3, Bid, 3, 0, 0, "", magicnumber, 0, Red);

             if (consecutive_loss==4)  

             { 

           ticket = OrderSend(Symbol(), OP_SELL, lot4, Bid, 3, 0, 0, "", magicnumber, 0, Red);

          BlockedTrade1 = TimeCurrent()+3600; 

             }

             if (consecutive_loss==5)   

           ticket = OrderSend(Symbol(), OP_SELL, lot5, Bid, 3, 0, 0, "", magicnumber, 0, Red);

((( p.s функция eventBuyClosed_SL > 0 подключена через инклуд ))) 

На  if (consecutive_loss==4)  

Добавляю в переменную  BlockedTrade1 текущее время + час.

 И после как проходит время (т.е TimeCurrent() > BlockedTrade1) должен открыться if (consecutive_loss==5) .

В итоге торговля прекращается и функция if (consecutive_loss==5) не выполняется.

 

Причина обращения: