Discussione sull’articolo "L'uso delle Librerie MQL5 Standard Trade Class nella scrittura di un Expert Advisor"

 

Il nuovo articolo L'uso delle Librerie MQL5 Standard Trade Class nella scrittura di un Expert Advisor è stato pubblicato:

Questo articolo spiega come utilizzare le principali funzionalità di MQL5 Standard Trade Class nella scrittura di Expert Advisor che implementano la chiusura e la modifica della posizione, l'immissione e l'eliminazione di ordini in sospeso e la verifica del margine prima di piazzare un trade. Abbiamo anche dimostrato come le classi di trading possono essere utilizzate per ottenere dettagli su ordini e transazioni.

Finora abbiamo visto come possiamo utilizzare le librerie di classi di trading per scrivere un Expert Advisor. La prossima cosa è testare il nostro Expert Advisor con lo Strategy Tester e vederne le prestazioni.

Compila il codice EA e poi caricalo nello Strategy Tester.

Compila il report per l'EA

Figura 3. Report di compilazione di Expert Advisor 

Sul grafico GBPUSD giornaliero utilizzando le impostazioni predefinite: Take Profit - 270, Stop Loss - 100 e Trails Point (TP/SL) - 32, avremo i seguenti risultati:

 

Figura 4. Rapporto di prova di Expert Advisor - Grafico giornaliero GBPUSD

Autore: Samuel Olowoyo

 

Articolo molto utile per me. Tutto è molto più facile se si usano le librerie!

Richiesta agli sviluppatori: scrivete una classe per lavorare con High[i] , Low[i]. Open[i], Close[i]. Penso che questa classe sarà utile a tutti! Ho risolto questo problema da solo, ma non sono sicuro che sia corretto, perché i test richiedono molto tempo....

 
Consultate la sezione Gruppo di classe Timeseries
 
#include <Indicators\Series.mqh>

double High[];
 CiHigh z;

perché questo codice dà un errore

'1.mq5' 1.mq5 1 1

'Series.mqh' Series.mqh 1 1

'ArrayObj.mqh' ArrayObj.mqh 1 1

'Array.mqh' Array.mqh 1 1

'Object.mqh' Object.mqh 1 1

'StdLibErr.mqh' StdLibErr.mqh 1 1

'ArrayDouble.mqh' ArrayDouble.mqh 1 1

'CiHigh' - dichiarazione senza tipo 1.mq5 12 2

1 errore/i, 0 avviso/i 2 1

in tutti gli esempi non è necessario dichiarare il tipo...

se non è difficile scrivere come ottenere

Stampa High[2], per esempio.

 
dimeon:

perché questo codice dà un errore


non è necessario dichiarare il tipo in tutti gli esempi...

se non è difficile, si prega di scrivere come ottenere

Stampare High[2], ad esempio.

c'è un errore di stampa nella documentazione. Questa classe si trova nel file TimeSeries.mqh.

Esempio di utilizzo (lo script stampa gli ultimi tre massimi del grafico corrente):

#include <Indicators\TimeSeries.mqh>
//+------------------------------------------------------------------+
//| Funzione di avvio del programma di script|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double High[];
   CiHigh z;
   int count=3;
   if(z.Create(_Symbol,_Period)==true)
     {
      if(z.GetData(0,count,High)==count)
        {
         for(int i=0; i<count; i++) Print(i,"=",High[i]);
        }
      else
         Print("Fallito il recupero di ",count," dati di serie temporali".);
     }
   else Print("Errore nella creazione di serie temporali".);
  }
//+------------------------------------------------------------------+
 
Quantum:

c'è un errore di stampa nella documentazione. Questa classe si trova nel file TimeSeries.mqh.

Esempio di utilizzo (lo script produce gli ultimi tre massimi del grafico corrente):

Grazie mille! Mi sono scervellato!
 

Capisco che ognuno programma per se stesso e per le sue esigenze, ma fondamentalmente non mi piace il gruppo di classi di serie temporali, perché fondamentalmente consistono tutte in un metodo e in una parte descrittiva più che funzionale, e di solito è necessario avere tutte le serie temporali per un particolare strumento, ho fatto una classe in cui ci sono tutte le serie temporali per lo strumento necessario, nei metodi è fatta la storia di paginazione, approssimativamente come questo:

