Посмотри SYMBOL_TRADE_TICK_SIZE в спецификации. У индексов шаг цены часто 0.25 или 0.5, а Digits говорит только, сколько знаков показывать. Цена заявки должна быть кратна шагу: 18452.37 сервер не примет, примет 18452.25 или 18452.50. Те единицы, что проходят, просто случайно попали на шаг. NormalizeDouble по знакам тут не спасает, округлять надо по шагу:
Код:
double NormalizeToTick(double price)
{
double tick = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
if(tick <= 0) return NormalizeDouble(price, _Digits);
return NormalizeDouble(MathRound(price / tick) * tick, _Digits);
}
Стоп и тейк прогоняй через ту же функцию. Для лимитки на покупку я бы округляла вниз, а не к ближайшему, чтобы заявка не оказалась ближе к рынку, чем ты задумал, для продажи вверх. И держи в голове стоп-левел: если стоп или тейк ближе SYMBOL_TRADE_STOPS_LEVEL, получишь уже 10016.