Standart özelliklerin/yaklaşımların alternatif uygulamaları - sayfa 4

 
fxsaber :

Bazen orijinalinden birkaç büyüklük sırası daha hızlı olan CopyTicks varyantı (> 0'dan)

Build 1432 - CopyTicks alternatifi artık geçerli değil.
 
fxsaber :
Build 1432 - CopyTicks'e alternatif artık geçerli değil.

1432 nereden geldi? MetaQuotes-Demo'da en son 1430'a sahibim

 
Alexey Volchanskiy :

1432 nereden geldi? MetaQuotes-Demo'da en son 1430'a sahibim

Ona bir iyilik yaptılar...
 
prostotrader :
Ona bir iyilik yaptılar...

Boşuna gülüyorsun. Bir kere verdiler.

 
Alexey Viktorov :

boşuna gülüyorsun. Bir kere verdiler.

Güldüğümü nereden çıkardın?
 
prostotrader :
Güldüğümü nereden çıkardın?
Öyle görünüyordu.
 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri

fxsaber , 2018.04.16 13:23

Bu seçenek çok daha hızlı (Hata Ayıkla değil Yayınla)

 double StringToDouble2( const string Str, const uint StartPos = 0 )
{
   const uint Size = StringLen (Str);
  
   bool Sign = false ;  
   uint i = StartPos;
  
   while (i < Size)
  {
     const int Digit = Str[i];

     if ((Digit != ' ' ) && (Digit != '\t' ) && (Digit != '\n' ) && (Digit != '\r' ))
    {
       if ((Sign = (Digit == '-' )) || (Digit == '+' ))
        i++;
      
       break ;
    }
      
    i++;
  }

   long Res = 0 ;
   int point = 0 ;
  
   while (i < Size)
  {
     const int Digit = Str[i];
    
     if (!point && (Digit == '.' ))
      point = 1 ;
     else if (((Digit >= '0' ) && (Digit <= '9' )))
    {
      Res = Res * 10 + Digit - '0' ;
      
       if (point)
        point *= 10 ;
    }
     else
       break ;
      
    i++;
  }
  
   if (Sign)
    Res = -Res;
  
   return ((point > 1 ) ? Res / ( double )point : Res); // Возможна потеря точности при делении
}

Hacimsel veriler ayrıştırılırken önemli bir ivme elde edilir.

 
Ortaya çıkan MQL5 koduna birçok basit sistem işlevini doğal olarak yerleştirme fikrine geri döndük ve bu, ortaya çıkan kodun global optimizasyonda kullanılması nedeniyle bunları 1 kat hızlandırmamıza izin verdi.

Bu, NormalizeDouble , dize işlemleri vb. işlevler için geçerlidir.

Önümüzdeki hafta yayınlanacak olan bir sonraki beta sürümünde sunulacak.
 
Renat Fatkhullin :
Ortaya çıkan MQL5 koduna birçok basit sistem işlevini doğal olarak yerleştirme fikrine geri döndük ve bu, ortaya çıkan kodun global optimizasyonda kullanılması nedeniyle bunları 1 kat hızlandırmamıza izin verdi.

TAMAM.

 
fxsaber :

TAMAM.

Tekrar hoşgeldiniz!

ChartXYToTimePrice'a benzer

Tam bir analog değil (parametreler açısından), ancak bana göre bu seçenek daha da kullanışlı ve pratik. Ayrıca daha hızlı (birkaç büyüklük sırası ile).
İşlevsellik açısından, tam bir analog ve hatta daha fazlası çünkü. (orijinal işlevin aksine) X, Y'nin (imleç) bulunduğu alt pencerenin numarasını, eğer -1 ise, pencerenin dışında (alt pencere) döndürür.

Bu analog, mevcut pencerenin dışında bu işlevin kullanımını göremediğim için chart_id ve sub_window giriş parametrelerine sahip değil. Ayrıca, sub_window parametresi genellikle anlaşılmazdır, çünkü değerlerinden bağımsız olarak, orijinal işlev tamamen aynı şekilde çalışır.



 // Fast Analog ChartXYToTimePrice function (https://www.mql5.com/ru/docs/chart_operations/chartxytotimeprice)
int XYToTimePrice( int x, int y, datetime &time, double &price, int id= 0 ) // возвращает номер подокна в котором находится X,Y (курсор), если -1 - то вне окна
  {
   static int left_bar; // номер самого левого бара на экране
   static int Wid;
   static int Hei[ 10 ];
   static double y_min[ 10 ];
   static double y_max[ 10 ];
   static int PerSec= PeriodSeconds ();
   static bool ChartChange= true ;
   static int windowsTotal=( int ) ChartGetInteger ( 0 , CHART_WINDOWS_TOTAL );
   static int Cur_wind=- 1 ;
   static int WidthBar= int ( 1 << ChartGetInteger ( 0 , CHART_SCALE ));
   if (id== CHARTEVENT_CHART_CHANGE ) if (!ChartChange) {ChartChange= true ; return (Cur_wind);}
   if (ChartChange) // если было изменение чатра после последнего вычисления
     {
      windowsTotal=( int ) ChartGetInteger ( 0 , CHART_WINDOWS_TOTAL );
       if (windowsTotal> 10 ) { Print ( "Too many subwindows" ); return (- 1 );}
       for ( int i= 0 ;i<windowsTotal;i++) if (i> 0 ) Hei[i]=( int ) ChartGetInteger ( 0 , CHART_HEIGHT_IN_PIXELS ,i)+Hei[i- 1 ]+ 2 ;
       else Hei[ 0 ]=( int ) ChartGetInteger ( 0 , CHART_HEIGHT_IN_PIXELS , 0 );
      left_bar=( int ) ChartGetInteger ( 0 , CHART_FIRST_VISIBLE_BAR , 0 );         // номер самого левого бара на экране
      Wid=( int ) ChartGetInteger ( 0 , CHART_WIDTH_IN_PIXELS , 0 );               // ширина экрана в пикселях
      WidthBar= int ( 1 << ChartGetInteger ( 0 , CHART_SCALE ));                     // растояние между барами в пикселях
                                                                          
       for ( int i= 0 ;i<windowsTotal;i++)
        {
         y_min[i]= ChartGetDouble ( 0 , CHART_PRICE_MIN , i);                         // макс. цена на экране
         y_max[i]= ChartGetDouble ( 0 , CHART_PRICE_MAX , i);                         // мин. цена на экране
        }
     }
   if (x>(Wid+ 1 ) || x< 0 || y< 0 || y>=(Hei[windowsTotal- 1 ]+ 1 )) return (- 1 );   // выходим если точка (x,y) за пределами экрана
   Cur_wind=- 1 ;
   if (y>= 0 && y<=Hei[ 0 ]) Cur_wind= 0 ;
   else if (windowsTotal> 1 ) for ( int i= 1 ;i<windowsTotal;i++) if (y>(Hei[i- 1 ]+ 1 ) && y<=Hei[i]) { Cur_wind=i; break ; }
   if (Cur_wind>= 0 )
     {
       if (Cur_wind> 0 ) y=y-Hei[Cur_wind- 1 ]- 2 ;
       int hh=Hei[Cur_wind];
       if (Cur_wind> 0 ) hh-=Hei[Cur_wind- 1 ]+ 2 ;
      price=y_min[Cur_wind]+(hh-y)*(y_max[Cur_wind]-y_min[Cur_wind])/hh;

       double NrBar=left_bar-( double )x/( double )WidthBar;
       datetime TT[ 2 ];
       if (NrBar> 0 ) { CopyTime ( NULL , 0 ,( int )NrBar, 2 ,TT); time=TT[ 0 ]+( datetime )((TT[ 1 ]-TT[ 0 ])*( 1.0 -NrBar+( int )NrBar)); }
       else         { CopyTime ( NULL , 0 , 0 , 1 ,TT);          time=TT[ 0 ]+( datetime )( fabs (NrBar)*PerSec); }
     }
   ChartChange= false ;

   return (Cur_wind);
  }


Bu işlev, id parametresi olmadan herhangi bir yerden başlatılabilir, ancak bu işlevin dahili değişkenlerini güncelleme ihtiyacını belirlemek için OnChartEvent'te (id parametresiyle) zorunlu olmalıdır.

Örneğin, işlev OnChartEvent'ten kullanılmıyorsa, OnChartEvent gövdesinde normal işlem için şu satırı eklemeniz gerekir:

 if (id== CHARTEVENT_CHART_CHANGE ) { double p= 0 ; datetime t= 0 ; XYToTimePrice( 0 , 0 ,t,p,id);}
Bu analog, bu işlev yeterince sık kullanıldığında gözle görülür bir kazanç sağlar.
Bir kerelik aramalar için bu analogu kullanmanın bir anlamı yok.
Dosyalar:
TestSpeedXY.mq5  15 kb