Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1161

 
KolyanSNA:
Olá! Como posso mudar o tamanho da fonte no terminal? Alguém pode me dar uma dica?

Pode ajudar a mudar o zoom nas configurações do display do sistema operacional, se você tiver tal necessidade.

 

Há alguma maneira de determinar a partir do OnChartEvent se um botão foi pressionado no teclado quando o mouse clicou sobre o gráfico?

 

Por favor, ajude-me a entender os indicadores.

Aqui, na abertura de cada novo bar deve haver um recálculo.

Lógica - ZigZag deve conectar fundos (baixa das últimas 3 barras abaixo de duas adjacentes) e superiores (alta das últimas 3 barras acima de duas adjacentes).

Se um pico é seguido por um novo, o indicador é redesenhado no novo, o antigo é apagado, acho que é claro.

Na verdade, o indicador conecta todos os altos e baixos sequencialmente, qual é o 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:

Por favor, ajude-me a entender os indicadores.

Aqui, na abertura de cada novo bar deve haver um recálculo.

Lógica - ZigZag deve conectar fundos (baixa das últimas 3 barras abaixo de duas adjacentes) e superiores (alta das últimas 3 barras acima de duas adjacentes).

Se um pico é seguido por um novo, o indicador é redesenhado no novo, o antigo é apagado, acho que é claro.

Na verdade, o indicador conecta todo o HI e LH em série, qual é o problema?

Tanto quanto sei, você tem 2 amortecedores de desenho. Ambos são desenhados. Cada buffer tem sua própria linha, você recebe um extremo. Há 3 amortecedores no ziguezague. Dois calculados para máximos e mínimos separadamente, e um para desenho de acordo com o sinal de que depois que os máximos foram escritos no buffer, estamos procurando o mínimo e vice versa.

 
Pergunta, há uma descrição das bibliotecas padrão para o MT4 ou não?
 
Valeriy Yastremskiy:

Entendo que você tem dois amortecedores de desenho. Ambos são desenhados. Cada buffer tem sua própria linha, você recebe um extremo. Há 3 amortecedores no ziguezague. Dois amortecedores de cálculo são separados para máximos e mínimos, e um amortecedor é usado para desenhar seguindo o último máximo escrito no amortecedor de máximos, e vice-versa.

Ajuda - o ziguezague é construído usando 2 amortecedores, exemplo com 2 amortecedores também

 
Valeriy Yastremskiy:
Pergunta, há uma descrição das bibliotecas padrão para o MT4 ou não?
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека MQL5 написана на языке MQL5 и предназначена для облегчения написания программ (индикаторов, скриптов, экспертов) конечным пользователям. Библиотека обеспечивает удобный доступ к большинству внутренних функций MQL5.
 
Artyom Trishkin:

MT4.

Kudos para os artigos. Ótimo trabalho.

 
Roman Sharanov:

Ajuda - o ziguezague é construído sobre 2 amortecedores, exemplo com 2 amortecedores também

Início do código 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[];

Um buffer de desenho. Três matrizes.

Veja o código. A lógica é complexa. Geralmente é difícil de fazer na mosca.

Código ZigZag com comentários traduzidos para o russo
Arquivos anexados:
ZigZagRu.mq4  19 kb
 
Valeriy Yastremskiy:

MT4.

Kudos para os artigos. Ótimo trabalho.

Não importa - quase tudo se encaixa.

Obrigado.

Razão: