ORDINE_POSIZIONE_ID - pagina 21

 
Mikalas:

...

Ma volevo implementarlo attraverso gliordini (succede che un ordine parzialmente eseguito "sta in piedi" per un paio o tre giorni),

...

Michael, avevi ragione! Perché non l'hai fatto? Dovete capire che quando avete a che fare con le posizioni nette, prima o poi vi troverete di fronte al fatto che non potete fare a meno dell'analisi degli ordini inclusi in essa. Questo è quello che ti dico come una persona che ha passato mesi a studiare questa questione, e ha fatto questo errore molte volte:) Inoltre, se hai più di un robot di trading, devi considerare il contributo di ogni robot nella posizione comune, e anche qui non puoi fare a meno degli ordini. Tutte le informazioni necessarie sono contenute negli ordini e nelle transazioni basate su di essi, e mappando le transazioni in una singola posizione netta le informazioni vengono cancellate irreversibilmente.

Ma se basate il vostro sistema sull'analisi degli ordini e delle operazioni, dovreste considerare l'esecuzione parziale degli ordini. Per fare questo, è necessario creare una versione virtuale dell'ordine e controllare l'arrivo di nuovi trade. Il mio algoritmo è il seguente:

1. È stato ricevuto un nuovo accordo (il contatore HistoryDealsTotal() è cambiato).

2. Se questo affare è iniziato da un certo ordine, creiamo un nuovo ordine che include un singolo affare (COrder* order = new Order(deal)).

3. Poi, cerchiamo nella nostra lista di ordini virtuali già esistenti, un ordine con lo stesso identificatore. Se tale ordine viene trovato, allora fondiamo le offerte dell'ordine creato con le offerte di quello trovato e aggiorniamo le sue proprietà, e cancelliamo l'ordine creato. Se lo stesso ordine non è ancora nella lista, lo aggiungiamo semplicemente alla lista.

In questo modo, il sistema diventa completamente deterministico. Con ogni nuovo trade il nostro ordine virtuale cambierà il suo stato, e non importa se l'ordine effettivo è in attesa di esecuzione o è già stato spostato nella cronologia, lo vedremo sempre nel nostro sistema nel volume effettivamente eseguito.

 
Contender:
E se chiudiamo la posizione, e la parte non eseguita dell'ordine non viene rimossa, si aprirà (o cambierà) un'altra posizione?

Bella domanda!

Se l'ordine è attivo, non è nella cronologia (questo è stato controllato per certo),

E naturalmente, un ordine attivo può aprire un'altra posizione, ma se

sarà eseguito di nuovo parzialmente, non gli assegneremo ORDER_POSITION_ID.

In altreparole,ORDER_POSITION_ID può essere visto solo nella storia.

 
C-4:

Sì, succede nel mercato azionario e queste situazioni devono essere prese in considerazione. Questo è uno degli svantaggi fondamentali degli ordini limite.

Nel tuo esempio penso che possiamo sostituirlo:

A:

Come tutte le operazioni di compravendita sono iniziate da un qualche tipo di ordine.

No, non si può, perché i trade avvengono in clearing, ma non hanno un ticket ( o meglio ticket = 0 ),

ma hanno un prezzo e un tipo (BUY e SELL) e naturalmente IN e OUT :(

 
C-4:

Mikhail, e giustamente! Perché non l'avete implementato? Dovete capire che quando avete a che fare con le posizioni nette, prima o poi vi troverete di fronte al fatto che non potete fare a meno dell'analisi degli ordini inclusi in essa. Questo è quello che ti dico come una persona che ha passato mesi a studiare questa questione, e ha fatto questo errore molte volte:) Inoltre, se hai più di un robot di trading, devi considerare il contributo di ogni robot nella posizione comune, e anche qui non puoi fare a meno degli ordini. Tutte le informazioni necessarie sono presenti negli ordini e nelle operazioni basate su di essi, e opacizzare le operazioni in una singola posizione netta al contrario cancella irreversibilmente le informazioni.

Ma se basate il vostro sistema sull'analisi degli ordini e delle operazioni, dovreste considerare l'esecuzione parziale degli ordini. Per fare questo, è necessario creare una versione virtuale dell'ordine e controllare l'arrivo di nuovi trade. Il mio algoritmo è il seguente:

1. È stato ricevuto un nuovo accordo (il contatore HistoryDealsTotal() è cambiato).

2. Se questo affare è iniziato da un ordine, creiamo un nuovo ordine che include un singolo affare (COrder* order = new Order(deal)).

3. Poi, cerchiamo nella nostra lista di ordini virtuali già esistenti, un ordine con lo stesso identificatore. Se tale ordine viene trovato, allora fondiamo le offerte dell'ordine creato con le offerte di quello trovato e aggiorniamo le sue proprietà, e cancelliamo l'ordine creato. Se lo stesso ordine non è ancora nella lista, lo aggiungiamo semplicemente alla lista.

In questo modo, il sistema diventa completamente deterministico. Lo stato del nostro ordine virtuale cambierà ad ogni nuova operazione e non importa se l'ordine effettivo è in attesa di esecuzione o è già stato spostato nella cronologia, lo vedremo sempre nel nostro sistema nel volume effettivamente eseguito.

Vasiliy, ho implementato tutto (non come hai fatto tu, ma neanche male), volevo solo ridurre il tempo di ricerca...
 
Serj_Che:

Problema risolto, relazioni risolte )

Ho una domanda correlata:

È molto scomodo selezionare un ordine per ticket per vedere le sue proprietà, perché non importa dove sia l'ordine nella storia o nel mercato, e il ticket non cambia.

Quindi dobbiamo cercare l'ordine sia qui che là.

Non sarebbe più semplice fare come in MT4: se selezioniamo un ordine, non importa dove si trova.

L'ho letto in MT4 Help:

Cosa ne pensate?

P.S. Spero che a Mihail non dispiaccia continuare questo thread, per non produrne altri nuovi?


Mikalas:

C-4, è molto bello che la discussione sia stata costruttiva!

Quindi, ho bisogno del prezzo "netto" della posizione per sapere (in un mese, per esempio) qual è il mio profitto.

...

Nella funzione (la sto usando ora):

...

Domanda pertinente, in generale l'API di MetaTrader5 è davvero di basso livello. Ma... Il trading in borsa ha un sacco di sfumature: esecuzione dell'ordine da parte di scambi multipli, scambi abbinati in una posizione netta e trasferimento attraverso la compensazione, un'abbondanza di operazioni di intermediazione e così via. Così MetaTrader5 API (e MT5 stesso) è tale, come ogni terminale di scambio dovrebbe essere.

Un'altra questione è che le sue API possono essere avvolte in un wrapper di alto livello scritto in MQL5 e utilizzare attraverso di esso le funzioni di più basso livello di MT5. Se avessi il wrapper, il compito di Mihail di calcolare il profitto sarebbe come questo

for(int i = 0; i < TransactionsTotal(); i++)
{
    if(TransactionSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
         ENUM_TRANS_TYPE trans_type = TransactionType();
         if(trans_type == TRANS_HEDGE_POSITION)
         {
              if(HedgePositionGetInteger(HEDGE_POSITION_MAGIC) != myMagic)continue;  // Работаем только со своими позициями.
              if(HedgePositionGetString(HEDGE_POSITION_SYMBOL) != Symbol())continue; // Работаем только с позициями на своем инструменте.
              double profit = HedgePositionGetDouble(HEDGE_POSITION_PROFIT_POINTS); //Профит в пунктах
              double currency = HedgePositionGetDouble(HEDGE_POSITION_PROFIT_CURRENCY); //Профит в валюте депозита.
              double price_open = HedgePositionGetDouble(HEDGE_POSITION_PRICE_OPEN); //Фактическая цена открытия позиции без клирингов и пр. изменений.
              double sl = HedgePositionGetDouble(HEDGE_POSITION_SL); //Узнаем уровень стоп-лосса позиции, если он есть, если нет - вернет нормализованный 0.0.
              if(HedgeOrderSelect(ORDER_SELECTED_INIT)) //Выбираем ордер, открывающий текущую позицию.
              {
                 int deals = HedgeOrderGetInteger(HEDGE_ORDER_DEALS_TOTAL); //Получаем количество сделок, открывающего ордера.
              }
              // Ну и так далее...
         }   
    }
}
 
Mikalas:

No, non puoi, perché i trade sono cancellati, ma non hanno ticket ( o meglio ticket = 0 ),

ma hanno un prezzo e un tipo (BUY e SELL) e naturalmente IN e OUT :(

Merda, giusto:

Allora tristezza per te.

 
Mikalas:
Vasiliy, ho implementato tutto (non come hai fatto tu, ma neanche male), volevo solo ridurre il tempo di ricerca...
A proposito, come vi occupate delle entrate multidirezionali dei vostri robot? Dopo tutto, l'entrata nel mercato di un Expert Advisor può essere l'uscita di un altro robot.
 
Mikalas:

Bella domanda!

Se l'ordine è attivo, non è nella cronologia (questo è stato controllato per certo),

E naturalmente, un ordine attivo può aprire un'altra posizione, ma se

sarà eseguito di nuovo parzialmente, non gli assegneremo ORDER_POSITION_ID.

In altreparole,ORDER_POSITION_ID può essere visto solo nella storia.

Qui c'è un'altra trappola. Una parte dei trade eseguiti da questo ordine apparterrà a una posizione, e l'altra parte apparterrà già all'altra, la nuova posizione. Allora la domanda è: quale identificatore di posizione gli verrà assegnato, quando alla fine arriverà alla storia?
 
C-4:
A proposito, come vi occupate delle entrate multidirezionali dei vostri robot? Dopo tutto, l'entrata di un Expert Advisor nel mercato può essere un'uscita dalla posizione di un altro robot.
Non ho alcuna sovrapposizione.
 
C-4:
Qui il problema è diverso. Una parte dei trade eseguiti di questo ordine apparterrà a una posizione, e l'altra parte apparterrà già a un'altra, nuova posizione. Allora la domanda è: quale ID di posizione gli verrà assegnato quando prima o poi arriverà alla storia?

Un ordine completamente riempito, riceverà l'ID della posizione che ha aperto o modificato.

Ma questo sarà disponibile solo ( ID ) nella storia.