MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 795

 
Alexey Viktorov :
Ekran rengini clrNONE olarak ayarlayın.

Yani, yalnızca bir arabellek çıktısı alabilirsiniz, ancak ayrı bir değişken olamaz mı?

 
psyman :

Yani, yalnızca bir arabellek çıktısı alabilirsiniz, ancak ayrı bir değişken olamaz mı?

Evet, sadece bu şekilde. Ve bir gadget daha, SetIndexLabel(0, ""); öğesini ayarlarsanız kullanışlı olabilir. daha sonra bu değerler veri penceresinde görüntülenmeyecektir. Ve iCustom () işlevleri bile kullanılamayacak
 
Igor Makanu :

Cevapladığınız için teşekkürler.

Anladığım kadarıyla, bir arabellek oluşturmanız ve ardından doldurmanız gerekiyor.

RSI değerlerini ve ardından bu arabelleği iMAOnArray() öğesine besleyin.

Bunu bir danışman için yapan var mı ve danışmanın testleri sırasında alt pencerede görüntülenecek mi?

iCustom aracılığıyla, EA testleri genellikle yavaşlar.

 

Kodu https://www.mql5.com/ru/docs/strings/stringadd referansındaki örnekten aldım ve komut dosyasına ekledim. Yürütme sonucu MQL4 ve MQL5'te benzerdir:


HE       0        22 : 42 : 49.015     Test Script (EURUSD,H1) time for 'c = a + b' = 235 milliseconds, i = 1000000
OH       0        22 : 42 : 50.187     Test Script (EURUSD,H1) time for ' StringAdd (a,b)' = 1156 milliseconds, i = 1000000
EP       0        22 : 42 : 50.781     Test Script (EURUSD,H1) time for ' StringConcatenate (c,a,b)' = 594 milliseconds, i = 1000000


StringAdd() ve StringConcatenate() 'in "+"dan daha hızlı olması gerektiğini düşündüm. Neden değil?

 
Northwest :

iCustom aracılığıyla, EA testleri genellikle yavaşlar.

doğru değil, genellikle tam tersi, çünkü gösterge arabellekleri için bellek tahsisi MQL betiği tarafından değil terminal tarafından gerçekleştirilir, genellikle bu sorunlar göstergede optimal olmayan hesaplama sorunudur, birçok yeni başlayanlar göstergenin bir çağrısında tüm tarihsel verilerin uzunluğunu hesaplar - onay işareti

peki, MQL'nin temellerini zaten anladıysanız, makaleleri okuyun, her şey uzun zamandır yazılmıştır.

https://www.mql5.com/ru/articles/4602


kuzeybatı :

Bunu bir danışman için yapan var mı ve danışmanın testleri sırasında bir alt pencerede görüntülenecek mi?

kimse yapmadı, bir danışmanın bir göstergeden nasıl farklı olduğunu, kimin gösterge tamponlarına sahip olduğunu ve kimin olmadığını, kimin ticaret işlevlerine sahip olduğunu, kimin ....

Not: Bir alt pencere yalnızca bir gösterge oluşturabilir, eğer bir alt pencere oluşturursanız, danışmanı kullanarak bu alt pencereye grafik nesneleri ekleyebilirsiniz https://www.mql5.com/en/docs/constants/objectconstants/enum_object

ZYZY: Bir şablon kullanarak bir alt pencere alabilirsiniz, birkaç ay önce bir konu vardı ama sanırım şimdilik farklı bir işiniz var.

Как перенести расчетную часть любого индикатора в код эксперта
Как перенести расчетную часть любого индикатора в код эксперта
  • www.mql5.com
Когда программист создает советник, который получает сигналы от индикаторов, он всякий раз сталкивается с вопросом: использовать обращение к индикатору или перенести код индикатора в советник? Причины этому могут быть различные: желание сохранить в тайне используемые индикаторы и стратегию в целом, необходимость распространения советника единым...
 
Igor Makanu :

doğru değil, genellikle tam tersi, çünkü gösterge arabellekleri için bellek tahsisi MQL betiği tarafından değil terminal tarafından gerçekleştirilir, genellikle bu sorunlar göstergede optimal olmayan hesaplama sorunudur, birçok yeni başlayanlar göstergenin bir çağrısında tüm tarihsel verilerin uzunluğunu hesaplar - onay işareti

peki, MQL'nin temellerini zaten anladıysanız, makaleleri okuyun, her şey uzun zamandır yazılmıştır.

https://www.mql5.com/ru/articles/4602


