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

 
KolyanSNA:
Hallo! Wie kann ich die Schriftgröße im Terminal ändern? Kann mir jemand einen Tipp geben?

Es kann hilfreich sein, den Zoom in den Anzeigeeinstellungen des Betriebssystems zu ändern, wenn Sie einen solchen Bedarf haben.

 

Gibt es eine Möglichkeit, aus dem OnChartEvent zu ermitteln, ob eine Taste auf der Tastatur gedrückt wurde, als die Maus auf die Grafik geklickt hat?

 

Bitte helfen Sie mir, die Indikatoren zu verstehen.

Hier sollte bei der Eröffnung eines jeden neuen Balkens eine Neuberechnung erfolgen.

Logik - ZigZag sollte Tiefststände (Tief der letzten 3 Balken unter zwei benachbarten) und Höchststände (Hoch der letzten 3 Balken über zwei benachbarten) verbinden.

Wenn auf einen Peak ein neuer Peak folgt, wird der Indikator auf dem neuen Peak neu gezeichnet, der alte Peak wird gelöscht, ich denke, das ist klar.

In der Tat verbindet der Indikator alle Hochs und Tiefs sequentiell, wo liegt das Problem?

#property indicator_chart_window
#property indicator_buffers 2 
#property indicator_plots   1 
//--- plot ZigZag 
#property indicator_label1  "ZigZag" 
#property indicator_type1   DRAW_ZIGZAG 
#property indicator_color1  clrBlue 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 
//--- indicator buffers 
double         ZigZagBuffer1[]; 
double         ZigZagBuffer2[]; 
double a = 0;
int last = 0; //В последний раз была вершина или низина 
int lastN = 0; //Номер бара с экстремумом
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit() 
  { 
//--- связывание массивов и индикаторных буферов 
   SetIndexBuffer(0,ZigZagBuffer1,INDICATOR_DATA); 
   SetIndexBuffer(1,ZigZagBuffer2,INDICATOR_DATA); 
//--- значение 0 (пустое значение) не будет участвовать в отрисовке 
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0); 
   ArrayInitialize(ZigZagBuffer1, EMPTY_VALUE);
   ArrayInitialize(ZigZagBuffer2, EMPTY_VALUE);
//--- значение 0 (пустое значение) не будет участвовать в отрисовке 
   PlotIndexSetString(0,PLOT_LABEL,"ZigZag1;ZigZag2"); 
//--- 
   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[]) 
{ 
   if(a != iOpen(_Symbol, PERIOD_CURRENT, 0))
   {
      a = iOpen(_Symbol, PERIOD_CURRENT, 0);
      for(int i = Bars(_Symbol, PERIOD_CURRENT) - 3; i > 0; i--)
      {
         if(high[i] <= high[i+1] && high[i+2] <= high[i+1] && low[i] >= low[i+1] && low[i+2] >= low[i+1]) //В обе стороны на одном баре
         {
            if(last == 0) continue; //Если с этого начинается расчет - пропускаем просто
            if(last == 1) //Если была вершина
            {
               if(high[lastN] > high[i+1])//Если новая верщина не перебила старую
               {
                  ZigZagBuffer1[i+1] = high[i+1];
                  ZigZagBuffer2[i+1] = low[i+1];
                  lastN = i+1;
                  continue;
               }
               //Если перебила
               ZigZagBuffer1[lastN] = EMPTY_VALUE;
               ZigZagBuffer1[i+1] = high[i+1];
               ZigZagBuffer2[i+1] = low[i+1];
               last = -1;
               lastN = i+1;
               continue;
            }
            if(last == -1)
            {
               if(low[lastN] < low[i+1])//Если новая низина не перебила старую
               {
                  ZigZagBuffer1[i+1] = high[i+1];
                  ZigZagBuffer2[i+1] = low[i+1];
                  lastN = i+1;
                  continue;
               }
               //Если перебила
               ZigZagBuffer2[lastN] = EMPTY_VALUE;
               ZigZagBuffer1[i+1] = high[i+1];
               ZigZagBuffer2[i+1] = low[i+1];
               last = 1;
               lastN = i+1;
               continue;
            }
         }
         if(high[i] <= high[i+1] && high[i+2] <= high[i+1]) //Новая вершина
         {
            if(last == 0)
            {
               last = 1;
               lastN = i+1;
               ZigZagBuffer1[i+1] = high[i+1];
               continue;
            }
            if(last == 1)
            {
               ZigZagBuffer1[lastN] = EMPTY_VALUE;
               ZigZagBuffer1[i+1] = high[i+1];
               lastN = i+1;
               continue;
            }
            if(last == -1)
            {
               ZigZagBuffer1[i+1] = high[i+1];
               lastN = i+1;
               last = 1;
               continue;
            }
         }
         if(low[i] >= low[i+1] && low[i+2] >= low[i+1])//Новая низина
         {
            if(last == 0)
            {
               last = -1;
               lastN = i+1;
               ZigZagBuffer2[i+1] = low[i+1];
               continue;
            }
            if(last == -1)
            {
               ZigZagBuffer2[lastN] = EMPTY_VALUE;
               ZigZagBuffer2[i+1] = low[i+1];
               lastN = i+1;
               continue;
            }
            if(last == 1)
            {
               ZigZagBuffer2[i+1] = low[i+1];
               lastN = i+1;
               last = -1;
               continue;
            }
         }
      }
   }
   
   return(rates_total); 
} 
Обработчик события "новый бар"
Обработчик события "новый бар"
  • www.mql5.com
Для создателей индикаторов и экспертов всегда был актуален вопрос написания экономичного кода с точки зрения времени выполнения. Можно подойти к решению этой задачи с разных сторон. Из этой обширной темы в данной статье будет затронут, казалось бы уже решенный вопрос: проверка появления нового бара. Это достаточно популярный способ ограничения...
 
Roman Sharanov:

Bitte helfen Sie mir, die Indikatoren zu verstehen.

Hier sollte bei der Eröffnung eines jeden neuen Balkens eine Neuberechnung erfolgen.

Logik - ZigZag sollte Tiefststände (Tief der letzten 3 Balken unter zwei benachbarten) und Höchststände (Hoch der letzten 3 Balken über zwei benachbarten) verbinden.

Wenn auf einen Peak ein neuer Peak folgt, wird der Indikator auf dem neuen Peak neu gezeichnet, der alte Peak wird gelöscht, ich denke, das ist klar.

Der Indikator schaltet alle HI und LH in Reihe, wo liegt das Problem?

Soweit ich weiß, haben Sie 2 Zeichenpuffer. Sie sind beide gezeichnet. Jeder Puffer hat seine eigene Zeile, Sie erhalten ein Extremum. Es gibt 3 Puffer im Zickzack. Zwei berechnete für Maxima und Minima getrennt, und eine für das Zeichnen nach dem Vorzeichen, dass wir nach dem Schreiben der Maxima in den Puffer nach dem Minimum suchen und umgekehrt.

 
Frage, gibt es eine Beschreibung der Standardbibliotheken für MT4 oder nicht?
 
Valeriy Yastremskiy:

Ich habe gehört, dass Sie zwei Zeichenpuffer haben. Beide sind unentschieden. Jeder Puffer hat seine eigene Zeile, Sie erhalten ein Extrem. Es gibt 3 Puffer im Zickzack. Es gibt zwei getrennte Berechnungspuffer für Maxima und Minima, und ein Puffer wird zum Zeichnen nach dem letzten in den Maxima-Puffer geschriebenen Maximum verwendet und umgekehrt.

Hilfe - Zickzack wird mit 2 Puffern gebaut, Beispiel auch mit 2 Puffern

 
Valeriy Yastremskiy:
Frage, gibt es eine Beschreibung der Standardbibliotheken für MT4 oder nicht?
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека MQL5 написана на языке MQL5 и предназначена для облегчения написания программ (индикаторов, скриптов, экспертов) конечным пользователям. Библиотека обеспечивает удобный доступ к большинству внутренних функций MQL5.
 
Artyom Trishkin:

MT4.

Vielen Dank für die Artikel. Großartige Arbeit.

 
Roman Sharanov:

Hilfe - Zickzack wird über 2 Puffer gebaut, Beispiel auch mit 2 Puffern

Beginn des ZZ-Codes.

//+------------------------------------------------------------------+
//|                                                       ZigZag.mq4 |
//|                   Copyright 2006-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "2006-2014, MetaQuotes Software Corp."
#property link      "http://www.mql4.com"
#property strict

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1  Red
//---- indicator parameters
input int InpDepth=12;     // Depth
input int InpDeviation=5;  // Deviation
input int InpBackstep=3;   // Backstep
//---- indicator buffers
double ExtZigzagBuffer[];
double ExtHighBuffer[];
double ExtLowBuffer[];

Ein Zeichenpuffer. Drei Arrays.

Sehen Sie sich den Code an. Die Logik ist komplex. Das ist in der Regel schwer zu bewerkstelligen, wenn die Zeit drängt.

ZigZag-Code mit ins Russische übersetzten Kommentaren
Dateien:
ZigZagRu.mq4  19 kb
 
Valeriy Yastremskiy:

MT4.

Vielen Dank für die Artikel. Großartige Arbeit.

Das macht nichts - fast alles passt.

Ich danke Ihnen.

Grund der Beschwerde: