Vou escrever o indicador gratuitamente - página 98

 
Aleksei Stepanenko:

Eu só posso ajudar um pouco, absolutamente grátis.

Há duas funções na parte inferior do indicador. Nos comentários ele exibe o valor do próprio indicador e o valor do ponto atual na última linha de tendência.

Descubra-o.

Obrigado, Alexei. Tenha um bom dia.
 
A-V-K:
Obrigado, Alexei. Tenha um bom dia.

.

 

Boa tarde!

Eu escrevi o seguinte 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, me ajude a corrigir o indicador ou me diga como.

1) Não sei como definir o ponto de referência "período01", para que o indicador comece com "iOpen" no início de um novo período.

2) Eu não sei como usar "iHighest" para não ter que usar tais "muletas".

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

Por favor, ajude.

 
MakarFX:

Boa tarde!

Eu escrevi este indicador


Por favor, me ajude a corrigir o indicador ou me diga como.

1) Não sei como definir o ponto de referência "período01", para que o indicador comece com "iOpen" no início de um novo período.

2) Eu não sei como usar "iHighest" para não ter que usar tais "muletas".

Por favor, ajude.

Por que você o escreveu?

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

Por que você o escreveu?

Procurando por um padrão...

se mudado para o porão, parece que é assim


 
MakarFX:

Bom dia!

Saudações, Makar!

Qual é o preço de abertura para aqui ? Tomar imediatamente os extremos do primeiro bar. Como este aqui:

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]; 
      }
   }
Ou será que eu me enganei na idéia?
 
Aleksei Stepanenko:

Saudações, Makar!

Qual é o preço de abertura para aqui ? Tomar imediatamente os extremos do primeiro bar. Como este aqui:

Ou será que me enganei na idéia?

Eu escrevi

1) Não sei como definir o ponto de referência"período01", para que o indicador comece com "iOpen" no início de um novo período.

Tirar imediatamente o extremo da primeira barra está correto e eu pego seu código depois do "outro". Obrigado.

Mas aqui

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

não se encaixa, porque está ligado ao início do dia e preciso da seleção "period01" - H1;H4; e assim por diante

 

Alternativamente, você poderia dividir a data atual pelo número de segundos no intervalo de tempo e depois comparar o valor resultante com o 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
.......
      

A partida provavelmente não será sincronizada com o gráfico, mas as barras de tempo contarão corretamente. Você poderia pensar em como sincronizar o primeiro início,

tais como:

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

Alternativamente, você poderia dividir a data atual pelo número de segundos no intervalo de tempo e depois comparar o valor resultante com o valor anterior:

A partida provavelmente não será sincronizada com o gráfico, mas as barras de tempo contarão corretamente. Você poderia pensar em como sincronizar o primeiro início,

tais como:

Muito obrigado, vou tentar.
 

Seja bem-vindo. Uma entrada mais curta:

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