English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Türkçe
Manuale MQL5: Ottenere Proprietà di Posizione

Manuale MQL5: Ottenere Proprietà di Posizione

MetaTrader 5Esempi | 11 gennaio 2022, 16:41
131 0
Anatoli Kazharski
Anatoli Kazharski

Introduzione

L'articolo precedente chiamato "Manuale MQL5: Utilizzo di diverse modalità di stampa" ci ha mostrato come possiamo scrivere rapidamente uno script e stampare le informazioni richieste utilizzando tre diverse modalità. Creiamo ora uno script che ottenga e mostri all'utente tutte le proprietà di posizione.

Dobbiamo implementarlo in modo tale da consentire all'utente di selezionare l'opzione appropriata nei parametri esterni dello script, come segue: ottenere solo le proprietà di posizione su un simbolo (corrente) o eseguire su tutte le posizioni aperte (se presenti) uno per uno su tutti i simboli. Questa volta, visualizzeremo le informazioni richieste direttamente nella finestra di dialogo, il che è abbastanza comodo e alcuni di voi potrebbero trovare questo metodo più utile.


Creare uno script

L'inizio del programma è più o meno lo stesso dell'articolo precedente (vedi il codice sotto). Iniziamo con le proprietà del programma. Sono seguiti dalla riga con la direttiva #define e quindi assegniamo il nome del programma alla variabile SCRIPT_NAME utilizzando la funzione MQLInfoString() e le MQL5_PROGRAM_NAME specificato. Maggiori informazioni su tutti i possibili valori della funzione MQLInfoString() possono essere trovate in MQL5 Reference.

Continuiamo con l'enumerazione dei modi. Se scrivi un commento per ogni identificatore, il testo di tale commento verrà visualizzato nell'elenco a discesa nei parametri esterni. Implementeremo due opzioni:

  • Simbolo corrente - per visualizzare le proprietà di posizione solo sul simbolo corrente e
  • Tutti i simboli - per visualizzare le proprietà di posizione su tutti i simboli.

Ci sarà un solo parametro esterno (modalità) da utilizzare per selezionare la modalità appropriata. Il commento successivo al parametro esterno verrà visualizzato anche nella finestra dei parametri esterni. Questo ci consentirà di creare nomi di parametri più significativi. Allo stesso tempo, nomi più brevi delle variabili sarebbero più convenienti in termini di codice.

#property copyright   "Copyright 2012, http://tol64.blogspot.com"
#property link        "http://tol64.blogspot.com"
#property description "email: hello.tol64@gmail.com"
#property version     "1.0"
#property script_show_inputs
//---
#define SCRIPT_NAME MQLInfoString(MQL_PROGRAM_NAME) // Script name
//---
// ENUMERATION OF MODES
enum ENUM_SYMBOLS_MODE
  {
   CURRENT_SYMBOL =0,                     // Current symbol
   ALL_SYMBOLS    =1                      // All symbols
  };
//---
// INPUT PARAMETERS
input ENUM_SYMBOLS_MODE mode=CURRENT_SYMBOL;     // Mode

Il codice continua con le variabili globali. Affinché le variabili globali siano accessibili da qualsiasi parte dello script, dovrebbero essere posizionate al di fuori delle funzioni (di solito all'inizio del programma).

// GLOBAL VARIABLES
long                 pos_magic=0;         // Magic number
string               pos_symbol="";       // Symbol
string               pos_comment="";      // Comment
double               pos_swap=0.0;        // Swap
double               pos_commission=0.0;  // Commission
double               pos_price=0.0;       // Current price of the position
double               pos_cprice=0.0;      // Current price of the position
double               pos_profit=0.0;      // Profit/Loss of the position
double               pos_volume=0.0;      // Position volume
double               pos_sl=0.0;          // Stop Loss of the position
double               pos_tp=0.0;          // Take Profit of the position
datetime             pos_time=NULL;       // Position opening time
long                 pos_id=0;            // Position identifier
ENUM_POSITION_TYPE   pos_type=NULL;       // Position type
//---

Nella funzione principale del programma, chiameremo solo una funzione definita dall'utente, PrintPositionProperties(), che eseguirà tutte le operazioni richieste:

//+------------------------------------------------------------------+
//| MAIN FUNCTION                                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   PrintPositionProperties();
  }

Diamo ora un'occhiata alla struttura della funzione PrintPositionProperties() definita dall'utente passo dopo passo. Per prima cosa creeremo la base per il nostro ulteriore lavoro. È molto semplice e una volta implementato appare come segue:

