Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 466

 

Saluti a tutti. Ho una domanda del genere. Ho un indicatore (frattali modificati), quando viene caricato su un grafico tutto è corretto, funziona come dovrebbe, ma quando cerco di usarlo in un EA, dice che il buffer è vuoto. Allo stesso tempo, quando si passa il buffer in Deinit, memorizza i valori corretti.

Il codice sorgente dell'indicatore è allegato. Sono pronto ad ascoltare consigli e suggerimenti su cosa sto sbagliando.

Codice da EA:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(Time[0] == prevtime) return;
   prevtime = Time[0];
   

   if(iCustom(NULL,0,"modify_Fractal",0,0) > 0) Print("x = ", 0, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,0));     
   if(iCustom(NULL,0,"modify_Fractal",0,2) > 0) Print("x = ", 2, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,2));
   if(iCustom(NULL,0,"modify_Fractal",0,3) > 0) Print("x = ", 3, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,3));   
   if(iCustom(NULL,0,"modify_Fractal",0,4) > 0) Print("x = ", 4, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,4));
   if(iCustom(NULL,0,"modify_Fractal",0,5) > 0) Print("x = ", 5, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,5)); 
   if(iCustom(NULL,0,"modify_Fractal",0,6) > 0) Print("x = ", 6, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,6));
   
  // тут везде 0
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
      Print("Deinit Function");
      
      for (int x = 0; x < 100; x++ )
      {
         if(iCustom(NULL,0,"modify_Fractal",0,x) > 0) Print("x = ", x, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,x));
         if(iCustom(NULL,0,"modify_Fractal",1,x) > 0) Print("x = ", x, "  fractal Down: ", iCustom(NULL,0,"modify_Fractal",1,x));
      }
   // а здесь полный буфер правильных значений индикатора.
  }
 
Karputov Vladimir:

Potresti sostituire i se alla fine con:

(se è così semplice come quello,,,)

Grazie

 
Maxim Dobrovolskii:

Saluti a tutti. Ho una domanda del genere. Ho un indicatore (frattali modificati), quando viene caricato su un grafico tutto è corretto, funziona come dovrebbe, ma quando cerco di usarlo in un EA, dice che il buffer è vuoto. Allo stesso tempo, quando si passa il buffer in Deinit, memorizza i valori corretti.

Il codice sorgente dell'indicatore è allegato. Sono pronto ad ascoltare consigli e suggerimenti su cosa sto sbagliando.

Codice da EA:

Un'occhiata molto sommaria. Domanda: Posso avere un frattale sulla barra dello zero ? Ma in OnDeinit(), si fa un ciclo attraverso le barre e naturalmente si trova un frattale (non un valore vuoto del buffer).
 
Artyom Trishkin:
Uno sguardo molto superficiale. Domanda: un frattale può essere su una barra zero ? Ma in OnDeinit() si fa un ciclo attraverso le barre e naturalmente si trova un frattale (non un valore di buffer vuoto).
In Deinit, faccio anche un loop attraverso 4-6 e ogni cosa è al suo posto e ha dei valori.
 
Maxim Dobrovolskii:
In Deinit, passo anche attraverso 4-6 e ogni cosa è al suo posto.

In OnDeinit() si esegue un ciclo (da 0 a 100) attraverso le barre alla ricerca di un valore diverso da zero e si registra il valore trovato.

In OnTick() si cerca di emettere solo le ultime 6 barre del buffer 0. Potrebbe non esserci nessun frattale su di loro.

Per prima cosa, trova la barra con il frattale e poi stampa il valore di quella barra.

 
Artyom Trishkin:

In OnDeinit() si esegue un ciclo (da 0 a 100) attraverso le barre alla ricerca di un valore diverso da zero e si registra il valore trovato.

Ma in OnTick(), si cerca di stampare solo le ultime 6 barre del buffer 0. Potrebbe non esserci nessun frattale su di loro. Per prima cosa, trova la barra con il frattale e poi stampa il valore di questa barra.

La sesta barra dovrebbe contenere un frattale.

2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 29 frattale Up: 1.09855
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 21 frattale Up: 1.09976
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 16 frattale Down: 1.09652
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 6 frattale Up: 1,10721
2015.11.01 13:19:10.577 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: Funzione Deinit
2015.11.01 13:19:08.380 2015.10.01 00:00 MoneyRobotics_Proboi! test avviato

Questo è l'inizio del log. Il test è iniziato, l'Expert Advisor ha funzionato, Deinit è stato lanciato e il frattale è stato trovato a 6 posizioni.



https://charts.mql5.com/9/256/eurusd-h1-alpari-limited-3.png

replay dell'immagine.

File:
 
Maxim Dobrovolskii:

la sesta barra dovrebbe contenere un frattale.

2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 29 frattale Up: 1,09855
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 21 frattale Up: 1.09976
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 16 frattale Down: 1.09652
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 6 frattale Up: 1,10721
2015.11.01 13:19:10.577 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: Funzione Deinit
2015.11.01 13:19:08.380 2015.10.01 00:00 MoneyRobotics_Proboi! test avviato

Questo è l'inizio del log. inizio del test, l'Expert Advisor ha lavorato, Deinit parte, e immediatamente sulla 6a posizione trova un frattale.



https://charts.mql5.com/9/256/eurusd-h1-alpari-limited-3.png

Non so come affrontare il buffer dell'indicatore.

Questo:

if(Time[0] == prevtime) return;
   prevtime = Time[0];

do

prevtime = Time[0];

alla fine

 
Artyom Trishkin:

Questo:

do

alla fine.

Come può influire questo? Purtroppo non è cambiato nulla.

come immagino il processo: l'indicatore viene caricato, inizia a controllare ogni condizione di tick/bar, se la condizione è soddisfatta, mette il valore nel buffer o nei buffer selezionati, poi l'EA chiama l'indicatore dal numero del buffer al valore ad un certo offset e prende il valore. Giusto?

 
Maxim Dobrovolskii:

Come può influire questo? Purtroppo non è cambiato nulla.

come immagino il processo: l'indicatore viene caricato, inizia a controllare la condizione ogni tick/bar, se è soddisfatta, mette il valore nel buffer o nei buffer selezionati, poi l'EA chiama l'indicatore dal numero del buffer al valore ad un certo offset e prende il valore. Giusto?

E perché c'è una nuova barra nell'indicatore? Apparentemente non ci sono calcoli complessi
 
Victor Nikolaev:
Perché c'è un nuovo controllo a barre nell'indicatore? Apparentemente non ci sono calcoli complicati
controllo di una nuova barra nell'EA che utilizza l'indicatore.
Motivazione: