Оптимизация кода

 

Сделал своего эксперта.

Но есть небольшая проблема. Хотелось бы чтоб оптимизация шла быстрей чем сейчас.

Эксперт использует  в расчетах Зигзаг (последние High и Low, т.е. последний отрезок),  значения High и Low последних 250 баров.

Отслеживается последняя сделка. ( если бай  закрылся по стоплоссу, то сигнал  на бай игнорируется). 

Расчет лота взят из  стандартного эксперта  по мувингу. 

На что обратить внимание в первую очередь для ускорения оптимизации ?  

ООП не используется, библиотечные функции - тоже. 

double Width_Channel()
  {
   double High[],Low[];
   ArraySetAsSeries(Low,true);
   ArrayResize(Low,350);
   int copiedLow=CopyLow(NULL,0,0,349,Low);
   ArraySetAsSeries(High,true);
   ArrayResize(High,350);
   int copiedHigh=CopyHigh(NULL,0,0,349,High);

   double longh = High[ArrayMaximum(High,0,longchannel)];
   double longl = Low[ArrayMinimum(Low,0,longchannel)];
   double shorth = High[ArrayMaximum(High,0,shortchannel)];
   double shortl = Low[ArrayMinimum(Low,0,shortchannel)];
   ushort ChannelPeriod=NormalizeDouble((minChannelPeriod*(longh-longl)/(shorth-shortl)),0);
   d=(High[ArrayMaximum(High,0,ChannelPeriod)]-Low[ArrayMinimum(Low,0,ChannelPeriod)])*om/2; //ширина канала
   //Print (ChannelPeriod, "   ",d);
   //Print (h1l1,"   d=",d,"   longh=",longh,"   longl=",longl,"   shorth=",shorth,"   shortl=",shortl,"  H1=",High[0]);

   return(d);
  }

//находим мин и макс. Зигзага
double zigzag(int ind_buff)
  {

   int copier=CopyBuffer(zzHandle,ind_buff,0,300,zzEx);
   for(int i=299;i>=0;i--)
     {
      if(zzEx[i]>0) {rezult=zzEx[i]; break;}
     }
   return(rezult);
  }
// находим центр канала 
void Channel_Center()
  {
   double  zh,zl;
   zh=zigzag(1);
   zl=zigzag(2);
   h1l1=(zh+zl)/2+(Ask-Bid)/2;
   return;
  }

void Check_History()
  {
   b=1;s=1;
   string  comment="order cooment";
   HistorySelect(0,TimeCurrent());
   int    ord=HistoryOrdersTotal();
   for(int i=ord-1;i>=ord-5;i--)
     {
      ulong ticket=HistoryOrderGetTicket(i);
      if(ticket==0) {b=1; s=1;}

      //  проверяем символ
      if(HistoryOrderGetString(ticket,ORDER_SYMBOL)==_Symbol)
        {
         double price=HistoryOrderGetDouble(ticket,ORDER_PRICE_OPEN);
         bool type=HistoryOrderGetInteger(ticket,ORDER_TYPE);

         ulong ticket1=HistoryOrderGetTicket(i-1);

         bool type1=HistoryOrderGetInteger(ticket1,ORDER_TYPE);
         double sl=HistoryOrderGetDouble(ticket1,ORDER_SL);
         //Print(type,"  ",type1," p=",price," sl=",sl);

         if(type==1 && type1==0 && price!=sl) {b=1; break;}
         if(type==0 && type1==1 && price==sl) {s=0;  break;}

         if(type==0 && type1==1 && price!=sl) {s=1;  break;}
         if(type==1 && type1==0 && price==sl) {b=0; break;}

        }
     }
   return;
  }



double TradeSizeOptimized(void)
  {

   if(Lots>0) {lot=Lots; return(lot);}
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble(_Symbol,SYMBOL_ASK,price))               return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin)) return(0.0);
   if(margin<=0.0)                                               return(0.0);

   lot=NormalizeDouble((AccountInfoDouble(ACCOUNT_FREEMARGIN))*MaximumRisk/margin,2);
   if(DecreaseFactor>0)
     {
      //--- select history for access
      HistorySelect(0,TimeCurrent());
      //---
      int    orders=HistoryDealsTotal();  // total history deals
      int    losses=0;                    // number of losses orders without a break

      for(int i=orders-1;i-10>=0;i--)
        {
         ulong ticket=HistoryDealGetTicket(i);
         if(ticket==0)
           {
            Print("HistoryDealGetTicket failed, no trade history");
            break;
           }
         //--- check symbol
         if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=_Symbol) continue;
         //--- check profit
         double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
         if(profit>0.0) break;
         if(profit<0.0) losses++;
        }
      //---
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);

   double minvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=minvol;

   double maxvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol) lot=maxvol;

//else lot=Lots
   if(lot < SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN)) lot = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   if(lot > SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX)) lot = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   Comment(lot);
   return(lot);

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