//+------------------------------------------------------------------+
//| OPENING A DIALOG BOX WITH SYMBOL DATA                            |
//+------------------------------------------------------------------+
void PrintPositionProperties()
  {
   int err=0; // Variable for handling errors
//---
// If you need to get position properties on the current symbol only
   if(mode==CURRENT_SYMBOL)
     {
 
     }
//---
// If you need to get position properties on all symbols
   if(mode==ALL_SYMBOLS)
     {
 
     }
  }

Abbiamo solo due rami e una variabile locale err che è responsabile della gestione degli errori ed è dichiarata all'inizio della funzione. Ora dobbiamo scrivere scenari di casi d'uso per ciascuna delle opzioni. Cominciamo con il primo, cioè "Se hai bisogno di ottenere le proprietà di posizione solo sul simbolo corrente".

È molto semplice. Prima di tutto, dobbiamo verificare se c'è una posizione sul simbolo corrente. Questo può essere fatto dalla funzione PositionSelect() disponibile in MQL5 che prende il nome del simbolo come unico parametro. Per passare il nome del simbolo corrente dobbiamo usare la funzione Symbol() o la variabile predefinita _Symbol che contiene già il nome del simbolo corrente. La funzione PositionSelect() restituirà un risultato positivo, se esiste una posizione su quel simbolo, o un risultato negativo, se non c'è posizione o si è verificato un errore.

Il codice con commenti dettagliati per la prima opzione è fornito di seguito:

//---
      // If a position exists, then...
      if(PositionSelect(_Symbol))
        {
         // ...get its properties
         GetPositionProperties();
         //---
         // Open a dialog box to display all the data we obtained
         MessageBox("Symbol        : "+pos_symbol+"\n"+
                    "Comment       : "+pos_comment+"\n"+
                    "Magic Number  : "+IntegerToString(pos_magic)+"\n"+
                    "Price Open    : "+DoubleToString(pos_price,_Digits)+"\n"+
                    "Current Price : "+DoubleToString(pos_cprice,_Digits)+"\n"+
                    "Stop Loss     : "+DoubleToString(pos_sl,_Digits)+"\n"+
                    "Take Profit   : "+DoubleToString(pos_tp,_Digits)+"\n"+
                    "Type          : "+PositionTypeToString(pos_type)+"\n"+
                    "Volume        : "+DoubleToString(pos_volume,2)+"\n"+
                    "Commission    : "+DoubleToString(pos_commission,2)+"\n"+
                    "Swap          : "+DoubleToString(pos_swap,2)+"\n"+
                    "Profit        : "+DoubleToString(pos_profit,2)+"\n"+
                    "Time          : "+TimeToString(pos_time)+"\n"+
                    "Identifier    : "+IntegerToString(pos_id)+"",
                    //---
                    "Message Box",MB_ICONASTERISK);
         //---
         return;
        }
      // If there is no position or an error has occurred, report it
      else
        {
         err=GetLastError(); // Get the code of the last registered error
         //---
         if(err>0) // If there is an error
           {
            // Print the relevant message
            MessageBox("Error ("+IntegerToString(err)+") when selecting a position ("+_Symbol+") !\n\n"+
                       "It is possible that there is no position on this symbol. If this is not the case, please try again.",
                       "Error",
                       MB_ICONWARNING);
            //---
            return; // Exit the function
           }
        }
      //---

Nel codice sopra, possiamo vedere altre due funzioni definite dall'utente: GetPositionProperties() e PositionTypeToString(). Dato che dovremo ottenere le proprietà di posizione in vari punti del programma, sarà bene creare una funzione separata in modo da ridurre la quantità di codice e quindi renderlo più leggibile. Di seguito è riportato il codice di questa funzione. Assicurarsi di controllare MQL5 Reference per ulteriori informazioni sulle funzioni e sugli identificatori MQL5 utilizzati in GetPositionProperties().

//+------------------------------------------------------------------+
//| GETTING SYMBOL PROPERTIES                                        |
//+------------------------------------------------------------------+
void GetPositionProperties()
  {
   pos_symbol     =PositionGetString(POSITION_SYMBOL);
   pos_comment    =PositionGetString(POSITION_COMMENT);
   pos_magic      =PositionGetInteger(POSITION_MAGIC);
   pos_price      =PositionGetDouble(POSITION_PRICE_OPEN);
   pos_cprice     =PositionGetDouble(POSITION_PRICE_CURRENT);
   pos_sl         =PositionGetDouble(POSITION_SL);
   pos_tp         =PositionGetDouble(POSITION_TP);
   pos_type       =(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
   pos_volume     =PositionGetDouble(POSITION_VOLUME);
   pos_commission =PositionGetDouble(POSITION_COMMISSION);
   pos_swap       =PositionGetDouble(POSITION_SWAP);
   pos_profit     =PositionGetDouble(POSITION_PROFIT);
   pos_time       =(datetime)PositionGetInteger(POSITION_TIME);
   pos_id         =PositionGetInteger(POSITION_IDENTIFIER);
  }

La funzione PositionTypeToString() definita dall'utente converte il tipo di posizione restituito come numero intero in una stringa per leggere il formato, come mostrato nel codice seguente:

//+------------------------------------------------------------------+
//| CONVERTING POSITION TYPE TO A STRING                             |
//+------------------------------------------------------------------+
string PositionTypeToString(int position_type)
  {
   string str="";
//---
   if(position_type==0) { str="buy";  }
   if(position_type==1) { str="sell"; }
//---
   return(str);
  }

Quindi il codice per la prima opzione per cui possiamo visualizzare le proprietà di posizione solo sul simbolo corrente è pronto. Può anche essere testato in questo momento se hai seguito tutti i passaggi descritti nell'articolo. Apri una posizione in MetaTrader 5 utilizzando strumenti standard. A tal fine, premi F9 e si aprirà la finestra Ordine in cui puoi trovare tutte le opzioni necessarie per impostare le proprietà della posizione prima che si apra:

Fig. 1. La finestra Order nel terminale client MetaTrader 5.

Fig. 1. La finestra dell'ordine nel terminale del cliente MetaTrader 5.

Quando tutte le proprietà sono state impostate, seleziona Vendi o Acquista ed esegui lo script facendo doppio clic o trascinandolo sul grafico. Si aprirà una finestra di script. Il valore richiesto (simbolo corrente) del parametro Mode è già stato impostato di default. Un clic sul pulsante OK aprirà una finestra di dialogo che mostra tutte le proprietà di posizione sul simbolo corrente:

Fig. 2. Finestra di dialogo con le proprietà di posizione sul simbolo corrente.

Fig. 2. Finestra di dialogo con le proprietà di posizione sul simbolo corrente.

Altrimenti, se non c'è posizione sul simbolo corrente, apparirà una finestra di avviso:

Fig. 3. Casella di avviso.

Fig. 3. Casella di avviso.

Tutto sembra funzionare come previsto e come implementato nel codice.

Esaminiamo ora il codice del programma che verrà utilizzato se si sceglie di visualizzare tutte le proprietà delle posizioni aperte. Il codice con i commenti dettagliati è mostrato di seguito:

//---
      int digits=0; // Number of decimal places
      int mb_res=-1; // Variable with the option selected in the dialog box
      int pos_total=PositionsTotal(); // Number of open positions in the terminal
      //---
      // View properties of all positions in a loop one by one
      for(int i=0; i<pos_total; i++)
        {
         ResetLastError(); // Reset the last error
         //---
         pos_symbol=PositionGetSymbol(i); // Get the symbol name
         digits=(int)SymbolInfoInteger(pos_symbol,SYMBOL_DIGITS); // Get the number of digits in the price
         //---
         // If a position on this symbol exists, then...
         if(PositionSelect(pos_symbol))
           {
            // ...get its properties
            GetPositionProperties();
            //---
            // Open a dialog box to display all position properties obtained
            mb_res=MessageBox("Total Positions/Current: "+IntegerToString(pos_total)+"/"+IntegerToString(i+1)+"\n"+
                              "---------------------------------\n"+
                              "Symbol: "        +pos_symbol+"\n"+
                              "Comment: "       +pos_comment+"\n"+
                              "Magic Number: "  +IntegerToString(pos_magic)+"\n"+
                              "Price Open: "    +DoubleToString(pos_price,digits)+"\n"+
                              "Current Price: " +DoubleToString(pos_cprice,digits)+"\n"+
                              "Stop Loss: "     +DoubleToString(pos_sl,digits)+"\n"+
                              "Take Profit: "   +DoubleToString(pos_tp,digits)+"\n"+
                              "Type: "          +PositionTypeToString(pos_type)+"\n"+
                              "Volume: "        +DoubleToString(pos_volume,2)+"\n"+
                              "Commission: "    +DoubleToString(pos_commission,2)+"\n"+
                              "Swap: "          +DoubleToString(pos_swap,2)+"\n"+
                              "Profit: "        +DoubleToString(pos_profit,2)+"\n"+
                              "Time: "          +TimeToString(pos_time)+"\n"+
                              "Identifier: "    +IntegerToString(pos_id)+"",
                              //---
                              "Message Box",MB_CANCELTRYCONTINUE|MB_ICONASTERISK);
            //---
            if(mb_res==IDCANCEL) // If you have clicked Cancel or Close
              { Print("The program ("+SCRIPT_NAME+") has been terminated by the user!"); return; } // Exit the function
            //---
            // If you have clicked Retry   
            if(mb_res==IDTRYAGAIN) { i--; } // Reset the counter to retry
           }
         else // If there is no position or an error has occurred, report it
           {
            err=GetLastError(); // Get the code of the last registered error
            //---
            if(err>0) // If there is an error
              {
               // Print the relevant message
               MessageBox("Error ("+IntegerToString(err)+") when selecting a position ("+pos_symbol+") !\n\n"+
                          "It is possible that there is no position on this symbol. If this is not the case, please try again.",
                          "Error",
                          MB_ICONWARNING);
              }
           }
        }
      //---

Ora dobbiamo solo testare questa opzione. Ad esempio, apriamo posizioni su due simboli (AUDUSD e EURUSD). Una volta eseguito lo script, selezionare la modalità Tutti i simboli nell'elenco a discesa nei parametri esterni e fare clic su OK, si aprirà una finestra di dialogo come mostrato di seguito:

Fig. 4. Finestra di dialogo con le proprietà di posizione per la seconda opzione.

Fig. 4. Finestra di dialogo con le proprietà di posizione per la seconda opzione.


Conclusione

Come puoi vedere nella figura sopra, ci sono tre pulsanti nella finestra di dialogo. Se si fa clic su Riprova, il contatore di loop verrà reimpostato e le proprietà di posizione per il simbolo attualmente visualizzato nella finestra di dialogo verranno aggiornate. Se si fa clic su Continua, il programma passerà al simbolo successivo. Il pulsante Annulla serve per terminare il programma.

Va inoltre notato che la prima riga sopra l'elenco delle proprietà della posizione contiene informazioni sul numero totale di posizioni aperte (Total Positions) e il numero corrente del contatore di posizione (Current).

Questo è tutto. Sentiti libero di scaricare il file del codice sorgente allegato di seguito che dovrà essere compilato in MetaEditor.

Tradotto dal russo da MetaQuotes Ltd.
Articolo originale: https://www.mql5.com/ru/articles/639

Manuale MQL5: Proprietà di posizione nel pannello delle informazioni personalizzate Manuale MQL5: Proprietà di posizione nel pannello delle informazioni personalizzate
Questa volta creeremo un semplice Expert Advisor che otterrà le proprietà della posizione sul simbolo corrente e le visualizzerà sul pannello informativo personalizzato durante il trading manuale. Il pannello informativo verrà creato utilizzando oggetti grafici e le informazioni visualizzate verranno aggiornate ad ogni tick. Questo sarà molto più conveniente rispetto al dover eseguire manualmente lo script descritto nel precedente articolo della serie chiamata "Manuale MQL5: Ottenere le Proprietà di posizione
Manuale MQL5: Utilizzo di diverse modalità di stampa Manuale MQL5: Utilizzo di diverse modalità di stampa
Questo è il primo articolo della serie Manuale MQL5. Inizierò con semplici esempi per permettere a chi sta muovendo i primi passi nella programmazione di familiarizzare gradualmente con il nuovo linguaggio. Ricordo i miei primi sforzi nel progettare e programmare sistemi di trading che posso dire sono stati piuttosto difficili, dato che è stato il primo linguaggio di programmazione della mia vita. Tuttavia, si è rivelato più semplice di quanto pensassi e mi ci sono voluti solo pochi mesi prima di poter sviluppare un programma abbastanza complesso.
Manuale MQL5: Analisi delle proprietà di posizione nel tester di strategia MetaTrader 5 Manuale MQL5: Analisi delle proprietà di posizione nel tester di strategia MetaTrader 5
Presenteremo una versione modificata dell'Expert Advisor dal precedente articolo "Manuale MQL5: Proprietà posizione nel pannello Informazioni personalizzate". Alcuni dei problemi che affronteremo includono l'ottenimento di dati dalle barre, il controllo di nuovi eventi di barra sul simbolo corrente, inclusa una classe commerciale della libreria standard in un file, la creazione di una funzione per la ricerca di segnali di trading e una funzione per l'esecuzione di operazioni di trading, nonché la determinazione degli eventi commerciali nella funzione OnTrade ().
Il Market MQL5 compie un anno Il Market MQL5 compie un anno
È passato un anno dal lancio delle vendite nel Market MQL5. È stato un anno di duro lavoro, che ha trasformato il nuovo servizio nel più grande negozio di robot di trading e indicatori tecnici per la piattaforma MetaTrader 5.