Помогите начинающему MQL4 писателю. Пришлите образец программы тестирования стратегии на исторических данных.
Помогите начинающему MQL4 писателю. Пришлите образец программы тестирования стратегии на исторических данных. Желателен также небольшой комментарий по принципу работы программы. Заранее благодарен всем откликнувшимся. А то много наслышан о том, что люди производят тестирование стратегий на исторических данных. Хотелось бы тоже попробовать самому этот весьма ценный метод разработки своей стратегии. Но пока что таких примеров ещё не нашёл. Возможно, что плохо или мало искал. solandr99@mail.ru
- Профилирование кода - Разработка программ
- Статьи по разработке торговых приложений
- MetaTrader Market – крупнейший магазин торговых приложений
Пример эксперта с проверкой истории сделок для мани-менеджмента:
//+------------------------------------------------------------------+ //| Moving Average.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #define MAGICMA 20050610 extern double Lots = 0.1; extern double MaximumRisk = 0.02; extern double DecreaseFactor = 3; extern double MovingPeriod = 12; extern double MovingShift = 6; //+------------------------------------------------------------------+ //| Подсчитаем количество открытых позиций | //+------------------------------------------------------------------+ int CalculateCurrentOrders(string symbol) { int buys=0,sells=0; //---- for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA) { if(OrderType()==OP_BUY) buys++; if(OrderType()==OP_SELL) sells++; } } //---- вернем количество ордеров if(buys>0) return(buys); else return(-sells); } //+------------------------------------------------------------------+ //| Расчитаем оптимальный размер рабочего лота | //+------------------------------------------------------------------+ double LotsOptimized() { double lot=Lots; int orders=HistoryTotal(); // общее количество сделок в истории int losses=0; // количество проигрышных сделок подряд //---- выберем нужный размер для сделки lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1); //---- подсчитаем количество проигрышных подряд сделок if(DecreaseFactor>0) { for(int i=orders-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; } if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue; //---- if(OrderProfit()>0) break; if(OrderProfit()<0) losses++; } if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1); } //---- вернем объем лота if(lot<0.1) lot=0.1; return(lot); } //+------------------------------------------------------------------+ //| Проверка возможности открыться | //+------------------------------------------------------------------+ void CheckForOpen() { double ma; int res; //---- проверяем возможность торговли только если это первые тики нового периода if(Volume[0]>1) return; //---- возьмем текущую сглаженную ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0); //---- открываемся вниз? if(Open[1]>ma && Close[1]<ma) { res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red); return; } //---- открываемся вниз? if(Open[1]<ma && Close[1]>ma) { res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue); return; } //---- } //+------------------------------------------------------------------+ //| Проверка на необходимость закрытия | //+------------------------------------------------------------------+ void CheckForClose() { double ma; //---- проверяем возможность торговли только если это первые тики нового периода if(Volume[0]>1) return; //---- возьмем текущую сглаженную ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0); //---- for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue; //---- проверим типы if(OrderType()==OP_BUY) { if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White); break; } if(OrderType()==OP_SELL) { if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White); break; } } //---- } //+------------------------------------------------------------------+ //| Стартовая функция | //+------------------------------------------------------------------+ void start() { //---- бары то хоть есть? if(Bars<100 || IsTradeAllowed()==false) return; //---- подсчитаем количество открытых ордеров по этому инструменту if(CalculateCurrentOrders(Symbol())==0) CheckForOpen(); else CheckForClose(); //---- } //+------------------------------------------------------------------+
Спасибо за текст программы. Программа прекрасно скомпилировалась и присоединилась к графику. Теперь я хочу получить результат работы этой программы. То есть какие шаги я должен сделать чтобы узнать что было бы например за прошедший месяц, если бы я чётко исполнял этот алгоритм следования за Moving Average? Как мне увидеть все сделки, проведённые по этой программе за месяц? В MetaTrader -Alpari 4.00 build 173 имеется пункт View/Strategy Tester. На нажатие которого ничего не происходит. Посоветуйте что мне нужно ещё сделать?
Отрывай пока календарные листочки до 1 июля. Если не поможет - опять на форум.

Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь