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

 
azolotta:
OK, wie überarbeite ich dann den Code, wenn ich z.B. das höchste Hoch aus den letzten 3 Balken (die die Bedingungen in if erfüllen) auswählen und einen Punkt darauf setzen muss (genau auf dieses Hoch!), und dann auch den Tiefpunkt finden muss.

Versuchen Sie es auf diese Weise, aber nicht sicher

//+------------------------------------------------------------------+
//|                                                           AZ.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Anastasiya Zolotareva"
#property link      "insta"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 5
//--- plot myAZ
#property indicator_label1  "myAZ"
#property indicator_color1  Black
#property indicator_color2  Blue
#property indicator_color3  Orange
#property indicator_color4  Blue
#property indicator_color5  Orange
#property indicator_style1 STYLE_SOLID
#property indicator_style2 STYLE_SOLID
#property indicator_style3 STYLE_SOLID
#property indicator_style4 STYLE_SOLID
#property indicator_style5 STYLE_SOLID
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1
#property indicator_width4 1
#property indicator_width5 1

extern int barsToProcess=200; //количество последних баров в истории
//--- indicator buffers
double myAZBuffer[];
double ExtHighBuffer01[];
double ExtLowBuffer01[];
double ExtHighBuffer02[];
double ExtLowBuffer02[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---- drawing settings
   SetIndexStyle(0,DRAW_NONE);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexShift(1,-2);
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexShift(2,-2);
   SetIndexStyle(3,DRAW_ARROW);
   SetIndexShift(3,-3);
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexShift(4,-3);

//--- indicator buffers mapping
   SetIndexBuffer(0,myAZBuffer);
   SetIndexBuffer(1,ExtHighBuffer01);
   SetIndexBuffer(2,ExtLowBuffer01);
   SetIndexBuffer(3,ExtHighBuffer02);
   SetIndexBuffer(4,ExtLowBuffer02);
   IndicatorShortName("AZ");
//---
   return(0);
  }
//+------------------------------------------------------------------+
//|         deinit                                                         |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  return(0);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
   if((rates_total-prev_calculated-barsToProcess)<=0)return(0);
   int limit, val_index;
   if(barsToProcess>0) limit=barsToProcess; 
   else
   limit=rates_total-prev_calculated-barsToProcess-1;
  
   for(int n=limit;n>=0;n--)
     {
      if(Close[n+1]>Open[n+1] && Open[n+2]>=Close[n+2])
        {
         val_index=iLowest(NULL,0,MODE_LOW,3,n+1);
         myAZBuffer[n]=Low[val_index];
         ExtLowBuffer01[n]=Low[val_index];
        }
      else
      if(Open[n+1]>Close[n+1] && Close[n+2]>=Open[n+2])
        {
         val_index=iHighest(NULL,0,MODE_HIGH,3,n+1);
         myAZBuffer[n]=High[val_index];
         ExtHighBuffer01[n]=High[val_index];
        }
      else
      if(Close[n+1]>Open[n+1] && Open[n+3]>Close[n+3])
        {
         val_index=iLowest(NULL,0,MODE_LOW,3,n+1);
         myAZBuffer[n]=Low[val_index];
         ExtLowBuffer02[n]=Low[val_index];
        }
      else
      if(Close[n+1]<Open[n+1] && Close[n+3]>Open[n+3])
        {
         val_index=iHighest(NULL,0,MODE_HIGH,3,n+1);
         myAZBuffer[n]=High[val_index];
         ExtHighBuffer02[n]=High[val_index];
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
MakarFX:

Versuchen Sie es auf diese Weise, aber ich bin mir nicht sicher

Leider ist der Schichtversatz nicht die richtige Option. Ich denke, ich sollte vielleicht versuchen, meinen Code in standard-zigzag einzufügen. Ich versuche es jetzt, aber bis jetzt ohne Erfolg. Was denken Sie, kann ich durch Zickzack gehen? Denn am Ende muss ich Scheitelpunkte abwechselnd verbunden zu finden, wie hoch-niedrig-hoch, und wenn ich eine Option hoch-hoch, oder niedrig-niedrig zu treffen, dann diese zweite Hochs und Tiefs nicht in das Array enthalten, und warten auf das Gegenteil.

 
azolotta:

Leider ist das Schalten nicht möglich. Ich denke, ich sollte vielleicht versuchen, meinen Code in den Standard-Zickzack einzufügen. Jetzt stöbere ich herum, aber bisher ohne Erfolg. Glauben Sie, dass es möglich ist, durch Zickzack zu gehen? Denn am Ende muss ich gefundenen Tops abwechselnd zu verbinden, wie hoch-niedrig-hoch, und wenn ich eine Option hoch-niedrig oder niedrig-niedrig treffen, dann sollten diese zweiten Hochs und Tiefs nicht in Arrays enthalten, und warten auf das Gegenteil.

Nein. Der vorherige sollte auf Null gesetzt werden, und der aktuelle sollte zum Indikatorpuffer hinzugefügt werden.

 
azolotta:

Leider ist der Schichtversatz keine geeignete Option. Ich denke, ich sollte vielleicht versuchen, meinen Code in den Standard-Zickzack einzufügen. Jetzt stöbere ich herum, aber bisher ohne Erfolg. Was denken Sie, kann ich durch Zickzack gehen? Denn am Ende muss ich Scheitelpunkte abwechselnd verbunden zu finden, wie hoch-niedrig-hoch, und wenn ich eine Option hoch-hoch, oder niedrig-niedrig zu treffen, dann diese zweite Hochs und Tiefs nicht in das Array enthalten, und warten auf das Gegenteil.

In jedem Fall wird es eine Verzögerung geben, d.h. bis die Bedingungen für 2-3 vorhergehende Balken erfüllt sind, wird nicht gezeichnet.

Ich verstehe, dass wir einen Zick-Zack-Kurs vom Hoch zum Tiefpunkt benötigen?
 
MakarFX:

In jedem Fall wird es eine Verzögerung geben, d.h. bis die Bedingungen für 2-3 vorhergehende Balken erfüllt sind, wird nicht gezeichnet.

Ich schätze, ich muss im Zickzack von Hochs zu Tiefs wechseln?

Ja, idealerweise brauchen wir einen Zick-Zack-Kurs von Hochs zu Tiefs (also sind diese Hochs und Tiefs in meinen Bedingungen in wenn, und wenn es zwei oder mehr Hochs/Tiefs in einer Reihe gibt, dann sollten diese zweiten Hochs/Tiefs nicht angezeigt werden, und wir sollten auf die Umkehrung warten). Es reicht mir, wenn ich die letzten 6 Tiefst- und 6 Höchststände in meinem Indikator anzeige. Und dann möchte ich diese gefundenen Zick-Zack-Punkte im Skript/Berater für weitere Bedürfnisse aufrufen.

 

Hallo!

Kann mir jemand sagen, warum im Debug-Modus keine Werte angezeigt werden?

Es sieht so aus, als ob nach der Aktualisierung des mt5-Programms das Problem begann

Und was bedeutet Rot in der Spalte - Werte?

 
Mikhail Toptunov:

Hallo!

Kann mir jemand sagen, warum im Debug-Modus keine Werte angezeigt werden?

Es sieht so aus, als ob nach der Aktualisierung des mt5-Programms das Problem begann

Und was bedeutet die rote Farbe des Wertes in der Spalte - Werte?

1. Bitte geben Sie minimale Informationen an (die ersten drei Zeilen der Registerkarte "Journal" nach dem Neustart des Terminals)

2) Aktualisieren des Builds

 
azolotta:

Ja, idealerweise brauchen wir einen Zick-Zack-Kurs von Hochs zu Tiefs (so dass diese Hochs und Tiefs in meinen Bedingungen in wenn sind, und wenn es zwei oder mehr Hochs/Tiefs in einer Reihe gibt, dann sollten diese zweiten Hochs/Tiefs nicht angezeigt werden, sondern auf eine Umkehrung warten). Mir reicht es, wenn die letzten 6 Tiefst- und 6 Höchststände im Indikator angezeigt werden. Und dann möchte ich diese gefundenen Zick-Zack-Punkte im Skript/Berater für weitere Bedürfnisse aufrufen.

Ich bin kein Programmierer und weiß noch nicht, wie ich helfen kann, aber ich werde darüber nachdenken...
 
MakarFX:
Ich bin kein Programmierer und weiß noch nicht, wie ich helfen kann, aber ich werde darüber nachdenken...
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,                                                           |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Возвращает экстремум ЗигЗага по его номеру.                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (      0     - текущий ТФ)              |
//|    ne - номер экстремума           (      0     - последний)               |
//|    dp - ExtDepth                                                           |
//|    dv - ExtDeviation                                                       |
//|    bs - ExtBackstep                                                        |
//+----------------------------------------------------------------------------+
double GetExtremumZZPrice(string sy="", int tf=0, int ne=0, int dp=12, int dv=5, int bs=3) {
  if (sy=="" || sy=="0") sy=Symbol();
  double zz;
  int    i, k=iBars(sy, tf), ke=0;

  for (i=1; i<k; i++) {
    zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, i);
    if (zz!=0) {
      ke++;
      if (ke>ne) return(zz);
    }
  }
  Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден");
  return(0);
}

benutzerdefiniertenZigZag-Indikators und gibt dessen Kursniveau zurück. Die Funktion akzeptiert die folgenden optionalen Parameter:
  • sy- Name des Instruments."" oderNULL- aktuelles Symbol. Der Standardwert istNULL.
  • tf- Zeitrahmen. Standardwert 0- aktuelles Symbol.
  • ne- Extreme Zahl. 0- letzte, 1- vorherige, 2- vorherige, usw.
  • dp,dv,bs- ZigZaga-Parameter: ExtDepth, ExtDeviation, ExtBackstep.

Переход на новые рельсы: пользовательские индикаторы в MQL5
Переход на новые рельсы: пользовательские индикаторы в MQL5
  • www.mql5.com
Я не буду перечислять все новые возможности и особенности нового терминала и языка. Их действительно много, и некоторые новинки вполне достойны освещения в отдельной статье. Вы не увидите здесь кода, написанного по принципам объектно-ориентированного программирования — это слишком серьезная тема для того, чтобы просто быть упомянутой в контексте как дополнительная вкусность для кодописателей. В этой статье остановимся подробней на индикаторах, их строении, отображении, видах, а также особенностях их написания по сравнению с MQL4.
 
Iurii Tokman:

benutzerdefiniertenZigZag-Indikators und gibt dessen Kursniveau zurück. Die Funktion akzeptiert die folgenden optionalen Parameter:
  • sy- Name des Instruments."" oderNULL- aktuelles Symbol. Der Standardwert istNULL.
  • tf- Zeitrahmen. Standardwert 0- aktuelles Symbol.
  • ne- Extreme Zahl. 0- letzte, 1- vorherige, 2- vorherige, usw.
  • dp,dv,bs- ZigZaga-Parameter: ExtDepth, ExtDeviation, ExtBackstep.

dies ist nicht geeignet, Sie brauchen nicht zickzackförmige Extremitäten