Un semplice Indicatore Visuale per MT4 – Delta Signal

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:

Catfoot Un semplice Indicatore Visuale per MT4 - Delta Signal
Un semplice indicatore a frecce in alto a destra

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:

Catfoot Un semplice Indicatore Visuale per MT4 - Delta Signal
In questo caso le Medie mobili sono troppo vicine e l’RSI è invece SHORT pieno.
Situazione long: tutto è verde
Situazione short: tutto è rosso
Situazione incerta: tutto è bianco.

Chiaro no?

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:

Catfoot Un semplice Indicatore Visuale per MT4 - Delta Signal
Voglio personalizzare alcuni dati estetici, ma sopratutto il periodo dell’RSI, Sulle Medie Mobili non avevo interesse a personalizzare, ma naturalmente sia il periodo sia la Modalità di calcolo possono essere facilmente messe come opzione.

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!

Un commento

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *