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

 
Vladimir Karputov:

Dort:

Danke. Ich werde am Computer sitzen, vielleicht schaue ich mal nach.
 
Artyom Trishkin:
Ich danke Ihnen. Ich werde am Computer sitzen, vielleicht schaue ich mal nach.

der Indikator ist in einem sehr, sehr alten Format für MQL4 geschrieben, ich habe ihn schon lange nicht mehr angefasst, ich bin mir nicht sicher, ob ich noch weiß, wie er geschrieben wurde

@zig2003 als Option, versuchen Sie, IndicatorBuffers(6) aus start() zu entfernen

und oben #property indicator_buffers 6 festlegen

 
Igor Makanu, und nachdem ich den Indikator zu beheben, was muss ich mit dem, was in der EA, um eine Umkehrung zu programmieren zu vergleichen?
Igor Makanu
Igor Makanu
  • www.mql5.com
Стал часто замечать у некоторых пользователей приаттаченные графики баланса из тестера стратегий. Я многое не понимаю, но видимо в этом есть смысл? Это религия? Или все таки работает примета деньги к деньгам... Появился интерес к изучению возможностей Python 3.7.2 Давно не занимался парсингом сайтов, ибо утомительное и неэффективное занятие...
 
zig2003:
Igor Makanu, und nachdem ich den Indikator korrigiert habe, womit sollte ich in meinem Expert Advisor vergleichen, um den Pivot zu programmieren?

jeder Indikator besteht aus mehreren Indikatorpuffern

Wenn Sie den Indikator aus dem Expert Advisor über iCustom() aufrufen, erhalten Sie den Wert eines Puffers für einen bestimmten Balken, und Sie können diesen Wert im Datenfenster Strg+D anzeigen.

was zu vergleichen ist, hängt von Ihrem TS ab, entweder die Werte von Indikatorpuffern oder Puffer und Preis - es gibt viele Varianten

Sie sollten zunächst einen EA erstellen, der den MA verwendet, und dann, wenn Sie den MA verstehen, Ihren Indikator anstelle des MA aufrufen

Es ist gar nicht so einfach - schreiben Sie einfach ein paar Befehle und Ihr Expert Advisor ist fertig


ZS: Ein Pivot-Indikator ist ein Vergleich mehrerer Werte von Indikatorpuffern. Nach Ihrem Screenshot zu urteilen, muss Bar Nr. 2 in der Nähe des Preises von Puffer Nr. 1 liegen und der Rest der Puffer hatEMPTY_VALUE Werte, und auf dem Balken №1, im Gegenteil, Puffer №1 hat den Wert EMPTY_VALUE , und einer von 2 oder 3 Puffern wird den Wert anders als EMPTY_VALUE haben - Sie sollten es alle im Fenster der Datenübersicht sehen (bewegen Sie den Mauspfeil auf den Balken und Sie sehen die Pufferwerte)

 

Igor, danke, ich habe den Indikator korrigiert, aber der Wert aus dem Puffer ist immer noch nicht erschienen. Diese Phase habe ich längst hinter mir gelassen, dort ist alles einfach, es gibt zwei Linien - zwei Puffer. Normalerweise schreibe ich den Code für ähnliche Indikatoren, die aus einer Zeile bestehen, aber mit unterschiedlichen Puffern für die Farben:

//Функция для определения входа и выхода по AMA 
 int Enter()
  {
   double AMAbuy_1  =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 0,1);             //Подключаем AMA для первого бара (buy)
   double AMAsell_1 =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 1,1);             //                                (sell)
   double AMAbuy_2  =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 0,2);             //Подключаем AMA для второго бара (buy)       
   double AMAsell_2 =iCustom(NULL,_Period, "AMA", Range, FastMA,SlowMA,filter,normalizeDigits, 1,2);             //                                (sell)                    
                         
   if(AMAbuy_1>0 && AMAsell_2>0)                                                                                 //Вход в бай
      return(1);                                                                                           
   if(AMAsell_1>0 && AMAbuy_2>0)                                                                                 //Вход в селл
      return(-1);                                                                                          
        
   return(0);
  } 

Dies gilt jedoch nur, wenn jeder Farbe ein echter Puffer zugewiesen wird. Wenn Sie beim ersten geschlossenen Balken die Farbe wechseln, wird der Pufferwert größer als Null, während er beim vorherigen Balken entweder gleich Null war oder der Puffer einer anderen Farbe größer als Null war. Ich kann den Wert für die zweite Verkaufsfarbe nicht aus diesem Indikator ablesen, und es ist unklar, womit ich ihn vergleichen soll, um die Umkehr zu erkennen. Ich habe alle Puffernummern ausprobiert. Dies ist bedauerlich, weil diese Mladenovs Drehscheibe, obwohl alt, aber sehr anständig Trend in der manuellen Strategien.... Kann jemand erraten, wie man den Wert aus dem zweiten Puffer ziehen und schreiben Sie die Formel für die Umkehrung?

 
zig2003:

Igor, danke, ich habe den Indikator korrigiert, aber der Wert aus dem Puffer ist immer noch nicht erschienen. Diese Phase habe ich schon lange hinter mir gelassen, dort ist alles einfach, es gibt zwei Linien - zwei Puffer. Normalerweise schreibe ich den Code für ähnliche Indikatoren, die aus einer Zeile bestehen, aber mit unterschiedlichen Puffern für die Farben:

Dies gilt jedoch nur, wenn jeder Farbe ein echter Puffer zugewiesen ist. Wenn Sie beim ersten geschlossenen Balken die Farbe wechseln, wird der Pufferwert größer als Null, während er beim vorherigen Balken entweder gleich Null war oder der Puffer einer anderen Farbe größer als Null war. Ich kann den Wert für die zweite Farbe nicht aus diesem Indikator ablesen, und ich verstehe nicht, womit ich ihn vergleichen soll, um die Umkehrung zu erkennen. Und das ist bedauerlich, weil diese Mladenovs Indikator, obwohl alt, aber sehr anständig trending in der manuellen Strategie.... Kann jemand herausfinden, wie man die Umkehrung Formel zu schreiben?

Ohne Änderung des Indikators.

Was bedeuten die Daten in den beiden Puffern - in 0 und 1:

  • Wenn es einen Wert in Puffer 0 und keinen Wert in Puffer 1 gibt, ist dies die Richtung, in die man gehen sollte (blaue Indikatorlinie (wenn Standard))
  • Wenn ein Wert in Puffer 0 und ein Wert in Puffer 1 vorhanden ist, handelt es sich um eine kurze Richtung (rote Farbe der Anzeigelinie (wenn Standard))

Änderung der Richtung (Farbe) der Linie:

  • Es gibt immer einen Wert im Puffer 0 und man kann ihn übrigens immer definieren (Vergleich der Werte auf drei Balken: 2<=1 && 1>0 --> unten, 2>=1 && 1<0 --> oben)
    ...
    Sie können aber auch nur Puffer 1 verwenden:
  • Wenn bei Takt 0 kein Wert im Puffer 1 vorhanden ist und bei Takt 1 ein Wert vorhanden ist, ist dies eine Änderung der Kursrichtung auf "Long";
  • Befindet sich ein Wert bei Takt 0 im Puffer 1 und kein Wert bei Takt 1, ist dies ein Wechsel der Kursrichtung auf Short;

"Kein Wert" bedeutet hier EMPTY_VALUE. Oder DBL_MAX - das ist egal, es ist das Gleiche. D.h. es ist nicht Null, sondern EMPTY_VALUE.

 
zig2003:

Kann jemand raten, wie man den Wert aus dem zweiten Puffer zieht und die Pivot-Formel schreibt?

Sie brauchen nicht zu raten, Sie sollten den Indikator zunächst in eine Normalform umschreiben, die dem aktuellen Stand von MQL4 entspricht

Ich habe den Code ein wenig in Ordnung gebracht, aber ich bin mir nicht sicher, ob es keine Fehler geben wird. Ich mag den Quellcode nicht, aber ich habe mit dem gearbeitet, was ich habe.

#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 clrDodgerBlue
#property indicator_color2 clrTomato
#property indicator_color3 clrTomato
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
//----
input int    Range           = 9;
input int    FastMA          = 3;
input int    SlowMA          = 30;
input int    filter          = 25;
input int    normalizeDigits = 4;

input bool   alertsOn        = false;
input bool   alertsOnCurrent = false;
input bool   alertsMessage   = true;
input bool   alertsSound     = true;
input bool   alertsEmail     = false;
input string soundfile       = "alert2.wav";


double Downa[];
double Downb[];
double trend[];
double fAMA[];
double mAMA[];
double AMA[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
{
   SetIndexBuffer(0, fAMA);
   SetIndexLabel(0, "fAMA");
   SetIndexBuffer(1, Downa);
   SetIndexLabel(1, "Downa");
   SetIndexBuffer(2, Downb);
   SetIndexLabel(2, "Downb");
   SetIndexBuffer(3, trend);
   SetIndexLabel(3, "trend");
   SetIndexBuffer(4, mAMA);
   SetIndexLabel(4, "mAMA");
   SetIndexBuffer(5, AMA);
   SetIndexLabel(5, "AMA");
   for (int i=0; i<indicator_buffers; i++) {
      SetIndexStyle(i, DRAW_LINE);
   }
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер входных таймсерий
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime &time[],     // Time
                 const double &open[],       // Open
                 const double &high[],       // High
                 const double &low[],        // Low
                 const double &close[],      // Close
                 const long &tick_volume[],  // Tick Volume
                 const long &volume[],       // Real Volume
                 const int &spread[]         // Spread
                )
{
   int limit;
   if(prev_calculated==0) limit=rates_total-1;
   else limit=rates_total-prev_calculated+1;
   if (trend[limit] == -1) ClearPoint(limit, Downa, Downb);
   double k1 = 2.0 / (SlowMA + 1);
   double k2 = 2.0 / (FastMA + 1) - k1;
   for(int i = limit; i>= 0; i--) {
      double sdAMA = 0;
      double Noise = 0;
      for(int k=0; k<Range; k++) Noise += MathAbs(Close[i+k] - Close[i+k+1]);
      double ER    = 0;
      if(Noise != 0) ER = MathAbs(Close[i] - Close[i+Range]) / Noise;
      double SSC   = (ER*k2+k1);



      AMA[i]  = AMA[i+1] + NormalizeDouble(SSC*SSC*(Close[i] - AMA[i+1]), normalizeDigits);
      mAMA[i] = AMA[i];

      if(filter < 1) fAMA[i] = mAMA[i];
      else {
         for(k = i; k <= i + SlowMA - 1; k++)  sdAMA = sdAMA + MathAbs(mAMA[k] - mAMA[k+1]);
         double dAMA  = mAMA[i] - mAMA[i+1];
         if(dAMA >= 0)
            if(dAMA < NormalizeDouble(filter*sdAMA/(100*SlowMA), 4) &&  High[i] <= High[Highest(NULL, 0, MODE_HIGH, 4, i)]+10*Point)
               fAMA[i] = fAMA[i+1];
            else   fAMA[i] = mAMA[i];
         else if(MathAbs(dAMA) < NormalizeDouble(filter*sdAMA/(100*SlowMA), 4) && Low[i] > Low[Lowest(NULL, 0, MODE_LOW, 4, i)]-10*Point)
            fAMA[i] = fAMA[i+1];
         else  fAMA[i] = mAMA[i];
      }

      Downa[i] = EMPTY_VALUE;
      Downb[i] = EMPTY_VALUE;
      trend[i] = trend[i+1];
      if (fAMA[i]> fAMA[i+1]) trend[i] =1;
      if (fAMA[i]< fAMA[i+1]) trend[i] =-1;
      if (trend[i]==-1) PlotPoint(i, Downa, Downb, fAMA);
   }

//


   if (alertsOn) {
      if (alertsOnCurrent)
         int whichBar = 0;
      else     whichBar = 1;
      if (trend[whichBar] != trend[whichBar+1])
         if (trend[whichBar] == 1)
            doAlert("buy");
         else  doAlert("sell");
   }
   return(rates_total);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void doAlert(string doWhat)
{
   static string   previousAlert="nothing";
   static datetime previousTime;
   string message;

   if (previousAlert != doWhat || previousTime != Time[0]) {
      previousAlert  = doWhat;
      previousTime   = Time[0];

      //
      //


      message =  StringConcatenate(Symbol(), " at ", TimeToStr(TimeLocal(), TIME_SECONDS), " AMA STL_Color ", doWhat);
      if (alertsMessage) Alert(message);
      if (alertsEmail)   SendMail(StringConcatenate(Symbol(), " AMA STL_Color "), message);
      if (alertsSound)   PlaySound(soundfile);
   }
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ClearPoint(int i, double& first[], double& second[])
{
   if ((second[i]  != EMPTY_VALUE) && (second[i+1] != EMPTY_VALUE))
      second[i+1] = EMPTY_VALUE;
   else if ((first[i] != EMPTY_VALUE) && (first[i+1] != EMPTY_VALUE) && (first[i+2] == EMPTY_VALUE))
      first[i+1] = EMPTY_VALUE;
}
void PlotPoint(int i, double& first[], double& second[], double& from[])
{
   if (first[i+1] == EMPTY_VALUE)
      if (first[i+2] == EMPTY_VALUE) {
         first[i]  = from[i];
         first[i+1]  = from[i+1];
         second[i] = EMPTY_VALUE;
      }
      else  {
         second[i] = from[i];
         second[i+1] = from[i+1];
         first[i]  = EMPTY_VALUE;
      }
   else     {
      first[i]  = from[i];
      second[i]   = EMPTY_VALUE;
   }
}
//+------------------------------------------------------------------+

Hier sehe ich die Werte der Indikatorpuffer dieses Indikators:


 
Leute, ich danke euch für die Tipps. InsbesondereIgor Makanu. Ja, ich habe in der Tat 6 Puffer anstelle der drei Standardpuffer erstellt, und die Werte 1 und -1 erschienen in einem der Puffer, aber nicht in den Originalpuffern. Deshalb konnte ich die Werte nicht herausbekommen. Und ich selbst wäre nie darauf gekommen. Jetzt ist alles wieder normal. Alles funktioniert. Igor, vielen Dank auch für die Destillation des Indikators in das neue Format und nochmals vielen Dank für Ihr Wissen!!!
Igor Makanu
Igor Makanu
  • www.mql5.com
Стал часто замечать у некоторых пользователей приаттаченные графики баланса из тестера стратегий. Я многое не понимаю, но видимо в этом есть смысл? Это религия? Или все таки работает примета деньги к деньгам... Появился интерес к изучению возможностей Python 3.7.2 Давно не занимался парсингом сайтов, ибо утомительное и неэффективное занятие...
 
Igor Makanu:

Sie müssen nicht raten, sondern zuerst den Indikator in eine Normalform umschreiben, die dem aktuellen Stand der MQL4-Sprache entspricht

Ich habe den Code ein wenig in Ordnung gebracht, aber ich bin nicht sicher, dass es keine Fehler geben wird, ich mag den Quellcode nicht, aber ich habe mit dem gearbeitet, was ich habe

Hier sehe ich die Werte der Indikatorpuffer dieses Indikators:

Es funktioniert ohne Überschreiben und macht es sehr einfach, an Ihre Daten zu gelangen. Ich habe ihn oben beschrieben - Sie müssen sich nur seine Pufferwerte im Datenfenster ansehen (Strg+D)

 
Artyom Trishkin:

Es funktioniert ohne Umschreiben und erlaubt es, seine Daten sehr einfach zu empfangen. Ich habe ihn oben beschrieben - Sie müssen sich nur seine Pufferwerte im Datenfenster ansehen (Strg+D)

Ich habe oben geschrieben, dass ich mich nicht daran erinnere, wie die Funktion IndicatorCounted() in alten Indikatoren funktioniert, die neue Form der Indikatoren mit OnCalculate() ist verständlicher

Nun, das Problem scheint gelöst zu sein, alles klar ;)