Questa funzione mostra il risultato sbagliato, o meglio il risultato sbagliato. Mi sono informato e ho scoperto che il Position ID non cambia a U-turn (cioè durante un trade in/out), come descritto nella documentazione:
Un'inversione di posizione cambia il suo ID al ticket dell'ordine che ha portato all'inversione.
Il tuo GetPositionPrice può accumulare 2 o più posizioni opposte se c'è un'inversione, e calcola un prezzo medio per esse. Un tale prezzo medio di una posizione non ha alcuna utilità pratica.
Quindi, il Position ID cambia all'inversione o no?
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
igorbel: Come puoi dire da un trade in/out quale volume ha chiuso una posizione precedente e quale ne ha aperta una nuova?
Potete confrontarlo con l'attuale aperto. Ma è meglio esaminare la storia della posizione in base al suo id, che non cambia quando la girate... Volumi di acquisto/vendita per aiutare.
Dennis Kirichenko: Può essere confrontato con l'attuale posizione aperta. Ma è meglio esaminare la storia della posizione tramite il suo id, che non cambia quando la posizione è invertita... Volumi di acquisto/vendita per aiutare.
Da poco, l'ID di posizione CAMBIA quando si gira. La documentazione su questo è già stata aggiornata....
IDENTIFICATORE DI POSIZIONE
Il Position ID è un numero unico, che viene assegnato ad ogni posizione appena aperta e non cambia per tutta la sua durata. Corrisponde al ticket dell'ordine con cui è stata aperta la posizione.
L'identificatore di posizione è specificato in ogni ordine (ORDER_POSITION_ID) e ogni trade (DEAL_POSITION_ID) che lo ha aperto, modificato o chiuso. Usa questa proprietà per cercare ordini e compravendite relative alla posizione.
Un'inversione di una posizione cambia il suo identificatore al biglietto d'ordine che ha portato all'inversione.
Dennis Kirichenko: Potreste confrontarlo con l'attuale aperto. Ma è meglio esaminare la storia della posizione dall'id, che non cambia durante un'inversione... Volumi di acquisto/vendita per aiutare.
Questa non è affatto un'opzione. La posizione precedente potrebbe anche essere aperta a causa dell'inversione ecc. Potrebbe essere un'opzione, ma chiaramente non ottimale.
Da poco, l'ID della posizione CAMBIA quando ci si gira. La documentazione su questo è già stata aggiornata....
IDENTIFICATORE DI POSIZIONE
Il Position ID è un numero unico, che viene assegnato ad ogni posizione appena aperta e non cambia per tutta la sua durata. Corrisponde al ticket dell'ordine con cui è stata aperta la posizione.
L'identificatore di posizione è specificato in ogni ordine (ORDER_POSITION_ID) e ogni trade (DEAL_POSITION_ID) che lo ha aperto, modificato o chiuso. Usa questa proprietà per cercare ordini e compravendite relative alla posizione.
Un'inversione di una posizione cambia il suo identificatore al biglietto d'ordine che ha portato all'inversione.
long pos_id1,pos_id2,pos_id3;
ulong deal1_ticket=xxx;
ulong deal2_ticket=xxx;
ulong deal3_ticket=xxx;
if(!HistoryDealSelect(deal1_ticket))
Print(__FUNCTION__+": deal 1 not selected. Error=",GetLastError());
pos_id1=HistoryDealGetInteger(deal1_ticket,DEAL_POSITION_ID);
Print(__FUNCTION__+": ticket=",deal1_ticket,", position ID=",pos_id1);
if(!HistoryDealSelect(deal2_ticket))
Print(__FUNCTION__+": deal 2 not selected. Error=",GetLastError());
pos_id2=HistoryDealGetInteger(deal2_ticket,DEAL_POSITION_ID);
Print(__FUNCTION__+": ticket=",deal2_ticket,", position ID=",pos_id2);
if(!HistoryDealSelect(deal3_ticket))
Print(__FUNCTION__+": deal 3 not selected. Error=",GetLastError());
pos_id3=HistoryDealGetInteger(deal3_ticket,DEAL_POSITION_ID);
Print(__FUNCTION__+": ticket=",deal3_ticket,", position ID=",pos_id3);
Dove deal2_ticket è il ticket della transazione in/out, deal1_ticket è il ticket che precede la transazione in/out, deal3_ticket è il ticket dopo la transazione in/out. In tutti e tre i casi ottengo lo stesso ID di posizione.
Dove deal2_ticket è il ticket della transazione in/out, deal1_ticket è il ticket che precede la transazione in/out, deal3_ticket è il ticket dopo la transazione in/out. In tutti e tre i casi ottengo lo stesso ID di posizione.
Il mio sta cambiando. Prova sulla build 1340 più recente.
igorbel: E come possiamo determinare da un trade in/out quale volume ha chiuso la posizione precedente e quale ha aperto quella nuova?
Questo Expert Advisor viene eseguito in modalità "Debugging on History" su un conto netting. L'esempio è un po' approssimativo, perché si calcola che ci sia solo un affare di tipo "IN/OUT" nella storia dell'affare.
All'inizio, dopo tutte le operazioni eseguite e la chiusura completa di una posizione, vengono mostrate le descrizioni di tutte le operazioni(DEAL_POSITION_ID, DEAL_VOLUME, DEAL_ENTRY, DEAL_TYPE), a quel punto DEAL_POSITION_ID per un'operazione di tipo IN/OUT viene memorizzato.
Poi passa di nuovo attraverso la storia e somma tutte le voci per le compravendite con DEAL_POSITION_ID.
Questo è approssimativamente ciò che otteniamo:
10:58:23.963 Test (EURUSD,H1) 2016.01.0400:06:42 CTrade::OrderSend: instant buy 0.04 EURUSD at 1.08732 [done at 1.08732]
10:58:30.692 Test (EURUSD,H1) 2016.01.0400:07:10DEAL_POSITION_ID0, DEAL_VOLUME0.00, DEAL_ENTRYDEAL_ENTRY_IN, DEAL_TYPEDEAL_TYPE_BALANCE10:58:30.784 Test (EURUSD,H1) 2016.01.0400:07:10DEAL_POSITION_ID2, DEAL_VOLUME0.02, DEAL_ENTRYDEAL_ENTRY_IN, DEAL_TYPEDEAL_TYPE_BUY10:58:32.074 Test (EURUSD,H1) 2016.01.0400:07:10DEAL_POSITION_ID2, DEAL_VOLUME0.01, DEAL_ENTRYDEAL_ENTRY_IN, DEAL_TYPEDEAL_TYPE_BUY10:58:33.826 Test (EURUSD,H1) 2016.01.0400:07:10DEAL_POSITION_ID2, DEAL_VOLUME0.07, DEAL_ENTRYDEAL_ENTRY_INOUT, DEAL_TYPEDEAL_TYPE_SELL10:58:37.237 Test (EURUSD,H1) 2016.01.0400:07:10DEAL_POSITION_ID4, DEAL_VOLUME0.04, DEAL_ENTRYDEAL_ENTRY_OUT, DEAL_TYPEDEAL_TYPE_BUY10:59:07.397 Test (EURUSD,H1) 2016.01.0400:07:19DEAL_POSITION_ID2: volume in 0.03, volume out 0.07
Funzioni usate frequentemente e utili:
Funzione GetPositionPrice() ridisegnata:
Questa funzione mostra il risultato sbagliato, o meglio il risultato sbagliato. Mi sono informato e ho scoperto che il Position ID non cambia a U-turn (cioè durante un trade in/out), come descritto nella documentazione:
https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties
Un'inversione di posizione cambia il suo ID al ticket dell'ordine che ha portato all'inversione.
Il tuo GetPositionPrice può accumulare 2 o più posizioni opposte se c'è un'inversione, e calcola un prezzo medio per esse. Un tale prezzo medio di una posizione non ha alcuna utilità pratica.
Quindi, il Position ID cambia all'inversione o no?
Come puoi dire da un trade in/out quale volume ha chiuso una posizione precedente e quale ne ha aperta una nuova?
Può essere confrontato con l'attuale posizione aperta. Ma è meglio esaminare la storia della posizione tramite il suo id, che non cambia quando la posizione è invertita... Volumi di acquisto/vendita per aiutare.
Da poco, l'ID di posizione CAMBIA quando si gira. La documentazione su questo è già stata aggiornata....
IDENTIFICATORE DI POSIZIONE
Il Position ID è un numero unico, che viene assegnato ad ogni posizione appena aperta e non cambia per tutta la sua durata. Corrisponde al ticket dell'ordine con cui è stata aperta la posizione.
L'identificatore di posizione è specificato in ogni ordine (ORDER_POSITION_ID) e ogni trade (DEAL_POSITION_ID) che lo ha aperto, modificato o chiuso. Usa questa proprietà per cercare ordini e compravendite relative alla posizione.
Un'inversione di una posizione cambia il suo identificatore al biglietto d'ordine che ha portato all'inversione.
lungo
Potreste confrontarlo con l'attuale aperto. Ma è meglio esaminare la storia della posizione dall'id, che non cambia durante un'inversione... Volumi di acquisto/vendita per aiutare.
Questa non è affatto un'opzione. La posizione precedente potrebbe anche essere aperta a causa dell'inversione ecc. Potrebbe essere un'opzione, ma chiaramente non ottimale.
Da poco, l'ID della posizione CAMBIA quando ci si gira. La documentazione su questo è già stata aggiornata....
IDENTIFICATORE DI POSIZIONE
Il Position ID è un numero unico, che viene assegnato ad ogni posizione appena aperta e non cambia per tutta la sua durata. Corrisponde al ticket dell'ordine con cui è stata aperta la posizione.
L'identificatore di posizione è specificato in ogni ordine (ORDER_POSITION_ID) e ogni trade (DEAL_POSITION_ID) che lo ha aperto, modificato o chiuso. Usa questa proprietà per cercare ordini e compravendite relative alla posizione.
Un'inversione di una posizione cambia il suo identificatore al biglietto d'ordine che ha portato all'inversione.
lungo
È scritto così, ma in realtà non cambia nulla.
Il mio codice, se volete:
Dove deal2_ticket è il ticket della transazione in/out, deal1_ticket è il ticket che precede la transazione in/out, deal3_ticket è il ticket dopo la transazione in/out. In tutti e tre i casi ottengo lo stesso ID di posizione.
Lo dice, ma in realtà non cambia nulla.
Se volete, il mio codice:
Dove deal2_ticket è il ticket della transazione in/out, deal1_ticket è il ticket che precede la transazione in/out, deal3_ticket è il ticket dopo la transazione in/out. In tutti e tre i casi ottengo lo stesso ID di posizione.
E come possiamo determinare da un trade in/out quale volume ha chiuso la posizione precedente e quale ha aperto quella nuova?
Questo Expert Advisor viene eseguito in modalità "Debugging on History" su un conto netting. L'esempio è un po' approssimativo, perché si calcola che ci sia solo un affare di tipo "IN/OUT" nella storia dell'affare.
All'inizio, dopo tutte le operazioni eseguite e la chiusura completa di una posizione, vengono mostrate le descrizioni di tutte le operazioni(DEAL_POSITION_ID, DEAL_VOLUME, DEAL_ENTRY, DEAL_TYPE), a quel punto DEAL_POSITION_ID per un'operazione di tipo IN/OUT viene memorizzato.
Poi passa di nuovo attraverso la storia e somma tutte le voci per le compravendite con DEAL_POSITION_ID.
Questo è approssimativamente ciò che otteniamo:
Sta cambiando per me. Prova con l'ultima build 1340.