Насколько это правильно - не знаю. Подобрал формулу под золото и EURUSD другие инструменты не проверял.
Может быть это лучше|тоже в Virtual добавить? Чтобы не перехватывать AccountInfoDouble(ACCOUNT_MARGIN_FREE) и AccountInfoDouble(ACCOUNT_MARGIN) из Virtual-а, который перехватил их из тестера))
получать из файла для мат режима. Ну это для простоты применения только нужно. Сейчас использую прямые вызовы MathTick.FreeMargin() и MathTick.OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin) вместо перехвата.
Так что возможно Виртуал и нет смысла править, он же не для мат. режима изначально.
В мат режиме решил добавить лот в %, а не статичный. В Virtual используется штатный OrderCalcMargin() в Order_Base.mqh
В мат. режиме он вернет 0. И вызов AccountInfoDouble(ACCOUNT_MARGIN) из \Orders.mqh тоже вернет 0.
В ME через CTRL+SHIFT+F поискал упоминание этого. Нашел только в одном месте - для реала. Больше нигде.
Не понимаю, зачем использовать Margin вообще для реализации % лота на бэктестах, т.к. лот прямо-пропорционален Equity/Balance.
Тем более, когда идет запуск через Virtual.
В мат. режиме полно свойств Account/Symbol должно возвращать нули. Чтобы этого не происходило - нужно тянуть в мат. режим весь этот скарб из Symbol.json и Account.json (еще и создавать нужно).
Все же мат. режим (обе публичные реализации) - это решение для осознающих ограничения авторов.
Просьба показать функцию расчета лота, чтобы понять, что на самом деле нужно.
Мы не будем давать сложное емкое определение торгового сигнала. А дадим более понятное обывательское грубое представление. Если сделать бэктест торгового робота, то точки сделок - это торговые
На этот раз для исследования возьмем советник второго по продаваемости (в этом месяце) автора в Маркете. В режиме по реальным тикам он выглядит так. TesterReport показывает сильное влияние
Не понимаю, зачем использовать Margin вообще для реализации % лота на бэктестах, т.к. лот прямо-пропорционален Equity/Balance.
Кстати, да. Тоже не очень понимаю, хотел даже где-нибудь на форуме спросить/обсудить преимущества перед просто Эквити. Может можно и тут обсудить, раз тема поднята. Или перенести в отдельную ветку с помощью модераторов.
Понимаю, что будут меньше новые лоты при наличии сделок. Но после оптимизации это видимо уже будет не важно, так как в топ уйдут одни варианты, при расчете по эквити другие.
Ну и чтобы в какой то момент не запросить сделку, на которую не будет хватать свободных средств/маржи.
Видимо это основные аргументы за такой алгоритм. Ну вообще мне не принципиально - могу и просто % от эквити брать. От баланса наверное не стоит.
//--- calculate number of losses orders without a break if(DecreaseFactor>0)...
Который только усложняет код, а преимущества не ясны.
Для мат вычислений сделал так
double TradeSizeOptimized(MqlTick& Tick){
if(MaximumRisk==0){return inLots;}
double price=Tick.ask, margin=0.0,lot=0,stepvol=0.01,minvol=0.01,maxvol=100;
//--- select lot size#ifdef _MathTick_
if(MathTick.isMath){
if(!MathTick.OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin)){return(0.0);}//Margin = (Price symbol x Volume) / Leverage / point; FreeMargin=Equity - Margin;if(margin<=0.0){return(0.0);}
lot=NormalizeDouble(MathTick.FreeMargin()*MaximumRisk/margin,2);
//lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_MARGIN_FREE)*MaximumRisk/margin,2);//ACCOUNT_MARGIN_FREE - возьмет в Virtual, есть малые отличия, наверное из за того, что свопы в эквити в конце добавляются, а не каждый день, поэтому эквити другое => др. своб маржа => др лот для лота в %
stepvol=MathTick.stepvol;
minvol=MathTick.minvol;
maxvol=MathTick.maxvol;
}
#endif
if(margin==0){// не было расчета в мат режимеif(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin)){return(0.0);}//Margin = (Price symbol x Volume) / Leverage; FreeMargin=Equity - Margin;if(margin<=0.0){return(0.0);}
lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_MARGIN_FREE)*MaximumRisk/margin,2);
stepvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
minvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
maxvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
}
//--- normalize and check limits
lot=stepvol*NormalizeDouble(lot/stepvol,0);
if(lot<minvol){lot=minvol;}
if(lot>maxvol){lot=maxvol;}
//--- return trading volumereturn(lot);
}
Возможно, узко вижу. Вроде, мат. режим нужен только для ускорения поиска рыночных закономерностей. А плюшки - это уже другая история.
Ну можно и совместить)) Тем более, что я обычно в валюте делаю тестирование с комиссиями и текущими свопами. При этом могу сразу проверить в тестере MQ. Отличие в результатах - обычно центы или единицы долларов. Наверное из за округлений и из за свопов которые в конце рассчитываются, а не каждый день.
Результат запуска Primitive2.ex5 на ICMarkets.
А цена тика в спецификации какая?
Я привел неправильный скрин - был включен режим по пипсам.
Спецификации RannForex.
сравнить прибыль по золоту в тестере MQ и в виртуальном.
В мат режиме решил добавить лот в %, а не статичный. В Virtual используется штатный OrderCalcMargin() в Order_Base.mqh
В мат. режиме он вернет 0. И вызов AccountInfoDouble(ACCOUNT_MARGIN) из \Orders.mqh
тоже вернет 0.Дополнительно и AccountInfoDouble(ACCOUNT_MARGIN_FREE)
вернет просто эквити.
Себе сделал так в MathTicker
Насколько это правильно - не знаю. Подобрал формулу под золото и EURUSD другие инструменты не проверял.
Может быть это лучше|тоже в Virtual добавить? Чтобы не перехватывать AccountInfoDouble(ACCOUNT_MARGIN_FREE) и AccountInfoDouble(ACCOUNT_MARGIN) из Virtual-а, который перехватил их из тестера))
Хотя видимо придется все равно перехватывать, т.к. нужно еще и
получать из файла для мат режима. Ну это для простоты применения только нужно. Сейчас использую прямые вызовы MathTick.FreeMargin() и MathTick.OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin) вместо перехвата.Так что возможно Виртуал и нет смысла править, он же не для мат. режима изначально.
В мат режиме решил добавить лот в %, а не статичный. В Virtual используется штатный OrderCalcMargin() в Order_Base.mqh
В мат. режиме он вернет 0. И вызов AccountInfoDouble(ACCOUNT_MARGIN) из \Orders.mqh тоже вернет 0.
В ME через CTRL+SHIFT+F поискал упоминание этого. Нашел только в одном месте - для реала. Больше нигде.
Не понимаю, зачем использовать Margin вообще для реализации % лота на бэктестах, т.к. лот прямо-пропорционален Equity/Balance.
Тем более, когда идет запуск через Virtual.
В мат. режиме полно свойств Account/Symbol должно возвращать нули. Чтобы этого не происходило - нужно тянуть в мат. режим весь этот скарб из Symbol.json и Account.json (еще и создавать нужно).
Все же мат. режим (обе публичные реализации) - это решение для осознающих ограничения авторов.
Просьба показать функцию расчета лота, чтобы понять, что на самом деле нужно.
Вот есть две истории торговли: постоянным лотом и процентом. Они должны однозначно преобразовываться одна в другую в обе стороны.
Если это не так, тогда вопрос.
Все же мат. режим (обе публичные реализации) - это решение для осознающих ограничения авторов.
Возможно, узко вижу. Вроде, мат. режим нужен только для ускорения поиска рыночных закономерностей. А плюшки - это уже другая история.
Primitive2.mq4 ровно так написан - отсутствие лишних/повторных расчетов.
Не понимаю, зачем использовать Margin вообще для реализации % лота на бэктестах, т.к. лот прямо-пропорционален Equity/Balance.
Кстати, да.
Тоже не очень понимаю, хотел даже где-нибудь на форуме спросить/обсудить преимущества перед просто Эквити. Может можно и тут обсудить, раз тема поднята. Или перенести в отдельную ветку с помощью модераторов.
Видимо это основные аргументы за такой алгоритм.
Ну вообще мне не принципиально - могу и просто % от эквити брать. От баланса наверное не стоит.
Просьба показать функцию расчета лота, чтобы понять, что на самом деле нужно.
Взял из примеров Moving Average
Выкинул из нее блок
//--- calculate number of losses orders without a break
if(DecreaseFactor>0)...
Который только усложняет код, а преимущества не ясны.
Для мат вычислений сделал так
Возможно, узко вижу. Вроде, мат. режим нужен только для ускорения поиска рыночных закономерностей. А плюшки - это уже другая история.
Тем более, что я обычно в валюте делаю тестирование с комиссиями и текущими свопами.
При этом могу сразу проверить в тестере MQ. Отличие в результатах - обычно центы или единицы долларов. Наверное из за округлений и из за свопов которые в конце рассчитываются, а не каждый день.