Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 850

 
Artyom Trishkin:
Correggere l'indicatore della curva. Può disegnare una linea solo al ricalcolo completo, che è fatto dal comando del menu contestuale.
Alexey Viktorov:

Ce n'è uno anche in mql4.

Grazie.

 
L'ho tirato fuori con una stampella). Volevo che l'indicatore si aggiornasse dopo aver trascinato manualmente la linea verticale, da cui prende il tempo. Ho usato la funzione evento di trascinamento di un oggetto e ci ho messo la funzione di cambiamento di TF con ritorno a quello iniziale. Ma per qualche motivo l'aggiornamento è ritardato, circa alcuni secondi. La funzione di commutazione TF funziona così lentamente che non capisco.
 
khorosh:
L'ho risolto con una stampella). Avevo bisogno di aggiornare l'indicatore dopo il trascinamento manuale di una linea verticale, da cui prende il tempo. Ho usato la funzione di trascinamento di un oggetto e ci ho messo dentro la funzione di cambiamento di TF con un ritorno a quello iniziale. Ma per qualche motivo l'aggiornamento è ritardato, circa alcuni secondi. La funzione di commutazione TF è troppo lenta, non la capisco.

Questa funzione è asincrona. Restituisce solo il risultato del comando nella coda degli eventi.

Per aggiornare immediatamente, è necessario eseguire il comando ChartRedraw() dopo il comando di commutazione del grafico

Questo è, ovviamente, un approccio sbagliato. Se volete aggiornare il grafico solo dopo il completamento dello spostamento della linea, il ciclo di ricalcolo dell'indicatore dovrebbe essere chiamato non da OnCalculate() ma da ChartEvent() - lo spostamento della linea viene catturato - viene chiamata la funzione di ricalcolo dell'indicatore, che eseguirà l'intero ciclo di ricalcolo della linea con i nuovi dati (la linea è necessaria per alcuni dati, vero?).

Oppure l'indicatore semplicemente non è fatto correttamente e non aggiorna la barra zero sui dati attuali, e tu l'hai calciato?

 
ilyav:

Qualcuno può aiutare a fissare il codice EA su MT5?

Ho letto i manuali, ma non posso battere 2 vernici nella compilazione.

dichiarazione di 'xxxx ' nasconde la dichiarazione globale

и

possibile perdita di dati a causa della conversione del tipo

Vedere il suggerimento allegato.

Ho solo stupidamente corretto i nomi delle variabili globali e fatto corrispondere i tipi.

Sono 10.000.000 che puoi far pagare - per aver superato la tua pigrizia.

File:
 
Artyom Trishkin:

Ho solo corretto i nomi delle variabili globali e allineato i tipi.

Mi devi 10 000 000 per aver superato la tua pigrizia.

Grazie mille.

Mi vergogno di mostrare come l'ho sistemato)

int CountTrades(long PositionID1)

 
Artyom Trishkin:

Questa funzione è asincrona. Restituisce solo il risultato del comando nella coda degli eventi.

Per aggiornare immediatamente, è necessario eseguire il comando ChartRedraw() dopo il comando di commutazione del grafico

Questo è, ovviamente, un approccio sbagliato. Se avete bisogno di aggiornare il grafico solo dopo il completamento dello spostamento della linea, il ciclo di ricalcolo dell'indicatore dovrebbe essere chiamato non da OnCalculate() ma da ChartEvent() - lo spostamento della linea viene catturato - viene chiamata la funzione di ricalcolo dell'indicatore, che eseguirà il ciclo completo di ricalcolo della linea con i nuovi dati (la linea è necessaria per alcuni dati, vero?).

O forse l'indicatore è stato semplicemente reso errato e non aggiorna la barra zero sui dati attuali e l'hai incasinato?

L'indicatore conta le ultime barre non calcolate. E dopo aver trascinato la verticale, dovrebbe ricalcolare completamente dopo aver letto il nuovo tempo verticale. Ne ho scritto qui e ho aggiunto degli screenshot di come funziona.

Grazie, cercherò di implementare la tua idea. In generale non sono molto bravo con gli indicatori, ho avuto a che fare soprattutto con gli Expert Advisors.

 
Artyom Trishkin:

Questa funzione è asincrona. Restituisce solo il risultato del comando nella coda degli eventi.

Per aggiornare immediatamente, è necessario eseguire il comando ChartRedraw() dopo il comando di commutazione del grafico

Questo è, ovviamente, un approccio sbagliato. Se volete aggiornare il grafico solo dopo il completamento dello spostamento della linea, il ciclo di ricalcolo dell'indicatore dovrebbe essere chiamato non da OnCalculate() ma da ChartEvent() - spostamento della linea - chiamata della funzione di ricalcolo dell'indicatore, che eseguirà l'intero ciclo di ricalcolo della linea con i nuovi dati (la linea è necessaria per alcuni dati, giusto?).

O forse l'indicatore non è fatto correttamente e non aggiorna la barra zero sui dati attuali, e l'hai preso a calci?

Ho fatto come mi hai consigliato. Tutto ha funzionato perfettamente. Ora istantaneamente dopo il trascinamento l'indicatore è completamente ridisegnato. Grazie ancora.

 
khorosh:

Ho fatto come mi hai consigliato. Tutto ha funzionato perfettamente. Ora, immediatamente dopo il trascinamento, l'indicatore è completamente ridisegnato. Grazie ancora.

Non c'è di che. Ma dovrebbe essere disegnato in OnCalculate(), o no?

Quando viene trascinato sul grafico, l'indicatore non è consapevole dei cambiamenti della linea, ma dovrebbe disegnare la linea.

 
Artyom Trishkin:

Non c'è di che. Ma dovrebbe disegnare in OnCalculate(), o no?

Quando lo si applica a un grafico, non è a conoscenza dei movimenti della linea, ma dovrebbe disegnare la linea.

Quando l'indicatore è collegato al grafico, viene creata una linea verticale in init() e inizialmente viene impostato un tempo per essa, per esempio Time[10]. Ho duplicato il codice inOnChartEvent() e OnCalculate(). Solo in OnChartEvent ho ricalcolato da tutte le barre.

 
khorosh:

Quando si installa l'indicatore sul grafico in init() viene creata una linea verticale che inizialmente è impostata su un certo tempo, per esempio Time[10]. Ho duplicato il codice in OnChartEvent() e OnCalculate(). Solo in OnChartEvent ho ricalcolato da tutte le barre.

Non sarebbe meglio creare semplicemente la funzione Refresh(), per esempio, con i parametri formali richiesti, e chiamarla quando necessario?

E a proposito, quando si ottiene il tasso_totale nell'indicatore oltre OnCalculate() usando Bars() con un intervallo di date, si può prendere un blocco dell'indicatore:

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

Analogo di iBarShift

Nikolai Semko, 2018.04.05 23:47

Finora questa variante, ma ora voglio aggiungerla per aggirare questo bug dei blocchi della funzione Bars, di cui ho già scritto a servicedesk.

L'essenza di questo bug è che se nella funzione Bars siastart_time chestop_time sono dentro una barra o sono nel futuro (a destra della barra zero), allora questa funzione si blocca per più di 10 secondi.

Forse più tardi farò una versione più veloce ma più ingombrante.


Motivazione: