Ошибка Invalid Price при торговле USDRUB_TOM - страница 3

 
2016.06.16 21:17:25.160 testDig (EURRUB_TOM,M15)        Digits() 4, SYMBOL_POINT 0.0001
Так?
 
Sergey Zhilinskiy:
Так?

Да. Так как

SYMBOL_POINT Значение одного пункта

 равно 0.0001, значит смело нужно нормализовать цену по правилу:

price=NormalizeDouble(price,digits);                         
 
Alexey Viktorov:

А теперь давайте посчитаем как будет нормализована цена...

Текущая цена 65.8412 разделим на 0.0025 и округлим до целого, получим 26336, затем умножим на 0.0025 и получим 65.84, что не соответствует действительности.


К сожалению, вы ошибаетесь тоже с нормализацией. При вашем способе нормализации (стандартному) количество открытий стремится к нулю - проверено. И какой такой действительности не соответствует?
 
Karputov Vladimir:

Да. Так как

 равно 0.0001, значит смело нужно нормализовать цену по правилу:

См. мой пост выше. Я проверял.
 
Sergey Zhilinskiy:
См. мой пост выше. Я проверял.
Не видел кода. Значит не проверяли. Переделайте код и покажите результат.
 
Sergey Zhilinskiy:
К сожалению, вы ошибаетесь тоже с нормализацией. При вашем способе нормализации (стандартному) количество открытий стремится к нулю - проверено. И какой такой действительности не соответствует?

1. Не соответствует текущей цене.

2. Не соответствует разрядности цены. Если вдруг цена оказалась "круглой" 65.84, то в приказ должно быть отправлено 65.8400

 

Работайте через стандартные классы. Пример из статьи


С чего начать при создании торгового робота для Московской биржи MOEX

С чего начать при создании торгового робота для Московской биржи MOEX

Многие трейдеры на Московской бирже хотели бы автоматизировать свои торговые алгоритмы, но не знают с чего начать. Язык MQL5 предлагает не только огромный набор торговых функций, но и готовые классы,...

 

#include<Trade\SymbolInfo.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- объект для получения свойств символа
CSymbolInfo symbol_info;
//--- зададим имя символа, для которого будем получать информацию
   symbol_info.Name(_Symbol);
//--- получим текущие котировки и выведем
   symbol_info.RefreshRates();
   Print(symbol_info.Name()," (",symbol_info.Description(),")",
         "  Bid=",symbol_info.Bid(),"   Ask=",symbol_info.Ask());
//--- получим количество знаков после запятой и размер пункта
   Print("Digits=",symbol_info.Digits(),
         ", Point=",DoubleToString(symbol_info.Point(),symbol_info.Digits()));
//--- запросим тип исполнения ордеров, нет ли ограничений
   Print("Ограничения на торговые операции: ",EnumToString(symbol_info.TradeMode()),
         " (",symbol_info.TradeModeDescription(),")");
//--- выясним режим заключения сделок
   Print("Режим исполнения сделок: ",EnumToString(symbol_info.TradeExecution()),
         " (",symbol_info.TradeExecutionDescription(),")");
//--- выясним способ вычисления стоимости контрактов
   Print("Вычисление стоимости контракта: ",EnumToString(symbol_info.TradeCalcMode()),
         " (",symbol_info.TradeCalcModeDescription(),")");
//--- размер контракта
   Print("Размер стандартного контракта: ",symbol_info.ContractSize());
//--- размер начальной маржи для 1 контракта
   Print("Начальная маржа для стандартного контракта: ",symbol_info.MarginInitial()," ",symbol_info.CurrencyBase());
//--- минимальный, максимальный размеры объема в торговых операциях
   Print("Volume info: LotsMin=",symbol_info.LotsMin(),"  LotsMax=",symbol_info.LotsMax(),
         "  LotsStep=",symbol_info.LotsStep());
//--- 
   Print(__FUNCTION__,"  completed");   
  }
 
Karputov Vladimir:
Не видел кода. Значит не проверяли. Переделайте код и покажите результат.

Видите разницу при стандартном способе нормирования? На скрине видно что цена не кратна 0.0025.

Ниже  то что в тестере при моем способе нормировки

 

 
Мне почему то кажется что предположения о неверной нормировки тут не совсем к месту. Проблема в чем то другом...
 
Sergey Zhilinskiy:

Видите разницу при стандартном способе нормирования? На скрине видно что цена не кратна 0.0025.

Ниже  то что в тестере при моем способе нормировки

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибка Invalid Price при торговле USDRUB_TOM

Karputov Vladimir, 2016.06.16 16:30

Работайте через стандартные классы. Пример из статьи

 

#include<Trade\SymbolInfo.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- объект для получения свойств символа
CSymbolInfo symbol_info;
//--- зададим имя символа, для которого будем получать информацию
   symbol_info.Name(_Symbol);
//--- получим текущие котировки и выведем
   symbol_info.RefreshRates();
   Print(symbol_info.Name()," (",symbol_info.Description(),")",
         "  Bid=",symbol_info.Bid(),"   Ask=",symbol_info.Ask());
//--- получим количество знаков после запятой и размер пункта
   Print("Digits=",symbol_info.Digits(),
         ", Point=",DoubleToString(symbol_info.Point(),symbol_info.Digits()));
//--- запросим тип исполнения ордеров, нет ли ограничений
   Print("Ограничения на торговые операции: ",EnumToString(symbol_info.TradeMode()),
         " (",symbol_info.TradeModeDescription(),")");
//--- выясним режим заключения сделок
   Print("Режим исполнения сделок: ",EnumToString(symbol_info.TradeExecution()),
         " (",symbol_info.TradeExecutionDescription(),")");
//--- выясним способ вычисления стоимости контрактов
   Print("Вычисление стоимости контракта: ",EnumToString(symbol_info.TradeCalcMode()),
         " (",symbol_info.TradeCalcModeDescription(),")");
//--- размер контракта
   Print("Размер стандартного контракта: ",symbol_info.ContractSize());
//--- размер начальной маржи для 1 контракта
   Print("Начальная маржа для стандартного контракта: ",symbol_info.MarginInitial()," ",symbol_info.CurrencyBase());
//--- минимальный, максимальный размеры объема в торговых операциях
   Print("Volume info: LotsMin=",symbol_info.LotsMin(),"  LotsMax=",symbol_info.LotsMax(),
         "  LotsStep=",symbol_info.LotsStep());
//--- 
   Print(__FUNCTION__,"  completed");   
  }

 

Где код? Переделайте код и покажите результат.

 

Причина обращения: