Помогите начинающему MQL4 писателю. Пришлите образец программы тестирования стратегии на исторических данных.

 
Помогите начинающему MQL4 писателю. Пришлите образец программы тестирования стратегии на исторических данных. Желателен также небольшой комментарий по принципу работы программы. Заранее благодарен всем откликнувшимся. А то много наслышан о том, что люди производят тестирование стратегий на исторических данных. Хотелось бы тоже попробовать самому этот весьма ценный метод разработки своей стратегии. Но пока что таких примеров ещё не нашёл. Возможно, что плохо или мало искал. solandr99@mail.ru
 
Пример эксперта с проверкой истории сделок для мани-менеджмента:

//+------------------------------------------------------------------+
//|                                               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 июля. Если не поможет - опять на форум.