Рациональные приемы (предложения) ускорения оптимизатора - страница 5

 

yosuf:
Вопрос к знатокам тестера: Почему нет в тестере МТ4 ТФ W1 (Weekly) и MN1 (Monthly)? Есть возможность их создать, чтобы проводить оптимизацию советника на этих ТФ?

Возможность есть, смысла нет

 
TheXpert:

Возможность есть, смысла нет

Почему Вы так категоричны. Например, в случае с моей ТС, наилучшие результаты получаются именно на ТФ Д1, но, это при отсутствии возможности тестирования на более старших ТФ. Может получиться, что на старших ТФ результаты окажутся лучше. Нужно пробовать и Д2, Д3, Д4, W1, W2, W3, MN1,.... Не могли-бы подсказать как  организовать оптимизацию и прогон ТС на этих ТФ?
 
yosuf:
Почему Вы так категоричны. Например, в случае с моей ТС, наилучшие результаты получаются именно на ТФ Д1, но, это при отсутствии возможности тестирования на более старших ТФ. Может получиться, что на старших ТФ результаты окажутся лучше. Нужно пробовать и Д2, Д3, Д4, W1, W2, W3, MN1,.... Не могли-бы подсказать как  организовать оптимизацию и прогон ТС на этих ТФ?

Тестируйте хоть на М1, а анализируйте нужный ТФ (хоть свой собственный).

ТФ тестера для этого менять не надо. 

 
Мне также нужна возможность  или опция видимости снятия прибыли или хотя бы переустановки в тестере в конце месяца или дня недели...ну чтоб как в реале тестировать )) что ждать год или15 когда в реале переустанавливаешь регулярно и тестирование теряет смысл...
 
komposter:

Тестируйте хоть на М1, а анализируйте нужный ТФ (хоть свой собственный).

ТФ тестера для этого менять не надо. 

Как-же так? По моему, если работаете на Д1, то и тестирование нужно проводить на Д1, наверное.
 
yosuf:
Как-же так? По моему, если работаете на Д1, то и тестирование нужно проводить на Д1, наверное.
Вы можете в коде анализировать любой ТФ.
 

Ну вот пример моего первого советника для торговли в ночном канале по еврофунту, который мне принес первую ощутимую прибыль и определил род занятий на много лет.  Советник работает на ТФ М1. Кстати и сейчас еще актуален и показывает прибыль если его немного допилить. В частности добавить обработку расширенного спреда. 

 Как можно ускорить расчеты такого советника через использование буферов ? 

input int period = 100;
input int Delta = 10; 
input double om = 0.8;
input double Lot = 0.0;
input double MaximumRisk = 0.5;

input int Starthour = 18;
input int Endhour =24 ;

int slipage,mag;

void  OnTick()
{
      if (!TradeHour() && OrdersTotal()==0) return;
	double h,l;
                
      int hbar=iHighest(NULL,0,MODE_HIGH,period,0);
      if(hbar>=0) h=iHigh(NULL,0,hbar);
      else h=-1.0;

      int lbar=iLowest(NULL,0,MODE_LOW,period,0);
      if(lbar>=0) l=iLow(NULL,0,lbar);
      else l=-1.0;
      
      double center=(h+l)/2;
      double dx=(h-l)*om/2;
      h= center+dx+_Point*Delta;
      l=center-dx-_Point*Delta;
      
      if(Bid>=h) { CloseBuy();  RefreshRates();}
           if(Bid>=h && TradeHour())  Sell();
        
           if(Bid<=l) { CloseSell();RefreshRates();}
           if(Bid<=l && TradeHour()) Buy();

}


double LotsOptimized()
  {
   double lot;
   double MINLOT=MarketInfo(Symbol(),MODE_MINLOT);
   double LOTSTEP=MarketInfo(Symbol(),MODE_LOTSTEP);
   double MAXLOT=MarketInfo(Symbol(),MODE_MAXLOT);
   if(Lot>0) {lot=Lot; return(lot);}
   int ml=(int) log10(1/LOTSTEP);
   lot=NormalizeDouble(AccountEquity()/1000*MaximumRisk,ml);
   if(DayOfWeek()==5 && Hour()>=19) lot*=0.25;

   if(lot>MAXLOT) lot=MAXLOT;
   if(lot<MINLOT) lot=MINLOT;
//---- return lot size
   return(lot);
  }

