A mudança do TF é um problema - página 5

 

Aqui está um indicador:

//+------------------------------------------------------------------+
//|                                                    Shabl_ind.mq4 |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "eevviill"
#property link      "http://alievtm.blogspot.com"
#property version   "1.42"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property  indicator_color1 clrLightBlue
#property  indicator_color2 clrRed
#property  indicator_width1 2
#property  indicator_width2 2

input string   arr_set="Arrow settings";
input int      arrow_indent=22;
input int      up_arrow_code=233;
input int      down_arrow_code=234;

double         up_arr[];
double         down_arr[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,up_arr);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,up_arrow_code);
   SetIndexLabel(0,"UP arrow");

   SetIndexBuffer(1,down_arr);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,down_arrow_code);
   SetIndexLabel(1,"DOWN arrow");

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Shabl_ind                                                        |
//+------------------------------------------------------------------+
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=0;
//---
   if(rates_total<=20)
      return(0);
//--- last counted bar will be recounted
   if(prev_calculated==0)
      limit=rates_total-1;
   if(prev_calculated>0)
      limit=rates_total-prev_calculated+1;
   Comment("rates_total=",rates_total,"; prev_calculated=",prev_calculated,"; limit=",limit);
//--- Shabl_ind counted in the 1-st buffer
   datetime temp;
   for(i=0; i<limit; i++)
     {
      temp=time[i];
      if(close[i]>close[i+1])
         up_arr[i]=low[i]-arrow_indent*Point; //up arrow
      if(close[i]<close[i+1])
         down_arr[i]=high[i]+arrow_indent*Point; //down arrow
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+

Observe apenas que, de acordo com as suas condições, o indicador pode desenhar ambos os amortecedores na barra zero.

Arquivos anexados:
 
Karputov Vladimir:

Aqui está um indicador:

Observe que, de acordo com suas condições, o indicador pode puxar ambos os amortecedores a zero bar.

Para evitar puxar dois amortecedores, você precisa zerar o outro quando um estiver cheio

      if(close[i]>close[i+1])
       {
        down_arr[i] = EMPTY_VALUE;
        up_arr[i]=low[i]-arrow_indent*Point; //up arrow
       }
      if(close[i]<close[i+1])
       {
        up_arr[i] = EMPTY_VALUE;
        down_arr[i]=high[i]+arrow_indent*Point; //down arrow
       }
 
Vasyl Nosal:
Você tem um código de solução?

Como muitos outros, eu tenho mais de uma solução para sua pergunta. Porque os indicadores podem ser diferentes em nuances (as tarefas que eles realizam/código/intervalos de cálculo, em geral, muitos fatores).

 
Karputov Vladimir:

Aqui está um indicador:

basta observar que, de acordo com as suas condições, o indicador pode desenhar ambos os amortecedores na barra zero.

Vocês estão todos me enganando ou não têm realmente idéia de qual é o problema?

Aqui está o seu indicador quando você muda o TF no histórico de descarregamento.

:)))))))))))))))))))))))))))))))))))))))))))

 
Dina Paches:

Como muitos outros, eu tenho mais de uma solução para sua pergunta. Porque os indicadores podem ser diferentes em nuances (as tarefas que eles realizam/código/intervalos de cálculo, em geral, muitos fatores).

Blá blá blá blá...
 
Vasyl Nosal:

Vocês estão me enganando ou realmente não têm idéia de qual é o problema?

Aqui está o seu indicador quando você muda o TF no histórico de descarregamento.

:)))))))))))))))))))))))))))))))))))))))))))

Cuidado para compartilhar quais manipulações você usa para obter uma imagem tão interessante? E espero que você seja mais reticente no futuro.

Acrescentei: mencionei acima que você mesmo precisa pensar sobre o conteúdo dos amortecedores indicadores ao bombear a história:

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

A mudança de TFs é um problema

Karputov Vladimir, 2015.12.07 10:09

Você tem duas variáveis à sua disposição: pré_calculadas e taxas_total. Ao controlar a carga do histórico (com pré-cálculo==0) você tem que pensar no que fazer com os amortecedores indicadores - o comportamento usual em tais casos é igualar a carga do histórico ao primeiro evento de carga do indicador.

Mas você o ignorou por alguma razão e não quis fazer edições.

De qualquer forma, aqui está a versão 1.43 (aqui estão minhas correções e correções deAlexey Viktorov):

Fórum sobre comércio, sistemas automatizados de comércio e testador de estratégias

Mudança TF - problema

Alexey Viktorov, 2015.12.07 12:52

Se você quiser evitar desenhar dois amortecedores, você tem que redefinir um amortecedor para zero quando ele estiver cheio.

      if(close[i]>close[i+1])
       {
        down_arr[i] = EMPTY_VALUE;
        up_arr[i]=low[i]-arrow_indent*Point; //up arrow
       }
      if(close[i]<close[i+1])
       {
        up_arr[i] = EMPTY_VALUE;
        down_arr[i]=high[i]+arrow_indent*Point; //down arrow
       }

:

//+------------------------------------------------------------------+
//|                                                    Shabl_ind.mq4 |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "eevviill"
#property link      "http://alievtm.blogspot.com"
#property version   "1.43"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property  indicator_color1 clrLightBlue
#property  indicator_color2 clrRed
#property  indicator_width1 2
#property  indicator_width2 2

input string   arr_set="Arrow settings";
input int      arrow_indent=22;
input int      up_arrow_code=233;
input int      down_arrow_code=234;

double         up_arr[];
double         down_arr[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,up_arr);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,up_arrow_code);
   SetIndexLabel(0,"UP arrow");

   SetIndexBuffer(1,down_arr);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,down_arrow_code);
   SetIndexLabel(1,"DOWN arrow");

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Shabl_ind                                                        |
//+------------------------------------------------------------------+
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=0;
//---
   if(rates_total<=20)
      return(0);
//--- last counted bar will be recounted
   if(prev_calculated==0)
     {
      limit=rates_total-1;
      ArrayInitialize(up_arr,EMPTY_VALUE);
      ArrayInitialize(down_arr,EMPTY_VALUE);
     }
   if(prev_calculated>0)
      limit=rates_total-prev_calculated+1;
   Comment("rates_total=",rates_total,"; prev_calculated=",prev_calculated,"; limit=",limit);
//--- Shabl_ind counted in the 1-st buffer
   for(i=0; i<limit; i++)
     {
      if(close[i]>close[i+1])
        {
         down_arr[i]=EMPTY_VALUE;
         up_arr[i]=low[i]-arrow_indent*Point; //up arrow
        }
      if(close[i]<close[i+1])
        {
         up_arr[i]=EMPTY_VALUE;
         down_arr[i]=high[i]+arrow_indent*Point; //down arrow
        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
Arquivos anexados:
 
Karputov Vladimir:

Você poderia nos dizer que manipulações você usa para obter uma imagem tão interessante? E espero que você seja mais reticente no futuro.

Eu abro um gráfico de um par de moedas que nunca abri antes. M1, por exemplo. Eu anexarei seu indicador. Eu mudo para M5.

Então eu estava certo? Precisamos reiniciar os amortecedores de flechas?

 
Vasyl Nosal:

mql4

Não. Aqui está seu projeto sobre um par onde não há história.

O que é ISTO?

if(i>Bars-20) i=Bars-20;

Como eu pensava, o laço está enraizado internamente. Além disso, como no corpo do loop você acessa a barra anterior ([i+1]), você deve começar o cálculo não antes da segunda barra na história (contando a partir da esquerda). E os tampões devem ser preenchidos em cada bar TODOS, não apenas em um. Bem, ou inicializá-los de antemão no OnInit().

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 nStartBar = rates_total - MathMax(prev_calculated, 2);

   for(int i = nStartBar; i >= 0; i--)
   {
      if(Close[i] > Close[i+1])
      {
         up_arr[i] = Low[i] - arrow_indent * _Point; //up arrow
         down_arr[i] = 0;
      }
         
      if(Close[i] < Close[i+1])
      {
         up_arr[i] = 0;
         down_arr[i] = High[i] + arrow_indent * _Point; //down arrow
      }
   }

   return(rates_total);
}
 
Karputov Vladimir:

Enfim, aqui está a versão 1.43 (minhas correções e as correçõesde Alexey Viktorov aqui):


:

Vladimir, por que você está fazendo isso dentro da OnCalculate()? Refiro-me às duas últimas linhas - reinicialização de matrizes. Ambos os amortecedores são calculados em cada barra, é uma ação desnecessária.

if(prev_calculated==0)
{
   limit=rates_total-1;
   ArrayInitialize(up_arr,EMPTY_VALUE);
   ArrayInitialize(down_arr,EMPTY_VALUE);
}
 
Sergei Vladimirov:

O QUE É ISTO?

Como eu pensava, o laço está corrompido internamente. Além disso, se você acessar a barra anterior no corpo do loop ([i+1]), então o cálculo não deve começar antes da segunda barra no histórico (contando a partir da esquerda). E os tampões devem ser preenchidos em cada bar TODOS, não apenas em um. Bem, ou inicializá-los de antemão no OnInit().

É isso? Não vai falhar?