Voy a escribir el indicador de forma gratuita - página 98

 
Aleksei Stepanenko:

Sólo puedo ayudar un poco, absolutamente gratis.

Hay dos funciones en la parte inferior del indicador. En los comentarios muestra el valor del propio indicador y el valor del punto actual de la última línea de tendencia.

Resuélvelo.

Gracias, Alexei. Que tengas un buen día.
 
A-V-K:
Gracias, Alexei. Que tengas un buen día.

.

 

¡Buenas tardes!

He escrito este indicador


//+------------------------------------------------------------------+
//|                                                      MTF_H&L.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020"
#property strict
#property indicator_chart_window
#property indicator_buffers   2
#property indicator_width1    1
#property indicator_color1    clrTeal
#property indicator_type1     DRAW_LINE
#property indicator_width2    1
#property indicator_color2    clrCrimson
#property indicator_type2     DRAW_LINE
//---
input ENUM_TIMEFRAMES   period01 =  PERIOD_D1;
input ENUM_TIMEFRAMES   period02 =  PERIOD_M15;
input int               percount =  10;         //Ограничение истории

double Buffer1[];
double Buffer2[];
int    index1=-1;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   SetIndexBuffer(0, Buffer1, INDICATOR_DATA);
   SetIndexBuffer(1, Buffer2, INDICATOR_DATA);
//---
   IndicatorDigits(Digits);
   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 i, limit, barcount;
   barcount=period01/Period()*percount;
   if(barcount != 0) limit = barcount; 
   else limit = rates_total - 2;
   
   for(i=limit;i>=0;i--)
   {
      if(TimeSeconds(time[i])==0)
      index1=iBarShift(Symbol(), period02, time[i], false);

      if(TimeHour(time[i])==0&&TimeMinute(time[i])<period02)
      {
      Buffer1[i]=iOpen(NULL,period02,index1);
      Buffer2[i]=iOpen(NULL,period02,index1);
      }
      else 
      {
      Buffer1[i]=iHigh(NULL,period02,index1);
      if(Buffer1[i]<Buffer1[i+1]){
      Buffer1[i]=Buffer1[i+1];}
      
      Buffer2[i]=iLow(NULL,period02,index1);
      if(Buffer2[i]>Buffer2[i+1]){
      Buffer2[i]=Buffer2[i+1];}
      }
   }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+

Por favor, ayúdenme a corregir el indicador o díganme cómo.

1) No sé cómo establecer el punto de referencia "period01", para que el indicador comience con "iOpen" al principio de un nuevo periodo.

2) No sé cómo usar "iHighest" para no tener que usar esas "muletas".

if(Buffer1[i]<Buffer1[i+1]){
   Buffer1[i]=Buffer1[i+1];}

Por favor, ayuda.

 
MakarFX:

¡Buenas tardes!

He escrito este indicador


Por favor, ayúdenme a corregir el indicador o díganme cómo.

1) No sé cómo establecer el punto de referencia "period01", para que el indicador comience con "iOpen" al principio de un nuevo periodo.

2) No sé cómo usar "iHighest" para no tener que usar esas "muletas".

Por favor, ayuda.

¿Por qué lo has escrito?

 
Алексей Тарабанов:

¿Por qué lo has escrito?

Buscando un patrón...

si se traslada al sótano se ve así


 
MakarFX:

¡Buenos días!

¡Saludos, Makar!

¿Cuál es el precio de apertura aquí ? Tomar los extremos del primer compás inmediatamente. Como éste:

if(i==limit || TimeDay(time[i])!=TimeDay(time[i+1]))
   {
   Buffer1[i]=iHigh(NULL,period02,index1);
   Buffer2[i]=iLow(NULL,period02,index1);
   }
else
   {
   if(iHigh(NULL,period02,index1)-Buffer1[i+1]>0)
      {
      Buffer1[i]=iHigh(NULL,period02,index1);
      }
   else
      {
      Buffer1[i]=Buffer1[i+1];
      }
   if(Buffer2[i+1]-iLow(NULL,period02,index1)>0)
      {
      Buffer2[i]=iLow(NULL,period02,index1);
      }
   else
      {
      Buffer2[i]=Buffer2[i+1]; 
      }
   }
¿O he entendido mal la idea?
 
Aleksei Stepanenko:

¡Saludos, Makar!

¿Cuál es el precio de apertura aquí ? Tomar los extremos del primer compás inmediatamente. Como éste:

¿O he entendido mal la idea?

Yo escribí.

1) No sé cómo establecer el punto de referencia"period01", para que el indicador comience con "iOpen" al principio de un nuevo periodo.

Para tomar de inmediato la extrema de la primera barra es correcta y tomo su código después de "else". Gracias.

Pero aquí

if(i==limit || TimeDay(time[i])!=TimeDay(time[i+1]))

no encaja, porque está vinculado al principio del día y necesito la selección "period01" - H1;H4; y así sucesivamente

 

Otra posibilidad es dividir la fecha actual por el número de segundos en el marco temporal y luego comparar el valor resultante con el valor anterior:

int part=0;

int OnCalculate(......)
   {

   for(......)
      {
      if(time[i]/PeriodSeconds(period01)>part)
         {      
         part=time[i]/PeriodSeconds(period01);
      
         Buffer1[i]=iHigh(NULL,period02,index1);
         Buffer2[i]=iLow(NULL,period02,index1);
         }
      else
.......
      

Es probable que el inicio no esté sincronizado con el gráfico, pero las barras de tiempo contarán correctamente. Podrías pensar en cómo sincronizar la primera salida,

como:

if(time[i]%PeriodSeconds(period01)==0)
 
Aleksei Stepanenko:

Otra posibilidad es dividir la fecha actual por el número de segundos en el marco temporal y luego comparar el valor resultante con el valor anterior:

Es probable que el inicio no esté sincronizado con el gráfico, pero las barras de tiempo contarán correctamente. Podrías pensar en cómo sincronizar la primera salida,

como:

Muchas gracias, lo probaré.
 

De nada. Una entrada más corta:

Buffer1[i]=MathMax(iHigh(NULL,period02,index1),Buffer1[i+1]);
Buffer2[i]=MathMin(iLow(NULL,period02,index1),Buffer2[i+1]);