Announcement

Collapse
No announcement yet.

Indicatore MACD

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

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

    Leave a comment:


  • umbertosm
    replied
    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)



    Leave a comment:


  • Francesco
    replied
    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

    Leave a comment:


  • umbertosm
    replied
    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

    Leave a comment:


  • Francesco
    replied
    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);
    }
    //+------------------------------------------------------------------+

    Leave a comment:


  • umbertosm
    replied
    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

    Leave a comment:


  • Francesco
    started a topic Indicatore MACD

    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
Working...
X