Я пытаюсь написать чрезвычайно простой советник на MQL5, который должен следовать только одному условию if. Существует массив, в котором хранятся последние 5 цен закрытия. Идея состоит в том, чтобы открыть позицию на ПОКУПКУ, когда последние 4 цены закрытия (исключая текущую свечу) находятся в восходящем тренде. Однако советник начинает открывать позиции BUY одну за другой, даже не заботясь о состоянии. Выкладываю полный код.
Пробовал создать новый метод Uptrend(), у которого абсолютно такое же условие - все равно не работает.
#include <Trade\Trade.mqh>
CTrade trade;
void OnTick()
{
double tpoint = Point();
double ClosePriceArray[];
ArraySetAsSeries(ClosePriceArray, true);
CopyClose(Symbol(), PERIOD_CURRENT, 0, 5, ClosePriceArray);
double Ask = NormalizeDouble(SymbolInfoDouble(Symbol(),SYMBOL_ASK),_Digits);
double Bid = NormalizeDouble(SymbolInfoDouble(Symbol(),SYMBOL_BID),_Digits);
if ((ClosePriceArray[4] < ClosePriceArray[3] < ClosePriceArray[2]< ClosePriceArray[1]) && PositionsTotal() < 1) {
trade.Buy(0.10, NULL, Ask, (Ask-50*tpoint), (Ask+150*tpoint), NULL);
}
}
Я хочу, чтобы советник открывал позицию на покупку только при выполнении условия. Нет никаких сообщений об ошибках или ошибок компиляции.
Разделите операторы сравнения с помощью &&
и добавьте еще одно условие, как показано ниже.
if ((ClosePriceArray[4] < ClosePriceArray[3] && ClosePriceArray[3] < ClosePriceArray[2] && ClosePriceArray[2]< ClosePriceArray[1]) && PositionsTotal() < 1)
{
trade.Buy(0.10, NULL, Ask, (Ask-50*tpoint), (Ask+150*tpoint), NULL);
}
Также вам не нужно нормализовать цены Bid
и Ask
, они нормализованы по умолчанию, но вам нужно нормализовать другие ценовые значения, такие как уровни tp и sl, размеры лотов и т. д.
В дополнение к выбранному ответу. Никогда не используйте NormalizeDouble
для нормализации цен и объемов, это может привести к непредсказуемым результатам.
Цены всегда должны быть нормализованы по размеру тика:
double NormalizePrice(double p)
{
double ts=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
return(MathRound(p/ts) * ts);
}
Это решило проблему. Большое спасибо!