kimse yapmadı, bir danışmanın bir göstergeden nasıl farklı olduğunu, kimin gösterge tamponlarına sahip olduğunu ve kimin olmadığını, kimin ticaret işlevlerine sahip olduğunu, kimin ....

Not: Bir alt pencere yalnızca bir gösterge oluşturabilir, eğer bir alt pencere oluşturursanız, danışmanı kullanarak bu alt pencereye grafik nesneleri ekleyebilirsiniz https://www.mql5.com/en/docs/constants/objectconstants/enum_object

ZYZY: Bir şablon kullanarak bir alt pencere alabilirsiniz, birkaç ay önce bir konu vardı ama sanırım şimdilik farklı bir işiniz var.

Üzgünüm. Kendimi doğru ifade edemedim galiba

Alt pencereye gelince, sadece Expert Advisor'ı test etmek istedim, çalışmasını değil.

Danışmanı test etme sürecinde gösterge tablosunda görselleştirme ile ilgili olarak, kullanıyorsanız

yerleşik gösterge işlevleri, test sırasında kolayca çizelgeye çizilirler

danışman Tam olarak bunu demek istedim.

Danışman kodunda yerleşik olarak bulunan gösterge hesaplama kodunuzun bir kısmını kullanırsanız, bu gösterge

Expert Advisor'ın testi sırasında görüntülenmez.

iCustom ile ilgili olarak, danışmanı test etme sürecinde kullanırken, bunlar grafikte gösterilecektir.

herhangi bir gösterge ve gösterge kodu bir danışmanla tek bir ex4'te derlenebilir, ancak buna ihtiyacım yok.

Ben sadece bu konuda iCustom'u aşmanın nasıl mümkün olduğunu bilmek istedim.Ama değilse, o zaman bu da sorun değil.

Ayrıntılı cevap için çok teşekkürler.

 

Burada Artem gösterge şablonunu ortaya koydu, işte OnCalculate'den bir bölüm

 //--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if (rates_total< 4 ) return 0 ;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   if (limit> 1 ) 
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
      limit=rates_total- 1 ;
       // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }

Kullanıyorum, ama bir soru beni rahatsız ediyor))

Neden tam geçmiş hesaplaması için limit=rates_total-1 kullanılıyor da limit=rates_total kullanılmıyor?

 
psyman :

Neden tam geçmiş hesaplaması için limit=rates_total-1 kullanılıyor da limit=rates_total kullanılmıyor?

dizinin hemen dışında bir "uçuş" olup olmayacağını kontrol etmeye çalışın - çubukların sıfırdan ... toplam sayı -1'e numaralandırılması , programlamadaki olağan durum - numaralandırma 0'dan başlar . Açık bir örnek olarak, double x[5] dizisini tanımlayın ve son elemana x[5] = 100;

Not: Henüz sorulmamış bir soruyu yanıtlıyorum .... OrderTotal() ayrıca sıfırdan OrderTotal()-1'e numaralandırıyor ;)

 
Igor Makanu :

Not: Henüz sorulmamış bir soruyu yanıtlıyorum... OrderTotal() da sıfırdan OrderTotal()-1'e numaralandırıyor;)

Soru geçişte ortaya çıktı, şimdi yine dizi üzerinden ortalamayı geçemiyorum, ilk beşte yapıyorum ama hangi konuda yazacağımı bilmiyorum, burada olsun.

Gösterge aç-kapa farkını hesaplar ve buna göre MA oluşturur. Hata ayıklama için MA=2 seçtim ancak SimpleMAOnBuffer ve iMAOnArray kullanırken açıklanamayan satır kaymaları oluyor, iMAOnArray son çubukta sıfır değeri veriyor.


 //+------------------------------------------------------------------+
//|                                                        _null.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_separate_window
#include <MovingAverages.mqh>

#property indicator_buffers 4
#property indicator_plots    2
//--- plot OC
#property indicator_label1    "OC"
#property indicator_type1    DRAW_COLOR_HISTOGRAM
#property indicator_color1    clrSteelBlue , clrRed , clrGreen
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1

#property indicator_label2    "MA1"
#property indicator_type2    DRAW_LINE
#property indicator_color2    clrBrown
#property indicator_style2    STYLE_SOLID
#property indicator_width2    1


//--- indicator buffers
double    OC[], OC_color[], MA1_buf[];
input int MA1= 2 ;

