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

 
psyman :

Saat 15:00'te başlayan döngüde nedense bara yetişmek mümkün değil.

Koşul olarak if(i<24) yazarsam, günlükte her bir çubuğun günlük zamanı görüntülenir, ancak gerekli koşul karşılanmaz:


Göstergeyi hangi zaman diliminde çalıştırıyorsunuz?

 
psyman :

Her iki durumda da saat.

İşler:

 //+------------------------------------------------------------------+
//|                                                     TestHour.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://mql5.com/ru/users/artmedia70"
#property version    "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots    1
#property strict
//--- plot Hour
#property indicator_label1    "Hour"
#property indicator_type1    DRAW_HISTOGRAM
#property indicator_color1    clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    #ifdef __MQL4__ 2 #else 6 #endif 
//--- input parameters
input uchar     InpHour  =   15 ;   // The required hour
//--- indicator buffers
double          BufferHour[];
//--- global variables
int             hour_req;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- set global variables
   hour_req= int (InpHour> 23 ? 23 : InpHour);
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,BufferHour, INDICATOR_DATA );
//--- setting indicator parameters
   IndicatorSetString ( INDICATOR_SHORTNAME , "Hour(" +( string )hour_req+ ")" );
#ifdef __MQL4__
   SetIndexLabel ( 0 , "Hour(" +( string )hour_req+ ")" );
#else 
   PlotIndexSetString ( 0 , PLOT_LABEL , "Hour(" +( string )hour_req+ ")" );
   ArraySetAsSeries (BufferHour, true );
#endif 
   IndicatorSetInteger ( INDICATOR_DIGITS , 0 );
//---
   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[])
  {
//--- Установка массивов буферов как таймсерий
#ifdef __MQL5__
   ArraySetAsSeries (time, true );
#endif 
//--- Проверка количества доступных баров
   if (rates_total< 1 ) return 0 ;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if (limit> 1 )
     {
      limit=rates_total- 1 ;
       ArrayInitialize (BufferHour, 0 );
     }
//--- Подготовка данных

//--- Расчёт индикатора
   for ( int i=limit; i>= 0 && ! IsStopped (); i--)
     {
       int hour=GetTimeHour(time[i]);
      BufferHour[i]=(hour==hour_req ? (hour>0 ? hour : 0.1) : 0 );
     }

//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
//| Возвращает час указанного времени                                |
//+------------------------------------------------------------------+
int GetTimeHour( const datetime time)
  {
   #ifdef __MQL4__
   return TimeHour (time);
   #endif 
   MqlDateTime tm;
   if (! TimeToStruct (time,tm)) return WRONG_VALUE ;
   return tm.hour;
  }
//+------------------------------------------------------------------+
 

Teşekkür ederim ama deneyim ve bilgi yükü olmayan biri için yazmak çok zor, sadece kapetler :-)


BufferHour[i]=(hour==hour_req ? (hour>0 ? hour : 0.1) : 0 );

Verileri ara belleğe aktarırken neden saat>0'ı kontrol etmelisiniz? Ve değilse, neden 0.1 atanır?



Ana grafiği vurgulamak istedim, ancak bir çizgi ile değil , haftanın sıra günü ile Pzt, Sal, Çar... SetIndexArrow(0, 140); (belki daha kolay bir yolu vardır, ama şu ana kadar başka bir şey çıkmadı), ama nedense ana pencerede dördüncüde kodunuzu çalıştıramıyorum ve ilk beşte var böyle bir mülk yok.

 
psyman :

Teşekkür ederim ama deneyim ve bilgi yükü olmayan biri için yazmak çok zor, sadece kapetler :-)


Verileri ara belleğe aktarırken neden saat>0'ı kontrol etmelisiniz ? Ve değilse, neden 0.1 atanır?



Ana grafiği vurgulamak istedim, ancak bir çizgi ile değil , haftanın sıra günü ile Pzt, Sal, Çar... SetIndexArrow(0, 140); (belki daha kolay bir yolu vardır, ama şu ana kadar başka bir şey çıkmadı), ama nedense ana pencerede dördüncüde kodunuzu çalıştıramıyorum ve ilk beşte var böyle bir mülk yok.

Tampon saatin değeri ile doldurulur. Ve saat sıfırsa, histogram çizilmeyecektir. Bu nedenle, saatin sıfıra eşit olup olmadığını (sıfır saati aramak için ayarladığınız ayarlarda) kontrol etmeniz ve sıfıra eşitse, tampona saatin değerini (sıfır) değil, girin. 0.1 - histogram sütununu görüntülemek için. Bu durumda, göstergenin Rakamları sıfıra ayarlandığından, veri penceresi 0,1 değil 0 değerini gösterecektir.

 
psyman :

Teşekkür ederim ama deneyim ve bilgi yükü olmayan biri için yazmak çok zor, sadece kapetler :-)


Verileri ara belleğe aktarırken neden saat>0'ı kontrol etmelisiniz? Ve değilse, neden 0.1 atanır?



Ana grafiği vurgulamak istedim, ancak bir çizgi ile değil , haftanın sıra günü ile Pzt, Sal, Çar... SetIndexArrow(0, 140); (belki daha kolay bir yolu vardır, ama şu ana kadar başka bir şey çıkmadı), ama nedense ana pencerede dördüncüde kodunuzu çalıştıramıyorum ve ilk beşte böyle bir mülk yok.

PlotIndexSetInteger(0,PLOT_OK,140);

Ancak hafta sayısına eşit sayıda arabellek oluşturmanız gerekir. Ve her arabellek için ok kodunu 140'tan 149'a ayarlayın - 1,2,3,4,5,6,7,8,9,10 - bir yıl için on hafta yeterli mi? Sadece 70 gün. Ya da nasıl istersin?

 
Hepinize iyi günler!
Lütfen yardım et!
Bu BB MACD - buradan indirdiğim MetaTrader 4 göstergesi https://www.mql5.com/en/code/9325
Bu gösterge iki döngüde hesaplanır.İlk döngüde MACD arabelleği ikinci döngüde hesaplanır.
Bir döngüde, önceki MACD arabelleğinden gelen veriler kullanılarak Bollinger Bantları arabellekleri hesaplanır.

Ana döngünün sayma yönlerini değiştirme ve her şeyi bir döngüde bir kerede hesaplama girişimi ve
Bollinger Bantlarını hesaplarken aynı anda ek döngüden kurtulmak fiyaskoyla sonuçlandı.
Gösterge, dokunulmamış karşılığıyla aynı şekilde çizer, ancak geçmişi hesaplarken terminali çılgınca yavaşlatır.
Daha fazla tarih, daha güçlü frenler.

sonra terminal kapanır ve yeniden başlatmanız gerekir.

Lütfen bunun neden olduğunu tavsiye ederek yardım edin, aksi takdirde nereye kazacağımı anlayamıyorum.

Ve belki birileri yöntemi, yavaş çalışan programlarda yerlerin nasıl hesaplanacağını söyler?

tavsiye için şimdiden teşekkürler!


Bu orijinal ve benim değişikliklerimle daha da düşük.

 //+------------------------------------------------------------------+
//|                                               Custom BB_MACD.mq4 |
//|                                     Copyright © 2005, adoleh2000 |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

#property   copyright "Copyright © 2005, adoleh2000"
#property   link        "http://www.metaquotes.net/"
//---- indicator settings
#property   indicator_separate_window
#property   indicator_buffers 4
#property   indicator_color1   Lime     //bbMacd up
#property   indicator_color2   Magenta //bbMacd up
#property   indicator_color3   Blue     //Upperband
#property   indicator_color4   Red     //Lowerband
//---- indicator parameters
extern int FastLen = 12 ;
extern int SlowLen = 26 ;
extern int Length = 10 ;
extern double StDv = 2.5 ;
//----
int loopbegin;
int shift;
double zeroline;
//---- indicator buffers
double ExtMapBuffer1[];   // bbMacd
double ExtMapBuffer2[];   // bbMacd
double ExtMapBuffer3[];   // Upperband Line
double ExtMapBuffer4[];   // Lowerband Line
//---- buffers
double bbMacd[];
double Upperband[];
double Lowerband[];
double avg[];
double bbMacdline;
double sDev;
double mean;
double sumSqr;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- 6 additional buffers are used for counting.
   IndicatorBuffers ( 8 );   
