Invalid Price

 

Этот участок кода 

            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());
            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);

Выдаёт следующую ошибку

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]

В чём может быть дело?

 
TraSer:

Этот участок кода 

Выдаёт следующую ошибку

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 инструментах всё идёт как и должно идти. А после неё через несколько таймфреймов виснет.
 
TraSer:
Изменил - не помогло. Дело в том, что за исключением этой бумаги программа работает корректно, и где-то на 5-10 инструментах всё идёт как и должно идти.

Меняйте логику. Вы посылаете приказ по несуществующей цене:

failed exchange buy 162.00 POLY at 544 [Invalid price]
 
Цена предложения в этот момент 543.6, при проскальзывании 4 пункта получается как раз 544. Мне кажется цена указана верно.
 
TraSer:
Цена предложения в этот момент 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 - объём и сделка проходит.

Я, конечно, дурак, но не настолько, чтобы с одним и тем же вопросом обращаться по нескольку раз, если исчерпывающий ответ уже дан

 
TraSer:

А как Вам такой пример:

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.

Документация по MQL5: Стандартная библиотека / Торговые классы / CSymbolInfo
Документация по MQL5: Стандартная библиотека / Торговые классы / CSymbolInfo
  • www.mql5.com
Стандартная библиотека / Торговые классы / CSymbolInfo - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vladimir Karputov:

Да, что-то я объём (162) попутал с ценой (544).

Рекомендую использовать стандартную нормализацию - торговый класс CSymbolInfo и ЕГО метод  NormalizePrice.

А разве у меня не так?

 
TraSer:

А разве у меня не так?

Нет. Не так.

 

Может я чего-то не понимаю, но по-моему у меня так.

            
	    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 при этом разное. Может разработчикам написать?