#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, таким образом, эффективно избегая какой-либо торговли вообще: