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

 
Igor Makanu:

Você não os inicializou no início ou em qualquer outro lugar, você apenas os declarou

Escrevi antes de usar, isto é, se você tem as variáveis SredRazmax, SredRazmin, Sredn como somas de valores de array, então para calcular corretamente a soma, você precisa zerar a variável e então adicionar os valores de array e salvá-los nesta variável

ou seja

E o segundo, o que você tem uma pergunta, no indicador cada tick chamaráOnCalculate() e significa que você contará constantemente os tops de ZigZag a cada tick, ou seja, cerca de 40-60 vezes por segundo.

Obrigado, mas eu tentei zerá-los e tenteiusarOnStart em vez deOnCalculate() , os valores ainda estão pulando e não está claro para mim se ww=0 (o valor do array é sempre exibido) , por que os valores estão pulando no meio, como fazer para não contar cada tick e apenas contar os valores do array?

 
Dmitry Belov:

Obrigado, mas eu tentei zerá-los e tenteiusarOnStart ao invés deOnCalculate()

Acho que não consigo explicar porque isso acontece, a questão é que OnStart() é usado em scripts e OnCalculate() é usado em indicadores. Você deve entender a diferença entre scripts e indicadores em MQL.

não estou bem claro qual é sua tarefa? você quer produzir os valores de quê? no código, você soma os preços aos quais os picos ZigZag estão localizados no gráfico inteiro, na produção você escreve "Spread médio" e imprime o valor(SredRazmax-SredRazmin)/nn, e o cálculo é realizado para todas as barras

por que você precisa do indicador se você não usa amortecedores indicadores para desenhar? nos amortecedores indicadores estão presos às barras, e seus valores mudarão assim que uma nova barra aparecer

 
Igor Makanu:

Eu acho que não consigo explicar porque isso acontece, a questão é que OnStart() é usado em scripts, e OnCalculate() em indicadores, você precisa entender como os scripts diferem dos indicadores em MQL

não estou bem claro qual é sua tarefa? você quer produzir os valores de quê? no código, você soma os preços aos quais os picos ZigZag estão localizados no gráfico inteiro, na produção você escreve "Spread médio" e imprime o valor(SredRazmax-SredRazmin)/nn, e o cálculo é realizado para todas as barras

Por que você precisa de um indicador se você não usa amortecedores indicadores para o desenho? Em um amortecedor indicador os amortecedores estão presos às barras e seus valores se moverão assim que uma nova barra aparecer

Para ser honesto, simplifiquei o problema (a fórmula original parece um pouco diferente), pensei que seria capaz de entender por que os valores do salto médio quando o valor zero na matriz permanece constante. Tenho dois loops, um para preencher a matriz e outro para o cálculo da média, há um limite de nn, e na verdade eu queria emitir um gráfico - é um zig-zag padrão, mas o iCustom está tirando o inferno de fora, e a média... De zero nó, se for maior que o anterior, subtrair o nó anterior e o anterior (será sinal de menos, portanto deve ser multiplicado por menos 1) e tudo isso deve ser somado e dividido por um determinado número de nn nós. Obtemos uma média de vértices. Além disso, eu queria obter outras médias para ziguezaguear, mas fiquei preso a valores de "salto".

Era mais ou menos como era originalmente:

//+------------------------------------------------------------------+
//|                                                           01.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
extern int nn=30;

int shift, ww=0;
double zz, SredRazmax=0.0; 
double HZZ[];


int OnInit()
  {
//--- indicator buffers mapping
    SetIndexBuffer(0,HZZ);
  SetIndexStyle(0,DRAW_SECTION);
//---
   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[])
  {
//---
  for(shift = 0; shift <= Bars-1; shift++){
      zz = iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, shift);
           if(zz > 0.0)   {
           HZZ[ww]=zz;
            ww++;          }
           else {
           continue;
           }
    }
//---------------------------------------------+
//расчет среднего значения           
//---------------------------------------------+      
  for(ww=0;ww<=nn;ww++){
       if(HZZ[ww]>HZZ[ww+1]){
          SredRazmax += (HZZ[ww]- HZZ[ww+1]);      
         }     
        else if(HZZ[ww]<HZZ[ww+1]){
         SredRazmax += (HZZ[ww]- HZZ[ww+1])*(-1);
        }
        else{
        continue;
           }
     }  
        
  if(SredRazmax>0){    
   
      Comment("Средний размах = ", SredRazmax/nn,",",HZZ[0],",",HZZ[1],",",HZZ[2],",",HZZ[3],",",HZZ[4]);      
        }
   
       
//--- return value of prev_calculated for next call
 return(0);

  
 
  }
 
Dmitry Belov:

Para ser honesto, eu simplifiquei o problema (originalmente a fórmula parece um pouco diferente), pensei que poderia entender porque os valores do salto médio, se o valor zero na matriz permanece constante. Tenho dois loops, um para preencher a matriz e outro para calcular a média, há um limite de nn, e na verdade eu também queria emitir um gráfico - é um zig-zag padrão, mas o iCustom tira o inferno dele, e a média... De zero nó, se for maior que o anterior, subtraia o nó anterior e do anterior subtraia o prerevioso (será sinal de menos, portanto deve ser multiplicado por menos 1) e tudo isso deve ser somado e dividido por um determinado número de nn. Obtemos uma média de vértices. Além disso, eu queria obter outras médias para ziguezaguear, mas fiquei preso a valores de "salto".

Isto é aproximadamente como era originalmente:

Eu realmente não entendo, é tarde, estou com sono, eu o ajustei como vi, tenho dúvidas de como o indicador se comportará em uma barra zero (eu não verifiquei), mas ele desenha e exibe comentários de acordo com sua fórmula

//+------------------------------------------------------------------+
//|                                                           01.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
extern int nn=30;

int  ww=0;
double zz,SredRazmax;
double HZZ[];
bool up,dn;
double lastzz;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,HZZ);
   SetIndexStyle(0,DRAW_SECTION);
   SetIndexEmptyValue(0,0.0);
   up = false;
   dn = false;
   lastzz=0.0;
   SredRazmax=0.0;
//---
   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[])
  {
//---
   int shift,limit;
//--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
   if(prev_calculated==0)
     {
      limit=rates_total-1;
      up = false;
      dn = false;
      lastzz=0.0;
      SredRazmax=0.0;
      ArrayInitialize(HZZ,0.0);
     }
   else limit=rates_total-prev_calculated+1;
   for(shift=limit; shift>=0; shift--)
     {
      zz=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,shift);
      if(zz>0.0)
        {
         HZZ[shift]=zz;
         if(lastzz>zz) {up=true;  dn=false;}
         if(lastzz<zz) {up=false; dn=true;}
         if(up) SredRazmax+=zz-lastzz;
         if(dn) SredRazmax+=(zz- lastzz)*(-1);
         lastzz=zz;
        }
      else HZZ[shift]=0.0;
     }
   Comment("Средний размах = ",SredRazmax/nn,",",HZZ[0],",",HZZ[1],",",HZZ[2],",",HZZ[3],",",HZZ[4]);
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Você pode me ajudar a resolver um problema como este? (Se possível.)

O Conselheiro Especialista emitirá um Alerta sob certas condições. É possível fazer com que a janela que acionou o Alerta se torne ativa também?

 
Vatal:

Você pode me ajudar a resolver um problema como este? (Se possível.)

O Conselheiro Especialista emitirá um Alerta sob certas condições. É possível fazer com que a janela que acionou o Alerta se torne ativa também?

Há um exemplo na documentação. Obtenha a identificação do gráfico em que a EA está funcionando e vá...
Примеры работы с графиком - Константы графиков - Константы, перечисления и структуры - Справочник MQL4
Примеры работы с графиком - Константы графиков - Константы, перечисления и структуры - Справочник MQL4
  • docs.mql4.com
В этом разделе представлены примеры для работы со свойствами графика. Для каждого свойства приведены одна или две законченные функции, которые позволяют задавать/получать значение этого свойства. Эти функции можно использовать в своих MQL4 программах как есть. На рисунке показана графическая панель для наглядной демонстрации того, как изменение...
 
Igor Makanu:

Tenho algumas dúvidas de como o indicador se comportará em uma barra de zero (não verifiquei), mas ele desenha e usa sua fórmula para emitir o comentário.

Sim, obrigado por seu tempo, funciona, devo ter feito algo errado. Mas não está dando uma matriz no comentário (só deve haver vértices, certo?) e conta mal com menos e número..., o ziguezague tem um spread diferente entre os vértices. A idéia é subtrair o vértice menor anterior do último maior (que acaba de ser formado), e do menor anterior subtrair até mesmo o maior e o número será com sinal de menos, multiplicamo-lo por (-1) e assim por diante, e tudo isso é somado nn vezes e dividido por nn, obtemos a partida média. Aproximadamente em 4 relógios, isto seria 1,69(de a) sobre USDJPY. Além disso, eu queria calcular a média do número de barras entre os topos. Agora vou tentar entender seu código, o que fiz de errado, por que ele não me desenhou e por que não calcula corretamente...

 
Dmitry Belov:
Sim, obrigado pelo seu tempo, realmente funciona, eu devo ter feito algo errado. Mas não sai a matriz no comentário (deveria ter apenas vértices, certo?) e conta mal com menos e número..., o ziguezague não tem a mesma distribuição entre os vértices. A idéia é subtrair o vértice menor anterior do último maior (que acaba de ser formado), e do menor anterior subtrair até mesmo o maior e o número será com sinal de menos, multiplicamo-lo por (-1) e assim por diante, e tudo isso é somado nn vezes e dividido por nn, obtemos a partida média. Aproximadamente em 4 relógios, isto seria 1,69(de a) sobre USDJPY. Além disso, eu queria calcular a média do número de barras entre os topos. Agora vou tentar entender seu código, o que fiz de errado, por que ele não me desenhou e por que não calcula corretamente...

As partes superiores no comentário não sairão, porque o buffer indicadorHZZ[] contém valores copiados do buffer indicador ZigZag, caso contrário não poderemos desenhar, dividi deliberadamente em 2 condições de detecção de vértices para cima e para baixo:

if(up) SredRazmax+=zz-lastzz;
if(dn) SredRazmax+=(zz- lastzz)*(-1);

Se vocêprecisa conhecer vários tops em ZZ, então você tem que criar outro array para armazenar estes dados. O novo buffer de indicadores irá complicá-lo, porque todos os arrays conectados aos buffers de indicadores "escorregam" junto com o gráfico

ZS: o código é meu exemplo, e eu acho que ele precisa de loop para a 1ª barra, e não para 0, irá recalcular constantemente os valores do SredRazmax, eu não posso verificar agora, nenhum terminal no PC

 
Igor Makanu:

As partes superiores no comentário não sairão, porque o buffer indicadorHZZ[] contém valores copiados do buffer indicador ZigZag, caso contrário não poderemos desenhar, dividi deliberadamente em 2 condições de detecção de vértices para cima e para baixo:

Se vocêprecisa conhecer alguns tops em ZZ, então você tem que criar outro array para armazenar estes dados. O novo buffer de indicadores irá complicá-lo, porque todos os arrays conectados aos buffers de indicadores "escorregam" junto com o gráfico

ZS: o código é meu exemplo, e eu acho que há necessidade de loop para a 1ª barra, e não para 0, irá recalcular constantemente o valor do SredRazmax, eu não posso verificar agora, nenhum terminal no PC

Meu indicador assim que é carregado mostra os valores corretos, então cada tick aumenta o valor da média, embora nos valores de saída da matriz em zig-zag não haja nenhuma mudança nos tops. Isso é o que eu não consigo entender, por que é assim? Falta-me experiência e conhecimento do idioma. Vou desistir do desenho - é um ziguezague normal tomado pelo iCustum (entendo agora que ele não pode sobrepor uma matriz no gráfico, por isso ele desenha o inferno para fora dele). A matriz "rastejará", mas então os valores apenas recalcularão, não é mesmo? por isso entendo... Obrigado... Eu estarei tentando... Aprender...
 
Como explicar a uma EA (ma padrão) que você só deve comprar (vender) quando as médias se cruzam, e não em geral, quando ma_1>ma_2. Mas ele compra constantemente, não pode parar
Razão: