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

 
Konstantin Nikitin:

Ja, das ist es, was ich meine. Okay, wir haben es verpasst. Die Hauptsache ist, dass er versteht, was was ist...

Wer ist er? Damit habe ich angefangen.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Alle Fragen von Anfängern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes

Alexey Viktorov, 2019.06.11 09:06

Sie können SymbolInfoInteger nicht verwenden, um Point()) zu erhalten.)

Und im Allgemeinen ist es notwendig, daran zu denken, dass Point() oder _Point nur für das aktuelle Symbol. Für andere Symbole als das, mit dem der EA arbeitet, sollten Sie diese Funktion verwenden.

Die Funktion SymbolInfoInteger liefert nicht nur int-Werte, sondern auch long, bool und Aufzählungen.

Dann meinte er natürlich Digits() oder _Digits und schrieb, was er geschrieben hatte. Und die letzte Zeile der Antwort bezog sich auf den zweiten Teil der Frage. Vergessen Sie nicht das russische Sprichwort: "Ein kluger Mann erzählt nicht, ein Narr rät nicht". geraten und gesagt, es ist also weder das eine noch das andere.
 
Alexey Viktorov:

Может вам очень не повезло, но я не люблю колупаться в чужом коде. Тем более править его...

Alexey Viktorov:

Nächste Frage: Wie oft, glauben Sie, wird der Wert des Indikators genau 50 betragen?

So wie ich das Problem verstanden habe, sollte es eine Farbe >50 und eine andere <=50 sein, aber ==50 habe ich nirgends gesehen. Um im Fall ==50 nicht zu verlieren, sollten wir natürlich >=50 zu einem der beiden und <=50 zu einem anderen hinzufügen. Es könnte besser aussehen.

Und die zweite Frage: Inwieweit war es notwendig, die gesamte Pufferindizierung zu ändern? Haben Sie nach der Neuindizierung alles in Ihrem Code korrigiert? Vielleicht wäre es einfacher, den Farbpuffer auf Index 4 und die Hilfspuffer 5 und 6 entsprechend zu setzen. Sie müssten weniger bearbeiten und hätten weniger Chancen, noch ein paar Fehler zu machen.

  • Danke für die Antwort. Hätte Luby im Code eines anderen herumgeschnüffelt, hätten wir Sie als Experten höchstwahrscheinlich verloren, also ist es in dieser Hinsicht einfach LUCKY.
  • Bei <= oder >= stimme ich zu, Auslassung, natürlich muss eines von beiden vorhanden sein, sobald ich durchlaufe, aber bisher nicht grundsätzlich.
  • Ausprobiert, einen Farbpuffer neu zugewiesen, ganze Gruppen neu zugewiesen, Gruppen vertauscht (oben/unten) - nichts hilft. Ich werde nun den Beitrag beenden und versuchen, einen separaten Histogramm-Indikator ohne Linien zu erstellen. Wenn es funktioniert, werde ich versuchen, sie wieder zu kombinieren. Dies ist eine Frage des Prinzips. Ich möchte keine weißen Flecken des Unverständnisses hinterlassen.

 
Sergey Voytsekhovsky:

  • Ich danke Ihnen für Ihre Antwort. Wenn Lubilee im Code anderer Leute herumgeschnüffelt hätte, hätten wir Sie wahrscheinlich als Experten verloren, also ist es in dieser Hinsicht einfach nur ein Glücksfall.
  • Bei <= oder >= stimme ich zu, Auslassung, natürlich muss eines von beiden vorhanden sein, sobald ich durchlaufe, aber bisher nicht grundsätzlich.
  • Ausprobiert, einen Farbpuffer neu zugewiesen, ganze Gruppen neu zugewiesen, Gruppen vertauscht (oben/unten) - nichts hilft. Ich werde nun den Beitrag beenden und versuchen, einen separaten Histogramm-Indikator ohne Linien zu erstellen. Wenn es funktioniert, werde ich versuchen, sie wieder zu kombinieren. Dies ist eine Frage des Prinzips. Ich möchte keine weißen Flecken des Unverständnisses zurücklassen.

Ich glaube, Sie haben sich den Kopf zerbrochen, als Sie die Pufferindizierung geändert haben.

Gehen Sie zurück und nehmen Sie den alten Code aus Meldung 8806 und ändern Sie nur die Pufferfolge.

   SetIndexBuffer(4,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(5,ExtHighesBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,ExtLowesBuffer,INDICATOR_CALCULATIONS);
Verfolgen Sie dann die Bedingungen, wann es notwendig ist, 0 und wann es notwendig ist, 1 zu setzen
 
Alexey Viktorov:

Sie haben sich wohl nicht allzu viele Gedanken gemacht, als Sie die Pufferindizierung geändert haben.

Gehen Sie zurück und nehmen Sie den alten Code aus Beitrag 8806 und ändern Sie dort nur die Puffersequenz.

Verfolgen Sie dann die Bedingungen, wann 0 und wann 1 in den Farbpuffer geschrieben werden soll

Das habe ich getan, es hat nicht geholfen, ich habe zugegeben, dass ich Fehler gemacht habe, und nach Ihrem Beitrag habe ich es wieder getan. Hier sind die von mir geänderten Codestellen. Die alte Version ist unkommentiert.

//+------------------------------------------------------------------+
//|                                       Stoch_HISTOGRAM_MQL5_4.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots   3

#property indicator_type1   DRAW_LINE       // основная
#property indicator_color1  clrLightSeaGreen
#property indicator_style1  STYLE_SOLID

#property indicator_type2   DRAW_LINE       // сигнальная
#property indicator_color2  clrYellow
#property indicator_style2  STYLE_SOLID

#property indicator_type3   DRAW_COLOR_HISTOGRAM2
#property indicator_color3  clrGreen,clrRed
#property indicator_style3  STYLE_SOLID

#property indicator_width1  3 
#property indicator_width2  2 
#property indicator_width3  1 
//--- input parameters
input int InpKPeriod=5;  // K period
input int InpDPeriod=3;  // D period
input int InpSlowing=3;  // Slowing
//--- indicator buffers
double    ExtMainBuffer[];
double    ExtSignalBuffer[];
double    ColorHistogram_2Buffer1[]; 
double    ColorHistogram_2Buffer2[]; 
     //double    ExtHighesBuffer[];
     //double    ExtLowesBuffer[];
     //double    ColorHistogram_2Colors[];
double    ColorHistogram_2Colors[];
double    ExtHighesBuffer[];
double    ExtLowesBuffer[];
color     colors[]={clrRed,clrGreen};
int       cl;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtMainBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(3,ColorHistogram_2Buffer2,INDICATOR_DATA);
        //SetIndexBuffer(4,ExtHighesBuffer,INDICATOR_CALCULATIONS);
        //SetIndexBuffer(5,ExtLowesBuffer,INDICATOR_CALCULATIONS);
        //SetIndexBuffer(6,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(4,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(5,ExtHighesBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,ExtLowesBuffer,INDICATOR_CALCULATIONS);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- set levels
   IndicatorSetInteger(INDICATOR_LEVELS,3);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,50);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,2,80);
//--- set maximum and minimum for subwindow 
   IndicatorSetDouble(INDICATOR_MINIMUM,0);
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Stoch_HISTOGRAM("+(string)InpKPeriod+","+(string)InpDPeriod+","+(string)InpSlowing+")");
   //PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
   PlotIndexSetString(0,PLOT_LABEL,"Main");
   PlotIndexSetString(1,PLOT_LABEL,"Signal");
        //PlotIndexSetString(2,PLOT_LABEL,"UP");
        //PlotIndexSetString(3,PLOT_LABEL,"LOW");
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpKPeriod+InpDPeriod);
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Stochastic Oscillator                                            |
//+------------------------------------------------------------------+
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 i,k,start;
//--- check for bars count
   if(rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
      return(0);
//---
   start=InpKPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++)
        {
         ExtLowesBuffer[i]=0.0;
         ExtHighesBuffer[i]=0.0;
        }
     }
//--- calculate HighesBuffer[] and ExtHighesBuffer[]
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double dmin=1000000.0;
      double dmax=-1000000.0;
      for(k=i-InpKPeriod+1;k<=i;k++)
        {
         if(dmin>low[k])  dmin=low[k];
         if(dmax<high[k]) dmax=high[k];
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }
//--- %K
   start=InpKPeriod-1+InpSlowing-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtMainBuffer[i]=0.0;
     }
//--- main cycle
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sumlow=0.0;
      double sumhigh=0.0;
      for(k=(i-InpSlowing+1);k<=i;k++)
        {
         sumlow +=(close[k]-ExtLowesBuffer[k]);
         sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
        }
      if(sumhigh==0.0) ExtMainBuffer[i]=100.0;
         else ExtMainBuffer[i]=sumlow/sumhigh*100;
      if(ExtMainBuffer[i]>=50){
         cl=1;
         ColorHistogram_2Buffer1[i]=50; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
      if(ExtMainBuffer[i]<50){
         cl=0;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]=50; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
     }
//--- signal
   start=InpDPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtSignalBuffer[i]=0.0;
     }
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sum=0.0;
      for(k=0;k<InpDPeriod;k++) sum+=ExtMainBuffer[i-k];
      ExtSignalBuffer[i]=sum/InpDPeriod;
     }
//--- OnCalculate done. Return new prev_calculated.
   //PlotIndexSetInteger(2,PLOT_LINE_COLOR,colors[i]);
   return(rates_total);
  }
//+------------------------------------------------------------------+ 

So sah es aus, bevor ich die Änderungen vorgenommen habe. Das Histogramm ist da, die richtige Farbe nicht.

So sieht es jetzt aus. Das Histogramm ist verschwunden, es wird nicht angezeigt.

Ich glaube, ich kann wieder nicht klar denken.


 
Sergey Voytsekhovsky:

Das habe ich gemacht, es hat nicht funktioniert, ich habe Fehler gemacht, nach deinem Beitrag habe ich es noch einmal gemacht. Hier sind die Stellen im Code, die ich geändert habe. Die alte Version ist unkommentiert.

So sah es aus, bevor ich die Änderungen vorgenommen habe. Das Histogramm ist da, die richtige Farbe nicht.

So sieht es jetzt aus. Das Histogramm ist verschwunden, es wird nicht angezeigt.

Ich muss mir wieder den Kopf zerbrechen.


Hier gibt es überhaupt keine Logik. Der Ablauf sollte folgendermaßen sein: Der Histogrammwert wird ermittelt und der i-te Index des Indikatorpuffers wird aufgefüllt. Dann eine separate Prüfung, wenn dieser Wert >=50 ist, wird der Farbpuffer mit 0 aufgefüllt, sonst mit 1. Er wird durch die Farbreihenfolge in der Richtlinie

#property indicator_color3  clrGreen,clrRed

Bei 0 wird die Farbe clrGreen genommen, bei 1 clrRed

Und diese Zeile ist völlig überflüssig, und die Reihenfolge ist das Gegenteil der ersten.

color     colors[]={clrRed,clrGreen};

Und dies

int       cl;

für welchen Zweck hinzugefügt? Es ist einfacher, sie direkt auszufüllen.

ColorHistogram_2Colors[i]=0;
// или 
ColorHistogram_2Colors[i]=1;

Um den Farbpuffer zu füllen, würde ich dieses Konstrukt verwenden

         ColorHistogram_2Colors[i]=ExtMainBuffer[i] >= 50 ? 0 : 1; 
Der Operator ?: ist gleichwertig mit if else, aber einfacher zu verwenden
 
Alexey Viktorov:

Die Logik ist hier im Allgemeinen gebrochen. Der Ablauf sollte folgendermaßen sein: Ermitteln des Histogrammwertes, Ausfüllen des i-ten Index des Indikatorpuffers. Dann eine separate Prüfung, wenn dieser Wert >=50 ist, wird der Farbpuffer mit 0 gefüllt, sonst mit 1. Dies wird durch die Farbreihenfolge in der Direktive

Bei 0 wird die Farbe clrGreen genommen, bei 1 clrRed.

Und diese Zeile ist absolut unnötig, und die Folge ist das Gegenteil der ersten.

Und dies

zu welchem Zweck hinzugefügt? Es ist einfacher, sie direkt auszufüllen.

Um den Farbpuffer zu füllen, würde ich dieses Konstrukt verwenden

Der Operator ?: ist gleichwertig mit if else, aber einfacher zu verwenden