//---- drawing settings     
   SetIndexBuffer ( 0 , ExtMapBuffer1); // bbMacd line
   SetIndexStyle ( 0 , DRAW_ARROW );
   SetIndexArrow ( 0 , 108 );
   IndicatorDigits ( Digits + 1 );
//----
   SetIndexBuffer ( 1 , ExtMapBuffer2); // bbMacd line
   SetIndexStyle ( 1 , DRAW_ARROW );
   SetIndexArrow ( 1 , 108 );
   IndicatorDigits ( Digits + 1 );
//----   
   SetIndexBuffer ( 2 , ExtMapBuffer3); // Upperband line
   SetIndexStyle ( 2 , DRAW_LINE , STYLE_SOLID , 1 );
   IndicatorDigits ( Digits + 1 );
//----   
   SetIndexBuffer ( 3 , ExtMapBuffer4); // Lowerband line
   SetIndexStyle ( 3 , DRAW_LINE , STYLE_SOLID , 1 );
   IndicatorDigits ( Digits + 1 );
//----
   SetIndexBuffer ( 4 , bbMacd);
   SetIndexBuffer ( 5 , Upperband);        
   SetIndexBuffer ( 6 , Lowerband);
   SetIndexBuffer ( 7 , avg);    
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName ( "BB MACD(" + FastLen + "," + SlowLen + "," + Length+ ")" );
   SetIndexLabel ( 0 , "bbMacd" );
   SetIndexLabel ( 1 , "Upperband" );
   SetIndexLabel ( 2 , "Lowerband" );  
//---- initialization done
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom BB_MACD                                                   |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   int counted_bars = IndicatorCounted ();
//---- check for possible errors
   if (counted_bars < 0 ) 
       return (- 1 );
//---- last counted bar will be recounted
   if (counted_bars > 0 ) 
       counted_bars--;
   limit = Bars - counted_bars;
//----
   for ( int i = 0 ; i < limit; i++)
       bbMacd[i] = iMA ( NULL , 0 , FastLen, 0 , MODE_EMA , PRICE_CLOSE , i) - 
                   iMA ( NULL , 0 , SlowLen, 0 , MODE_EMA , PRICE_CLOSE , i);
//----
   for (i = 0 ; i < limit; i++)
     {
       avg[i] = iMAOnArray (bbMacd, 0 , Length, 0 , MODE_EMA , i);
       sDev = iStdDevOnArray (bbMacd, 0 , Length, MODE_EMA , 0 , i);  
       Upperband[i] = avg[i] + (StDv * sDev);
       Lowerband[i] = avg[i] - (StDv * sDev);
       ExtMapBuffer1[i]=bbMacd[i];     // Uptrend bbMacd
       ExtMapBuffer2[i]=bbMacd[i];     // downtrend bbMacd
       ExtMapBuffer3[i]=Upperband[i];   // Upperband
       ExtMapBuffer4[i]=Lowerband[i];   // Lowerband
       //----
       if (bbMacd[i] > bbMacd[i+ 1 ])
           ExtMapBuffer2[i] = EMPTY_VALUE ;
       //----
       if (bbMacd[i] < bbMacd[i+ 1 ])
           ExtMapBuffer1[i] = EMPTY_VALUE ;
     }
//---- done
   return ( 0 );
  }
//+------------------------------------------------------------------+


//================


 //+------------------------------------------------------------------+
//|                                               Custom BB_MACD.mq4 |
//|                                     Copyright © 2005, adoleh2000 |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

