Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 116

 
In linea di principio lo era, l'errore era probabilmente nel fatto che il mio indicatore viene creato nella funzione OnTick e i dati vengono copiati immediatamente nello stesso tick. L'ho capito durante la notte, ora cercherò di trasferire le maniglie degli indicatori alla funzione OnInit.
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
sss20192:
L'errore era nel manico dell'indicatore creato nella funzione OnTick e i dati vengono copiati nello stesso tick. L'ho capito durante la notte, ora cercherò di trasferire le maniglie degli indicatori alla funzione OnInit.

Non ha funzionato. Ecco il codice ora


#property version   "1.00"

input int                  InpFastEMA=12;                // Fast EMA period
input int                  InpSlowEMA=26;                // Slow EMA period
input int                  InpSignalMA=9;                // Signal MA period
input ENUM_APPLIED_PRICE   InpAppliedPrice=PRICE_CLOSE;  // Applied price
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int Handle1, Handle2, Handle3;
double MacdArray[];

int OnInit()
  {
//---
  Handle1 = iMACD(_Symbol, PERIOD_M5, InpFastEMA, InpSlowEMA, InpSignalMA, InpAppliedPrice);
  Handle2 = iMACD(_Symbol, PERIOD_M15, InpFastEMA, InpSlowEMA, InpSignalMA, InpAppliedPrice);
  Handle3 = iMACD(_Symbol, PERIOD_H1, InpFastEMA, InpSlowEMA, InpSignalMA, InpAppliedPrice);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
        CopyBuffer(Handle1, 0, 1, 1, MacdArray);
        Print(MacdArray[0], " ", GetLastError());
        
        CopyBuffer(Handle2, 0, 1, 1, MacdArray);
        Print(MacdArray[0], " ", GetLastError());
        
        CopyBuffer(Handle3, 0, 1, 1, MacdArray);
        Print(MacdArray[0], " ", GetLastError());
  }
//+------------------------------------------------------------------+

I seguenti messaggi appaiono nel log

2013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988e-005 0

2013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988e-005 0

2013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988e-005 0

Ed è sempre così. Non sembra esserci un errore di copiatura.

 
sss20192: Non ha aiutato. Ecco il codice

Ma finora non avete né un controllo per la creazione di maniglie, né un controllo per il calcolo degli indicatori e un controllo per la copia. L'idea di spostare l'inizializzazione degli handle a OnInit() è corretta.

Inoltre, aggiungi la linea Print(MacdArray[0]) all'inizio di OnTick() - per vedere quale valore spazzatura è contenuto nell'array prima di iniziare a copiare i buffer.

Da aggiungere. Naturalmente, usare GetLastError() dopo la funzione stessa può essere una peculiarità dello stile di programmazione. Se non mi sbaglio, un valore nullo di GetLastError() non significa sempre che la funzione ha funzionato con successo.

 
Yedelkin:
Ma finora non avete né un controllo per la creazione di maniglie, né un controllo per il calcolo degli indicatori e un controllo per la copia. L'idea di spostare l'inizializzazione degli handle a OnInit() è corretta.
Ma solo per la prima volta. Se in qualsiasi altro punto del programma si scopre che qualche maniglia non è valida, dobbiamo cercare di ottenerla di nuovo. Pertanto, non possiamo dire che il codice scritto per ottenere gli handle in OnInit() risolverà completamente il problema e sarà corretto al 100%. ))
 
Controllato quanti dati sono stati copiati con la funzione CopyBuffer, scrive sempre 1. E non c'è nessun errore, ma i dati sono ancora sbagliati.
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyBuffer - Документация по MQL5
 

tol64

Yedelkin : L'idea di spostare l'inizializzazione degli handle a OnInit() è buona.

Ma solo per la prima volta. Se in qualsiasi altro punto del programma si scopre che qualche maniglia non è valida, si deve cercare di ottenerla di nuovo. Pertanto, non possiamo dire che il codice scritto per ottenere gli handle in OnInit() risolverà completamente il problema e sarà corretto al 100%. ))

Stai dicendo che l'idea di spostare l'inizializzazione delle maniglie a OnInit() da OnTick() è sbagliata in sé?
 
sss20192:
Ho controllato quanti dati sono stati copiati con la funzione CopyBuffer, scrive sempre 1. E non c'è nessun errore, ma i dati sono ancora sbagliati.

Ho questo risultato di questo codice nel tester:

//---

L'unica cosa che ho fatto prima del test è stata solo la conversione dei valori dell'indicatore prima dell'output nel log:

Print(DoubleToString(MacdArray[0],Digits())," ",GetLastError());
 
Yedelkin:
Stai dicendo che l'idea di spostare l'inizializzazione del gestore a OnInit() da OnTick() è sbagliata di per sé?
Se solo in OnInit() e da nessun'altra parte, allora sì - sbagliato. La prima volta che cerchiamo di ottenere un handle in OnInit(). Poi, prima di ogni tentativo di ottenere i dati dell'indicatore, controlliamo se la maniglia è valida. Se è valido, otteniamo i dati, se non lo è, cerchiamo di ottenere di nuovo l'handle.
 
tol64:

Ho ottenuto questo risultato di questo codice nel tester:

//---

L'unica cosa che ho fatto prima del test è stata di convertire semplicemente i valori dell'indicatore prima di emetterli nel log:

Oh, è geniale! Grazie mille! Terzo giorno risolvendo il problema)
 
tol64:
Yedelkin: stai dicendo che l'idea di spostare l'inizializzazione delle maniglie a OnInit() da OnTick() è sbagliata di per sé?
Se solo in OnInit() e da nessun'altra parte, sì - sbagliato. La prima volta che cerchiamo di ottenere un handle in OnInit(). Poi, prima di ogni tentativo di ottenere i dati dell'indicatore, controlliamo se l'handle è valido. Se è valido, otteniamo i dati, se non lo è, cerchiamo di ottenere di nuovo l'handle.

E senza "se"? E in relazione a questa particolare situazione? La maniglia dell'indicatore è stata creata nella funzione OnTick durante ogni tick, e i dati vengono copiati durante lo stesso tick. Significa che la stessa maniglia dell'indicatore è stata richiesta ogni volta, senza controllarne la validità/invalidità. In questo contesto, continuerete a sostenere che l'idea di trasferire l'inizializzazione degli handle a OnInit() da OnTick() è sbagliata di per sé?

PS. Sembra che lei abbia aiutato l'uomo, quindi la questione può essere considerata chiusa.