bool TradeHour()
  {
   bool tradehour=false;
   if(Starthour>Endhour && (Hour()>Starthour-1 || Hour()<Endhour)) tradehour=true;
   if(Starthour<Endhour && (Hour()>Starthour-1 && Hour()<Endhour)) tradehour=true;
   return(tradehour);
  }
  
  void CheckOpen(bool &ob,bool &os,int _mag)
  {

   for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==_mag)
        {
         if(OrderType()==OP_BUY)
           {
            ob=true;
           }
         else
         if(OrderType()==OP_SELL)
           {
            os=true;
           }
        }
     }
  }
  
  void Buy()
  {
   if(AccountFreeMarginCheck(Symbol(),OP_BUY,LotsOptimized())<=0 || GetLastError()==134) return;
   bool ob=0,os=0;
   CheckOpen(ob,os,mag);
   if(ob>0 || os>0) return;
   bool o=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,slipage,0,0,NULL,0,0,clrBlue);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Sell()
  {
        if(AccountFreeMarginCheck(Symbol(),OP_SELL,LotsOptimized())<=0 || GetLastError()==134) return;
   bool ob=0,os=0;
   CheckOpen(ob,os,mag);
   if(os>0 || ob>0) return;
   bool o=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,slipage,0,0,NULL,0,0,clrRed);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseBuy()
  {
   int ordtot=OrdersTotal();
   if(ordtot>0)
     {
      for(int cnt=ordtot-1;cnt>=0;cnt--)
        {
         bool o=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
           {
            if(OrderMagicNumber()==mag && OrderType()==OP_BUY && OrderSymbol()==Symbol())
              {
               o=OrderClose(OrderTicket(),OrderLots(),Bid,0,clrBlue);

              }
           }
        }
     }

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseSell()
  {
   int ordtot=OrdersTotal();
   if(ordtot>0)
     {
      for(int cnt=ordtot-1;cnt>=0;cnt--)
        {
         bool o=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
           {
            if(OrderMagicNumber()==mag && OrderType()==OP_SELL && OrderSymbol()==Symbol())
              {
               o=OrderClose(OrderTicket(),OrderLots(),Ask,slipage,clrRed);

              }
           }
        }
     }

  }
 
Dmitiry Ananiev:
 

Как можно ускорить расчеты такого советника через использование буферов ? 

Боюсь, тут особо ускорять нечего. Смысла в буфферах - никакого, в них же надо все равно загружать данные.  Особого простора для оптимизации я не вижу.

Разве что прогнать через профилировщик... Есть в МТ4 профилировщик, я не в курсе ?

 
Dmitiry Ananiev:

Ну вот пример моего первого советника для торговли в ночном канале по еврофунту, который мне принес первую ощутимую прибыль и определил род занятий на много лет.  Советник работает на ТФ М1. Кстати и сейчас еще актуален и показывает прибыль если его немного допилить. В частности добавить обработку расширенного спреда. 

 Как можно ускорить расчеты такого советника через использование буферов ? 

iHighest и iLowest можно не пересчитывать на каждом тике по всем 100 барам, а:

  • посчитать один раз при появлении нового бара и обновлять каждый тик, анализируя только High[0] и Low[0] (по сути, Bid);
  • считать на основе своих массивов high и low, постоянно смещая содержащиеся в них данные.
Это значительно ускорит работу, при оптимизации увидите невооруженным взглядом.

 
Andrey Khatimlianskii:

iHighest и iLowest можно не пересчитывать на каждом тике по всем 100 барам, а:

  • посчитать один раз при появлении нового бара и обновлять каждый тик, анализируя только High[0] и Low[0] (по сути, Bid);
  • считать на основе своих массивов high и low, постоянно смещая содержащиеся в них данные.

Не уверен, что это сильно ускорит обработку. Насколько я знаю, стандартные индикаторы - уже выполняют эту оптимизацию. Впрочем, попробовать можно.

Говорю ж... Профилировщик очень бы помог...

Причина обращения: