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

 
Nerd Trader:
Почему isCrossing() не возвращает 2 ??? В самом isCrossing() есть вход во второй if, но потом в OnTick() не происходит вхождения в if, когда isCrossing() == 2. Что за бред...

Оба условия подходят...поэтому получаешь первый результат

 
MakarFX:

Оба условия подходят...поэтому получаешь первый результат

Подходят только когда Bid == ma. Исправил <= на < (также и для >=), но ничего не поменялось. 
 
Nerd Trader:
Почему isCrossing() не возвращает 2 ??? В самом isCrossing() есть вход во второй if, но потом в OnTick() не происходит вхождения в if, когда isCrossing() == 2. Что за бред...

Почему-то я думаю и 1 тоже не возвращает.

Это условие

if(g_barTime < iTime(NULL,g_timeFrame,0)// и дальше

говорит об открытии нового бара. На первом тике бара open == high == low == close  и == Bid — отсюда следует, что условие

 && high > ma && Bid <= ma)

или

 && low < ma && Bid >= ma)
выполнено быть не может…

Сегодня был вопрос об условии if(i != i) Вот и эти условия примерно такие-же.

 
Ф-ия OnTick() какова есть сейчас в моем редакторе:
void OnTick()
  {
/*     if(isCrossing() == 1){          
      Print("enter to '1. if (isCrossing)'");
        if(shouldBars(1))         
          Print("angulation is ", shouldAngulation(1));            
    } */

    if(isCrossing() == 2){
      Print("enter to '2. if (isCrossing)'");
      if(shouldBars(2))
        Print("angulation is ", shouldAngulation(2));
        //if(shouldAngulation(2))
          //OpenSell();
    }

   
  }
Если закоментить первый блок, то второй выполняется. Только где ошибка не пойму.

P.S.
при том, что в ф-ии isCrossing() все оставил как есть.
 
Alexey Viktorov:

Почему-то я думаю и 1 тоже не возвращает.

Это условие

говорит об открытии нового бара. На первом тике бара open == high == low == close  и == Bid — отсюда следует, что условие

или

выполнено быть не может…

Сегодня был вопрос об условии if(i != i) Вот и эти условия примерно такие-же.

"1" возвращает, делал отладку кода в MetaEditor'e. 

Далее, даже если всё всему равняется, то только на первом тике.

 
Nerd Trader:

"1" возвращает, делал отладку кода в MetaEditor'e. 

Далее, даже если всё всему равняется, то только на первом тике.

Ну да, я был не прав. Новый бар будет только после выполнения всего условия.

Попробуй заменить high и low на open. Может не сильно повлияет на стратегию…

 
Nerd Trader:

"1" возвращает, делал отладку кода в MetaEditor'e. 

Далее, даже если всё всему равняется, то только на первом тике.

Так работает

//--- input parameters
input int                  g_maPeriod  = 14;
input int                  g_maShift   = 1;
input ENUM_APPLIED_PRICE   g_maPrice   = PRICE_CLOSE;  //Applied price
input ENUM_MA_METHOD       g_maMethod  = MODE_SMA;    //Method Ma
input ENUM_TIMEFRAMES      g_timeFrame = PERIOD_CURRENT;   //Timeframe for calculate
datetime g_barTime=0;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(g_barTime != iTime(NULL,g_timeFrame,0))
     {
      if(isCrossing()==1)
        {
         Print("enter to '1. if (isCrossing)'"); g_barTime = iTime(NULL,g_timeFrame,0);
        }
      if(isCrossing()==2)
        {
         Print("enter to '2. if (isCrossing)'"); g_barTime = iTime(NULL,g_timeFrame,0);
        }
     }
  }
//+------------------------------------------------------------------+
int isCrossing()
  {  
   int res=0;
   double low = iLow(Symbol(), g_timeFrame, 1);
   double high = iHigh(Symbol(), g_timeFrame, 1);
   double ma = iMA(_Symbol, g_timeFrame, g_maPeriod, g_maShift, g_maMethod, g_maPrice, 0);

   if(high > ma && Bid <= ma) res=1;
  
   if(low < ma && Bid >= ma) res=2;
   return (res);
  }
//+------------------------------------------------------------------+
2021.08.25 09:24:56.629 2021.08.20 23:50:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.624 2021.08.20 23:45:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.592 2021.08.20 21:35:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.582 2021.08.20 21:05:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.566 2021.08.20 20:20:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.554 2021.08.20 18:50:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.553 2021.08.20 18:45:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.553 2021.08.20 18:40:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
 
MakarFX:

Так работает


Сделал так и всё заработало, только сообщения из isCrossing() дублируются, потому что ф-я вызывается дважды на один тик.

void OnTick()
  {
   if(BarTime != iTime(NULL,0,0)){

     if(isCrossing == 1){
       ...
     }

     if(isCrossing == 2){
       ...
     }
     BarTime = iTime(NULL,0,0); 
  }

int isCrossing()
  {  
    ...

    if(high > ma && Bid <= ma){
      Print("Crossing down");
      return 1;
    } 
  
    if(low < ma && Bid >= ma){
      Print("Crossing up");
      return 2;
    }
   return 0;
  }


В общем оставил как было изначально, только теперь из isCrossing() всё возвращается в переменную. Ничего не дублируется и всё работает. Всем спасибо :)

void OnTick()
  {
    int iCrossing = isCrossing();

    if(iCrossing == 1){
       ...
    }

    if(iCrossing == 2){
       ...
    }   
  }
 
MakarFX:
2021.08.25 09:24:56.629 2021.08.20 23:50:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.624 2021.08.20 23:45:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.592 2021.08.20 21:35:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.582 2021.08.20 21:05:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.566 2021.08.20 20:20:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.554 2021.08.20 18:50:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.553 2021.08.20 18:45:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.553 2021.08.20 18:40:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
Увидел сейчас, что вы добавили лог. Вот и у вас тоже дублируются сообщения :)
 

объясните пожалуйста в чем разница между функциями?

 for (int j = OrdersHistoryTotal()-1; j >= 0; j--)

   {

      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))

 и

 int i=OrdersHistoryTotal();

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

     {

      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))

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