Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 695

 
psyman:

Aus irgendeinem Grund kann ich in der Schleife, die um 15 Uhr beginnt, keinen Takt einfangen.

Wenn ich if(i<24) als Bedingung aufschreibe, zeigt das Protokoll die Zeit jedes Balken für den Tag an, aber die erforderliche Bedingung ist nicht erfüllt:


Und in welchem Zeitrahmen lassen Sie den Indikator laufen?

 
psyman:

Sentinel in beiden Fällen.

Es funktioniert:

//+------------------------------------------------------------------+
//|                                                     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;
  }
//+------------------------------------------------------------------+
 

Danke, aber es ist so kompliziert für jemanden, der nicht mit Erfahrung und Wissen belastet ist, dass es ein Durcheinander ist :-)


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

Warum wird bei der Übertragung von Daten in den Puffer einePrüfstunde>0 durchgeführt? Und wenn das nicht der Fall ist, warum dann 0,1 zuweisen?



Ich wollte die Hervorhebung auf Hauptdiagramm zu tun, aber nicht durch eine Linie, sondern durch ordinale Tag der Woche Mon, Wed, Wed ... über SetIndexArrow(0, 140); (vielleicht gibt es einen einfacheren Weg, aber so weit nichts anderes kam), aber aus irgendeinem Grund kann ich nicht machen Ihren Code in Hauptfenster in vier arbeiten, und in fünf keine solche Eigenschaft bereits.

 
psyman:

Danke, aber es ist so kompliziert für jemanden, der nicht mit Erfahrung und Wissen belastet ist, dass es ein Durcheinander ist :-)


Welchen Zweck hat die Überprüfung vonhour>0bei der Übertragung von Daten in den Puffer? Und wenn das nicht der Fall ist, warum dann 0,1 zuweisen?



Ich wollte die Hervorhebung auf Hauptdiagramm zu tun, aber nicht durch eine Linie, sondern durch ordinale Tag der Woche Mon, Wed, Wed ... über SetIndexArrow(0, 140); (vielleicht gibt es einen einfacheren Weg, aber so weit nichts anderes kam), aber aus irgendeinem Grund kann ich nicht machen Ihren Code in Hauptfenster in vier arbeiten, und in fünf keine solche Eigenschaft.

Der Puffer wird mit dem Stundenwert gefüllt. Und wenn die Stunde Null ist, wird das Histogramm nicht gezeichnet. Wir müssen also prüfen, ob die Stunde Null ist (wir haben in den Einstellungen festgelegt, dass nach der Stunde Null gesucht wird), und wenn sie Null ist, müssen wir 0,1 in den Puffer eingeben, nicht den Stundenwert (Null), um die Histogrammspalte anzuzeigen. Dadurch wird im Datenfenster ein Wert von 0 anstelle von 0,1 angezeigt, da das Kennzeichen Stellen auf Null gesetzt ist.

 
psyman:

Danke, aber es ist so kompliziert für jemanden, der nicht mit Erfahrung und Wissen belastet ist, dass es ein Durcheinander ist :-)


Warum wird bei der Übertragung von Daten in den Puffer einePrüfstunde>0 durchgeführt? Und wenn das nicht der Fall ist, warum dann 0,1 zuweisen?



Ich wollte die Hervorhebung auf Hauptdiagramm zu tun, aber nicht durch eine Linie, sondern durch ordinale Tag der Woche Mon, Wed, Wed ... über SetIndexArrow(0, 140); (vielleicht gibt es einen einfacheren Weg, aber so weit nichts anderes kam), aber aus irgendeinem Grund kann ich nicht machen Ihren Code in Hauptfenster in vier arbeiten, und in fünf keine solche Eigenschaft bereits.

PlotIndexSetInteger(0,PLOT_ARROW,140);

Sie müssen jedoch eine Anzahl von Puffern anlegen, die der Anzahl der Wochen entspricht. Und jeder Puffer wird mit einem Pfeilcode von 140 bis 149 versehen - 1,2,3,4,5,6,7,8,9,10 - zehn Wochen reichen für ein Jahr? Das sind nur 70 Tage. Oder wie haben Sie es sich gewünscht?

 
Einen guten Tag an Sie alle!
Bitte um Hilfe!
Dieser BB MACD - Indikator für MetaTrader 4 wurde von mir von hierhttps://www.mql5.com/en/code/9325 heruntergeladen.
Dieser Indikator wird in zwei Zyklen berechnet.
Anhand der Daten des vorherigen MACD-Puffers werden die Bollinger-Bänder berechnet.

Ein Versuch, die Zählrichtung des Hauptzyklus zu ändern und alles auf einmal in einem Zyklus zu berechnen und gleichzeitig die
Gleichzeitig den zusätzlichen Zyklus bei der Berechnung der Bollinger-Bänder loszuwerden, endete in einem Fiasko.
Der Indikator liefert die gleichen Ergebnisse wie sein unberührtes Gegenstück, bremst aber das Terminal bei der Berechnung der Historie stark aus.
Wenn Sie es einen Monat lang laufen lassen, werden Sie es nicht bemerken, aber wenn Sie es 15 Minuten laufen lassen

Ich muss ihn neu starten.

Ich bin mir nicht sicher, was ich damit anfangen soll.

Ich kann fragen, wer vorschlagen kann, wie man die langsamsten Stellen in den Programmen berechnet?

Vielen Dank im Voraus für die Tipps!


Dies ist das Original, und unten ist dasselbe mit meinen Änderungen.

//+------------------------------------------------------------------+
//|                                               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:
Einen guten Tag an Sie alle!
Bitte um Hilfe!
Dieser BB MACD - Indikator für MetaTrader 4 wurde von mir von hierhttps://www.mql5.com/en/code/9325 heruntergeladen.
Dieser Indikator wird in zwei Zyklen berechnet.
Anhand der Daten des vorherigen MACD-Puffers werden die Bollinger-Bänder berechnet.

Ein Versuch, die Zählrichtung des Hauptzyklus zu ändern und alles auf einmal in einem Zyklus zu berechnen und gleichzeitig die
Gleichzeitig den zusätzlichen Zyklus bei der Berechnung der Bollinger-Bänder loszuwerden, endete in einem Fiasko.
Der Indikator liefert die gleichen Ergebnisse wie sein unberührtes Gegenstück, bremst aber das Terminal bei der Berechnung der Historie stark aus.
Wenn Sie es einen Monat lang laufen lassen, werden Sie es nicht bemerken, aber wenn Sie es 15 Minuten laufen lassen

Ich muss ihn neu starten.

Ich bin mir nicht sicher, was ich damit anfangen soll.

Ich kann fragen, wer vorschlagen kann, wie man die langsamsten Stellen in den Programmen berechnet?

Vielen Dank im Voraus für die Tipps!


Dies ist das Original, und unten ist dasselbe mit meinen Änderungen.


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


Geben Sie alles zurück, quälen Sie den Computer nicht

iBandsOnArray, iStdDevOnArray berechnet für in einem Array gespeicherte Daten

Das Array hingegen wird in 1 Schleife gefüllt

 
Alekseu Fedotov:

Legen Sie alles zurück, quälen Sie den Computer nicht

iBandsOnArray, iStdDevOnArray berechnet für in einem Array gespeicherte Daten

Ein Array hingegen wird in 1 Zyklus gefüllt

1. Legen Sie alles zurück, quälen Sie Ihren Computer nicht .

Tut mir leid, aber du bekommst sie nicht zurück. Du musst den Indikator von links nach rechts zählen lassen.

Ich störe ihn nicht, ich benutze ihn für den ihm zugedachten Zweck.

2. iBandsOnArray, iStdDevOnArray berechnet anhand der im Array gespeicherten Daten

Ja, sie werden anhand der Daten aus dem Array bbMacd[] berechnet, was nun?

Das Array wird in einer Schleife gefüllt.

In einer oder in der ersten?

Wollen Sie damit sagen, dass Sie, um ein Array zu füllen, eine eigene Schleife benötigen, in der dieses Array gefüllt wird?

Array gefüllt ist und keine weiteren Operationen durchgeführt werden können?


Für mich ist es wichtig herauszufinden, warum sich der Indikator verlangsamt und wie man die Stellen berechnet, an denen dies geschieht.

Ich habe noch mehr Fragen, aber keine Antworten.

Leider haben Sie keine Anhaltspunkte geliefert.

 

Wie kann ich die Neuinitialisierung deaktivieren, wenn sich der EA-Zeitrahmen ändert?


Hier finden Sie einige Informationen:

EAWenn OnDeinit und OnInit ausgeführt werden, ändert sich das globale Klassenobjekt nicht.

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


Ist dies auch für mql4 korrekt?