Discussione sull’articolo "Manuale MQL5: La cronologia delle offerte e la libreria di funzioni per ottenere proprietà di posizione"

 

Il nuovo articolo Manuale MQL5: La cronologia delle offerte e la libreria di funzioni per ottenere proprietà di posizione è stato pubblicato:

È il momento di riassumere brevemente le informazioni fornite nei precedenti articoli sulle proprietà della posizione. In questo articolo creeremo alcune funzioni aggiuntive per ottenere le proprietà che possono essere ottenute solo dopo aver effettuato l'accesso alla cronologia delle offerte. Acquisiremo anche familiarità con le strutture dati che ci consentiranno di accedere alle proprietà di posizione e simbolo in modo più comodo.

Per poter vedere il funzionamento delle nuove funzioni nell'Expert Advisor modificato nel precedente articolo chiamato "MQL5 Cookbook: Come evitare errori durante l'impostazione/modifica dei livelli commerciali", aggiungeremo la possibilità di aumentare il volume della posizione se si verifica nuovamente un segnale di apertura, mentre la posizione è già presente.

Potrebbero esserci diverse operazioni nella cronologia delle posizioni e, se si sono verificati cambiamenti nel volume della posizione nel corso del trading, devono esserci stati anche cambiamenti nel prezzo della posizione corrente. Per conoscere il prezzo del primo punto di ingresso, dobbiamo accedere allo storico delle trattative rispetto a quella specifica posizione. La figura seguente è una dimostrazione del caso in cui una posizione ha una sola operazione (punto di ingresso):

Fig. 1. Primo affare in posizione


Autore: Anatoli Kazharski

 
L'articolo è buono, mi è piaciuto. Capita spesso che la posizione corrente sia composta da diverse operazioni e, oltre alla prima e all'ultima, mi piacerebbe conoscere i parametri di 2, 3, ecc. operazioni. Una funzione del genere arricchirebbe l'articolo.
 
paladin800:
L'articolo è buono, mi è piaciuto. Capita spesso che la posizione corrente sia composta da diverse operazioni e, oltre alla prima e all'ultima, mi piacerebbe conoscere i parametri di 2, 3, ecc. operazioni. Una funzione del genere arricchirebbe l'articolo.
Per ora è un compito a casa. Ma cercherò di scrivere qualcosa di più su questo argomento in seguito.
 

Domanda all'autore dell'articolo.

Come posso ottenere l'ID della posizione in cui il trade è stato coinvolto subito dopo l'apertura della posizione?



 
denkir:

Domanda all'autore dell'articolo.

Come ottenere l'identificatore della posizione, in cui è stato effettuato il trade, subito dopo l'apertura della posizione?

Selezionate la posizione con la funzione PositionSelect() e ottenete il suo identificatore con la funzione PositionGetInteger() e l'identificatore mql5 - POSITION_IDENTIFIER.

Esempio dalla Guida:

//+------------------------------------------------------------------+
//| Funzione commerciale|
//+------------------------------------------------------------------+
void OnTrade()
  {
//--- controlla se la posizione è disponibile e stampa l'ora della sua modifica
   if(PositionSelect(_Symbol))
     {     
//--- ottenere l'identificatore di posizione per lavorare ulteriormente con esso
      ulong position_ID=PositionGetInteger(POSITION_IDENTIFIER);
      Print(_Symbol," postion #",position_ID);
//--- ottenere il tempo di formazione della posizione in millisecondi dal 01.01.1970
      long create_time_msc=PositionGetInteger(POSITION_TIME_MSC);
      PrintFormat("Position #%d  POSITION_TIME_MSC = %i64 milliseconds => %s",position_ID,
                  create_time_msc,TimeToString(create_time_msc/1000));
//--- ottenere l'ora dell'ultimo cambio di posizione in secondi dal 01.01.1970
      long update_time_sec=PositionGetInteger(POSITION_TIME_UPDATE);
      PrintFormat("Position #%d  POSITION_TIME_UPDATE = %i64 seconds => %s",
                  position_ID,update_time_sec,TimeToString(update_time_sec));
//--- ottenere l'ora dell'ultimo cambio di posizione in millisecondi dal 01.01.1970
      long update_time_msc=PositionGetInteger(POSITION_TIME_UPDATE_MSC);
      PrintFormat("Position #%d  POSITION_TIME_UPDATE_MSC = %i64 milliseconds => %s",
                  position_ID,update_time_msc,TimeToString(update_time_msc/1000));
     }
//---
  }
 
tol64:

Selezionare una posizione utilizzando la funzione PositionSelect() e ottenere il suo identificatore utilizzando la funzione PositionGetInteger() e l'identificatore mql5 - POSITION_IDENTIFIER.

Esempio dalla Guida:

Grazie, tol64! In linea di principio, hai ragione.

E mi scuso per la brevità della prima domanda... nonostante abbia dato un riferimento all'identificatore di posizione.

Il problema è questo. È necessario, dopo l'apertura di una posizione, catturare questa apertura nella cronologia delle transazioni con l'aiuto della classe CDealInfo utilizzando il metodo ::PositionId(). E preferibilmente con il minimo scarto temporale tra il momento dell'apertura e il momento in cui un' operazione di tipo DEAL_ENTRY_IN o DEAL_ENTRY_INOUT appare nella cronologia.

È possibile farlo in questo modo? Non attraverso l'elenco delle posizioni attive, ma attraverso l'elenco delle operazioni nello storico...
 
denkir:

Grazie, tol64! In linea di principio, la verità è tua.

E mi scuso per la brevità della prima domanda... nonostante abbia dato un link alla posizione ID.

Il problema è questo. Dopo l'apertura di una posizione, è necessario rilevare questa apertura nella cronologia delle transazioni utilizzando la classe CDealInfo con il metodo ::PositionId(). E preferibilmente con il minimo scarto temporale tra il momento dell'apertura e il momento in cui un' operazione di tipo DEAL_ENTRY_IN o DEAL_ENTRY_INOUT appare nella cronologia.

È possibile farlo in questo modo? Non attraverso l'elenco delle posizioni attive, ma attraverso l'elenco delle operazioni nello storico...

A mio parere, il monitoraggio dell'evento in OnTrade(), come nell'esempio precedente, è abbastanza adatto a questo scopo. Ma penso che all'improvviso una posizione non possa essere selezionata da un evento di trade, e che la prossima non lo sarà presto. In questo caso è necessario monitorare l'ambiente tramite un timer. Anche i millisecondi possono essere impostati ora.

Oppure, invece di tracciare la posizione aperta, scansionare la cronologia degli scambi (numero di scambi). Ricordiamo la precedente e la confrontiamo con quella attuale. È possibile farlo anche nel timer. Esistono molte varianti. Tutto dipende dal compito specifico.

 

Anatoly, ho riscontrato un problema. Per favore, condividi la tua esperienza. O c'è un bug quando si lavora con le funzioni, o sto andando "male". Ma credo di aver fatto tutto correttamente....

Ho una domanda sulle varianti di funzione in cui la seconda non "funziona".

Ad esempio:

1)

double  HistoryOrderGetDouble(
   ulong                       ticket_number,     // biglietto
   ENUM_ORDER_PROPERTY_DOUBLE  property_id        // identificativo della proprietà
   );

2)

bool  HistoryOrderGetDouble(
   ulong                       ticket_number,     // biglietto
   ENUM_ORDER_PROPERTY_DOUBLE  property_id,       // identificativo della proprietà
   double&                     double_var         // qui si prende il valore della proprietà
   );

Ho allegato il codice sorgente.

File:
 
denkir:

Anatoly, ho riscontrato un problema. Per favore, condividi la tua esperienza. O c'è un bug quando si lavora con le funzioni, o sto andando "male". Ma credo di aver fatto tutto correttamente....

La domanda riguarda le varianti di funzione in cui la seconda non "funziona".

...

Cosa vedi nel log? Non ho problemi quando eseguo lo script.
 
tol64:
Cosa si vede nel log? Non vedo alcun problema durante l'esecuzione dello script.

Vedo che con le impostazioni predefinite dello script c'è una voce come "Failure to return HistoryOrderGetDouble() function".

Cioè la versione booleana della funzione non ottiene il valore della proprietà.

 
denkir:

Vedo che con le impostazioni predefinite dello script c'è un record come "Failure to return HistoryOrderGetDouble() function".

Cioè, la versione booleana della funzione non ottiene il valore della proprietà.

Per me tutto passa con successo. Esaminate tutto in modo più dettagliato (output nel log) per scoprire il motivo. Numero di ordini, biglietti, numero di errori, ecc.