struct str_bars{
   datetime    time[];     // Array Timeseries contenente l'ora di apertura di ogni barra del grafico corrente
   double      open[];     // Array Timeseries contenente i prezzi di apertura di ogni barra del grafico corrente.
   double      close[];    // Array Timeseries contenente i prezzi di chiusura di ogni barra del grafico corrente.
   double      high[];     // Array Timeseries contenente i prezzi massimi di ogni barra del grafico corrente.
   double      low[];      // Un array di serie temporali contenente i prezzi minimi di ogni barra del grafico corrente.
};
struct str_info{
   double   point;         // Dimensione del punto dello strumento corrente nella valuta di quotazione
   int      spread;        // Spread attuale
};
//____________________________________________________________________
class currency {
   public:
//---- данные      
      MqlTick TICK;        // dati di tick
      str_bars  BAR;       // dati della serie temporale
      str_info INFO;       // informazioni sullo strumento
      int error;
//---- методы      
      int create(string sym,ENUM_TIMEFRAMES period, int numbars);
      int refresh(void);
   private:
      string            symbol;
      ENUM_TIMEFRAMES   per;
      int               num;
      datetime          lastbar_time;
      int               tmpint1,tmpint2;
      int ch_load(void);
};
//____________________________________________________________________

Lavoro con la mia classe solo nella parte di dati già preparati, e naturalmente la classe stessa riceve i dati chiamando il metodo refresh()

 
Articolo utile!
 

c'è un'imprecisione nell'articolo

double lot_price = myaccount.MarginCheck(_Symbol,otype,Lot); // prezzo del lotto/numero di margini richiesti

dovrebbe essere

   double lot_price=myaccount.MarginCheck(_Symbol,otype,Lot,price);  //--- prezzo del lotto/numero di margine richiesto
 

Ottimo articolo. Grazie all'autore. Vorrei anche scrivere un controllo dello Stop_Level prima di piazzare un ordine, e un controllo del valore dello spread. Il fatto è che se lo spread è fluttuante, allora a valori elevati non si può entrare nel mercato, perché non è redditizio. Questo aiuterà l'Expert Advisor a non operare durante le notizie. Vorrei anche controllare la deviazione - il ragionamento è simile. C'è anche una domanda sulla libreria: cos'è una funzione (che tipo di processo denota e descrive)?

Livello di congelamento

Ottiene la distanza delle operazioni di congelamento in punti.

int FreezeLevel() const

in un linguaggio semplice - per favore spiegatelo se lo conoscete.

E un'altra domanda. Possiamo scoprire i limiti, ad esempio lo Stop_Level al momento attuale (diciamo 10 punti). Inseriamo un ordine pendente con SL=10 punti. Dopo, ad esempio, un'ora il prezzo raggiunge il prezzo specificato nell'ordine, ma lo Stop_Level in questo momento è pari, ad esempio, a 15 pip. Cosa succederà: l'ordine pendente funzionerà o sarà respinto? Inoltre, quando il prezzo raggiunge il prezzo specificato nell'ordine, ma lo spread è cambiato - significa che l'entrata o l'uscita è possibile a un prezzo peggiore rispetto a quello previsto al momento dell'apertura dell'ordine, oppure l'ordine non funzionerà affatto?

 

Cosa sto facendo di sbagliato? Perché il Bid non viene stampato?

Ecco il log del lavoro


2011.01.31 20:20:18 00(EURUSD,M1) EURUSD 0

Ecco il codice

#include <Trade\SymbolInfo.mqh>  //--- Classe CSymbolInfo
CSymbolInfo    my_symbol;        //--- Oggetto della classe CSymbolInfo
//+------------------------------------------------------------------+
//| Funzione di inizializzazione dell'esperto|
//+------------------------------------------------------------------+
int OnInit()
  {   return(0);  }
//+------------------------------------------------------------------+
//| Funzione di deinizializzazione dell'esperto|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {  }
//+------------------------------------------------------------------+
//| Funzione tick dell'esperto|
//+------------------------------------------------------------------+
void OnTick()
  {
   my_symbol.Name(_Symbol);
   my_symbol.Refresh();
   Print(_Symbol," ",my_symbol.Bid());
  }
//+------------------------------------------------------------------+