Announcement

Collapse
No announcement yet.

Indicatore MACD

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Indicatore MACD

    Salve a tutti. Premesso che non sono un programmatore MQL me sto cercando ugualmente di programmare un indicatore MACD che mi dia il segnale quando la mode_main taglia (al rialzo o al ribasso) la mode_signal.
    Avendo però stabilito dei valori di mode_main diversi per ogni grafico che andrò a tradare è la nata la necessità di creare delle variabili esterne che la mt4 mi fa modificare ma solo in facciata, nel senso che poi il programma non modifica i dati immessi di default e quindi non genera il segnale richiesto.
    Qualcuno può darmi una mano? Grazie infinite a tutti

    #2
    Siccome quel che vuoi fare è molto semplice...
    o posti quel che hai scritto e proviamo a capire come correggerlo
    o continua a studiare le basi di metaquote language
    La vita non è un giro di prova, cogli l’attimo..
    Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

    Comment


      #3
      Questo è il codice
      Grazie mille

      //+------------------------------------------------------------------+
      //| MACD personale.mq4 |
      //| Copyright 2020, MetaQuotes Software Corp. |
      //| https://www.mql5.com |
      //+------------------------------------------------------------------+
      #property copyright "Copyright 2020, MetaQuotes Software Corp."
      #property link "https://www.mql5.com"
      #property version "1.00"
      #property description ""

      #include <stdlib.mqh>
      #include <stderror.mqh>

      //--- indicator settings
      #property indicator_chart_window
      #property indicator_buffers 2

      #property indicator_type1 DRAW_ARROW
      #property indicator_width1 1
      #property indicator_color1 0xFFAA00
      #property indicator_label1 "MACD BUY"

      #property indicator_type2 DRAW_ARROW
      #property indicator_width2 1
      #property indicator_color2 0x0000FF
      #property indicator_label2 "MACD SELL"

      //--- indicator buffers
      double Buffer1[];
      double Buffer2[];

      extern double MACD_VAL_NEG = 0.0;
      extern double MACD_VAL_POS = 0.0;
      datetime time_alert; //used when sending alert
      extern bool Audible_Alerts = true;
      double myPoint; //initialized in OnInit

      void myAlert(string type, string message)
      {
      if(type == "print")
      Print(message);
      else if(type == "error")
      {
      Print(type+" | MACD @ "+Symbol()+","+IntegerToString(Period())+" | "+message);
      }
      else if(type == "order")
      {
      }
      else if(type == "modify")
      {
      }
      else if(type == "indicator")
      {
      if(Audible_Alerts) Alert(type+" | MACD @ "+Symbol()+","+IntegerToString(Period())+" | "+message);
      }
      }

      //+------------------------------------------------------------------+
      //| Custom indicator initialization function |
      //+------------------------------------------------------------------+
      int OnInit()
      {
      IndicatorBuffers(2);
      SetIndexBuffer(0, Buffer1);
      SetIndexEmptyValue(0, EMPTY_VALUE);
      SetIndexArrow(0, 241);
      SetIndexBuffer(1, Buffer2);
      SetIndexEmptyValue(1, EMPTY_VALUE);
      SetIndexArrow(1, 242);
      //initialize myPoint
      myPoint = Point();
      if(Digits() == 5 || Digits() == 3)
      {
      myPoint *= 10;
      }
      return(INIT_SUCCEEDED);
      }

      //+------------------------------------------------------------------+
      //| Custom indicator iteration function |
      //+------------------------------------------------------------------+
      int OnCalculate(const int rates_total,
      const int prev_calculated,
      const datetime& time[],
      const double& open[],
      const double& high[],
      const double& low[],
      const double& close[],
      const long& tick_volume[],
      const long& volume[],
      const int& spread[])
      {
      int limit = rates_total - prev_calculated;
      //--- counting from 0 to rates_total
      ArraySetAsSeries(Buffer1, true);
      ArraySetAsSeries(Buffer2, true);
      //--- initial zero
      if(prev_calculated < 1)
      {
      ArrayInitialize(Buffer1, EMPTY_VALUE);
      ArrayInitialize(Buffer2, EMPTY_VALUE);
      }
      else
      limit++;

      //--- main loop
      for(int i = limit-1; i >= 0; i--)
      {
      if (i >= MathMin(5000-1, rates_total-1-50)) continue; //omit some old rates to prevent "Array out of range" or slow calculation

      //Indicator Buffer 1
      if(iMACD(NULL, PERIOD_CURRENT, 12, 48, 12, PRICE_CLOSE, MODE_MAIN, i) > iMACD(NULL, PERIOD_CURRENT, 12, 48, 12, PRICE_CLOSE, MODE_SIGNAL, i)
      && iMACD(NULL, PERIOD_CURRENT, 12, 48, 12, PRICE_CLOSE, MODE_MAIN, i+1) < iMACD(NULL, PERIOD_CURRENT, 12, 48, 12, PRICE_CLOSE, MODE_SIGNAL, i+1) //MACD crosses above MACD
      && iMACD(NULL, PERIOD_CURRENT, 12, 48, 12, PRICE_CLOSE, MODE_MAIN, i) < MACD_VAL_NEG //MACD < fixed value
      && iMACD(NULL, PERIOD_CURRENT, 12, 48, 12, PRICE_CLOSE, MODE_MAIN, i) > iMACD(NULL, PERIOD_CURRENT, 12, 48, 12, PRICE_CLOSE, MODE_MAIN, 1+i) //MACD > MACD
      && iMACD(NULL, PERIOD_CURRENT, 12, 48, 12, PRICE_CLOSE, MODE_MAIN, 1+i) < iMACD(NULL, PERIOD_CURRENT, 12, 48, 12, PRICE_CLOSE, MODE_MAIN, 2+i) //MACD < MACD
      )
      {
      Buffer1[i] = Low[i] - iATR(NULL, PERIOD_CURRENT, 14, i) * 1.5; //Set indicator value at Candlestick Low - Average True Range * fixed value
      if(i == 1 && Time[1] != time_alert) myAlert("indicator", "MACD BUY"); //Alert on next bar open
      time_alert = Time[1];
      }
      else
      {
      Buffer1[i] = EMPTY_VALUE;
      }
      //Indicator Buffer 2
      if(iMACD(NULL, PERIOD_CURRENT, 12, 48, 12, PRICE_CLOSE, MODE_MAIN, i) < iMACD(NULL, PERIOD_CURRENT, 12, 48, 12, PRICE_CLOSE, MODE_SIGNAL, i)
      && iMACD(NULL, PERIOD_CURRENT, 12, 48, 12, PRICE_CLOSE, MODE_MAIN, i+1) > iMACD(NULL, PERIOD_CURRENT, 12, 48, 12, PRICE_CLOSE, MODE_SIGNAL, i+1) //MACD crosses below MACD
      && iMACD(NULL, PERIOD_CURRENT, 12, 48, 12, PRICE_CLOSE, MODE_MAIN, i) > MACD_VAL_NEG //MACD > fixed value
      && iMACD(NULL, PERIOD_CURRENT, 12, 48, 12, PRICE_CLOSE, MODE_MAIN, i) < iMACD(NULL, PERIOD_CURRENT, 12, 48, 12, PRICE_CLOSE, MODE_MAIN, 1+i) //MACD < MACD
      && iMACD(NULL, PERIOD_CURRENT, 12, 48, 12, PRICE_CLOSE, MODE_MAIN, 1+i) > iMACD(NULL, PERIOD_CURRENT, 12, 48, 12, PRICE_CLOSE, MODE_MAIN, 2+i) //MACD > MACD
      )
      {
      Buffer2[i] = High[i] + iATR(NULL, PERIOD_CURRENT, 14, i) * 1.5; //Set indicator value at Candlestick High + Average True Range * fixed value
      if(i == 1 && Time[1] != time_alert) myAlert("indicator", "MACD SELL"); //Alert on next bar open
      time_alert = Time[1];
      }
      else
      {
      Buffer2[i] = EMPTY_VALUE;
      }
      }
      return(rates_total);
      }
      //+------------------------------------------------------------------+

      Comment


        #4
        ho salvato il codice che hai postato in un file indicatore

        il problema è che non si vede il MACD sul grafico e quindi non puoi verificare nulla sulla correttezza o meno.

        Inoltre leggo
        if(iMACD(NULL, PERIOD_CURRENT, 12, 48, 12, PRICE_CLOSE, MODE_MAIN, i) > iMACD(NULL, PERIOD_CURRENT, 12, 48, 12, PRICE_CLOSE, MODE_SIGNAL, i)

        quindi le tre variabili Fast EMA Period, Slow EMA Period, Signal SMA Period sono cablate ai valori 12, 48 e 12 !

        TI consiglio di modificare l'indicatore nativo di Mt4 con il file MACD.mq4
        input int InpFastEMA=12; // Fast EMA Period
        input int InpSlowEMA=26; // Slow EMA Period
        input int InpSignalSMA=9; // Signal SMA Period

        così da vedere l'indicatore sul grafico e verificare le soglie
        La vita non è un giro di prova, cogli l’attimo..
        Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

        Comment


          #5
          Umbertosm, si i parametri del macd che ho impostato sono assolutamente quelli. Sotto l'aspetto strategia ha ovviamente dei filtri ma non è questo il problema. Dall'indicatore non voglio avere la visualizzazione del macd ma solo delle frecce che mi indichino quando si avvera la condizione impostata. Ora, siccome il valore dell'istogramma voglio che vari da grafico a grafico che vado a seguire sulla mt4 mi è sembrato opportuno creare delle variabili esterne in maniera tale da modificare il valore del macd ogni volta che mi interessa farlo. Il problema è che la mt4 non mi legge il valore che io imposto quando carico l'indicatore. Come posso fare? Grazie mille

          Comment


            #6
            qual è il valore che imposti come variabile esterna ?
            io vedo soltanto queste due variabili

            extern double MACD_VAL_NEG = 0.0;
            extern double MACD_VAL_POS = 0.0;

            se quando carichi l'indicatore su grafico le setti ad un valore, queste dovrebbero rimanere in memoria, essendo variabili esterne.

            Stampa una Print() di queste due variabile così verifichi se il valore si mantiene ad ogni tick

            Code:
            Print("MACD_VAL_NEG = "+DoubleToStr(MACD_VAL_NEG,1)+" MACD_VAL_POS = "+DoubleToStr(MACD_VAL_POS,1));
            a me mantiene correttamente i valori delle due variabili esterne.

            Comunque se non stampi a video le variabili per controllarne i valori, se non vedi a video se il calcolo del iMACD è corretto, come fai a sapere se il giocattolo sta funzionando come vuoi ?
            Io stampo decine di Print per avere il controllo totale su ogni evento, e alla fine poi quando vedo che tutto funziona commento queste Print() (inserisco // e il compilatore di Mt4 non le inserisce nel codice che quindi risulta snello come se non avessi messo le Print)



            La vita non è un giro di prova, cogli l’attimo..
            Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

            Comment


              #7
              Il valore lo verficavo con il MACD della MT4. Ad ogni modo, non so come ma sono riuscito a farlo funzionare.
              Grazie mille

              Comment

              Working...
              X