Diskussion zum Artikel "Von der Grundstufe bis zur Mittelstufe: Indikator (III)"

 

Neuer Artikel Von der Grundstufe bis zur Mittelstufe: Indikator (III) :

In diesem Artikel wird untersucht, wie verschiedene grafische Darstellungsindikatoren wie DRAW_COLOR_LINE und DRAW_FILLING deklariert werden können. Außerdem werden wir natürlich lernen, wie man Charts mit mehreren Indikatoren auf einfache, praktische und schnelle Weise erstellt. Dies kann Ihre Sichtweise auf den MetaTrader 5 und den Markt als Ganzes wirklich verändern.

Im vorherigen Artikel „Vom Anfänger zur Mittelstufe: Indikator (II)“ haben wir viel gelernt, denn es wurde gezeigt, wie man einen gleitenden Durchschnitt auf sehr einfache, praktische und voll funktionsfähige Weise implementiert. Das Gezeigte kann jedoch nur als kurze Einführung in die Welt der MQL5-Programmierung betrachtet werden, da das Material recht grundlegend, einfach und überschaubar ist. Aber wir können noch viel mehr tun.

Bemühen Sie sich also, die hier vorgestellten Konzepte zu verstehen. Kopieren Sie nicht einfach den Code, und denken Sie nicht, dass, wenn Sie es nicht können, es auch niemand anderes kann. Das Verständnis des Konzepts ist wichtiger als das Verständnis des Codes selbst, da der Code je nach Autor variieren kann, während das Konzept konstant bleibt. Wir werden mit etwas sehr Einfachem beginnen, denn was Sie sehen werden, kann sehr komplex werden, wenn wir plötzlich bestimmte Funktionen anwenden.


Autor: CODE X

 
Sehr geehrte Damen und Herren.
Ichversuche, einen benutzerdefinierten Indikator auf Basis von iBand zu erstellen.
Nach langem Suchen habe ich beschlossen, hier zu posten, vielleicht kann mir jemand helfen.
Hier ist der vollständige Indikator.
//Das ist MQL5\Indikatoren\Anhnt\iBand_Display.mq5
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   3

//--- Handlung Mitte
#property indicator_label1  "Middle"
#property indicator_type1   DRAW_LINE

//--- Plot Obere
#property indicator_label2  "Upper"
#property indicator_type2   DRAW_LINE

//--- plot Lower
#property indicator_label3  "Lower"
#property indicator_type3   DRAW_LINE

//==================================================
// Eingabeparameter
//==================================================
input int      InpBBPeriod      = 14;
input ENUM_APPLIED_PRICE inp_Applied_Price   = PRICE_MEDIAN;
input double   InpBBDeviation   = 2.0;
input int      InpBBShift       = 0;

input color    InpMiddleColor   = clrYellow;
input color    InpUpperColor    = clrYellow;
input color    InpLowerColor    = clrYellow;

input int      InpMiddleWidth   = 2;
input int      InpUpperWidth    = 2;
input int      InpLowerWidth    = 2;

input bool inp_BB_Show_Upper   = true;
input bool inp_BB_Show_Middle  = true;
input bool inp_BB_Show_Lower   = true;

input ENUM_LINE_STYLE InpMiddleStyle = STYLE_DOT;
input ENUM_LINE_STYLE InpUpperStyle  = STYLE_DOT;
input ENUM_LINE_STYLE InpLowerStyle  = STYLE_DOT;
//==================================================
#include <Anhnt/Configuration/NamingConfiguration.mqh>
//==================================================
// Indikatorpuffer
//==================================================
double MiddleBuffer[];
double UpperBuffer[];
double LowerBuffer[];

//==================================================
// Globale Variablen
//==================================================
int g_bb_handle = INVALID_HANDLE;

//https://www.mql5.com/de/docs/indicators/ibands
//--- wir behalten die Anzahl der Werte im Bollinger Bands Indikator bei

//+------------------------------------------------------------------+
int OnInit()
{
   //==================================================
   // Puffer einstellen
   //==================================================
   SetIndexBuffer(BASE_LINE,  MiddleBuffer, INDICATOR_DATA);
   SetIndexBuffer(UPPER_BAND, UpperBuffer,  INDICATOR_DATA);
   SetIndexBuffer(LOWER_BAND, LowerBuffer,  INDICATOR_DATA);

   ArraySetAsSeries(MiddleBuffer, true);
   ArraySetAsSeries(UpperBuffer,  true);
   ArraySetAsSeries(LowerBuffer,  true);   

   //================================================== 
   // INPUT-Werte auf Plots anwenden (laufzeitsicherer Weg)
   //==================================================
   PlotIndexSetInteger(BASE_LINE,  PLOT_LINE_COLOR, InpMiddleColor);
   PlotIndexSetInteger(UPPER_BAND, PLOT_LINE_COLOR, InpUpperColor);
   PlotIndexSetInteger(LOWER_BAND, PLOT_LINE_COLOR, InpLowerColor);

   PlotIndexSetInteger(BASE_LINE,  PLOT_LINE_STYLE, InpMiddleStyle);
   PlotIndexSetInteger(UPPER_BAND, PLOT_LINE_STYLE, InpUpperStyle);
   PlotIndexSetInteger(LOWER_BAND, PLOT_LINE_STYLE, InpLowerStyle);

   PlotIndexSetInteger(BASE_LINE,  PLOT_LINE_WIDTH, InpMiddleWidth);
   PlotIndexSetInteger(UPPER_BAND, PLOT_LINE_WIDTH, InpUpperWidth);
   PlotIndexSetInteger(LOWER_BAND, PLOT_LINE_WIDTH, InpLowerWidth);   

   PlotIndexSetInteger(
         BASE_LINE,
         PLOT_DRAW_TYPE,
         inp_BB_Show_Middle ? DRAW_LINE : DRAW_NONE
   );

   PlotIndexSetInteger(
         UPPER_BAND,
         PLOT_DRAW_TYPE,
         inp_BB_Show_Upper ? DRAW_LINE : DRAW_NONE
   );

   PlotIndexSetInteger(
         LOWER_BAND,
         PLOT_DRAW_TYPE,
         inp_BB_Show_Lower ? DRAW_LINE : DRAW_NONE
   );
   string name = SMT_PREFIX + SMT_BB_NAME +
                 "(" + (string)InpBBPeriod + "," +
                 DoubleToString(InpBBDeviation, 1) + ")";  
   
                                   
   IndicatorSetString(INDICATOR_SHORTNAME, name);
   //==================================================
   // iBands-Handle erstellen
   //==================================================
   g_bb_handle = iBands(
      _Symbol,
      _Period,
      InpBBPeriod,
      InpBBShift,
      InpBBDeviation,
      inp_Applied_Price
   );
   if(g_bb_handle == INVALID_HANDLE)
   {
      Print("iBand_Display INIT FAILED. Unable to create iBands handle. GetLastError = ", GetLastError());
      return INIT_FAILED;
   }
      
   Print("iBand_Display INIT SUCCESS");
   return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
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[]
)
{
   //https://www.mql5.com/de/docs/indicators/ibands&amp;nbsp;  
   //--- warten, bis iBands bereit ist
   int calculated = BarsCalculated(g_bb_handle);
   if(calculated <= InpBBPeriod)
      return 0;   
      // Print("DEBUG from OnCalculate After Waiting BarsCalculated | Symbol=", _Symbol,
      // " | Zeitraum=", _Zeitraum,
      // " | BarsCalculated(iBands)=", calculated); 
   //--- Dieser Block wird ausgeführt, wenn der Indikator zum ersten Mal an ein Diagramm angehängt wird
   if(prev_calculated == 0)
   {
      ArrayInitialize(MiddleBuffer, EMPTY_VALUE);
      ArrayInitialize(UpperBuffer,  EMPTY_VALUE);
      ArrayInitialize(LowerBuffer,  EMPTY_VALUE);

      int to_copy = MathMin(calculated, rates_total);

      // Alle verfügbaren Daten auf einmal kopieren
      CopyBuffer(g_bb_handle, BASE_LINE,  0, to_copy, MiddleBuffer);
      CopyBuffer(g_bb_handle, UPPER_BAND, 0, to_copy, UpperBuffer);
      CopyBuffer(g_bb_handle, LOWER_BAND, 0, to_copy, LowerBuffer);
      // Print("DEBUG von OnCalculate First Initial | Symbol=", _Symbol,
      // " | Zeitraum=", _Zeitraum,
      // " | BarsCalculated(iBands)=", calculated);
      return rates_total;    
   }   
   //--- Dieser Block wird bei jedem neuen geöffneten Balken ausgeführt
   if(prev_calculated != rates_total && prev_calculated != 0)
   {
      //==================================================
   // NEXT RUNS:
   // Nur den neuesten Balken (Index 0) aktualisieren.
   // Verschieben Sie Arrays NICHT manuell (die Serie übernimmt das).
   //==================================================
      double tmp[1];
      if(CopyBuffer(g_bb_handle, BASE_LINE, 0, 1, tmp) > 0)
      MiddleBuffer[0] = tmp[0];

      if(CopyBuffer(g_bb_handle, UPPER_BAND, 0, 1, tmp) > 0)
         UpperBuffer[0] = tmp[0];

      if(CopyBuffer(g_bb_handle, LOWER_BAND, 0, 1, tmp) > 0)
         LowerBuffer[0] = tmp[0];
      return rates_total;      
   }  
   return rates_total;
}
//+------------------------------------------------------------------+

bool FillArraysFromBuffers(
   double &base_values  [],   // MiddleBuffer
   double &upper_values [],   // ObererPuffer
   double &lower_values [],   // UntererPuffer
   int shift,                 // shift = 0 → echtzeit
   int ind_handle,
   int amount
)
{
   // ANMERKUNG:
   // Derzeit nicht verwendet.
   // Wie geplant für zukünftige Helfer / EA-Logik aufbewahrt.

   ResetLastError();
   if(CopyBuffer(ind_handle, BASE_LINE,  -shift, amount, base_values) < 0)
      return false;
   if(CopyBuffer(ind_handle, UPPER_BAND, -shift, amount, upper_values) < 0)
      return false;
   if(CopyBuffer(ind_handle, LOWER_BAND, -shift, amount, lower_values) < 0)
      return false;
   return true;
}
Sehr einfach möchte ich nur ermöglichen, dass der Benutzer einzelne Linien wie BASE_LINE,UPPER_BAND,LOWER_BAND und Custom Farbe nuranzeigen oder ausblenden .
Problem 1 ist:
Sie können in Bild anhängen sehen, ich weiß nicht, warum ich grün unter Chart haben.
Dateien:
Problem_1.jpg  217 kb
 
Nguyen Tuấn Anh # :
Karos.
Ich möchte einen persönlichen Indikator auf Basis des iBand erstellen.
Depois de muita pesquisa, decidi postar aqui, talvez alguém possa me ajudar.
Aqui está o indicador completo. Ganz einfach, ich möchte, dass der Benutzer einzelne Linien, wie BASE_LINE, UPPER_BAND, LOWER_BAND und nur eine persönliche Linie anzeigen kann .
O problema 1 é:
Como você pode ver na imagem em anexo, não sei por que há uma área verde embaixo do gráfico.
Diese grünen Linien sind die Lautstärkeanzeige. Um sie zu deaktivieren, müssen Sie die Diagrammeigenschaften öffnen und den Lautstärke-Indikator ausschalten. Oder setzen Sie einfach die Volumenfarbe auf CL_NONE, damit diese grünen Linien verschwinden.