int OnInit ()
  {
  
   IndicatorSetString ( INDICATOR_SHORTNAME , "t1" );
   
   SetIndexBuffer ( 0 ,OC, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,OC_color, INDICATOR_COLOR_INDEX );
   
   SetIndexBuffer ( 2 , MA1_buf, INDICATOR_DATA ); 
   //PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,50);

     
//--- indicator buffers mapping

   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
{

//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if (rates_total< 4 ) return 0 ;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   //if(limit>1) 
   
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
     limit=rates_total- 1 ;
           // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }
   for ( int i=limit; i>= 0 && ! IsStopped (); i--)
     {
       // необходимые действия по расчёту индикатора
     
     OC[i]= fmax (open[i],close[i])- fmin (open[i],close[i]);
     if (OC[i]> 0.001 )
      {   OC_color[i]= 1 ;
      }
      }  
   
 /*  for(int k=limit; k>=0 && !IsStopped(); k--)
     {
   
     MA1_buf[k]=iMAOnArray(OC,0,MA1,k,MODE_SMA,0);
     }
*/
      SimpleMAOnBuffer(rates_total,prev_calculated, 0 ,MA1,OC,MA1_buf);

//--- return value of prev_calculated for next call
   return (rates_total);
  }




double iMAOnArray( double &array[],
                       int total,
                       int period,
                       int ma_shift,
                       int ma_method,
                       int shift)
  {
   double buf[],arr[];
   if (total== 0 ) total= ArraySize (array);
   if (total> 0 && total<=period) return ( 0 );
   if (shift>total-period-ma_shift) return ( 0 );
   switch (ma_method)
     {
       case MODE_SMA :
        {
         total= ArrayCopy (arr,array, 0 ,shift+ma_shift,period);
         if ( ArrayResize (buf,total)< 0 ) return ( 0 );
         double sum= 0 ;
         int     i,pos=total- 1 ;
         for (i= 1 ;i<period;i++,pos--)
            sum+=arr[pos];
         while (pos>= 0 )
           {
            sum+=arr[pos];
            buf[pos]=sum/period;
            sum-=arr[pos+period- 1 ];
            pos--;
           }
         return (buf[ 0 ]);
        }
       case MODE_EMA :
        {
         if ( ArrayResize (buf,total)< 0 ) return ( 0 );
         double pr= 2.0 /(period+ 1 );
         int     pos=total- 2 ;
         while (pos>= 0 )
           {
             if (pos==total- 2 ) buf[pos+ 1 ]=array[pos+ 1 ];
            buf[pos]=array[pos]*pr+buf[pos+ 1 ]*( 1 -pr);
            pos--;
           }
         return (buf[shift+ma_shift]);
        }
       case MODE_SMMA :
        {
         if ( ArrayResize (buf,total)< 0 ) return ( 0 );
         double sum= 0 ;
         int     i,k,pos;
         pos=total-period;
         while (pos>= 0 )
           {
             if (pos==total-period)
              {
               for (i= 0 ,k=pos;i<period;i++,k++)
                 {
                  sum+=array[k];
                  buf[k]= 0 ;
                 }
              }
             else sum=buf[pos+ 1 ]*(period- 1 )+array[pos];
            buf[pos]=sum/period;
            pos--;
           }
         return (buf[shift+ma_shift]);
        }
       case MODE_LWMA :
        {
         if ( ArrayResize (buf,total)< 0 ) return ( 0 );
         double sum= 0.0 ,lsum= 0.0 ;
         double price;
         int     i,weight= 0 ,pos=total- 1 ;
         for (i= 1 ;i<=period;i++,pos--)
           {
            price=array[pos];
            sum+=price*i;
            lsum+=price;
            weight+=i;
           }
         pos++;
         i=pos+period;
         while (pos>= 0 )
           {
            buf[pos]=sum/weight;
             if (pos== 0 ) break ;
            pos--;
            i--;
            price=array[pos];
            sum=sum-lsum+price*period;
            lsum-=array[i];
            lsum+=price;
           }
         return (buf[shift+ma_shift]);
        }
       default : return ( 0 );
     }
   return ( 0 );
  }
 
psyman :

Soru geçişte ortaya çıktı, şimdi yine dizi üzerinden ortalamayı geçemiyorum, ilk beşte yapıyorum ama hangi konuda yazacağımı bilmiyorum, burada olsun.

MQL5'te gösterge arabellekleri ve zaman serileri tersine çevrilir, varsayılan olarak MT5'teki en soldaki çubuk çubuk #0 iken MT4'te en sağdaki çubuk çubuk #0'dır ve gösterge arabellekleri aynı numaralandırılmıştır

Not: ne yazık ki MT5 ile uğraşmak istemiyorum, fikirleri kontrol etmek için yeterli MT4'üm var, sadece MT5'e hazır bakıyorum, MT5'in altına bir şey yazarsam kimseye göstermem)))