Этот участок кода
Выдаёт следующую ошибку
2019.10.31 14:03:25.537 Core 1 2018.04.09 13:15:00 failed exchange buy 162.00 POLY at 544 [Invalid price]
2019.10.31 14:03:25.537 Core 1 2018.04.09 13:15:00 CTrade::OrderSend: exchange buy 162.00 POLY [invalid price]
В чём может быть дело?
Вы уж определить, Вы работаете с Symbol() или с Instruments[i].instrument
MqlTick last_tick; if(SymbolInfoTick(Symbol(),last_tick)) m_symbol.NormalizePrice(last_tick.ask); else Print("SymbolInfoTick() failed, error = ",GetLastError()); m_trade.Buy(int)MathFloor((AccountInfoDouble(ACCOUNT_EQUITY)*oneLot)/ SymbolInfoDouble(Instruments[i].instrument, SYMBOL_TRADE_CONTRACT_SIZE)/ SymbolInfoDouble(Instruments[i].instrument, SYMBOL_ASK)), Instruments[i].instrument);
Похоже, что цену нужного инструмента Вы не получаете.
Изменил - не помогло. Дело в том, что за исключением этой бумаги программа работает корректно, и где-то на 5-10 инструментах всё идёт как и должно идти.
Меняйте логику. Вы посылаете приказ по несуществующей цене:
failed exchange buy 162.00 POLY at 544 [Invalid price]
Цена предложения в этот момент 543.6, при проскальзывании 4 пункта получается как раз 544. Мне кажется цена указана верно.
162.00 это совсем не 544. Откажитесь от своей логики. Напишите сначала минимальный пример (выкиньте свои структуры).
А как Вам такой пример:
2019.11.13 20:01:17.083 Core 1 2018.04.09 11:15:00 exchange buy 6.00 AFLT at 154.80 (154.75 / 154.80 / 154.75)
, где 154 - реальная цена, 6 - объём и сделка проходит.
Я, конечно, дурак, но не настолько, чтобы с одним и тем же вопросом обращаться по нескольку раз, если исчерпывающий ответ уже дан
А как Вам такой пример:
2019.11.13 20:01:17.083 Core 1 2018.04.09 11:15:00 exchange buy 6.00 AFLT at 154.80 (154.75 / 154.80 / 154.75)
, где 154 - реальная цена, 6 - объём и сделка проходит.
Я, конечно, дурак, но не настолько, чтобы с одним и тем же вопросом обращаться по нескольку раз, если исчерпывающий ответ уже дан
Да, что-то я объём (162) попутал с ценой (544).
Рекомендую использовать стандартную нормализацию - торговый класс CSymbolInfo и ЕГО метод NormalizePrice.
- www.mql5.com
Да, что-то я объём (162) попутал с ценой (544).
Рекомендую использовать стандартную нормализацию - торговый класс CSymbolInfo и ЕГО метод NormalizePrice.
А разве у меня не так?
А разве у меня не так?
Нет. Не так.
Может я чего-то не понимаю, но по-моему у меня так.
CSymbolInfo m_symbol; m_trade.SetExpertMagicNumber(i); m_trade.SetMarginMode(); m_symbol.Name(Instruments[i].instrument); m_trade.SetTypeFillingBySymbol(m_symbol.Name()); Print("openPositions=",openPositions, " ", AccountInfoDouble(ACCOUNT_EQUITY), " ", SymbolInfoDouble(Instruments[i].instrument, SYMBOL_TRADE_CONTRACT_SIZE), " ", SymbolInfoDouble(Instruments[i].instrument, SYMBOL_ASK)); m_trade.SetDeviationInPoints(dev); m_symbol.RefreshRates(); MqlTick last_tick; if(SymbolInfoTick(Symbol(),last_tick)) m_symbol.NormalizePrice(last_tick.ask); else Print("SymbolInfoTick() failed, error = ",GetLastError()); m_trade.Buy((int)MathFloor((AccountInfoDouble(ACCOUNT_EQUITY)*oneLot)/ SymbolInfoDouble(Instruments[i].instrument, SYMBOL_TRADE_CONTRACT_SIZE)/ SymbolInfoDouble(Instruments[i].instrument, SYMBOL_ASK)), Instruments[i].instrument);
7-я строка снизу.
Попробовал сделать немного иначе
CTrade m_trade; CSymbolInfo m_symbol; //m_trade.SetExpertMagicNumber(i); m_trade.SetMarginMode(); m_symbol.Name(Instruments[i].instrument); m_trade.SetTypeFillingBySymbol(m_symbol.Name()); m_trade.SetDeviationInPoints(dev); m_symbol.RefreshRates(); m_symbol.NormalizePrice(iOpen(Instruments[i].instrument, PERIOD_M15, 0)); Print("openPositions=",openPositions, " ", AccountInfoDouble(ACCOUNT_EQUITY), " ", SymbolInfoDouble(Instruments[i].instrument, SYMBOL_TRADE_CONTRACT_SIZE), " ", SymbolInfoDouble(Instruments[i].instrument, SYMBOL_ASK)); m_trade.Buy(MathFloor((AccountInfoDouble(ACCOUNT_EQUITY)*oneLot)/ SymbolInfoDouble(Instruments[i].instrument, SYMBOL_TRADE_CONTRACT_SIZE)/ SymbolInfoDouble(Instruments[i].instrument, SYMBOL_ASK)), Instruments[i].instrument);
Результат тот же.
Могу ещё добавить, что ошибка происходит в тот момент, когда на одном таймфрейме открываются 2 сделки. Но это ничего не объясняет, поскольку i при этом разное. Может разработчикам написать?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Этот участок кода
Выдаёт следующую ошибку
2019.10.31 14:03:25.537 Core 1 2018.04.09 13:15:00 failed exchange buy 162.00 POLY at 544 [Invalid price]
2019.10.31 14:03:25.537 Core 1 2018.04.09 13:15:00 CTrade::OrderSend: exchange buy 162.00 POLY [invalid price]
В чём может быть дело?