Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2266

 

Примерно так?

if(iBarShift(symbol,tf,time,exact)>=Barcount) Cls_B=true; 

 
Ratmirfat #:

Примерно так?

if(iBarShift(symbol,tf,time,exact)>=Barcount) Cls_B=true; 

void CloseExpOrder() 
  {
   int i=OrdersTotal()-1;
   datetime t=0;
   for(int pos=i;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol&&OrderMagicNumber()==Magic)
           {
            t=OrderOpenTime()+_Period*5*60;
            if(t<=TimeCurrent())
              {
               if(OrderType()==OP_BUY ) OrderClose(OrderTicket(),OrderLots(),Bid,3,clrRed);
               if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,3,clrRed);
              } 
           }
        }
     }
  }
 
Tretyakov Rostyslav #:
Спасибо! Это закрытие ордера по времени, а по определенному количеству баров как сделать?
 
Ratmirfat #:
Спасибо! Если period будет равен единице, то t будет равно часу? То есть ордер будет закрываться через час?
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2023.09.11
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
Ratmirfat #:
Спасибо! Это закрытие ордера по времени, а по определенному количеству баров как сделать?
t=OrderOpenTime()+_Period*5*60;

1 бар = _Period*60

здесь к открытию ордера добавляем 5 баров

 
Tretyakov Rostyslav #:

1 бар = _Period*60

здесь к открытию ордера добавляем 5 баров

  Не совсем понял, то есть   _Period это значение, которое я должен обозначить выше в программе? 
 
Ratmirfat #:
  Не совсем понял, то есть   _Period это значение, которое я должен обозначить выше в программе? 

Бар - это единица времени на графике!

"_Period"  или  "Period ()" на М15 = 15 минут, на М30 = 30, на Н1 = 60 и т.д.

5 баров на М15 - это 15*5 и умножить на секунды, т.е. 15*5*60

 
Tretyakov Rostyslav #:

Бар - это единица времени на графике!

"_Period"  или  "Period ()" на М15 = 15 минут, на М30 = 30, на Н1 = 60 и т.д.

5 баров на М15 - это 15*5 и умножить на секунды, т.е. 15*5*60

Это понятно, у меня вобщем-то немного другая проблема возникла, я ее пытаюсь подобным образом решить.

Дело в том что в своем советнике я открываю ордер с помощью МА, а закрываю с помощью RSI. И вот тут возникает зависание, то есть ордер десятки раз в один и тот же период времени

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

if(MA_1a < MA_2 && MA_1 > MA_2)  Opn_B=true; 

if(R_1 < RSI_level_1 && R_2 > RSI_level_1) Cls_B=true; 

Вот в этом случае, в ряде случаев, кода поступают сигналы на открытие и сразу закрытие ордера, возникает зависание с многократным закрытием и открытием ордера в одно и тоже время. Я пробовал решить проблему вот так:

if(MA_1a < MA_2 && MA_1 > MA_2)  Opn_B=true; 

if(R_1 < RSI_level_1 && R_2 > RSI_level_1 && OrderOpenTime() <TimeCurrent()) Cls_B=true; 

Но тогда сделки вообще с помощью RSI не закрываются. Поэтому я и спросил о закрытии через, к примеру больше, чем 1 бар, чтобы не было совпадения команды на открытие и закрытие ордера. Подскажите, пожалуйста, как решить эту проблему?

 
Ratmirfat #:

Это понятно, у меня вобщем-то немного другая проблема возникла, я ее пытаюсь подобным образом решить.

Дело в том что в своем советнике я открываю ордер с помощью МА, а закрываю с помощью RSI. И вот тут возникает зависание, то есть ордер десятки раз в один и тот же период времени

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

if(MA_1a < MA_2 && MA_1 > MA_2)  Opn_B=true; 

if(R_1 < RSI_level_1 && R_2 > RSI_level_1) Cls_B=true; 

Вот в этом случае, в ряде случаев, кода поступают сигналы на открытие и сразу закрытие ордера, возникает зависание с многократным закрытием и открытием ордера в одно и тоже время. Я пробовал решить проблему вот так:

if(MA_1a < MA_2 && MA_1 > MA_2)  Opn_B=true; 

if(R_1 < RSI_level_1 && R_2 > RSI_level_1 && OrderOpenTime() <TimeCurrent()) Cls_B=true; 

Но тогда сделки вообще с помощью RSI не закрываются. Поэтому я и спросил о закрытии через, к примеру больше, чем 1 бар, чтобы не было совпадения команды на открытие и закрытие ордера. Подскажите, пожалуйста, как решить эту проблему?

Ошибку надо искать не здесь.

1) Проверьте функцию закрытия ордеров, которую я дал. Я там исправил ошибку.

if(t<=TimeCurrent())

2) если первый пункт не поможет, то покажите код где идет обработка Opn_B и Cls_B

 
Ratmirfat #:
Спасибо! Это закрытие ордера по времени, а по определенному количеству баров как сделать?

я честно говоря не понял ради чего вам  дают заведомо неверные ответы (они чётко в 00:01 понедельника и ещё "кое-когда" будут закрывать ордера), но

кол-во баров прошедших с момента открытия это iBarShift(_Symbol,_Period,OrderOpenTime()); то есть одно из условий для закрытия ордера: 

if (iBarShift(OrderSymbol(),TIMEFRAME,OrderOpenTime()) > BARS_TO_CLOSE) { /* прошло более BARS_TO_CLOSE баров на таймфейме TIMEFRAME */ .... }

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