/*
Осторожно!!!
В том коде мной изменено направление расчёта главного цикла. Осторожно!!! Этот индикатор очень медленно выполняется!!! Его можно бросить только на недельный или месячный таймфрейм где в истории мало баров, если ниже 4х часов то терминал вешается!!! */ #property   copyright "Copyright © 2005, adoleh2000" #property   link        "http://www.metaquotes.net/" //---- indicator settings #property   indicator_separate_window #property   indicator_buffers 4 #property   indicator_color1   Lime     //bbMacd up #property   indicator_color2   Magenta //bbMacd up #property   indicator_color3   Blue     //Upperband #property   indicator_color4   Red     //Lowerband //---- indicator parameters extern int FastLen = 12 ; extern int SlowLen = 26 ; extern int Length = 10 ; extern double StDv = 2.5 ; //---- int loopbegin; int shift; double zeroline; //---- indicator buffers double ExtMapBuffer1[];   // bbMacd double ExtMapBuffer2[];   // bbMacd double ExtMapBuffer3[];   // Upperband Line double ExtMapBuffer4[];   // Lowerband Line //---- buffers double bbMacd[]; double Upperband[]; double Lowerband[]; double avg[]; double bbMacdline; double sDev; double mean; double sumSqr; //+------------------------------------------------------------------+ //| Custom indicator initialization function                         | //+------------------------------------------------------------------+ int init()   { //---- 6 additional buffers are used for counting.    IndicatorBuffers ( 8 );   //---- drawing settings        SetIndexBuffer ( 0 , ExtMapBuffer1); // bbMacd line    SetIndexStyle ( 0 , DRAW_ARROW );    SetIndexArrow ( 0 , 108 );    IndicatorDigits ( Digits + 1 ); //----    SetIndexBuffer ( 1 , ExtMapBuffer2); // bbMacd line    SetIndexStyle ( 1 , DRAW_ARROW );    SetIndexArrow ( 1 , 108 );    IndicatorDigits ( Digits + 1 ); //----      SetIndexBuffer ( 2 , ExtMapBuffer3); // Upperband line    SetIndexStyle ( 2 , DRAW_LINE , STYLE_SOLID , 1 );    IndicatorDigits ( Digits + 1 ); //----      SetIndexBuffer ( 3 , ExtMapBuffer4); // Lowerband line    SetIndexStyle ( 3 , DRAW_LINE , STYLE_SOLID , 1 );    IndicatorDigits ( Digits + 1 ); //----    SetIndexBuffer ( 4 , bbMacd);    SetIndexBuffer ( 5 , Upperband);            SetIndexBuffer ( 6 , Lowerband);    SetIndexBuffer ( 7 , avg);     //---- name for DataWindow and indicator subwindow label    IndicatorShortName ( "BB MACD-2(" + FastLen + "," + SlowLen + "," + Length+ ")" );    SetIndexLabel ( 0 , "bbMacd" );    SetIndexLabel ( 1 , "Upperband" );    SetIndexLabel ( 2 , "Lowerband" );            //---- initialization done    return ( 0 );   } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function                       | //+------------------------------------------------------------------+ int deinit()   { //----    return ( 0 );   } //+------------------------------------------------------------------+ //| Custom BB_MACD                                                   | //+------------------------------------------------------------------+ int start()   {    int limit, i,MaxPeriod;    int counted_bars = IndicatorCounted (); //---- check for possible errors    if (counted_bars < 0 )        return (- 1 ); //---- last counted bar will be recounted    if (counted_bars > 0 )        counted_bars--;    limit = Bars - counted_bars;              if (counted_bars== 0 ){               for (i= Bars - 1 ; i>= 1 ; i--) bbMacd[i]= 0.0 ; //обнулим первый рассчитываемый массив              MaxPeriod= MathMax ( MathMax (FastLen,SlowLen), Length); //это самые старые бары в истории которые не будем рассчитывать       limit=limit-MaxPeriod;    }    //      //---- основной цикл    for (i=limit; i>= 1 ; i--){ //ЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦ //В этом месте изменено направление пересчёта в основном цикле. //И все расчёты зависимых друг от друга буферов производятся последовательно  в одном цикле. //Дополнительный цикл расчета удалён.        bbMacd[i] = iMA ( NULL , 0 , FastLen, 0 , MODE_EMA , PRICE_CLOSE , i) -                    iMA ( NULL , 0 , SlowLen, 0 , MODE_EMA , PRICE_CLOSE , i);                           avg[i] = iMAOnArray (bbMacd, 0 , Length, 0 , MODE_EMA , i);        sDev = iStdDevOnArray (bbMacd, 0 , Length, MODE_EMA , 0 , i);          Upperband[i] = avg[i] + (StDv * sDev);        Lowerband[i] = avg[i] - (StDv * sDev);        ExtMapBuffer1[i]=bbMacd[i];     // Uptrend bbMacd        ExtMapBuffer2[i]=bbMacd[i];     // downtrend bbMacd        ExtMapBuffer3[i]=Upperband[i];   // Upperband        ExtMapBuffer4[i]=Lowerband[i];   // Lowerband        //----        if (bbMacd[i] > bbMacd[i+ 1 ])            ExtMapBuffer2[i] = EMPTY_VALUE ;        //----        if (bbMacd[i] < bbMacd[i+ 1 ])            ExtMapBuffer1[i] = EMPTY_VALUE ;      } //ЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦ //---- done    return ( 0 );   } //+------------------------------------------------------------------+
BB MACD
BB MACD
  • www.mql5.com
