Disegnare le Emissioni di Indicatori in MQL5
Introduzione
Certamente, molti trader e sviluppatori di strategie di trading sono interessati a queste domande:- Come stanno emergendo i forti movimenti di mercato?
- Come determinare la direzione corretta dei cambiamenti imminenti?
- Come aprire una posizione redditizia per il trading?
- Come chiudere una posizione con il massimo profitto?
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:- Ogni persona ha la propria percezione delle immagini grafiche, quindi avrai bisogno di un po' di tempo per personalizzare le emissioni.
- Il "caos" in Fig.9. non permette di riconoscere alcuna regolarità o pattern nelle immagini. È un esempio di cattivo disegno.
- Prova a usare i colori vicini nello spettro dell'arcobaleno.
- 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.
- 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.
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
- 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.
- 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.
- 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
- 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