Cambiare il TF è un problema - pagina 5

 

Ecco un indicatore:

//+------------------------------------------------------------------+
//|                                                    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);
  }
//+------------------------------------------------------------------+

Notate solo che, secondo le vostre condizioni, l'indicatore può disegnare entrambi i buffer sulla barra zero.

File:
 
Karputov Vladimir:

Ecco un indicatore:

Notate che, secondo le vostre condizioni, l'indicatore può disegnare entrambi i buffer a zero bar.

Per evitare di disegnare due buffer, è necessario azzerare l'altro buffer quando uno è pieno

      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:
Avete un codice di soluzione?

Come molti altri, ho più di una soluzione alla tua domanda. Perché gli indicatori possono essere diversi nelle sfumature (i compiti che svolgono/codice/intervalli di calcolo, in generale, molti fattori).

 
Karputov Vladimir:

Ecco un indicatore:

basta notare che secondo le vostre condizioni, l'indicatore può disegnare entrambi i buffer a zero bar.

Mi prendete tutti per il culo o davvero non avete idea di quale sia il problema?

Ecco il vostro indicatore quando cambiate TF sulla storia non caricata.

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

 
Dina Paches:

Come molti altri, ho più di una soluzione alla tua domanda. Perché gli indicatori possono essere diversi nelle sfumature (i compiti che svolgono/codice/intervalli di calcolo, in generale, molti fattori).

Blah blah blah...
 
Vasyl Nosal:

Mi state tutti prendendo per il culo o davvero non avete idea di quale sia il problema?

Ecco il vostro indicatore per il cambiamento di TF sulla storia scaricata.

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

Puoi dirmi quali manipolazioni usi per ottenere un'immagine così interessante? E spero che sarai più reticente in futuro.

Aggiunto: ho detto sopra che dovete pensare voi stessi al contenuto dei buffer degli indicatori quando pompate la storia:

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Cambiare i TF è un problema

Karputov Vladimir, 2015.12.07 10:09

Avete due variabili a vostra disposizione: prev_calculated e rates_total. Controllando il caricamento della storia (con prev_calculated==0) devi pensare a cosa fare con i buffer degli indicatori - il comportamento abituale in questi casi è di equiparare il caricamento della storia al primo evento di caricamento dell'indicatore.

Ma l'hai ignorato per qualche motivo e non hai voluto fare modifiche.

Comunque ecco la versione 1.43 (qui ci sono le mie correzioni e quelle diAlexey Viktorov):

Forum sul trading, sistemi di trading automatico e tester di strategie

Cambio TF - problema

Alexey Viktorov, 2015.12.07 12:52

Se volete evitare di disegnare due buffer, dovreste azzerare un buffer quando è pieno.

      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);
  }
//+------------------------------------------------------------------+
File:
 
Karputov Vladimir:

Potresti dirci quali manipolazioni usi per ottenere un'immagine così interessante? E spero che d'ora in poi sarai più discreto nel tuo linguaggio.

Apro un grafico di una coppia di valute che non ho mai aperto prima. M1, per esempio. Allego il tuo indicatore. Lo cambio in M5.

Quindi avevo ragione? Dobbiamo resettare i buffer delle frecce?

 
Vasyl Nosal:

mql4

No. Qui è con il tuo disegno su una coppia dove non c'era storia.

Cos'è questo?

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

Come pensavo, il ciclo è corrotto internamente. Inoltre, poiché nel corpo del ciclo si accede alla barra precedente ([i+1]), si dovrebbe iniziare il calcolo non prima della seconda barra della storia (contando da sinistra). E i buffer devono essere riempiti ad ogni barra TUTTI, non solo una. Bene, o inizializzarli prima in 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:

Comunque, ecco la versione 1.43 (le mie correzioni e quelle diAlexey Viktorov qui):


:

Vladimir, perché lo stai facendo dentro OnCalculate()? Intendo le ultime due righe - reinizializzazione degli array. Entrambi i buffer sono calcolati su ogni barra, è un'azione inutile.

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

COS'È QUESTO?

Come pensavo, il ciclo è corrotto internamente. Inoltre, poiché nel corpo del ciclo si accede alla barra precedente ([i+1]), il calcolo non dovrebbe iniziare prima della seconda barra della storia (contando da sinistra). E i buffer devono essere riempiti ad ogni barra TUTTI, non solo una. Bene, o inizializzarli prima in OnInit().

Tutto qui? Non ci saranno glitch?
Motivazione: