Domanda sulla funzione OnTradeTransaction - pagina 2

 
Mikalas:

Sì, è possibile non usare OnTradeTransaction, ma allora dovresti scavare nella storia, il che ridurrebbe la performance complessiva dell'EA.

Ogni sviluppatore ha una scelta!

Ecco perché ho iniziato a scavare in questa direzione...

Grazie per il chiarimento. Continuerò a scavare. Nessuno mi mette fretta. :))))

 
AlexeyVik:

Ecco perché ho iniziato a scavare in quella direzione...

Grazie per il chiarimento. Continuerò a scavare. Nessuno mi mette fretta. :))))

Il fatto è che l'esempio che ho dato è solo un'assicurazione che l'evento TradeTransaction non accadrà

Infatti, ho avuto 6 mesi di lavoro quotidiano dell'EA su un conto reale con 2000 transazioni al giorno,

Non ho mai avuto una situazione di "emergenza"!

Buona fortuna!

 
C-4:
Come se capissimo tutto e battessimo le mani per la gioia. Scusa, ma il tuo codice è un casino.

Oh sì, ho completamente dimenticato Vasiliy!

Il codice funziona al 100% - lancia l'EA sulla demo e vedi come funziona

in modalità normale, e poi commentate la funzione OnTradeTransaction e avrete

vedrete come funziona la modalità "emergenza".

 
AlexeyVik:

Quindi, se non usate l'asincronia, non c'è bisogno del gestore OnTradeTransaction, perché i gufi aspetteranno una risposta dal server?

Non complicare le cose. Non c'è bisogno di usare l'asincronia per fare trading su FORTS. Per iniziare, consultate questo articolo, capitolo 3: "Le basi delle operazioni asincrone". Non è molto, è molto elementare, ma è sufficiente per iniziare a studiarlo. Il codice descritto lì è asincrono al 100%, tuttavia, ciò non impedisce di lavorare in modalità sincrona senza ricevere tutti gli eventi OnTradeTransaction e altri.

AlexeyVik:

Ma finora non ho trovato il modo migliore per determinare se un ordine stop è stato attivato. Per esempio, ho impostato il mercato Buy 0,1 e SellStop 0,3, ma quando si attiva 0,3, rimane 0,2 e a che punto devo seguirlo... Così si scopre che dobbiamo seguire due ordini ad ogni tick. E volevo alleggerire i gufi e controllare solo quando la transazione avviene. Non volevo nemmeno controllare, ma controllare cosa era successo e decidere cosa fare. Ma credo che questo non sia il caso... Forse è meglio tornare ai vecchi metodi collaudati...

La soluzione dovrebbe essere basata sul vostro compito. In MetaTrader 5, hai solo una posizione attiva in qualsiasi momento, quindi sta a te tenerla d'occhio. Non c'è bisogno di guardare la storia dell'ordine. Se hai ancora bisogno della cronologia degli ordini, allora devi chiarire il tuo obiettivo.

 
Mikalas:

Oh sì, ho completamente dimenticato Vasiliy!

Il codice funziona al 100% - lancia l'EA sulla demo e vedi come funziona

in modalità normale, e poi commentate la funzione OnTradeTransaction e avrete

vedrete come funziona la modalità "emergenza".

Ho guardato il tuo codice più da vicino. La state rendendo troppo complicata. Non ci dovrebbe essere nessuna modalità "emergenza". Indipendentemente dal fatto che usiate un tipo di trading sincrono o asincrono, dovete concentrarvi sull'analisi dell'ambiente di trading. L'analisi degli eventi di tipo OnTradeTransaction è di carattere ausiliario.

Mikalas:

Sì, puoi scegliere di non usare OnTradeTransaction, ma in questo caso dovrai guardare attraverso la storia, il che ridurrà significativamente le prestazioni complessive di un EA.

Ogni sviluppatore ha una scelta!

Non è vero. L'analisi della storia non diminuisce le prestazioni dell'EA. Invece del vostro lungo CheckOrder(), è sufficiente scrivere qualcosa come questo (codice realmente funzionante):

///
/// Отслеживает поступление новых трейдов в истории трейдов.
///
void TrackingHistoryDeals()
{
    int total = HistoryDealsTotal();
    //Перебираем все доступные трейды и формируем на их основе прототипы будущих позиций типа COrder
    for(; dealsCountNow < HistoryDealsTotal(); dealsCountNow++)
    {  
        ulong ticket = HistoryDealGetTicket(dealsCountNow);
        AddNewDeal(ticket);
        graphRebuild = true;
    }
}

Questo è tutto. L'arrivo di nuovi scambi sarà rilevato automaticamente dalla funzione TrackingHistoryDeals(), che a sua volta sarà chiamata dal timer di sistema. Questa funzione deve essere chiamata anche in OnTradeTransaction(), per esempio al verificarsi dell'evento TRADE_TRANSACTION_DEAL_ADD, per guadagnare velocità e non dipendere dal permesso del timer impostato. Se questo evento viene perso, l'Expert Advisor scopre i cambiamenti un po' più tardi (nel mio caso è 200 ms), aspetta la prossima chiamata del timer e ottiene informazioni sull'attivazione dell'ordine.

 
C-4:

Ho guardato il tuo codice più da vicino. State complicando le cose. Non dovrebbe esserci alcuna modalità "crash". Indipendentemente dal fatto che usiate un tipo di trading sincrono o asincrono, dovreste concentrarvi sull'analisi dell 'ambiente di trading. L'analisi di eventi come OnTradeTransaction è di natura ausiliaria.

