English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Türkçe
Disegnare le Emissioni di Indicatori in MQL5

Disegnare le Emissioni di Indicatori in MQL5

MetaTrader 5Esempi | 15 dicembre 2021, 17:05
133 0
Sergey Pavlov
Sergey Pavlov

Introduzione

Certamente, molti trader e sviluppatori di strategie di trading sono interessati a queste domande:

Trovare le risposte a queste domande mi ha portato alla creazione di un nuovo approccio alla ricerca di mercato: costruzione e analisi degli indicatori di emissione. Per renderlo più chiaro, dai un'occhiata alle seguenti figure:

Fig. 1 Emissione dell'indicatore DCMV.

Fig. 2. Emissione dell'indicatore, basato su envelope iMA.

Mostra l'emissione di diversi indicatori, ma il principio della loro costruzione è lo stesso. Dopo ogni tick compaiono sempre più punti di colore e forma diversi. Formano numerosi gruppi sotto forma di nebulose, nuvole, tracce, righe, archi, ecc. Queste forme possono aiutare a rilevare le molle e le forze invisibili che influenzano il movimento dei prezzi di mercato. La ricerca e l'analisi di queste emissioni sono qualcosa di simile alla chiromanzia.

Emissione e sue Proprietà

L'emissione è un insieme di punti, situati nei punti di intersezione di righe specifiche dell'indicatore.

Le proprietà delle emissioni non sono ancora state ancora chiare, stanno ancora aspettando i ricercatori. Ecco un elenco di proprietà conosciute:

  • i punti dello stesso tipo tendono a raggrupparsi;
  • l'emissione ha una direzione - dal presente al futuro o al passato;
  • i cluster sono importanti - i cluster densi possono attrarre o, al contrario, possono respingere il prezzo.

Calcolo dell'Emissione dell'Indicatore

Consideriamo i fondamenti del calcolo delle emissioni utilizzando an esempio: Prendiamo due indicatori - iBand e iMA - e troviamo l'intersezione delle loro righe. Li useremo per disegnare i punti di emissione. Per questo avremo bisogno di oggetti grafici. L'algoritmo è implementato in Expert Advisor, ma può essere fatto negli indicatori.

Gli indicatori iniziali sono presentati nella Fig. 3.:

Fig. 3. Gli indicatori iBands (verde) e iMA (rosso).

Abbiamo bisogno di un Expert Advisor per creare punti di emissione. È meglio utilizzare la procedura guidata MQL5 per creare un modello Expert Advisor.

Fig. 4. Creazione di un modello Expert Advisor utilizzando MQL5 Wizard.

//+------------------------------------------------------------------+
//|                                      Emission of Bands && MA.mq5 |
//|                                                 Copyright DC2008 |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "DC2008"
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

Innanzitutto, abbiamo bisogno di alcuni plotting ausiliari. Dobbiamo continuare le righe indicatrici usando i raggi (Fig. 5.). Permetterà di controllare la correttezza del calcolo e della visualizzazione dei punti di emissione. Successivamente, rimuoveremo queste righe dal grafico.

Fig. 5. Plotting ausiliari. Continuazione delle righe dell'indicatore mediante raggi.

Quindi, aggiungiamo gli oggetti grafici (linee orizzontali e di tendenza) al codice del nostro Expert Advisor.

input bool     H_line=true;   // flag to enable drawing of the horizontal lines
input bool     I_line=true;   // flag to enable drawing of the indicator's lines
//---
string         name;
//---- indicator buffers
double      MA[];    // array for iMA indicator 
double      BBH[];   // array for iBands indicator  - UPPER_BAND 
double      BBL[];   // array for iBands indicator - LOWER_BAND
double      BBM[];   // array for iBands indicator - BASE_LINE
datetime    T[];     // array for time coordinates
//---- handles for indicators
int         MAHandle;   // iMA indicator handle
int         BBHandle;   // iBands indicator handle
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   MAHandle=iMA(Symbol(),0,21,0,MODE_EMA,PRICE_CLOSE);
   BBHandle=iBands(Symbol(),0,144,0,2,PRICE_CLOSE);
//---
   if(H_line)     // Horizontal lines of iBands indicator
      {
         //--- iBands - UPPER_BAND
         name="Hi";
         ObjectCreate(0,name,OBJ_HLINE,0,0,0);           
         ObjectSetInteger(0,name,OBJPROP_COLOR,Red);
         ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DOT);
         ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
         //--- iBands - LOWER_BAND
         name="Lo";
         ObjectCreate(0,name,OBJ_HLINE,0,0,0);           
         ObjectSetInteger(0,name,OBJPROP_COLOR,Blue);
         ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DOT);
         ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
         //--- iBands - BASE_LINE
         name="MIDI";
         ObjectCreate(0,name,OBJ_HLINE,0,0,0);           
         ObjectSetInteger(0,name,OBJPROP_COLOR,DarkOrange);
         ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DOT);
         ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
      }
//---
   if(I_line)     // Indicator lines
      {
         //--- iMA
         name="MA";
         ObjectCreate(0,name,OBJ_TREND,0,0,0,0);           
         ObjectSetInteger(0,name,OBJPROP_COLOR,Red);
         ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID);
         ObjectSetInteger(0,name,OBJPROP_WIDTH,2);
         ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,1);
         ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,1);
         //--- iBands - UPPER_BAND
         name="BH";
         ObjectCreate(0,name,OBJ_TREND,0,0,0,0);           
         ObjectSetInteger(0,name,OBJPROP_COLOR,MediumSeaGreen);
         ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID);
         ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
         ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,1);
         ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,1);
         //--- iBands - LOWER_BAND
         name="BL";
         ObjectCreate(0,name,OBJ_TREND,0,0,0,0);           
         ObjectSetInteger(0,name,OBJPROP_COLOR,MediumSeaGreen);
         ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID);
         ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
         ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,1);
         ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,1);
         //--- iBands - BASE_LINE
         name="BM";
         ObjectCreate(0,name,OBJ_TREND,0,0,0,0);           
         ObjectSetInteger(0,name,OBJPROP_COLOR,MediumSeaGreen);
         ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID);
         ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
         ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,1);
         ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,1);
      }
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //--- filling the arrays with current values
   CopyBuffer(MAHandle,0,0,2,MA);
   ArraySetAsSeries(MA,true);  
   CopyBuffer(BBHandle,0,0,2,BBM);
   ArraySetAsSeries(BBM,true);  
   CopyBuffer(BBHandle,1,0,2,BBH);
   ArraySetAsSeries(BBH,true);  
   CopyBuffer(BBHandle,2,0,2,BBL);
   ArraySetAsSeries(BBL,true);
   CopyTime(Symbol(),0,0,10,T);
   ArraySetAsSeries(T,true);
     
   //--- Horizontal lines of iBands indicator (correction)
   if(H_line)
      {
      name="Hi";
      ObjectSetDouble(0,name,OBJPROP_PRICE,BBH[0]);
      name="Lo";
      ObjectSetDouble(0,name,OBJPROP_PRICE,BBL[0]);
      name="MIDI";
      ObjectSetDouble(0,name,OBJPROP_PRICE,BBM[0]);
      }
   //--- Indicator's lines (correction)
   if(I_line)
      {
      name="MA";  //--- iMA
      ObjectSetInteger(0,name,OBJPROP_TIME,T[1]);
      ObjectSetDouble(0,name,OBJPROP_PRICE,MA[1]);
      ObjectSetInteger(0,name,OBJPROP_TIME,1,T[0]);
      ObjectSetDouble(0,name,OBJPROP_PRICE,1,MA[0]);
      name="BH";  //--- iBands - UPPER_BAND
      ObjectSetInteger(0,name,OBJPROP_TIME,T[1]);
      ObjectSetDouble(0,name,OBJPROP_PRICE,BBH[1]);
      ObjectSetInteger(0,name,OBJPROP_TIME,1,T[0]);
      ObjectSetDouble(0,name,OBJPROP_PRICE,1,BBH[0]);
      name="BL";  //--- iBands - LOWER_BAND
      ObjectSetInteger(0,name,OBJPROP_TIME,T[1]);
      ObjectSetDouble(0,name,OBJPROP_PRICE,BBL[1]);
      ObjectSetInteger(0,name,OBJPROP_TIME,1,T[0]);
      ObjectSetDouble(0,name,OBJPROP_PRICE,1,BBL[0]);
      name="BM";  //--- iBands - BASE_LINE
      ObjectSetInteger(0,name,OBJPROP_TIME,T[1]);
      ObjectSetDouble(0,name,OBJPROP_PRICE,BBM[1]);
      ObjectSetInteger(0,name,OBJPROP_TIME,1,T[0]);
      ObjectSetDouble(0,name,OBJPROP_PRICE,1,BBM[0]);
      }
  }
//+------------------------------------------------------------------+
Poiché l'emissione continua nel passato e nel futuro, le proprietà della linea di tendenza dovrebbero essere le seguenti:
  • OBJPROP_RAY_LEFT = 1, (Ray va a sinistra);
  • OBJPROP_RAY_RIGHT = 1, (Ray va a destra).

Di conseguenza, il grafico con righe aggiuntive apparirà come presentato nella Fig. 6.

La fase preparatoria è completata, ora procediamo all'emissione. Creeremo la prima serie di punti all'intersezione delle seguenti linee:

  • tra la riga "MA" (iMA) e la riga "BH" (iBands = UPPER_BAND);
  • tra la riga "MA" (iMA) e la riga "BL" (iBands = LOWER_BAND);
  • tra la riga "MA" (iMA) e la riga "BM" (iBands = BASE_BAND).

Fig. 6. Plotting ausiliari. Continuazione delle righe dell'indicatore mediante righe rette.

Ora è il momento di calcolare le coordinate di intersezione e di disegnare i punti di emissione. Creiamo la funzione:

void Draw_Point(
                string   P_name,     // Object name (OBJ_ARROW)
                double   P_y1,       // Y-coordinate of the 1st line at the [1] bar
                double   P_y0,       // Y-coordinate of the 1st line at the [0] bar
                double   P_yy1,      // Y-coordinate of the 2nd line at the [1] bar 
                double   P_yy0,      // Y-coordinate of the 2nd line at the [0] bar
                char     P_code1,    // Char at the right side of the [0] bar
                char     P_code2,    // Char at the left side of the [0] bar
                color    P_color1,   // Color of point at the right side of the [0] bar
                color    P_color2    // color of point at the left side of the [0] bar
                )
  {
   double   P,X;
   datetime P_time;
   if(MathAbs((P_yy0-P_yy1)-(P_y0-P_y1))>0)
     {
      P=P_y1+(P_y0-P_y1)*(P_y1-P_yy1)/((P_yy0-P_yy1)-(P_y0-P_y1));
      X=(P_y1-P_yy1)/((P_yy0-P_yy1)-(P_y0-P_y1));
      if(X>draw_period)
        {
         P_time=T[0]+(int)(X*PeriodSeconds());
         ObjectCreate(0,P_name,OBJ_ARROW,0,0,0);
         ObjectSetDouble(0,P_name,OBJPROP_PRICE,P);
         ObjectSetInteger(0,P_name,OBJPROP_TIME,P_time);
         ObjectSetInteger(0,P_name,OBJPROP_WIDTH,0);
         ObjectSetInteger(0,P_name,OBJPROP_ARROWCODE,P_code1);
         ObjectSetInteger(0,P_name,OBJPROP_COLOR,P_color1);
         if(X<0)
           {
            ObjectSetInteger(0,P_name,OBJPROP_ARROWCODE,P_code2);
            ObjectSetInteger(0,P_name,OBJPROP_COLOR,P_color2);
           }
        }
     }
  }

E aggiungendo le seguenti righe di codice alla funzione OnTick:

//+------------------------------------------------------------------+
   int GTC=GetTickCount();                                                    
//+------------------------------------------------------------------+
   name="H"+(string)GTC;
   Draw_Point(name,BBH[1],BBH[0],MA[1],MA[0],170,178,Red,Red);
   name="L"+(string)GTC;
   Draw_Point(name,BBL[1],BBL[0],MA[1],MA[0],170,178,Blue,Blue);
   name="M"+(string)GTC;
   Draw_Point(name,BBM[1],BBM[0],MA[1],MA[0],170,178,Green,Green);
//---
   ChartRedraw(0);

Ora avviamo l'Expert Advisor e osserviamo il risultato (Fig. 7.).

Va bene, ma ci sono altri casi di intersezione che non abbiamo considerato. Ad esempio, l'indicatore iBands ha tre linee che si intersecano e possono completare il quadro generale.

Fig. 7. L'emissione degli indicatori iMA e iBands (3 incroci).

Ora proviamo ad aggiungere un'altra serie di punti all'emissione calcolata, l'intersezione tra le seguenti righe:
  • tra la riga "BH" (iBands = UPPER_BAND) e la riga "BL" (iBands = LOWER_BAND);
  • tra la riga "BH" (iBands = UPPER_BAND) e la riga "BM" (iBands = BASE_BAND);
  • tra la riga "BL" (iBands = LOWER_BAND) e la riga "BM" (iBands = BASE_BAND).

A causa di queste intersezioni, otterremmo 3 punti, ma tutti avranno le stesse coordinate. Pertanto è sufficiente utilizzare una sola intersezione, tra la riga "BH" e la riga "BL".

Aggiungiamo queste righe di codice al nostro Expert Advisor e diamo un'occhiata al risultato (Fig. 8.).

   name="B"+(string)GTC;
   Draw_Point(name,BBH[1],BBH[0],BBL[1],BBL[0],170,178,Magenta,Magenta);

Fig. 8. Emissione degli indicatori iMA e iBands (4 incroci).

Quindi, abbiamo ottenuto l'emissione, ma c'è la sensazione che ci sia sfuggito qualcosa di importante. Tuttavia, cosa ci siamo persi?

Perché abbiamo usato solo questi parametri di input? Cosa otterremo se li cambiamo? E comunque, qual è il loro ruolo nelle emissioni?

Va bene, l'emissione che abbiamo corrisponde a una singola frequenza, risultata dai parametri di input dell'indicatore. Per calcolare l'intero spettro multifrequenza è necessario eseguire gli stessi calcoli per le altre frequenze. Ad esempio, ecco la mia versione del possibile spettro di emissione:

//---- handles for indicators
int         MAHandle[5];   // handles array of iMA indicators
int         BBHandle[7];   // handles array of iBands indicator
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   MAHandle[0]=iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE);
   MAHandle[1]=iMA(NULL,0,34,0,MODE_EMA,PRICE_CLOSE);
   MAHandle[2]=iMA(NULL,0,55,0,MODE_EMA,PRICE_CLOSE);
   MAHandle[3]=iMA(NULL,0,89,0,MODE_EMA,PRICE_CLOSE);
   MAHandle[4]=iMA(NULL,0,144,0,MODE_EMA,PRICE_CLOSE);
//---
   BBHandle[0]=iBands(NULL,0,55,0,2,PRICE_CLOSE);
   BBHandle[1]=iBands(NULL,0,89,0,2,PRICE_CLOSE);
   BBHandle[2]=iBands(NULL,0,144,0,2,PRICE_CLOSE);
   BBHandle[3]=iBands(NULL,0,233,0,2,PRICE_CLOSE);
   BBHandle[4]=iBands(NULL,0,377,0,2,PRICE_CLOSE);
   BBHandle[5]=iBands(NULL,0,610,0,2,PRICE_CLOSE);
   BBHandle[6]=iBands(NULL,0,987,0,2,PRICE_CLOSE);
//---
   return(0);
  }

Per considerare tutte le possibili combinazioni, aggiungiamo il seguente codice all'Expert Advisor:

//+------------------------------------------------------------------+
   CopyTime(NULL,0,0,10,T);
   ArraySetAsSeries(T,true);
   int GTC=GetTickCount();
//+------------------------------------------------------------------+
   int iMax=ArraySize(BBHandle)-1;
   int jMax=ArraySize(MAHandle)-1;
   for(int i=0; i<iMax; i++)
     {
      for(int j=0; j<jMax; j++)
        {
         //--- filling the arrays with current values
         CopyBuffer(MAHandle[j],0,0,2,MA);
         ArraySetAsSeries(MA,true);
         CopyBuffer(BBHandle[i],0,0,2,BBM);
         ArraySetAsSeries(BBM,true);
         CopyBuffer(BBHandle[i],1,0,2,BBH);
         ArraySetAsSeries(BBH,true);
         CopyBuffer(BBHandle[i],2,0,2,BBL);
         ArraySetAsSeries(BBL,true);

         name="H"+(string)GTC+(string)i+(string)j;
         Draw_Point(name,BBH[1],BBH[0],MA[1],MA[0],250,158,Aqua,Aqua);
         name="L"+(string)GTC+(string)i+(string)j;
         Draw_Point(name,BBL[1],BBL[0],MA[1],MA[0],250,158,Blue,Blue);
         name="M"+(string)GTC+(string)i+(string)j;
         Draw_Point(name,BBM[1],BBM[0],MA[1],MA[0],250,158,Green,Green);
         name="B"+(string)GTC+(string)i+(string)j;
         Draw_Point(name,BBH[1],BBH[0],BBL[1],BBL[0],250,158,Magenta,Magenta);
        }
     }
//---
   ChartRedraw(0);

Più frequenze sono coinvolte nello spettro di emissione, l'immagine migliore sarà sul grafico, ma non dovresti abusarne: è un modo più semplice per esaurire le risorse del computer e per ottenere il caos sul grafico. Il numero di frequenze può essere determinato sperimentalmente. Per una migliore percezione della grafica, dobbiamo prestare particolare attenzione allo stile di disegno.

Fig. 9. Spettro di emissione multifrequenza.

Degli Stili di Disegno di Emissione

Il linguaggio MQL5 fornisce un'ampia gamma di caratteri Web Colors e Windings per le emissioni di disegno. Vorrei condividere la mia opinione a riguardo:  
  1. Ogni persona ha la propria percezione delle immagini grafiche, quindi avrai bisogno di un po' di tempo per personalizzare le emissioni.
  2. Il "caos" in Fig.9. non permette di riconoscere alcuna regolarità o pattern nelle immagini. È un esempio di cattivo disegno.
  3. Prova a usare i colori vicini nello spettro dell'arcobaleno.
  4. I codici dei caratteri per il passato (dal lato sinistro della barra [0]) e per il futuro (dal lato destro della barra [0]) dovrebbero essere diversi.
  5. La riuscita combinazione di colori e forme dei punti è in grado di trasformare l'emissione in capolavori, che non solo aiuteranno nel trading, ma piaceranno anche ai tuoi occhi.
Ad esempio, ecco la mia versione dello stile di disegno per l'emissione (vedi Figure 10-17):
         name="H"+(string)GTC+(string)i+(string)j;
         Draw_Point(name,BBH[1],BBH[0],MA[1],MA[0],250,158,Aqua,Aqua);
         name="L"+(string)GTC+(string)i+(string)j;
         Draw_Point(name,BBL[1],BBL[0],MA[1],MA[0],250,158,Blue,Blue);
         name="M"+(string)GTC+(string)i+(string)j;
         Draw_Point(name,BBM[1],BBM[0],MA[1],MA[0],250,158,Magenta,Magenta);
         name="B"+(string)GTC+(string)i+(string)j;
         Draw_Point(name,BBH[1],BBH[0],BBL[1],BBL[0],250,158,DarkOrchid,DarkOrchid);

La Galleria delle Emissioni di iMA e iBands

Le immagini con queste emissioni sono presentate in questo capitolo.

 

Fig. 10.

 

Fig. 11

Fig. 12.

Fig. 13.

Fig. 14.

 

Fig. 15.

Fig. 16.

 

Fig. 17.

Analisi delle Emissioni

L'analisi delle emissioni è un compito separato. La cosa più utile è guardare le sue dinamiche in tempo reale, è il modo migliore per capire molti effetti e pattern.

Prestare attenzione alle correzioni dei prezzi: sembra che l'emissione "conosca" il prezzo target. Inoltre, puoi vedere i livelli di prezzo di supporto, resistenza e equilibrio.

Conclusione

  1. Le emissioni degli indicatori potrebbero essere interessanti per i trader e gli sviluppatori di sistemi commerciali, che sono alla ricerca di nuovi approcci nelle ricerche e analisi di mercato.
  2. Come articolo introduttivo, non contiene le soluzioni pronte. Tuttavia, la tecnologia presentata per il calcolo delle emissioni può essere applicata ad altri indicatori o alle loro combinazioni.
  3. Preparando questo articolo, ho raccolto più domande che risposte. Eccone alcuni: come ottimizzare l'algoritmo di disegno delle emissioni; qual è il ruolo delle caratteristiche dello spettro di emissione nella struttura dell'emissione; come utilizzare le emissioni nel trading automatizzato?

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

Come Esportare Quotazioni da МetaTrader 5 ad Applicazioni .NET Utilizzando i Servizi WCF Come Esportare Quotazioni da МetaTrader 5 ad Applicazioni .NET Utilizzando i Servizi WCF
Vuoi organizzare l'esportazione delle quotazioni da MetaTrader 5 alla tua applicazione? La giunzione MQL5-DLL permette di creare tali soluzioni! Questo articolo ti mostrerà uno dei modi per esportare le quotazioni da MetaTrader 5 ad applicazioni scritte in .NET. Per me è stato più interessante, razionale e facile implementare l'esportazione dei preventivi utilizzando proprio questa piattaforma. Sfortunatamente, la versione 5 non supporta ancora .NET quindi, come ai vecchi tempi, utilizzeremo win32 dll con supporto .NET come interlayer.
Scambio di Dati tra Indicatori: È Facile Scambio di Dati tra Indicatori: È Facile
Vogliamo creare un tale ambiente che fornisca l'accesso ai dati degli indicatori allegati a un grafico e che abbia le seguenti proprietà: assenza di copia dei dati; modifica minima del codice dei metodi disponibili, se è necessario utilizzarli; È preferibile il codice MQL (ovviamente dobbiamo usare DLL, ma useremo solo una dozzina di stringhe di codice C++). L'articolo descrive un metodo semplice per sviluppare un ambiente di programma per il terminale MetaTrader, che fornirebbe i mezzi per accedere ai buffer degli indicatori da altri programmi MQL.
Implementazione Pratica di Filtri Digitali in MQL5 per Principianti Implementazione Pratica di Filtri Digitali in MQL5 per Principianti
L'idea di filtrare il segnale digitale è stata ampiamente discussa negli argomenti del forum sulla costruzione di sistemi di trading. E sarebbe imprudente non creare un codice standard di filtri digitali in MQL5. In questo articolo l'autore descrive la trasformazione del semplice codice dell'indicatore SMA dal suo articolo "Indicatori personalizzati in MQL5 per principianti" in codice di filtro digitale più complicato e universale. Questo articolo è un seguito logico all'articolo precedente. Indica anche come sostituire il testo nel codice e come correggere gli errori di programmazione.
Come Scambiare i Dati: Una DLL per MQL5 in 10 minuti Come Scambiare i Dati: Una DLL per MQL5 in 10 minuti
Ora, non sono così tanti gli sviluppatori che ricordano come scrivere una semplice DLL e quali sono le caratteristiche speciali dei diversi binding di sistema. Usando diversi esempi, cercherò di mostrare l'intero processo di creazione della semplice DLL in 10 minuti, oltre a discutere alcuni dettagli tecnici della nostra implementazione vincolante. Mostrerò il processo passo dopo passo della creazione di DLL in Visual Studio con esempi di scambio di diversi tipi di variabili (numeri, array, stringhe, ecc.). Inoltre spiegherò come proteggere il tuo terminale client da arresti anomali nelle DLL personalizzate.