Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1161

 
KolyanSNA:
Ciao, come faccio a cambiare la dimensione del carattere nel terminale? Qualcuno può darmi un suggerimento?

Può essere utile cambiare lo zoom nelle impostazioni di visualizzazione del sistema operativo se si ha questa necessità.

 

C'è un modo per determinare dall'OnChartEvent se è stato premuto un pulsante sulla tastiera quando il mouse ha cliccato sul grafico?

 

Per favore, aiutatemi a capire gli indicatori.

Qui, all'apertura di ogni nuova barra dovrebbe esserci un ricalcolo.

Logica - ZigZag dovrebbe collegare i fondi (basso delle ultime 3 barre sotto due adiacenti) e i top (alto delle ultime 3 barre sopra due adiacenti).

Se un picco è seguito da uno nuovo, l'indicatore viene ridisegnato su quello nuovo, quello vecchio viene cancellato, penso sia chiaro.

Infatti, l'indicatore collega tutti i massimi e i minimi in modo sequenziale, qual è il problema?

#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:

Per favore, aiutatemi a capire gli indicatori.

Qui, all'apertura di ogni nuova barra ci dovrebbe essere un ricalcolo.

Logica - ZigZag dovrebbe collegare i fondi (basso delle ultime 3 barre sotto due adiacenti) e i top (alto delle ultime 3 barre sopra due adiacenti).

Se un picco è seguito da uno nuovo, l'indicatore viene ridisegnato su quello nuovo, quello vecchio viene cancellato, penso sia chiaro.

In effetti, l'indicatore collega tutti gli HI e LH in serie, qual è il problema?

Per quanto ho capito, avete 2 buffer di disegno. Entrambi sono disegnati. Ogni buffer ha la sua linea, si ottiene un solo estremo. Ci sono 3 buffer nello zigzag. Due calcolati per i massimi e i minimi separatamente, e uno per disegnare secondo il segno che dopo che i massimi sono stati scritti nel buffer, stiamo cercando il minimo e viceversa.

 
Domanda, c'è una descrizione delle librerie standard per MT4 o no?
 
Valeriy Yastremskiy:

Ho capito che avete due buffer di disegno. Entrambi sono disegnati. Ogni buffer ha la sua linea, si ottiene un estremo. Ci sono 3 buffer nello zigzag. Due buffer di calcolo sono separati per i massimi e i minimi, e un buffer è usato per disegnare dopo l'ultimo massimo scritto nel buffer dei massimi, e viceversa.

Aiuto - lo zigzag è costruito usando 2 buffer, anche l'esempio con 2 buffer

 
Valeriy Yastremskiy:
Domanda, c'è una descrizione delle librerie standard per MT4 o no?
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека MQL5 написана на языке MQL5 и предназначена для облегчения написания программ (индикаторов, скриптов, экспертов) конечным пользователям. Библиотека обеспечивает удобный доступ к большинству внутренних функций MQL5.
 
Artyom Trishkin:

MT4.

Complimenti per gli articoli. Ottimo lavoro.

 
Roman Sharanov:

Aiuto - lo zigzag è costruito su 2 buffer, esempio anche con 2 buffer

Inizio del codice ZZ.

//+------------------------------------------------------------------+
//|                                                       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[];

Un buffer per il disegno. Tre matrici.

Guarda il codice. La logica è complessa. Di solito è difficile da fare al volo.

Codice ZigZag con commenti tradotti in russo
File:
ZigZagRu.mq4  19 kb
 
Valeriy Yastremskiy:

MT4.

Complimenti per gli articoli. Ottimo lavoro.

Non importa - quasi tutto si adatta.

Grazie.

Motivazione: