
Manuale MQL5: Ottenere Proprietà di Posizione
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 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.
Altrimenti, se non c'è posizione sul simbolo corrente, apparirà una finestra 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.
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





- 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