Se ti è capitato di inserire degli indicatori, e parallelamente hai avuto modo di scrivere qualche riga di codice, forse ti è venuto in mente di scriverti un indicatore personalizzato.
Il che non è per niente male, nel senso: probabilmente ci sono decine di migliaia di indicatori gratuiti e altrettanti a pagamento, ma se tu volessi ESATTAMENTE quell’indicatore?
Ma sopratutto, cosa deve fare quell’indicatore?
Ho scritto alcuni indicatori per Meta Trader 4 e Meta Trader 5 e no, non sono diventato schifosamente ricco grazie a questi.
Se sei un trader probabilmente vorrai scriverti quello specifico indicatore che riesca a mostrarti in un momento le informazioni necessarie al tuo trading system, senza altre distrazioni.
Guarda per esempio questo screenshot:
Quell’indicatore mi serviva per vedere in una botta sola se le medie mobili erano allineate long o short, e con quale distanza (indicata dal numerino sopra la freccia sinistra, in questo caso 7.2 pip).
A destra, trovo l’indicazione del valore dell’RSI, che essendo superiore a 50 ed inferiore a 75, posso considerarlo un segnale (o meglio, una conferma di segnale) anch’esso long.
Insomma, volevo tradare in trend, mi sono scritto questo semplice indicatore e… non ho guadagnato. 🙂 Ahahaha. Ricordo che ho aperto (in demo grazie al Signore) un sacco di operazioni poi tradotte in uno stop.
Però, nello specifico, ho imparato a prendere dei valori degli indicatori, fattorizzarli con le mie esigenze e risputarli fuori con un codice mql4, in questo caso, che mi facesse ottenere quello che volevo.
Ecco come si presentava l’indicatore in caso di segnali short o segnali incerti:
Ecco che allora avevo in mano un bello strumentino che mi permetteva di avere una visione chiara della mia IDEA di trading.
Sicuramente è stato utile, perché con questo indicatorino ho imparato a:
- Prendere i valori da altri indicatori (Medie Mobili e RSI)
- Fare una valutazione matematica (differenza tra MM e confronto di RSI con dei valori esterni)
- Renderizzare le informazioni in un indicatore per tradare
Sì, tutto bello, MAILCODICEEEEEEE???
Premetto che il codice che troverai è per MQL4. Questo indi non l’ho mai tradotto per MQL5, ove mi sto spostando principalmente per questioni legate al backtesting degli EA.
E sopratutto al tempo non ho mai pensato (mi sta venendo in mente ora mentre scrivo) di utilizzare questo semplice indi insieme ad una strategia di breakout. Maybe in the future. 🙂
Comunque. Mi preparo innanzi tutto i parametri che voglio manipolare dall’esterno:
Il mio codice quindi iniziava così
//+------------------------------------------------------------------+ //| Simple Delta Signal.mq4 | //| Copyright 2018, Catfoot Woollover | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2018, Catfoot Woollover" #property link "https://www.mql5.com" #property strict #property indicator_chart_window extern int scaleX=30; // horizontal interval at which the squares are created extern int scaleY=30; // vertical interval extern int offsetX=35; // horizontal indent of all squares extern int offsetY=20; // vertical indent extern int fontSize=20; // font size extern int corner=1; // corner of the screen extern int RSI_Period = 9; // Period of RSI extern double MA_Delta=4.5; // Distance of the Two EMAs int Signal; int P;
La prima parte descrive, nel pre-processore del codice, autore, finestra e tutti i parametri esterni, salvati in variabili riconoscibili dalla dicitura extern
//+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { for(int x=0;x<2;x++) for(int y=0;y<2;y++) { ObjectCreate("signal"+x+y,OBJ_LABEL,0,0,0,0,0); ObjectSet("signal"+x+y,OBJPROP_CORNER,corner); ObjectSet("signal"+x+y,OBJPROP_XDISTANCE,x*scaleX+offsetX); ObjectSet("signal"+x+y,OBJPROP_YDISTANCE,y*scaleY+offsetY); ObjectSet("signal"+x+y,OBJPROP_SELECTABLE,false); ObjectSet("signal"+x+y,OBJPROP_HIDDEN,true); ObjectSetText("signal"+x+y,CharToStr(122),fontSize,"Wingdings",Gold); } //--- return(0); }
Qui, nell’OnInit, creo con due loop innestati quattro elementi: le due frecce e le due etichette numeriche.
Dopodiché dovrò fare in modo che quando rimuovo l’indi dalla chart questo se ne vada. Ecco come lo faccio:
//+------------------------------------------------------------------+ //| DEINIT FUNCTION | //+------------------------------------------------------------------+ int deinit() { // when deleting the indicator delete all objects killindicator(); return(0); }
Nell’ OnDeinit() evoco una funzione Killindicator(); che leva tutti gli oggetti con questo loop:
//+------------------------------------------------------------------+ //|REMOVE ALL OBJECTS | //+------------------------------------------------------------------+ void killindicator() { for(int x=0;x<2;x++) for(int y=0;y<2;y++) { ObjectDelete(Symbol(),"signal"+x+y); } }
Eccola. Recupero il nome di tutti gli oggetti e semplicemente li elimino con ObjectDelete().
E nel ciclo dell’OnTick(), ovvero ogni volta che c’è una variazione di prezzo, prendo:
- La distanza delle MM
- Il valore dell’RSI
E faccio in modo che modificano i colori degli oggetti creati, con questa funzione:
void OnTick() { //prendo il dato RSI int RsiValue = iRSI(Symbol(),0,RSI_Period,PRICE_CLOSE,0); //prendo il valore della differenza tra la media a 9 e a 19 periodi double Delta = NormalizeDouble(MathAbs((iMA(Symbol(),0,9,0,MODE_EMA,PRICE_CLOSE,0)-iMA(Symbol(),0,19,0,MODE_EMA,PRICE_CLOSE,0))/(Point*10)),1); // cicli if-elseif-else per cambio colore Delta Medie Mobili if(iMA(Symbol(),0,9,0,MODE_EMA,PRICE_CLOSE,0)>iMA(Symbol(),0,19,0,MODE_EMA,PRICE_CLOSE,0) && Delta>=MA_Delta) { ObjectSetText("signal11",CharToStr(221),fontSize,"Wingdings",MediumSeaGreen); ObjectSetText("signal10",Delta,10,"Verdana",MediumSeaGreen); } else if(iMA(Symbol(),0,9,0,MODE_EMA,PRICE_CLOSE,0)<iMA(Symbol(),0,19,0,MODE_EMA,PRICE_CLOSE,0) && Delta>=MA_Delta) { ObjectSetText("signal11",CharToStr(222),fontSize,"Wingdings",Tomato); ObjectSetText("signal10",Delta,10,"Verdana",Tomato); } else { ObjectSetText("signal11",CharToStr(251),fontSize,"Wingdings",White); ObjectSetText("signal10",Delta,10,"Verdana",White); } // cicli if-elseif-else per cambio colore RSI if(RsiValue>50 && RsiValue<70) { ObjectSetText("signal01",CharToStr(221),fontSize,"Wingdings",MediumSeaGreen); ObjectSetText("signal00",RsiValue,10,"Verdana",MediumSeaGreen); } else if(RsiValue<50 && RsiValue>30) { ObjectSetText("signal01",CharToStr(222),20,"Wingdings",Tomato); ObjectSetText("signal00",RsiValue,10,"Verdana",Tomato); } else { ObjectSetText("signal01",CharToStr(251),fontSize,"Wingdings",White); ObjectSetText("signal00",RsiValue,10,"Verdana",White); }
Attenzione! il codice non è completo, sta a te utilizzarlo al meglio per scrivere il tuo indicatore.
Se ti è piaicuto l’articolo, condividilo!
[…] in mql può infatti aiutarti a costruire tool, indicatori, dashboard che ti possano aiutare nel tuo trading quotidiano, e, perché no, a migliorare la tua […]