А теперь давайте посчитаем как будет нормализована цена...
Текущая цена 65.8412 разделим на 0.0025 и округлим до целого, получим 26336, затем умножим на 0.0025 и получим 65.84, что не соответствует действительности.
К сожалению, вы ошибаетесь тоже с нормализацией. При вашем способе нормализации (стандартному) количество открытий стремится к нулю - проверено. И какой такой действительности не соответствует?
Sergey Zhilinskiy: К сожалению, вы ошибаетесь тоже с нормализацией. При вашем способе нормализации (стандартному) количество открытий стремится к нулю - проверено. И какой такой действительности не соответствует?
Многие трейдеры на Московской бирже хотели бы автоматизировать свои торговые алгоритмы, но не знают с чего начать. Язык MQL5 предлагает не только огромный набор торговых функций, но и готовые классы,...
#include<Trade\SymbolInfo.mqh>
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//--- объект для получения свойств символа
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");
}
Работайте через стандартные классы. Пример из статьи
#include<Trade\SymbolInfo.mqh>
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//--- объект для получения свойств символа
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");
}
Так?
Да. Так как
SYMBOL_POINT Значение одного пунктаравно 0.0001, значит смело нужно нормализовать цену по правилу:
price=NormalizeDouble(price,digits);А теперь давайте посчитаем как будет нормализована цена...
Текущая цена 65.8412 разделим на 0.0025 и округлим до целого, получим 26336, затем умножим на 0.0025 и получим 65.84, что не соответствует действительности.
Да. Так как
равно 0.0001, значит смело нужно нормализовать цену по правилу:
См. мой пост выше. Я проверял.
К сожалению, вы ошибаетесь тоже с нормализацией. При вашем способе нормализации (стандартному) количество открытий стремится к нулю - проверено. И какой такой действительности не соответствует?
1. Не соответствует текущей цене.
2. Не соответствует разрядности цены. Если вдруг цена оказалась "круглой" 65.84, то в приказ должно быть отправлено 65.8400
Работайте через стандартные классы. Пример из статьи
С чего начать при создании торгового робота для Московской биржи MOEX
Многие трейдеры на Московской бирже хотели бы автоматизировать свои торговые алгоритмы, но не знают с чего начать. Язык MQL5 предлагает не только огромный набор торговых функций, но и готовые классы,...
Не видел кода. Значит не проверяли. Переделайте код и покажите результат.
Видите разницу при стандартном способе нормирования? На скрине видно что цена не кратна 0.0025.
Ниже то что в тестере при моем способе нормировки
Видите разницу при стандартном способе нормирования? На скрине видно что цена не кратна 0.0025.
Ниже то что в тестере при моем способе нормировки
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибка Invalid Price при торговле USDRUB_TOM
Karputov Vladimir, 2016.06.16 16:30
Работайте через стандартные классы. Пример из статьи
Где код? Переделайте код и покажите результат.