BB_MACD Indicator.
 
Northwest :
Hepinize iyi günler!
Lütfen yardım et!
Bu BB MACD - buradan indirdiğim MetaTrader 4 göstergesi https://www.mql5.com/en/code/9325
Bu gösterge iki döngüde hesaplanır.İlk döngüde MACD arabelleği ikinci döngüde hesaplanır.
Bir döngüde, önceki MACD arabelleğindeki verileri kullanarak Bollinger Bantları arabellekleri hesaplanır.

Ana döngünün sayma yönlerini değiştirme ve her şeyi bir döngüde bir kerede hesaplama girişimi ve
Bollinger Bantlarını hesaplarken aynı anda ek döngüden kurtulmak fiyaskoyla sonuçlandı.
Gösterge, dokunulmamış karşılığıyla aynı şekilde çizer, ancak geçmişi hesaplarken terminali çılgınca yavaşlatır.
Daha fazla tarih, daha güçlü frenler.

sonra terminal kapanır ve yeniden başlatmanız gerekir.

Lütfen bunun neden olduğunu tavsiye edin, aksi takdirde nereye kazacağımı anlayamıyorum.

Ve belki birileri yöntemi, yavaş çalışan programlarda yerlerin nasıl hesaplanacağını söyler?

tavsiye için şimdiden teşekkürler!


Bu orijinal ve benim değişikliklerimle daha da düşük.


//================


Her şeyi geri getir, bilgisayara işkence etme

iBandsOnArray, dizide depolanan veriler üzerinde hesaplanan iStdDevOnArray

Dizi 1 döngüde doldurulur

 
Alekseu Fedotov :

Her şeyi geri getir, bilgisayara işkence etme

iBandsOnArray, dizide depolanan veriler üzerinde hesaplanan iStdDevOnArray

Dizi 1 döngüde doldurulur

1. Her şeyi yerine koyun, bilgisayarınıza eziyet etmeyin .

Üzgünüz, ancak iade edemezsiniz, göstergenin soldan sağa sayması gerekir.

Ve ben ona işkence etmiyorum, onu amacına uygun olarak kullanıyorum.

2. iBandsOnArray, dizide depolanan veriler üzerinde hesaplanan iStdDevOnArray

Evet, bbMacd[] dizisindeki veriler üzerinden hesaplanırlar, peki ya sonra?

3. Dizi 1 döngüde doldurulur

Bir mi yoksa ilk mi?

Bir diziyi doldurmak için, bunun içinde olduğu kişisel bir döngüye ihtiyacınız olduğunu söylemek istiyorsunuz.

dizi dolduruldu ve daha fazla işlem yapılamaz mı?


Göstergenin neden yavaşladığını ve gerçekleştiği yerleri nasıl hesaplayacağımı bulmak benim için önemli.

Daha fazla soru ve cevap yok.

Maalesef öyle demedin.

 

Danışmanın zaman çerçevesini değiştirirken yeniden başlatma nasıl devre dışı bırakılır?


şu var:

danışman OnDeinit ve OnInit çalıştırıldığında, global sınıf nesnesi değişmez .

https://www.mql5.com/ru/forum/170952/page61#comment_6132824


Bu mql4 için de geçerli mi?

Neden: