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

 
PokrovMT5:

Olá, você pode me dizer se você precisa digitar iData para este indicador, não importa se é algum programa ou referência aos dados da barra, onde você pode especificar o período de tempo, por que os dados de outros períodos de tempo não são refletidos corretamente no atual diferente no gráfico do período de tempo, mas apenas no gráfico do período de tempo especificado? Obrigado.


Eu não entendo bem

Mas eu acho que isso ajudará

Доступ к таймсериям и индикаторам - Справочник MQL4
Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
Функции для работы с таймсериями и индикаторами. Таймсерия отличается от обычного массива тем, что индексация элементов таймсерии производится от конца массива к началу (от самых свежих данных к самым старым). Для копирования значений таймсерий и индикаторов рекомендуется использовать только динамические массивы, так как функции копирования...
 

Obrigado pelo link, tenho exatamente a mesma imagem, apenas um algoritmo ligeiramente diferente, a questão é fazer mais pontos (no desenho final), fazê-los aparecer com um limiar.

 
Alekseu Fedotov:

Eu não entendo bem.

Mas eu acho que ajuda.


Obrigado, definitivamente vou analisar, mas como exemplo o princípio por que não funciona se em vez de escrever os dados de outro prazo em vez de zero, por que não é refletido corretamente, devo copiá-lo primeiro e depois renderizá-lo?

iClose(NULL,0,i);
 
Alekseu Fedotov:

Confira aqui.


Novaja:

Obrigado pelo link, tenho exatamente a mesma imagem, apenas um algoritmo ligeiramente diferente, a essência é fazer mais pontos (no desenho final), fazê-los aparecer com um limiar.


Você pode fazer isso, mas acontece que a Renco, ou seja, divide em segmentos iguais a distância m / um vértice. Isto quebra os vértices de busca do próprio algoritmo, a questão de como fazer mantendo o código inicial, o limiar entre pontos (no desenho adicional), deve obter um múltiplo da distância entre todos, exceto o último e o topo (será menor que o limiar).

 
//+------------------------------------------------------------------+
//|                                                       FastZZ.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, Yurich"
#property link      "https://login.mql5.com/ru/users/Yurich"
//---
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Red
#property indicator_color2 Red
#property indicator_color3 Gold
#property indicator_color4 DodgerBlue

#property indicator_width3 3
#property indicator_width4 3

//--- input parameters
extern int  Depth    = 10;
//---
double zzH[], zzL[];
double depth;
int last, direction, pbars;
datetime lastbar;

double ArrUp[];
double ArrDn[];
//+------------------------------------------------------------------+
int init()
{
//---- indicators
   SetIndexBuffer(0,zzH);
   SetIndexBuffer(1,zzL);
   SetIndexBuffer(2,ArrUp);
   SetIndexBuffer(3,ArrDn);
   
   SetIndexStyle(0,DRAW_ZIGZAG);
   SetIndexStyle(1,DRAW_ZIGZAG);
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexStyle(3,DRAW_ARROW);
   
   SetIndexArrow(2,159);
   SetIndexArrow(3,159);
   
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   IndicatorDigits(Digits);
//----
   depth=Depth*Point;
   direction=1;
   last=0;
   pbars=0;
   lastbar=0;
   return(0);
}
//+------------------------------------------------------------------+
int start()
{
   int limit=Bars-IndicatorCounted()-1;
   if(lastbar!=Time[0])
   {
      lastbar=Time[0];
      last++;
   }
   if(MathAbs(Bars-pbars)>1) { last=Bars-1; limit=last;}
   pbars=Bars;
   //---
   for(int i=limit; i>0; i--)
   {
      bool set=false;
      zzL[i]=0;
      zzH[i]=0;
      ArrUp[i]=EMPTY_VALUE;
      ArrDn[i]=EMPTY_VALUE;
      //---
      if(direction>0)
      { 
         if(High[i]>zzH[last]+depth)
         {
            zzH[last]=0;
            zzH[i]=High[i];
           
            ArrUp[i]=High[i];
            
            if(Low[i]<High[last]-depth)
            {
               if(Open[i]<Close[i])
                {
                  zzH[last]=High[last]; 
                  ArrUp[last]=High[last];
                }else direction=-1;
               zzL[i]=Low[i];
               ArrDn[i]=Low[i];
            }
            last=i;
            set=true;
         }
         if(Low[i]<zzH[last]-depth && (!set || Open[i]>Close[i]))
         {
            zzL[i]=Low[i];
            ArrDn[i]=Low[i];
            
            if(High[i]>zzL[i]+depth && Open[i]<Close[i])
             {
               zzH[i]=High[i];
               ArrUp[i]=High[i]; 
             }else direction=-1;
            last=i;
         }
      } else //direction<0
      {
         if(Low[i]<zzL[last]-depth)
         {
            zzL[last]=0;
            zzL[i]=Low[i];
        
            ArrDn[i]=Low[i];            
            
            if(High[i]>Low[last]+depth)
            {
               if(Open[i]>Close[i])
                {
                  zzL[last]=Low[last]; 
                  ArrDn[last]=Low[last];
                }else direction=1;
               zzH[i]=High[i];
               ArrUp[i]=High[i];
            }
            last=i;
            set=true;
         }
         if(High[i]>zzL[last]+depth && (!set || Open[i]<Close[i]))
         {
            zzH[i]=High[i];
            ArrUp[i]=High[i];
            
            if(Low[i]<zzH[i]-depth && Open[i]>Close[i])
             {
               zzL[i]=Low[i]; 
               ArrDn[i]=Low[i];
             }else direction=1;
            last=i;
         }
      }
   }
//----
   zzH[0]=0;
   zzL[0]=0;
//----
   return(0);
}
//+------------------------------------------------------------------+
 

Por alguma razão o código não inseriu o comentário imediatamente, eu tive que reescrevê-lo.

 
PokrovMT5:

Obrigado, vou investigar, mas como exemplo, por que não funciona se, em vez de escrever zero, você colocar dados de outro prazo, por que não é refletido corretamente, devo copiá-lo primeiro e depois desenhá-lo?



CopyClose é uma função mais moderna, mas ok,iClose(...) funciona bem

Como isso não funciona corretamente? Uma foto ou um pedaço de código, por favor, seja mais específico.

 
Alekseu Fedotov:

CopyClose é uma função mais moderna, mas tudo bem, iClose(...) funciona bem

Como funciona incorretamente? Uma foto ou um pedaço de código, por favor, seja mais preciso.

Bem, aqui está um exemplo simples, quero ver preços próximos no gráfico, quero ver uma hora no cronograma, tudo é bom no relógio, mas é diferente em qualquer outro cronograma. A idéia era ver os preços de fechamento dos mais altos em um período de tempo menor. A imagem é de 30 minutos.
//+------------------------------------------------------------------+
//|                                                   Проверка 2.mq4 |
//|                                                  Bugaev Vladimir |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Bugaev Vladimir"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 clrBlue
#property indicator_width1 2
int i,limit;

double C,CC[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
IndicatorBuffers(1);
//----      
   SetIndexBuffer(0,CC);
  
   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(prev_calculated<1) limit=rates_total-1;
if(prev_calculated>0)limit=rates_total-prev_calculated;
for(i=limit; i>0; i--)  
  
  {
 C= iClose(NULL,60,i);
 CC[i]=C; 



  }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
PokrovMT5:
Bem aqui está o exemplo mais simples, eu quero ver os preços de fechamento no gráfico, o cronograma é escrito uma hora, tudo é bom no relógio, tudo é diferente em qualquer outro cronograma. A idéia era ver os preços de fechamento dos mais altos em um período de tempo menor. A imagem é de 30 minutos.

Assim


     int shift;
     datetime  T;
  
   for(i=limit; i>=0; i--)
     {
      T = iTime(NULL,0,i); 
      shift=iBarShift(NULL,60,T); 
      C=iClose(NULL,60,shift);
      CC[i]=C;
     }
 
Alekseu Fedotov:

É assim que as coisas são.



Muito obrigado!

Razão: