Почему при появлении второго индикатора со стрелкой советник ничего не выполняет?

#mql4 #indicator #mql #forex #activity-indicator

#mql4 #индикатор #mql #форекс #activity-индикатор

Вопрос:

Я написал некоторый код для советника для торговли на индикаторе Fiji-trend. Советник распознает первый индикатор со стрелкой и соответственно совершает сделку, однако, когда вторая стрелка должна появиться при обратном тестировании, остальной код ничего не делает.

Я вижу, что поле настраиваемой цены в индикаторе, которое следует за ценой предложения на графике, перестает двигаться вверх или вниз по значению, когда советник совершает первую сделку, может быть, что-то пошло не так?

 double CloseAllTradesThisPair()
{
 for (int i=OrdersTotal();i>=0;i--)
  {
   OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
   if (OrderSymbol()==Symbol())
    {
     OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),10,Red);
    }
  }
}
extern bool bought = false;
extern bool sold = false;

double Lotsize = AccountBalance()/5000;
double Lots = NormalizeDouble(Lotsize,2);

void OnTick()
 {
  for(int i=0;i<OrdersTotal();i  )
   {
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
    return(0);
   }
  double uparrow = iCustom(Symbol(),PERIOD_CURRENT,"fiji-trend-indicator",2,0);
  double dnarrow = iCustom(Symbol(),PERIOD_CURRENT,"fiji-trend-indicator",3,0);
  
  if(uparrow < 1000 amp;amp; i==0)
   {
    double buyticket = OrderSend(Symbol(),OP_BUY,0.01,Ask,10,0,0,NULL,0,0,Green);
    bought = true;
   }
   if(dnarrow < 1000 amp;amp; i==0)
    {
     double sellticket = OrderSend(Symbol(),OP_SELL,0.01,Bid,10,0,0,NULL,0,0,Red);
     sold = true;
    }
   if(bought != true amp;amp; dnarrow < 1000 )
    {
     CloseAllTradesThisPair();
     double sticket = OrderSend(Symbol(),OP_SELL,0.01,Bid,10,0,0,NULL,0,0,Red);
    }
     
   if(sold != true amp;amp; uparrow < 1000)
    {
     CloseAllTradesThisPair();
     double bticket = OrderSend(Symbol(),OP_BUY,0.01,Ask,10,0,0,NULL,0,0,Green);
    }

}
  

Ответ №1:

Вопрос: «Может быть, именно в этом случае, когда советник совершает первую сделку, что-то идет не так?»

О, конечно, это так.

Учитывая код, советник выполняет именно то, что ему указано в void OnTick(){...} -code:

 ...
for ( int i = 0; i < OrdersTotal(); i   )
{
    OrderSelect( i, SELECT_BY_POS, MODE_TRADES );
    return( 0 ); // _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _THE_TERMINATOR_ >>> FINITO...
    }
...
  

Этот фрагмент ничего не делает, пока не был выставлен 1-й ордер (так как затем i он остановился, чтобы выполнить условие < OrdersTotal() .

Остальное очевидно: return( 0 ); … кроме ошибки, из которой нужно возвращать значение void завершается без исключений для любого следующего кода-проходит через OnTick() -code, таким образом, эффективно избегая какой-либо торговли вообще: