Errore numero 6 - pagina 29

 
registri inviati. <br / translate="no"> Dove devo mettere questo codice?
while(!IsStopped() && !IsTradeAllowed()) Sleep(1000); GlobalVariableSet(strTradeSemaphore, 0.0);


all'uscita della funzione di avvio
 
Provato Sleep()
Fino a 100000 senza miglioramenti visibili

Sostituito da
if(!IsTesting()) { Sleep(1000); GlobalVariableSet(strTradeSemaphore, 0.0); }


su

while(!IsStopped() && !IsTradeAllowed()) Sleep(1000); GlobalVariableSet(strTradeSemaphore, 0.0);



Stesso pepe.
Errore 146.

 
Dopo un po', ripensandoci, si è scoperto che esiste un metodo esatto. Proverò a formularlo<br/ translate="no">
while(!IsStopped() && !IsTradeAllowed()) Sleep(1000); GlobalVariableSet(strTradeSemaphore, 0.0);


cioè noi stessi stiamo aspettando che il nostro contesto di trading venga rilasciato

e in generale, questa è una situazione estremamente strana. dopo aver condotto un'operazione di trading, il contesto viene rilasciato istantaneamente. altrimenti sarebbe impossibile chiudere le posizioni in un ciclo



Ancora una volta.

Il codice di cui sopra causerà l'arresto dell'Expert Advisor, se il trade flag è stato cancellato.
Questo farà sì che il commercio si fermi del tutto, perché nessuno segnalerà il semaforo. Questa situazione è almeno in qualche modo controllabile, perché la bandiera può essere rimossa solo manualmente.
Peggio ancora è il caso del semaforo. GlobalVariableSet può cadere su un altro EA, quando quest'ultimo chiude il semaforo. Come risultato, diversi EA cercheranno di fare trading allo stesso tempo.
Come vediamo, gli sviluppatori non capiscono quali processi asincroni avvengono nel terminale. E questo malinteso viene esportato nel forum.
Non c'è da stupirsi che appaiano errori fatali, come quello discusso qui, e che questi errori non possano essere corretti.

Perché dare consigli dannosi?
 
Perché dare consigli a вредные?

Il presupposto è che se il consulente ha raggiunto questo punto, allora la bandiera del trading sta in piedi!
 
Зачем давать вредные советы?

si presume che se l'EA ha raggiunto questo punto, allora la bandiera di trading è alzata!

Qual è la base di questa supposizione? Quando le ipotesi non corrispondono alla realtà, si verificano errori inaspettati.
La bandiera non è niente.
Sincronizzazione, mutex, risorse condivise - il problema è reale. È un'assurdità suggerire di risolverlo con variabili globali a livello utente. Soprattutto perché l'esempio è impraticabile.
 
A partire dalle 12 di ieri sera, gli esperti stavano lavorando su MQ-demo e Alpari-demo. Durante tutto il tempo non c'era nessun errore 128, su Alpari c'era un errore 6 (errore di ping), e su entrambi - diversi vecchi tick. Gli ordini hanno funzionato senza errori. Build 1.8.3 del 05.10. Forse è qualcos'altro? Per esempio, le peculiarità della connessione attraverso la porta 443 su diversi provider Internet? MT3 aveva degli errori, ma non così tanti.


Ahimè. "Dalle 12 di notte" non è una statistica. Per ragioni sconosciute, i problemi arrivano a ondate, poi nessuno, poi diversi in una volta...
 
<br / translate="no"> Quark, abbi una coscienza, non pubblicare tali registri sul forum =)))))


Ho pensato - chi se ne frega (tono da violinista di Kindzadz) :))


Per quanto riguarda la realtà della chiusura/apertura - ho dei controlli in tutte le funzioni f e gli errori appaiono, ma sono errori FALSI. Ho controllato i registri e la cronologia degli ordini, tutte le posizioni erano chiuse. L'ordine non ha avuto il tempo di muoversi nella storia. Ho fatto un ritardo di 1 secondo prima di controllare - ma non è abbastanza... Quando ho chiesto, non mi hanno dato alcuna risposta.


Buon punto. Ma ho avuto casi in cui anche un'ora dopo l'ordine non è andato da nessuna parte, cioè, a volte non sono falsi.
Anch'io ho un ritardo di 10 secondi.
 
Questo è un buon punto. Ma ho avuto casi in cui anche un'ora dopo l'ordine non è andato da nessuna parte, cioè a volte non sono falsi. <br / translate="no"> Ho anche un ritardo di 10 secondi ciascuno.

Tutti i miei errori, come si è scoperto, erano nel codice =) cioè ho fatto il controllo sbagliato dopo l'orderclose.
Dopo averlo corretto - non ce ne sono. È vero che non è passato molto tempo, dobbiamo aspettare...
 
<br / translate="no"> tutti i miei errori sembravano essere nel codice =) cioè ho fatto il controllo sbagliato dopo orderclose.
Dopo averlo corretto - non ce ne sono. È vero che non è passato molto tempo, dovremo aspettare...


Come appare il codice corretto?
 
Che aspetto ha il codice corretto?

per orderclaus:
//---- controlla se la posizione ha effettivamente chiuso e, in caso contrario, emette l'informazione ed esce, restituendo -5 per ( int x = 0; x < 5; x ++ ) { Sleep(1000);
		if ( OrderSelect( Close_OrderTicket, SELECT_BY_TICKET ) ) { if ( OrderCloseTime() <= 0 ) { Processing_Error ( 0, "OrderClose" ); _Return_ ( 3, "Error", 0, "Position was not closed", "OrderClose(...)", "La posizione non è stata chiusa" ); return(-5); } else { break; } } } Close_GetLastError = GetLastError(); _Print_ ( 3, "OrderSelect( " + Close_OrderTicket + ", SELECT_BY_TICKET )", "Error #" + Close_GetLastError + " ( " + ErrorDescription( Close_GetLastError ) + " )" ); }


per ordersand - solo un 5x tentativo di selezionare un ordine con una seconda pausa,
per modifiersand - confrontando i vecchi valori con quelli attuali