Errori, bug, domande - pagina 2997

 
Alexey Viktorov:

Forse gli sci non vanno bene?


E poi c'è l'RTS-6.21.


Questa è un'altra cosa. Che broker hai e che versione di MT5.

 
Alexey Viktorov:

Forse gli sci non vanno bene?


E anche RTS-6.21.


Grazie per l'aiuto. L'ho capito. Collegate diverse versioni di indicatori da cartelle diverse.

 
Francuz:

Sì, l'ho fatto. Il risultato non è cambiato.

Non ci credo.
prova di nuovo

datetime a = D'2021.04.08 10:00:00';
   int      handle;
   double   Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   handle = iCustom(_Symbol, PERIOD_CURRENT, "Examples\\ATR.ex5", 14);
   ::Print(__FUNCTION__ + "| PERIOD_CURRENT = ", EnumToString(_Period));

   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>0 && handle != INVALID_HANDLE)
   {
      ::CopyBuffer(handle, 0, a, 1, Buffer);
      
      double BS = ::NormalizeDouble(Buffer[0], _Digits);
      
      ::Print(__FUNCTION__ + "| a = ", a);
      ::Print(__FUNCTION__ + "| BS ", BS);
      
      handle = INVALID_HANDLE;
   }
   
   // return value of prev_calculated for next call
   return(rates_total);
}
 
Nikolai Semko:

Non ci credo.
prova di nuovo.

L'ho capito. Il problema era che due diversi file ATR da cartelle diverse erano collegati. Ecco perché c'era una discrepanza nei valori.

Grazie per il vostro aiuto.
 
Nikolai Semko:

Non ci credo.
prova di nuovo

Nikolai, aveva un problema diverso. Anch'io non ho capito subito il problema, pensavo di dover prendere i valori da un altro TF. Ho lubrificato gli sci e tutto è andato bene.
 
Alexey Viktorov:
Nikolay, aveva un problema diverso. Anch'io non ho capito la domanda all'inizio, pensavo di dover ottenere i valori da un altro TF. Ho oliato gli sci e tutto è andato bene.

Strano, non ho capito niente.
Ho riprodotto il suo problema nel mio esattamente come ha descritto.
È successo esattamente perché l'unica esecuzione di CopyBuffer è avvenuta alla prima esecuzione in OnCalculate, quando prev_calculated == 0 e non c'era garanzia che le barre fossero già generate.
La soluzione era di ignorare questa prima esecuzione ed eseguire il solo CopyBuffer solo quando prev_calculated>0.
Non capisco"due file ATR diversi da cartelle diverse ".

 
Nikolai Semko:

Strano, non ho capito niente.
Ho riprodotto il suo problema nel mio esattamente come ha descritto.
È successo esattamente perché l'unica esecuzione di CopyBuffer è avvenuta alla prima esecuzione in OnCalculate, quando prev_calculated == 0 e non c'era garanzia che le barre fossero già generate.
La soluzione era di ignorare questa prima chiamata ed eseguire il singolo CopyBuffer solo quando prev_calculated>0.
Perché c'erano"due diversi file ATR da cartelle diverse " - non capisco.

Bene, se il grafico è aperto e l'indicatore per il TF corrente è creato, i dati dovrebbero essere già pronti quando il grafico è aperto. Non è vero?

 
Alexey Viktorov:

Bene, se si apre un grafico e si crea un indicatore per il TF corrente, i dati dovrebbero essere già pronti quando si apre il grafico. Non è vero?

Oh, quante meravigliose scoperte ci aspettano ... più

 
Alexey Viktorov:

Bene, se un grafico è aperto e viene creato un indicatore per il TF corrente, i dati dovrebbero essere già pronti quando il grafico viene aperto. Non è vero?

Non l'ho espresso correttamente. Le barre sono sì - molto probabilmente sono pronte. Ma non c'è garanzia che l'indicatore sia stato ricalcolato per tutte queste barre alla prima chiamata di OnCalculate, quando prev_calculated == 0.
Potete eseguire un tale indicatore per assicurarvene.
Ma deve essere fatto quando le quotazioni sono negoziate. Se il mercato è chiuso, non vedrete il mismatch.
Quindi è meglio provare sulle criptovalute, che sono in movimento, nel fine settimana.
Se Size of Buffer array = -1, significa che il buffer dell'indicatore non è ancora ricalcolato e il valore BS non sarà corretto.

   datetime a = D'2021.04.08 10:00:00';
   int      handle;
   double   Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   handle = iCustom(_Symbol, PERIOD_CURRENT, "Examples\\ATR.ex5", 14);
   ::Print(__FUNCTION__ + "| PERIOD_CURRENT = ", EnumToString(_Period));

   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(handle != INVALID_HANDLE)
   {
      ::CopyBuffer(handle, 0, a, 1, Buffer);
      
      double BS = ::NormalizeDouble(Buffer[0], _Digits);
      
      ::Print(__FUNCTION__ + "| a = ", a);
      ::Print(__FUNCTION__ + "| BS ", BS);
      int total_bars = iBars(NULL,PERIOD_CURRENT);
      int size = CopyBuffer(handle, 0, 0, total_bars, Buffer);
      Print("Total Bars = " + string(total_bars) + ", Size of Buffer array = " + string(size));
      
      handle = INVALID_HANDLE;
   }
   
   // return value of prev_calculated for next call
   return(rates_total);
}


Se lo fate nella prossima chiamata di OnCalculate (quando prev_calculated>0) allora non ci sarà questo problema.

SOM c'era un errore nel codice - l'ho corretto

 
Artyom Trishkin:

Oh, quali meravigliose scoperte sono in serbo per noi... più

Intendevo i dati per calcolare l'indicatore. Non essere sarcastico))))