Questo non è vero. L'analisi della storia non riduce la performance dell'Expert Advisor. Invece del vostro lungo CheckOrder(), avete solo bisogno di scrivere qualcosa come questo (codice realmente funzionante):

Questo è tutto. L'arrivo di nuovi scambi sarà rilevato automaticamente dalla funzione TrackingHistoryDeals(), che a sua volta sarà chiamata dal timer di sistema. Questa funzione deve essere chiamata anche in OnTradeTransaction(), per esempio al verificarsi dell'evento TRADE_TRANSACTION_DEAL_ADD, per guadagnare velocità e non dipendere dal permesso del timer impostato. Se l'evento viene perso, l'Expert Advisor scopre i cambiamenti un po' più tardi (nel mio caso è 200 ms), aspetta la prossima chiamata del timer e ottiene informazioni sull'attivazione dell'ordine.

Parliamo lingue diverse.

Voi tenete la vostra opinione e io, se mi permettete, terrò la mia.

Non vedi nemmeno le cose ovvie:

Quando l'evento TradeTransaction arriva, non c'è bisogno di controllare NULLA - TUTTI i dati esistono già!

La funzione CheckOrder() NON funziona affatto se l'evento TradeTransaction è arrivato!!!

 
Mikalas:

Stiamo parlando in "lingue diverse".

Rimanga con la sua opinione, e io, con il suo permesso, rimarrò con la mia.

No, stiamo parlando la stessa lingua - MQL5 e il suo dialetto asincrono OrderSendAsync. Non importa come la si guardi, i compiti in Async devono essere risolti allo stesso modo. Date un'occhiata al mioarticolo qui sopra. Codice asincrono - interagire sincronicamente con esperti esterni. Essenzialmente una manifestazione non banale del polimorfismo. Tutto ciò è dovuto al fatto che l'enfasi in questo codice è posta sull'analisi dei cambiamenti dell'ambiente di trading. Questo dimostra ancora una volta che il modello degli eventi è utile ma di carattere secondario, di cui possiamo fare a meno anche nelle operazioni asincrone.
 
C-4:
No, stiamo parlando la stessa lingua - MQL5 e il suo dialetto asincrono OrderSendAsync. Non importa come lo guardi, devi risolvere gli stessi problemi con Async. Date un'occhiata al mioarticolo qui sopra. Codice asincrono - interagire sincronicamente con esperti esterni. Essenzialmente una manifestazione non banale del polimorfismo. Tutto grazie al fatto che l'enfasi in questo codice è posta sull'analisi dei cambiamenti dell'ambiente di trading. Questo dimostra ancora una volta che il modello event-driven è utile, ma di secondaria importanza, e possiamo farne a meno anche nelle operazioni asincrone.
Vasiliy, non essere testardo, esegui l'esempio su demo - allora capirai TUTTO!
 
Mikalas:
Vasily, non insistere, ed esegui l'esempio su una demo - allora capirai TUTTO!

Grazie, non ne ho più voglia:

2015.02.05 23:37:21.147 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: ticket ordine non ricevuto. Richiesta = 14

2015.02.05 23:37:20.767 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: ticket ordine non ricevuto. Richiesta = 13

2015.02.05 23:37:20.464 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: ticket ordine non ricevuto. Richiesta = 12

2015.02.05 23:37:20.105 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: ticket ordine non ricevuto. Richiesta = 11

2015.02.05 23:37:19.912 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: ticket ordine non ricevuto. Richiesta = 10

2015.02.05 23:37:19.832 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: ticket ordine non ricevuto. Richiesta = 9

2015.02.05 23:37:19.036 OnTradeTransaction: Biglietto d'ordine non ricevuto. Richiesta = 7

2015.02.05 23:37:05.723 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: ticket d'ordine non ricevuto. Richiesta = 6

2015.02.05 23:36:59.919 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: ticket ordine non ricevuto. Richiesta = 5

2015.02.05 23:36:59.199 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: ticket ordine non ricevuto. Richiesta = 4

2015.02.05 23:36:53.693 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: ticket ordine non ricevuto. Richiesta = 3

2015.02.05 23:36:52.689 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: ticket ordine non ricevuto. Richiesta = 2

2015.02.05 23:36:44.410 AutoTrading è abilitato

2015.02.05 23:36:41.995 Ordine non inviato! Codice di ritorno AUDCAD = AutoTrading non è permesso dal terminale client

2015.02.05 23:36:39.996 TestTradeTrans (AUDCAD,H1) Ordine non inviato! AUDCAD Return Code = AutoTradeTrans non è permesso dal terminale client

2015.02.05 23:36:39.958 TestTradeTrans (AUDCAD,H1) Ordine non inviato! AUDCAD Return Code = AutoTradeTrans non è permesso dal terminale client

2015.02.05 23:36:34.581 MQL5 'TestTradeTrans.mq5' compilato con successo

Sono riuscito a disabilitarlo, altrimenti avrebbe inondato l'intero terminale.

Z.I. A proposito, non cercate di incorporare questo codice nell'articolo. Questo esempio non è accettabile in nessuna circostanza, perché spamma orribilmente con ordini innumerevoli ad ogni tick!!!

 
C-4:

Grazie, non ne ho più voglia:

Sono riuscito a spegnerlo, altrimenti i rimbalzi avrebbero inondato tutto il terminale.

:)

1. ESEMPIO per i FORTI

2. Non si possono mettere i brackpoint?

3. Ho l'impressione che tu stia leggendo i messaggi attraverso una linea :)

Facciamo così.

Io ti faccio delle domande e tu rispondi, ok?

Domanda 1: come si riconosce il biglietto d'ordine (inviando il comando OrderSendAsync) se nessun evento TradeTransaction è arrivato (o non è usato)?