WURRAA, und meine Seele hat gesungen. Alexey, vielen Dank !!!!!

Es hat alles funktioniert, ich verstehe nicht ganz, wie es möglich ist, ohne Array auszukommen.

color     colors[]={clrRed,clrGreen};

weil seine Beschreibung gelöscht wurde. Sie können hier also auf ein zusätzliches Feld verzichten?


 
Sergey Voytsekhovsky:

  • Ich danke Ihnen für Ihre Antwort. Wenn Luby im Code anderer Leute herumgeschnüffelt hätte, hätten wir Sie als Experten höchstwahrscheinlich verloren, also ist es in dieser Hinsicht einfach ein Glücksfall.
  • Bei <= oder >= stimme ich zu, Auslassung, natürlich muss eines von beiden vorhanden sein, sobald ich durchlaufe, aber im Moment ist es keine Frage des Prinzips.
  • Ausprobiert, einen Farbpuffer neu zugewiesen, ganze Gruppen neu zugewiesen, Gruppen vertauscht (oben/unten) - nichts hilft. Ich werde nun den Beitrag beenden und versuchen, einen separaten Histogramm-Indikator ohne Linien zu erstellen. Wenn es funktioniert, werde ich versuchen, sie wieder zu kombinieren. Dies ist eine Frage des Prinzips. Ich möchte keine weißen Flecken des Unverständnisses zurücklassen.

Mein Squeaky ist einfach ein Wunder, er nimmt ihn immer und überall mit hin.

p.s Ich habe immer noch nicht gelernt, wie man das Bild richtig anhängt, bitte entschuldigen Sie mich, ich werde Screenshots posten.

Dateien:
EURUSD.png  52 kb
GBPUSD.png  54 kb
 
Alexey Viktorov:

Um den Farbpuffer zu füllen, würde ich diese Konstruktion verwenden

Der Operator ?: entspricht dem if else-Operator, ist aber einfacher zu verwenden

Tolle Ratschläge und eine tolle Wissenschaft für die Zukunft!!! Er ist sogar noch ein bisschen weiter gegangen. Nachstehend das Ergebnis.

So war es auch:

if(ExtMainBuffer[i]>=50){
         //cl=1;
         ColorHistogram_2Buffer1[i]=50; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=0;
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " # ExtSignalBuffer[i]=",ExtSignalBuffer[i],
           " # ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " # ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " # ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
if(ExtMainBuffer[i]<50){
         //cl=0;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]=50; 
         ColorHistogram_2Colors[i]=1;
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " # ExtSignalBuffer[i]=",ExtSignalBuffer[i],
           " # ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " # ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " # ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 

So wurde es, die Wirksamkeit des Ansatzes ist offensichtlich!!! Ich danke Ihnen.

      ColorHistogram_2Buffer1[i]=ExtMainBuffer[i] >= 50 ? 50 : ExtMainBuffer[i]; 
      ColorHistogram_2Buffer2[i]=ExtMainBuffer[i] >= 50 ? ExtMainBuffer[i] : 50; 
      ColorHistogram_2Colors [i]=ExtMainBuffer[i] >= 50 ? 0 : 1;
         Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
            " # ExtSignalBuffer[i]=",ExtSignalBuffer[i],
            " # ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
            " # ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
            " # ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
 
Sergey Voytsekhovsky:

Tolle Ratschläge und eine tolle Wissenschaft für die Zukunft!!! Er ging sogar noch ein wenig weiter als das. Nachstehend das Ergebnis.

So war es auch:

So wurde es, die Wirksamkeit des Ansatzes ist offensichtlich!!! Ich danke Ihnen.

Das ist nicht effizient - drei if-else-Bedingungen anstelle von einer. Hier ist es noch schlimmer, so wie es ist...

 
Artyom Trishkin:

Hier gibt es keine Effizienz: Es gibt drei if-else-Bedingungen anstelle von einer. Hier ist es noch schlimmer...

Ja, in der Tat, das war mir nicht aufgefallen. Es sieht besser aus, es gibt weniger Buchstaben.

Und es gibt keine Möglichkeit, drei Ausführungen (ich weiß nicht, wie ich es richtig sagen soll) unter einem Operator?: auf einmal zu platzieren?