Как обслучаить поток сделок в тестере?

 

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

До сих пор пытался в init() засунуть

MathSrand( TimeCurrent() );

а потом в start() обращаться к MathRand(), чтобы вычислить направление и время открытия очередной сделки. Не помогает: seed все время получается одним и тем же (первая секунда начала тестируемого промежутка). А я хочу, чтобы оно было разным. Что посоветуете, коллеги?

Пока перспективным видится такой вариант: пишем еще один индюкатор/советнег, который на каждом новом тике фиксирует в некотором файле текущее время (вот сейчас которое, т.е. 2008.10.14 18:24:53) - или соответствующий эквивалент в формате datetime, а в init() исходного советнега его считываем. Но не проверял еще. А как-нибудь попроще, без файлов, нельзя?

 
Есть такая тема - http://www.alpari.ru/ru/articles_mql4/22.html
 
А может попробовать GetTickCount() ?
 
Mathemat >>:

Вынести seed в параметры.

Попробовать поломать GetSystemTime.

Luptator >>:
А может попробовать GetTickCount() ?

СтОит проверить, хотя наверное тоже моделируется.

 

SergNF, TimeLocal() работает точно так же (моделируется).

2 Rosh: спасибо! Получается, что советник, если его не перекомпилировать, выполняет в тестере функцию init() только однажды, при первом запуске?

P.S. Для всех, кто не прочитал статью по ссылке, - это GetTickCount() .

P.P.S. Пардон, я ошибся. Выполняется она каждый раз при запуске тестирования. Но каждый прогон в тестере (если не перекомпилить) помнит о времени первого запуска последней версии советнега.

 
ого..а куда подевались интересные посты..
ты что Mathemat уже контролем инета занялся :-)
 
А что за посты были, geometrr?
 

был 1 или 2 графика из экселя с примером чего-то случайного..
глазами только бегло успел просмотреть..

но это уже было пару дней назад, не помню теперь, хотел вернуться посмотреть а тут...?

новые манеры наверное надо вырабатывать.. все что интересно надо сразу тянуть домой

 
geometrr писал(а) >>

был 1 или 2 графика из экселя с примером чего-то случайного..
глазами только бегло успел просмотреть..

но это уже было пару дней назад, не помню теперь, хотел вернуться посмотреть а тут...?

новые манеры наверное надо вырабатывать.. все что интересно надо сразу тянуть домой

У Саркази со счёта деньги спёрли, а уж с форума красивые экселя-графики каждый стырить готов :)

Будь начеку!

 

Это уж точно не я выкладывал. Ну ничего, скоро статейку тисну очередную, компенсирую недостаток графиков из MS XL.

 

Пример реализации случайного числа. При каждом прогоне результаты абсолютно разные. Главное сохранять в файлк :)

Пример на экспике во вложении.

int            Magic = 1010;
extern int MM         = 0; // 0- без МаниМенеджмента , 
                           // 1- ставит лот в минимальный лот после убытка
                           // 2- уменьшает лот в 2 раза после убытка
                           // 3- лот зависит только от свободных средств и риска Risk
extern double Lots    = 0.1;
extern double Risk    = 0.05;
extern int     sl1    = 70;
extern int     tp1    = 140;
extern int     sl2    = 70;
extern int     tp2    = 140;
extern int     Time1 = 7;
extern int     Time2 = 15;
extern int     X     = 0;
       bool    today = false;
       int     slip  = 3; 
       color   CLR_Buy = Blue;
       color   CLR_Sell = Red;      
int srand;
int init()
  {
   ReadSRand();   
   return(0);
   
  }
int deinit()
  {
   SaveSRand();
   return(0);
  }
int start()
  {
      int J, i;
      double lots;
      srand++;
      if(Hour() > Time1 && Hour() < Time2 && (!today))
      {
         lots= LotsOptimized(); 
         MathSrand(srand);
         //MathSrand(Bid*MathPow(10,Digits));
         J = MathRand();
         J = J % 2;
         Alert("J = ", J);
         if(J==X)
         {
            OrderSend(Symbol(), OP_BUY, lots, Ask, slip, Ask - sl1*Point, Ask + tp1*Point, "BUY1", Magic, 0, CLR_Buy);
            OrderSend(Symbol(), OP_BUY, lots, Ask, slip, Ask - sl1*Point, 0             , "BUY2", Magic, 0, CLR_Buy);
         }
         else
         {
            OrderSend(Symbol(), OP_SELL, lots, Bid, slip, Bid + sl2*Point, Bid - tp2*Point, "Sell1", Magic, 0, CLR_Sell);
            OrderSend(Symbol(), OP_SELL, lots, Bid, slip, Bid + sl2*Point, 0             , "Sell2", Magic, 0, CLR_Sell);
         }
        
         today = true;
      }
    
      
      else if(Hour() == Time2 && today)
         for(i=0; i<OrdersTotal(); i++)
         {
            OrderSelect(i, SELECT_BY_POS);
            if(OrderType() == OP_BUY)
               OrderClose(OrderTicket(), OrderLots(), Bid, slip, CLR_Buy);
            else if(OrderType() == OP_SELL)
               OrderClose(OrderTicket(), OrderLots(), Ask, slip, CLR_Sell);
         }
      
      if(Hour() >= Time2)
         today = false;
   return(0);
  }
//+------------------------------------------------------------------+
  
double LotsOptimized()
  {
   double lot=Lots;
   double lastprofit=0;
   for(int i=0;i<OrdersHistoryTotal() ;i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)  break;
      lastprofit=OrderProfit();
   }
   
   lot=NormalizeDouble(AccountFreeMargin()*Risk/1000.0,1);
   if (MM==0 ) return(Lots);
   if (MM==1 && lastprofit<0)  return(Lots);
   if (MM==2 && lastprofit<0) lot=NormalizeDouble(lot/2,1);
   
   if(lot<Lots) lot=Lots;
   if (lot>10) lot=10;
   return(lot);
  }
//+------------------------------------------------------------------+
void SaveSRand()
{
    int handle = FileOpen("srand.txt",FILE_READ|FILE_WRITE|FILE_CSV,";");
    if(handle==-1)Print("Error file");
    FileSeek(handle,0,SEEK_SET);
                   if(handle!=-1)
                     {
                     FileWrite(handle,srand);
                  FileFlush(handle);
                  FileClose(handle);
                     }
}
void ReadSRand()
{
     int FileHandle=FileOpen("srand.txt",FILE_READ);
     if(FileHandle!=-1)
      {
     FileSeek(FileHandle,0,SEEK_SET);
     srand=StrToInteger(FileReadString(FileHandle));
     }
}
Файлы:
random.mq4  4 kb
Причина обращения: