Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1188
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
In generale, a giudicare dalla tua risposta, non hai capito bene come funziona il programma. Quindi sembra una domanda stupida. Proprio come il commentatore precedente pensa che si fermi. Solo dall'esperienza di programmazione in altri linguaggi, penso che esegua il suo corpo in un ciclo, e quando arriva un evento, si immerge in esso. Se il programma esegue il suo corpo in un ciclo, questo spiega perché il programma è scritto in quel modo.
Quando si verifica un evento "nuovo tick", il programma viene avviato nel gestore OnTick(), eseguito fino al completamento e fermato. Con l'arrivo di una nuova zecca tutto si ripete dall'inizio. Se un nuovo tick è arrivato durante l'esecuzione del programma, e il programma non ha finito di elaborare il tick precedente (è ancora in esecuzione), allora questo tick viene saltato.
I programmi in MQL non sono in loop. Hanno tre punti di ingresso - OnInit(), OnDeinit() e OnTick().
All'avvio, viene eseguita OnInit(), poi quando viene ricevuto un tick - OnTick(), quando l'operazione è finita - OnDeinit().
Ci sono anche altri gestori. Ma è meglio che tu apra l'aiuto piuttosto che chiedere a qualcuno di duplicarlo qui.
Salve. Mentre lavoravo al mio indicatore ho trovato un bug al riavvio del terminale. Sulla base di questo bug ho fatto un piccolo codice sorgente per il suo test:
Se questo esempio è lanciato su un grafico (o è il primo avvio del terminale dopo l'avvio del sistema) tutto funziona bene. Nel registro c'è scritto quanto segue:
2020.06.24 21:05:50.773 Loader::Loader symbol: EURUSD timeframe: PERIOD_H1
2020.06.24 21:05:50.773 Loader::Loader bar: 140433
2020.06.24 21:05:50.773 Loader::Loader Error: 0
2020.06.24 21:05:50.773 Loader::Loader bars (2): 140433
Ma se riavvio il terminale con questo indicatore ottengo un errore:
2020.06.24 21:07:34.963 Loader::Loader simbolo: EURUSD timeframe: PERIOD_H1
2020.06.24 21:07:34.963 Loader::Loader bars: 0
2020.06.24 21:07:34.963 Loader::Loader Error: 4401
2020.06.24 21:07:34.964 Loader::Loader bars (2): 140433
Simbolo e timeframe inizializzati ok
2020.06.24 21:07:34.963 Loader::Loader simbolo: EURUSD timeframe: PERIOD_H1
Ma iBars(simbolo, timeframe) dà 0 per qualche motivo
2020.06.24 21:07:34.963 Loader::Loader bars: 0
In questo caso appare l'errore 4401.
Ma iBars(Symbol(), Period()) funziona bene.
2020.06.24 21:07:34.964 Loader::Loader bars (2): 140433
Almeno symbol = Symbol() e timeframe = Period() secondo i messaggi di log (anche durante il lag, quando il terminale si riavvia). Come può iBars(symbol, timeframe), con simbolo e timeframe assolutamente corretti, dare zero, mentre iBars(Symbol(), Period()) funziona bene, se i parametri nelle funzioni sono gli stessi, secondo il log?
Come posso aprire un conto demo MT4 su MetaQuotes Demo? Prima funzionava senza problemi, ora nell'ultima pagina del dialogo dice: Registration, Wait a little, please, e in questo stato rimane inattivo indefinitamente, i campi con login e password rimangono vuoti. Nessun messaggio nel registro. Provato sia "demo" che "reale" e diversi tipi di conti.
UPD Provato un broker demo - stessa cosa.
Quando si verifica un evento "nuovo tick", il programma viene avviato nel gestore OnTick(), eseguito fino al completamento e fermato. Con l'arrivo di una nuova zecca tutto si ripete dall'inizio. Se un nuovo tick è arrivato durante l'esecuzione del programma, e il programma non ha finito di elaborare il tick precedente (è ancora in esecuzione), allora questo tick viene saltato.
I programmi in MQL non sono in loop. Hanno tre punti di ingresso - OnInit(), OnDeinit() e OnTick().
All'avvio, viene eseguita OnInit(), poi quando viene ricevuto un tick - OnTick(), quando l'operazione è finita - OnDeinit().
Ci sono anche altri gestori. Ma è meglio che tu apra l'aiuto piuttosto che chiedere a qualcuno di duplicarlo qui.
Grazie. Sì, lo capisco, è solo che la funzione è scritta nel corpo del programma. Forse non ho notato che si chiama da qualche parte.
Come possiamo vedere di cosa stai parlando? Ci faccia un esempio.
Come possiamo vedere di cosa stai parlando? Ci faccia un esempio.
Grazie. Sì, lo capisco, è solo che la funzione è scritta nel corpo del programma. Forse devo essermi perso una chiamata da qualche parte.
In mql4 le funzioni sono scritte in qualsiasi ordine, sopra sotto non importa, può sembrare che funzionino prima o dopo. Non esiste una cosa del genere in C++ dove tutte le funzioni possono lavorare solo in ordine di scrittura e se volete chiamarla, deve essere definita prima del luogo di chiamata altrimenti il programma va in crash. L'uomo mi ha mostrato come scrivere funzioni in ordine diverso, ma non ricordo come farlo in C++.
Saluti. Per favore, aiutatemi. Ho questa domanda. Ho capito bene. Il programma viene eseguito dall'inizio alla fine, ma si ferma quando si verifica un evento, ad esempio un tick, la funzione ontick inizia ad essere eseguita, poi finisce la sua esecuzione e il programma viene eseguito di nuovo dall'inizio? Questa domanda è legata a quanto segue: dove scrivo per esempio la dimensione del lotto di trading, nel corpo del programma o nella funzione ontick?
Guardo il bot ufficiale, che è un esempio nel terminale, ci calcolo molto viene eseguito nel corpo del programma, e non capisco perché così.
Il mio lotto è calcolato in questo modo
è all'inizio dell'Expert Advisor... e l'ho messo alla fine del codice
Quando la funzione OnTick chiama la variabile Lots, allora EA la trova e la ricalcola.
@Artyom Trishkin
Sei un moderatore in questo thread?