Buona sera.
Ragazzi, per favore aiutatemi a capire. Il problema probabilmente non è nuovo, ma non ho trovato una sola soluzione (né nella pratica né sui forum).
Sto eseguendo 2 diversi robot nel terminale su 2 strumenti diversi. Le magie sono diverse ovunque. Il robot pone dei limiti pendenti e la procedura OnTradeTransaction mi permette di rilevare una transazione e piazzare degli ordini di stop pendenti utilizzando questa transazione.
Di seguito è riportato il codice per la transazione commerciale
Questo è il codice della funzione che controlla se l'affare appartiene a un robot
Questo è il codice della procedura per gli ordini di stop in sospeso
Questo è il codice della funzione per cercare un ordine nella storia e fuori dalla storia
Vorrei emettere le informazioni sulle transazioni in entrata nel registro nell'ordine in cui sono ricevute nel terminale. Ora ho un problema che ho affrontato durante il trading su un conto demo:
A volte le transazioni vengono nel seguente ordine TRADE_TRANSACTION_ORDER_DELETE, poi TRADE_TRANSACTION_DEAL_ADD, poi TRADE_TRANSACTION_HISTORY_ADD. In questo caso gli ordini di stop spesso non vengono piazzati dopo che un'operazione è stata eseguita. Suppongo che questo accada perché l'ordine è già stato cancellato ma non è ancora stato aggiunto alla cronologia. Significa che non possiamo trovare l'ordine dell'affare né nella storia né nel terminale. Anche se è dubbio, il fatto è che non viene piazzato nessun ordine stop perché il robot non lo trova dopo aver cercato l'ordine in tutte le dimensioni(isFindOrder=false). L'ordine della transazione può essere corretto, ma l'ordine non si trova da nessuna parte.
Provato diversi approcci, niente aiuta. Ora sto pensando di aggiungere uno sleep di 1 secondo all'inizio di una procedura per piazzare ordini in sospeso, forse il tempo non è sufficiente. Non so nemmeno dove altro scavare.
Per favore, condividete le vostre esperienze e idee.
Non ho iniziato a guardare tutto il codice. Non credo affatto che questo approccio sia corretto.
Al momento della transazione di tipo TRADE_TRANSACTION_DEAL_ADD dobbiamo scegliere la trans.position e controllare la sua magia.
if(PositionSelectByTicket(trans.position) && PositionGetInteger(POSITION_MAGIC) == mag)
Potete anche controllare trans.symbol == _Symbol e prendere una decisione basata sui risultati di questi controlli.
Non ho esaminato tutto il codice. A mio parere, l'approccio non è affatto corretto.
Al momento del tipo di transazione TRADE_TRANSACTION_DEAL_ADD si dovrebbe scegliere trans.position e controllare il suo magik.
Potete anche controllare trans.symbol == _Symbol e prendere una decisione basata sui risultati di questi controlli.
Ho dimenticato di aggiungere che la modalità è la rete. La posizione è la stessa per tutti i robot. Cioè, un robot ha comprato una posizione, il secondo l'ha comprata, gli eventi TRADE_TRANSACTION_DEAL_ADD sono arrivati in ordine inverso e il primo robot non l'ha visto come risultato.
E logicamente ho bisogno di ottenere il commento dell'ordine dal trade, la posizione non è di grande aiuto qui.Condividete le vostre esperienze e idee per favore.
Una situazione
Forum sul trading, sistemi di trading automatico e test di strategia
fxsaber, 2018.06.20 23:18
Ho deciso di controllare quanto durano queste situazioni di ordine fantasma, quando un ordine è nel sistema ma non nel terminale.
// Советник отслеживает длительность ситуаций, когда ордер отсутствует среди текущих и исторических #define TOSTRING(A) #A + " = " + (string)(A) + "\n" #define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n" bool OrderIsExist( const ulong &OrderTicket ) { return(OrderTicket ? OrderSelect(OrderTicket) || HistoryOrderSelect(OrderTicket) : true); } void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest&, const MqlTradeResult& ) { static bool PrevIsExist = true; static ulong StartTime = 0; static ulong MaxInterval = 0; const ulong NowTime = GetMicrosecondCount(); const bool IsExist = OrderIsExist(Trans.order); if (!IsExist) { Print(TOSTRING2(Trans.type) + TOSTRING(Trans.order) + TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order))); if (PrevIsExist) StartTime = NowTime; } else if (!PrevIsExist) { const ulong Interval = NowTime - StartTime; Print(TOSTRING(Interval) + TOSTRING2(Trans.type) + TOSTRING(Trans.order) + TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order))); if (Interval > MaxInterval) { MaxInterval = Interval; Comment(TOSTRING(MaxInterval) + TOSTRING(Trans.order)); // mcs. } } PrevIsExist = IsExist; }
Risultato
2018.06.21 00:10:31.047 Trans.type = TRADE_TRANSACTION_ORDER_DELETE (2) 2018.06.21 00:10:31.047 Trans.order = 2210967406 2018.06.21 00:10:31.047 OrderSelect(Trans.order) = false 2018.06.21 00:10:31.047 HistoryOrderSelect(Trans.order) = false 2018.06.21 00:10:31.047 2018.06.21 00:10:31.080 Interval = 32643 2018.06.21 00:10:31.080 Trans.type = TRADE_TRANSACTION_HISTORY_ADD (3) 2018.06.21 00:10:31.080 Trans.order = 2210967406 2018.06.21 00:10:31.080 OrderSelect(Trans.order) = false 2018.06.21 00:10:31.080 HistoryOrderSelect(Trans.order) = true
32 millisecondi un ordine c'è ma non nel terminale! Provate a immaginare le conseguenze se la logica di trading fosse eseguita in questo intervallo...
È interessante che gli ordini fantasma sono più spesso presenti solo nei tipi di transazioneTRADE_TRANSACTION_ORDER_DELETE e TRADE_TRANSACTION_DEAL_ADD (molto più rari).
Una pessima sfumatura della piattaforma.
ZZY velocità discutibile delle transazioni commerciali su cinque, purtroppo.
Secondo
aprendo una posizione e OrdersTotal è aumentato di uno.
Per esempio, non ci sono posizioni o ordini - PositionsTotal = 0, OrdersTotal = 0.
Hai impostato un ordine a mercato. PositionsTotal = 0, OrdersTotal = 1.
L'ordine a mercato viene eseguito - OrdersTotal = 0. Ma PositionsTotal = 0!
Ho dimenticato di aggiungere che la modalità è la rete. La posizione è la stessa per tutti i robot.
Non importa. La posizione ha sempre un biglietto, ma può anche essere selezionata da un simbolo. Potrebbe essere necessario aggiungere un controllo sul volume degli affari o qualcos'altro. Per esempio, seleziona gli ordini e le operazioni di una posizione e scuotili per trovare quella giusta. Ma un accordo è un accordo... E nessuno garantisce la coerenza delle transazioni. Non molto tempo fa c'era un avvertimento sulla possibile perdita di transazioni.
Visto l'addendum nel tuo post, è tutto sbagliato. In questo caso, è necessario esaminare più attentamente.
Ho provato diversi approcci, ma niente funziona.
Scrivi una semplice azione che deve essere implementata.
Una situazione
Secondo
Grazie, lo leggerò, ma a prima vista conferma la mia supposizione.
Non importa. La posizione ha sempre un biglietto, ma si può anche selezionare per simbolo. Potrebbe essere necessario aggiungere un controllo sul volume delle transazioni o qualcos'altro. Per esempio, seleziona gli ordini e le operazioni di una posizione e scuotili per trovare quella giusta. Ma un accordo è un accordo... E nessuno garantisce la coerenza delle transazioni. Non molto tempo fa c'è stato un avvertimento sulla possibile perdita di transazioni.
Considerando l'addendum nel tuo post, non ci sta tutto. In questo caso, è necessario esaminare più attentamente.
Ho visto un post sulla perdita di transazioni, ma i moderatori hanno detto che era una reliquia del passato e hanno dimenticato di rimuoverlo dalla documentazione.
Scrivere una semplice azione da implementare.
Non capisco bene la scrittura di una semplice azione).
L'hanno fatto, ma non è stato molto tempo fa.
Non capisco bene come scrivere una semplice azione) Spiega per favore.
Qual è l'obiettivo commerciale?
Qual è il tuo obiettivo di trading?
Piazziamo ordini limite e quando scattano, piazziamo un ordine stop e un ordine take profit. Quando scatta un ordine stop, rimuoviamo il take profit e viceversa. Il ticket limite iniziale, sulla base del quale impostiamo l'ordine stop e take profit, è scritto nel commento dell'ordine stop e take profit. Questo è il motivo per cui è importante ottenere i commenti degli ordini in modo che quando scatta un ordine stop, si può trovare il take profit con lo stesso commento e cancellarlo.
Dato che il nostro robot ci permette di ricaricare le posizioni, dovremmo anche mettere un ordine di stop e un take profit e lasciare un commento con il ticket di take profit quando compriamo altre posizioni.
1 secondo di sonno può essere una buona idea? Avere tempo per tutte le transazioniTRADE_TRANSACTION_ORDER_DELETE eTRADE_TRANSACTION_HISTORY_ADD
- www.metatrader5.com
Илья Ребенок:
Il robot permette di scalare, quindi quando compriamo di più, mettiamo anche un ordine di stop e un take profit, e registriamo lo scaling nel ticket
Possiamo avere >=2 ordini take e stop allo stesso tempo?
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
Buona sera.
Ragazzi, per favore aiutatemi a capire. Il problema probabilmente non è nuovo, ma non ho trovato una sola soluzione (né nella pratica né sui forum).
Sto eseguendo 2 diversi robot nel terminale su 2 strumenti diversi. Le magie sono diverse ovunque. Il robot pone dei limiti pendenti e la procedura OnTradeTransaction mi permette di rilevare una transazione e piazzare degli ordini di stop pendenti utilizzando questa transazione.
Di seguito è riportato il codice per la transazione commerciale
Questo è il codice della funzione che controlla se l'affare appartiene a un robot
Questo è il codice della procedura per gli ordini di stop in sospeso
Questo è il codice della funzione per cercare un ordine nella storia e fuori dalla storia
Io farei uscire le informazioni sulle transazioni in entrata nei file di log nell'ordine in cui sono ricevute nel terminale. Ora ho un problema che ho affrontato durante il trading su un conto demo:
A volte le transazioni vengono nel seguente ordine TRADE_TRANSACTION_ORDER_DELETE, poi TRADE_TRANSACTION_DEAL_ADD, poi TRADE_TRANSACTION_HISTORY_ADD. In questo caso gli ordini di stop spesso non vengono piazzati dopo che un'operazione è stata eseguita. Suppongo che questo accada perché l'ordine è già stato cancellato ma non è ancora stato aggiunto alla cronologia. Significa che non possiamo trovare l'ordine dell'affare né nella storia né nel terminale. Anche se è dubbio, il fatto è che non viene piazzato nessun ordine stop perché il robot non lo trova dopo aver cercato l'ordine in tutte le dimensioni(isFindOrder=false). L'ordine delle transazioni può essere corretto, ma l'ordine non si trova da nessuna parte. In tutti i casi, il robot rileva correttamente la transazione, ma non arriva a piazzare gli ordini.Tuttavia, a volte funziona anche correttamente e gli ordini vengono piazzati.
Ho provato diversi approcci, ma niente funziona. Ora sto pensando di aggiungere un intervallo di 1 secondo all'inizio della procedura di ordine pendente. Non so davvero dove andare.
Per favore, condividete le vostre esperienze e idee.