Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Хочешь изучить язык MQL5? 300 статей помогут тебе!
Алексей
95
Алексей 2016.01.12 21:08 

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

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

 

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


Когда срабатывал 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;  , но после как проходило нужное время сделки больше не открывались вообще  

Dmitry Fedoseev
42885
Dmitry Fedoseev 2016.01.12 21:21  

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

BlockedTrade1 = Hour()+1; 

заменить на

BlockedTrade1 = TimeCurrent()+3600; 

А проверку 

Hour() > BlockedTrade1

 Заменить на

TimeCurrent() > BlockedTrade1
Алексей
95
Алексей 2016.01.12 22:15  

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 

 

 

 

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

 

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

Vladislav Andruschenko
91686
Vladislav Andruschenko 2016.01.12 22:26  

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

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

Dmitry Fedoseev
42885
Dmitry Fedoseev 2016.01.12 22:46  
xjasond:


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

Есть функции Print(), Comment(). Смотрите значения переменных, результаты сравнений. 
Artyom Trishkin
Модератор
75603
Artyom Trishkin 2016.01.12 23:46  
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, то запрет на открытие. Иначе - можно открываться.
Алексей
95
Алексей 2016.01.13 06:18  

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

 

Print(TimeToString(BlockedTrade1));

     

 

 

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

 

if (consecutive_loss==4)  

             { 

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

          BlockedTrade1 = TimeCurrent()+3600; 

             } 

Dmitry Fedoseev
42885
Dmitry Fedoseev 2016.01.13 06:25  
Наверно переменная BlockedTrade1 в функции объявлена. Надо в начале файла, но не в функции. Если в функции, то в начале объявления добавить static.
Алексей
95
Алексей 2016.01.13 07:36  

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

 

 

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

 

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

 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; 

Dina Paches
7604
Dina Paches 2016.01.13 08:38  
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 в таких разделах как: Приведение типов и/или Преобразование данных.


Алексей
95
Алексей 2016.01.13 08:52  
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) не выполняется.

 

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий