Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 370

 
PokrovMT5:

Hola, ¿Puede decirme por favor si es necesario escribir en iData para este indicador, no importa si es cualquier programa o referencia a los datos de la barra, donde se puede especificar el marco de tiempo, ¿por qué es los datos de otros marcos de tiempo no se reflejan correctamente en la actual diferente en el gráfico de tiempo, pero sólo en el gráfico del marco de tiempo especificado? Gracias.


No entiendo muy bien

Pero creo que esto ayudará

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

Gracias por el enlace, tengo exactamente la misma imagen, sólo un algoritmo ligeramente diferente, la cuestión es hacer más puntos (en el dibujo final), hacerlos aparecer con un umbral.

 
Alekseu Fedotov:

No lo entiendo.

Pero creo que ayuda.


Gracias, lo miraré, pero como ejemplo el principio por qué no funciona si en vez de escribir los datos de otro timeframe en vez de cero, por qué no se refleja correctamente, ¿debo copiarlo primero y luego dibujarlo?

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

Compruébelo aquí.


Novaja:

Gracias por el enlace, tengo exactamente la misma imagen, sólo un algoritmo ligeramente diferente, la esencia es hacer más puntos (en el dibujo final), para que aparezcan con un umbral.


Usted puede hacerlo, pero resulta Renco, es decir, divide en segmentos iguales distancia m / un vértice. Esto rompe el propio algoritmo de búsqueda de vértices, la cuestión de cómo hacer mientras se mantiene el código inicial, el umbral entre los puntos (en el dibujo, además), debe obtener un múltiplo de la distancia entre todos menos el último y la parte superior (será menor que el umbral).

 
//+------------------------------------------------------------------+
//|                                                       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 alguna razón el código no insertaba el comentario inmediatamente, tuve que reescribirlo.

 
PokrovMT5:

Gracias, lo miraré, pero como ejemplo ¿por qué no funciona si en vez de escribir cero pones datos de otro marco temporal, por qué no se refleja correctamente, debo copiarlo primero y luego dibujarlo?



CopyClose es una función más moderna, pero bien,iClose(...) funciona bien

¿Cómo es que no funciona correctamente? Una imagen o un trozo de código, por favor, sea más específico.

 
Alekseu Fedotov:

CopyClose es una función más moderna, pero vale, iClose(...) funciona bien

¿Cómo funciona incorrectamente? Una imagen o un trozo de código, por favor, sea más preciso.

Bueno, aquí hay un ejemplo simple, quiero ver los precios de cierre en el gráfico, quiero ver una hora en el marco de tiempo, todo es bueno en el reloj, pero es diferente en cualquier otro marco de tiempo. La idea era ver los precios de cierre de los más altos en un marco temporal más pequeño. La imagen es de 30 min.
//+------------------------------------------------------------------+
//|                                                   Проверка 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:
Bueno, aquí está el ejemplo más simple, quiero ver los precios de cierre en el gráfico, el marco de tiempo se escribe una hora, todo es bueno en el reloj, todo es diferente en cualquier otro marco de tiempo. La idea era ver los precios de cierre de los más altos en un marco temporal más pequeño. La imagen es de 30 min.

Así


     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:

Así es.



¡Muchas gracias!

Razón de la queja: