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

 
Igor Makanu:

Sie haben sie nicht am Anfang oder irgendwo anders initialisiert, sondern nur deklariert

Ich habe vor der Verwendung geschrieben, d.h. wenn Sie die Variablen SredRazmax, SredRazmin, Sredn als Summen von Array-Werten haben, dann müssen Sie, um die Summe korrekt zu berechnen, die Variable auf Null setzen und dann die Array-Werte addieren und sie in dieser Variablen speichern

d.h.

und die zweite, was Sie eine Frage haben, in der Indikator jeder Tick wirdOnCalculate() aufrufenund es bedeutet, dass Sie ständig zählen Tops von ZigZag bei jedem Tick, d.h. etwa 40-60 mal pro Sekunde.

Danke, aber ich habe versucht, sie auf Null zu setzen und versucht,OnStart anstelle vonOnCalculate() zuverwenden, dieWerte springen immer noch und es ist nicht klar für mich, wenn ww=0 (Array-Wert wird immer angezeigt), warum Werte in der Mitte springen, wie man es nicht jeden Tick zählen und nur Werte aus Array zählen lassen?

 
Dmitry Belov:

Danke, aber ich habe versucht, sie auf Null zu setzen undOnStart anstelle vonOnCalculate() zuverwenden.

Ich glaube, ich kann nicht erklären, warum es so passiert, die Sache ist, dass OnStart() in Skripten und OnCalculate() in Indikatoren verwendet wird. Sie sollten den Unterschied zwischen Skripten und Indikatoren in MQL verstehen.

Ich bin nicht ganz klar, was Ihre Aufgabe ist? Sie wollen die Werte von was ausgeben? in den Code, Sie addieren die Preise, bei denen die ZigZag Spitzen auf dem gesamten Chart befinden, in der Ausgabe schreiben Sie "Average Spread" und drucken Sie den Wert(SredRazmax-SredRazmin)/nn, und die Berechnung wird für alle Bars durchgeführt

Wozu brauchen Sie den Indikator, wenn Sie keine Indikatorpuffer zum Zeichnen verwenden? Im Indikator sind die Puffer an die Balken angehängt, und ihre Werte verschieben sich, sobald ein neuer Balken erscheint.

 
Igor Makanu:

Ich denke, ich kann nicht erklären, warum es passiert, der Punkt ist, dass OnStart() in Skripten verwendet wird, und OnCalculate() in Indikatoren, müssen Sie verstehen, wie Skripte von Indikatoren in MQL unterscheiden

Ich bin nicht ganz klar, was Ihre Aufgabe ist? Sie wollen die Werte von was ausgeben? in den Code, addieren Sie die Preise, bei denen die ZigZag Spitzen auf dem gesamten Chart befinden, in der Ausgabe schreiben Sie "Average Spread" und drucken Sie den Wert(SredRazmax-SredRazmin)/nn, und die Berechnung wird für alle Bars durchgeführt

Wozu brauchen Sie einen Indikator, wenn Sie keine Indikatorpuffer zum Zeichnen verwenden? Im Indikator sind die Puffer mit den Balken verbunden und ihre Werte verschieben sich, sobald ein neuer Balken erscheint.

Um ehrlich zu sein, habe ich das Problem vereinfacht (die ursprüngliche Formel sieht ein wenig anders aus), ich dachte, ich könnte verstehen, warum die Werte des Durchschnitts springen, wenn der Nullwert in der Matrix konstant bleibt. Ich habe zwei Schleifen, eine für das Füllen des Arrays, und die andere für die Berechnung des Durchschnitts, gibt es eine Grenze von nn, und ich wollte eigentlich ein Diagramm ausgeben - es ist ein Standard-Zickzack, aber iCustom ist die Hölle aus ihm heraus zu zeichnen, und der Durchschnitt... Vom Nullknoten, wenn er größer ist als der vorherige, subtrahiert man den vorherigen Knoten und vom vorherigen subtrahiert man den vorherigen (er hat ein Minuszeichen, also muss er mit minus 1 multipliziert werden) und all dies wird summiert und durch eine bestimmte Anzahl von nn geteilt. Wir erhalten die durchschnittliche Spannweite der Scheitelpunkte. Außerdem wollte ich andere Durchschnittswerte für Zickzack ermitteln, aber ich blieb bei "springenden" Werten hängen.

Dies ist in etwa der ursprüngliche Zustand:

//+------------------------------------------------------------------+
//|                                                           01.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
extern int nn=30;

int shift, ww=0;
double zz, SredRazmax=0.0; 
double HZZ[];


int OnInit()
  {
//--- indicator buffers mapping
    SetIndexBuffer(0,HZZ);
  SetIndexStyle(0,DRAW_SECTION);
//---
   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[])
  {
//---
  for(shift = 0; shift <= Bars-1; shift++){
      zz = iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, shift);
           if(zz > 0.0)   {
           HZZ[ww]=zz;
            ww++;          }
           else {
           continue;
           }
    }
//---------------------------------------------+
//расчет среднего значения           
//---------------------------------------------+      
  for(ww=0;ww<=nn;ww++){
       if(HZZ[ww]>HZZ[ww+1]){
          SredRazmax += (HZZ[ww]- HZZ[ww+1]);      
         }     
        else if(HZZ[ww]<HZZ[ww+1]){
         SredRazmax += (HZZ[ww]- HZZ[ww+1])*(-1);
        }
        else{
        continue;
           }
     }  
        
  if(SredRazmax>0){    
   
      Comment("Средний размах = ", SredRazmax/nn,",",HZZ[0],",",HZZ[1],",",HZZ[2],",",HZZ[3],",",HZZ[4]);      
        }
   
       
//--- return value of prev_calculated for next call
 return(0);

  
 
  }
 
Dmitry Belov:

Um ehrlich zu sein, habe ich das Problem nur vereinfacht (ursprünglich sieht die Formel etwas anders aus), ich dachte, ich könnte verstehen, warum die Werte des Durchschnitts springen, wenn der Nullwert im Array konstant bleibt. Ich habe zwei Schleifen, eine für das Füllen des Arrays, und die andere für die Berechnung des Durchschnitts, gibt es eine Grenze von nn, und ich wollte eigentlich ein Diagramm als auch ausgeben - es ist ein Standard-Zickzack, aber iCustom zeichnet die Hölle aus ihm heraus, und der Durchschnitt... Vom Nullknoten, wenn er größer ist als der vorherige, subtrahiert man den vorherigen Knoten und vom vorherigen subtrahiert man den vorherigen (er hat ein Minuszeichen, also muss er mit minus 1 multipliziert werden) und all dies wird summiert und durch eine bestimmte Anzahl von nn geteilt. Wir erhalten die durchschnittliche Spannweite der Scheitelpunkte. Außerdem wollte ich andere Durchschnittswerte für Zickzack ermitteln, aber ich blieb bei "springenden" Werten hängen.

Das ist in etwa der ursprüngliche Stand der Dinge:

Ich verstehe es nicht wirklich, es ist spät, ich bin müde, ich habe es so verändert, wie ich es gesehen habe, ich habe Zweifel, wie sich der Indikator bei einem Null-Balken verhält (ich habe es nicht überprüft), aber er zeichnet und zeigt Kommentare gemäß Ihrer Formel an

//+------------------------------------------------------------------+
//|                                                           01.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
extern int nn=30;

int  ww=0;
double zz,SredRazmax;
double HZZ[];
bool up,dn;
double lastzz;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,HZZ);
   SetIndexStyle(0,DRAW_SECTION);
   SetIndexEmptyValue(0,0.0);
   up = false;
   dn = false;
   lastzz=0.0;
   SredRazmax=0.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[])
  {
//---
   int shift,limit;
//--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
   if(prev_calculated==0)
     {
      limit=rates_total-1;
      up = false;
      dn = false;
      lastzz=0.0;
      SredRazmax=0.0;
      ArrayInitialize(HZZ,0.0);
     }
   else limit=rates_total-prev_calculated+1;
   for(shift=limit; shift>=0; shift--)
     {
      zz=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,shift);
      if(zz>0.0)
        {
         HZZ[shift]=zz;
         if(lastzz>zz) {up=true;  dn=false;}
         if(lastzz<zz) {up=false; dn=true;}
         if(up) SredRazmax+=zz-lastzz;
         if(dn) SredRazmax+=(zz- lastzz)*(-1);
         lastzz=zz;
        }
      else HZZ[shift]=0.0;
     }
   Comment("Средний размах = ",SredRazmax/nn,",",HZZ[0],",",HZZ[1],",",HZZ[2],",",HZZ[3],",",HZZ[4]);
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Können Sie mir helfen, ein solches Problem zu lösen? (Wenn möglich.)

Der Expert Advisor gibt unter bestimmten Bedingungen eine Warnung aus. Ist es möglich, das Fenster, das den Alarm ausgelöst hat, ebenfalls aktiv werden zu lassen?

 
Vatal:

Können Sie mir helfen, ein solches Problem zu lösen? (Wenn möglich.)

Der Expert Advisor gibt unter bestimmten Bedingungen eine Warnung aus. Ist es möglich, das Fenster, das den Alarm ausgelöst hat, ebenfalls aktiv werden zu lassen?

In der Dokumentation finden Sie ein Beispiel. Holen Sie sich die ID des Charts, auf dem der EA läuft und gehen Sie...
Примеры работы с графиком - Константы графиков - Константы, перечисления и структуры - Справочник MQL4
Примеры работы с графиком - Константы графиков - Константы, перечисления и структуры - Справочник MQL4
  • docs.mql4.com
В этом разделе представлены примеры для работы со свойствами графика. Для каждого свойства приведены одна или две законченные функции, которые позволяют задавать/получать значение этого свойства. Эти функции можно использовать в своих MQL4 программах как есть. На рисунке показана графическая панель для наглядной демонстрации того, как изменение...
 
Igor Makanu:

Ich habe einige Zweifel, wie sich der Indikator bei einem Null-Balken verhält (ich habe es nicht überprüft), aber er zeichnet und verwendet Ihre Formel, um den Kommentar auszugeben.

Ja, danke für Ihre Zeit, es funktioniert, ich muss etwas falsch gemacht haben. Aber es ist nicht die Ausgabe ein Array in den Kommentar (es sollte nur Scheitelpunkte, richtig?) und zählt falsch mit Minus und Zahl..., die Zickzack hat eine andere Verteilung zwischen Scheitelpunkten. Die Idee ist, den vorhergehenden kleineren Scheitelpunkt vom letzten größeren Scheitelpunkt (der gerade gebildet wird) zu subtrahieren, und vom vorhergehenden kleineren Scheitelpunkt auch den größeren zu subtrahieren, und die Zahl wird mit Minuszeichen sein, wir multiplizieren sie mit (-1) und so weiter, und all dies wird nn-mal summiert und durch nn geteilt, wir erhalten die durchschnittliche Abfahrt. Ungefähr auf 4 Uhren würde dies 1,69 (von bis) auf USDJPY sein. Außerdem wollte ich die durchschnittliche Anzahl der Balken zwischen den Höchstständen berechnen. Ich werde nun versuchen, Ihren Code zu verstehen, was ich falsch gemacht habe, warum er nicht gezeichnet hat und warum er nicht richtig berechnet...

 
Dmitry Belov:
Ja, vielen Dank für Ihre Zeit, es funktioniert wirklich, ich muss etwas falsch gemacht haben. Aber es gibt nicht das Array im Kommentar aus (es sollte nur Scheitelpunkte haben, richtig?) und zählt falsch mit Minus und Zahl..., der Zickzack hat eine andere Verteilung zwischen Scheitelpunkten. Die Idee ist, den vorhergehenden kleineren Scheitelpunkt vom letzten größeren Scheitelpunkt (der gerade gebildet wird) zu subtrahieren, und vom vorhergehenden kleineren Scheitelpunkt auch den größeren zu subtrahieren, und die Zahl wird mit Minuszeichen sein, wir multiplizieren sie mit (-1) und so weiter, und all dies wird nn-mal summiert und durch nn geteilt, wir erhalten die durchschnittliche Abfahrt. Ungefähr auf 4 Uhren würde dies 1,69 (von bis) auf USDJPY sein. Außerdem wollte ich die durchschnittliche Anzahl der Balken zwischen den Höchstständen berechnen. Ich werde nun versuchen, Ihren Code zu verstehen, was ich falsch gemacht habe, warum er nicht gezeichnet hat und warum er nicht richtig berechnet...

Die Tops im Kommentar werden nicht ausgegeben, weil IndikatorpufferHZZ[] kopierte Werte des Indikatorpuffers ZigZag enthält, sonst können wir nicht zeichnen, ich habe bewusst in 2 Bedingungen der Vertex-Erkennung nach oben und unten aufgeteilt:

if(up) SredRazmax+=zz-lastzz;
if(dn) SredRazmax+=(zz- lastzz)*(-1);

Wenn Siemehrere Tops in ZZ benötigen, müssen Sie ein weiteres Array erstellen, um diese Daten zu speichern. Der neue Indikatorpuffer erschwert dies, da alle Arrays, die mit Indikatorpuffern verbunden sind, zusammen mit dem Chart "rutschen", wenn ein neuer Balken erscheint.

ZS: der Code ist mein Beispiel, und ich denke, dass es braucht, um die Schleife zum 1. bar, und nicht auf 0, wird ständig neu berechnen die Werte der SredRazmax, kann ich nicht überprüfen, jetzt kein Terminal in den PC

 
Igor Makanu:

Die Tops im Kommentar werden nicht ausgegeben, weil IndikatorpufferHZZ[] kopierte Werte des Indikatorpuffers ZigZag enthält, sonst können wir nicht zeichnen, ich habe bewusst in 2 Bedingungen der Vertex-Erkennung nach oben und unten aufgeteilt:

Wenn Sieein paar Tops in ZZ benötigen, müssen Sie ein weiteres Array erstellen, um diese Daten zu speichern. Der neue Indikatorpuffer erschwert dies, da alle Arrays, die mit Indikatorpuffern verbunden sind, zusammen mit dem Diagramm "rutschen".

ZS: der Code ist mein Beispiel, und ich denke, dass es brauchen, um die Schleife zum 1. bar, und nicht auf 0, wird ständig neu zu berechnen den Wert der SredRazmax, kann ich nicht überprüfen, jetzt kein Terminal in den PC

Mein Indikator zeigt, sobald er geladen ist, die korrekten Werte an, dann erhöht sich mit jedem Tick der Wert des Durchschnitts, obwohl in den Ausgabewerten des Zickzackfeldes keine Veränderung in den Tops festgehalten wird. Das ist es, was ich nicht verstehen kann, warum ist das so? Mir fehlt es an Erfahrung und Sprachkenntnissen. Ich gebe das Zeichnen auf - es ist ein normales Zickzack, das von iCustum genommen wird (ich verstehe jetzt, dass es ein Array nicht auf dem Graphen überlagern kann, also zeichnet es die Hölle aus ihm heraus.). Das Array wird "kriechen", aber dann werden die Werte einfach neu berechnet, nicht wahr? so verstehe ich Danke... Ich werde es versuchen... Lernen...
 
Wie erklärt man einem EA (Standard-MA), dass man nur kaufen (verkaufen) sollte, wenn sich die Durchschnitte kreuzen, und nicht generell, wenn ma_1>ma_2. Aber er kauft ständig, er kann nicht aufhören