Aiuto nella Programmazione. il mio primo EA.

 

Salve a tutti ragazzi, 
sto creando il mio primo Expert Advisor. 

la logica è questa su timeframe h1: 
2 EMA a 38 e 48 periodi

2 SMA a 5 e 8 periodi 

Quando le due SMA sono > delle due EMA ed il prezzo della candela chiude sopra le SMA entro BUY
per il SELL le condizioni contrarie. 


Ho iniziato a scrivere il codice, mi da errore 130 nel log del backtesting... cosa sto sbagliando? 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

// Dichiarazione delle variabili globali
extern int FastEMA = 38;   // Periodo per la media mobile esponenziale veloce
extern int SlowEMA = 48;   // Periodo per la media mobile esponenziale lenta
extern int FastSMA = 5;  // Periodo per la media mobile semplice veloce
extern int SlowSMA = 8;  // Periodo per la media mobile semplice lenta
extern double StopLoss = 200; // Livello di Stop Loss in pips
extern double TakeProfit = 500; // Livello di Take Profit in pips
extern double lotsizebuy = 0.5;  // lotti per Buy
extern double lotsizesell = 0.5;  // lotti per sell

double fastEMA;
double slowEMA;
double fastSMA;
double slowSMA; 

datetime lastCandleTime = 0;
datetime lastHour = 0; // Variabile per memorizzare l'ora precedente

double PointXAUUSD; // Variabile per memorizzare il valore di un punto (pip) per XAUUSD


void OnInit()
{
    // Ottieni il simbolo del grafico corrente
    string currentSymbol = Symbol();
    
    
    // Stampa il simbolo corrente sulla console
    Print("Simbolo corrente: ", currentSymbol);

    // Imposta il timer per verificare le condizioni con l'intervallo del timeframe corrente
    int timeframeSeconds = PeriodSeconds(Period());
    
    EventSetTimer(timeframeSeconds); // Imposta il timer con l'intervallo del timeframe corrente
    
    // Inizializza PointXAUUSD con il valore di un pip per XAUUSD
    if (StringFind(currentSymbol, "XAUUSD") >= 0)
    {
        PointXAUUSD = MarketInfo(currentSymbol, MODE_POINT);
    }
}

void OnTick()
{
    // Ottieni l'ora corrente
    datetime currentHour = TimeHour(TimeCurrent());

    // Verifica se è iniziata una nuova ora
    if (currentHour != lastHour)
    {
        // Calcola la media mobile sul tick
        fastEMA = iMA(NULL, 0, FastEMA, 0, MODE_EMA, PRICE_CLOSE, 0);
        slowEMA = iMA(NULL, 0, SlowEMA, 0, MODE_EMA, PRICE_CLOSE, 0);
        fastSMA = iMA(NULL, 0, FastSMA, 0, MODE_SMA, PRICE_CLOSE, 0);
        slowSMA = iMA(NULL, 0, SlowSMA, 0, MODE_SMA, PRICE_CLOSE, 0);

        // Disegna le medie mobili sul grafico
        ObjectCreate("FastEMA", OBJ_TREND, 0, 0, Time[0], fastEMA);
        ObjectSet("FastEMA", OBJPROP_COLOR, Blue);
        ObjectSet("FastEMA", OBJPROP_WIDTH, 1);

        ObjectCreate("SlowEMA", OBJ_TREND, 0, 0, Time[0], slowEMA);
        ObjectSet("SlowEMA", OBJPROP_COLOR, Red);
        ObjectSet("SlowEMA", OBJPROP_WIDTH, 1);

        ObjectCreate("FastSMA", OBJ_TREND, 0, 0, Time[0], fastSMA);
        ObjectSet("FastSMA", OBJPROP_COLOR, Green);
        ObjectSet("FastSMA", OBJPROP_WIDTH, 1);

        ObjectCreate("SlowSMA", OBJ_TREND, 0, 0, Time[0], slowSMA);
        ObjectSet("SlowSMA", OBJPROP_COLOR, Magenta);
        ObjectSet("SlowSMA", OBJPROP_WIDTH, 1);
        
        // Memorizza l'ora corrente come l'ora precedente per il prossimo controllo
        lastHour = currentHour;
    }

    // Verifica se la candela corrente è chiusa
    if (Time[0] != lastCandleTime)
    {
        // Esegui le azioni desiderate per la chiusura oraria (H1)
        CheckHourlyClose();

        // Memorizza il timestamp dell'ultima candela chiusa
        lastCandleTime = Time[0];
    }
}

void OnTimer()
{
    // Esegui il controllo del segnale di trading sulla nuova candela H1
    CheckHourlyClose();
}

void CheckHourlyClose()
{
    double hourClose = iClose(Symbol(), PERIOD_H1, 0);

    // Imposta il valore magic per gli ordini
    int magic = 12345; // Sostituisci con un valore univoco a tua scelta
    int slippage = 3; // Slippage consentito

    // Calcola i valori delle medie mobili
    fastEMA = iMA(NULL, 0, FastEMA, 0, MODE_EMA, PRICE_CLOSE, 0);
    slowEMA = iMA(NULL, 0, SlowEMA, 0, MODE_EMA, PRICE_CLOSE, 0);
    fastSMA = iMA(NULL, 0, FastSMA, 0, MODE_SMA, PRICE_CLOSE, 0);
    slowSMA = iMA(NULL, 0, SlowSMA, 0, MODE_SMA, PRICE_CLOSE, 0);

    // Verifica le condizioni di incrocio per il segnale di acquisto/vendita
    bool buySignal = (fastSMA > slowSMA) && (slowSMA > fastEMA) && (slowEMA > fastSMA) && (hourClose > fastSMA);
    bool sellSignal = (fastSMA < slowSMA) && (slowSMA < fastEMA) && (slowEMA < fastSMA) && (hourClose < fastSMA);
        
      // Calcolo del valore dello stop loss e take profit in termini di punti (Pips)
    double StopLossPips = NormalizeDouble (StopLoss * PointXAUUSD,Digits);
    double TakeProfitPips = NormalizeDouble (TakeProfit * PointXAUUSD, Digits);
    
       
    // Dichiarazione delle variabili per la gestione delle operazioni
    int ticketBuy, ticketSell;
 
    
      // Se c'è un segnale di acquisto, apri una posizione Buy
    if (buySignal)
    {
        ticketBuy = OrderSend(Symbol(), OP_BUY, lotsizebuy, Ask, slippage, StopLossPips, TakeProfitPips, "", magic, 0, Green);
             
        if (ticketBuy < 0)
        {
            Print("Errore nell'apertura dell'ordine Buy. Codice dell'errore:", GetLastError());
        }
    }
    // Se c'è un segnale di vendita, apri una posizione Sell
    else if (sellSignal)
    {
        ticketSell = OrderSend(Symbol(), OP_SELL, lotsizesell, Bid, slippage, StopLossPips, TakeProfitPips, "", magic, 0, Red);
            
        if (ticketSell < 0)
        {
            Print("Errore nell'apertura dell'ordine Sell. Codice dell'errore:", GetLastError());
        }
    }
}

      --------------------------------------------------------------------------------------------------------

 
MassimoB:
  // Calcolo del valore dello stop loss e take profit in termini di punti (Pips)     double StopLossPips = NormalizeDouble (StopLoss * PointXAUUSD,Digits);     double TakeProfitPips = NormalizeDouble (TakeProfit * PointXAUUSD, Digits);

Ciao Massimo!


tu scrivi:

  // Calcolo del valore dello stop loss e take profit in termini di punti (Pips)
    double StopLossPips = NormalizeDouble (StopLoss * PointXAUUSD,Digits);
    double TakeProfitPips = NormalizeDouble (TakeProfit * PointXAUUSD, Digits);

ma lo stop loss va passato come prezzo, non come numero di pips, quindi nel tuo caso:


  // Calcolo del valore dello stop loss e take profit in termini di punti (Pips)
    double StopLossPipsBuy = NormalizeDouble (Ask - (StopLoss * PointXAUUSD),Digits);
    double TakeProfitPipsBuy = NormalizeDouble (Ask + (TakeProfit * PointXAUUSD), Digits);




double StopLossPipsSell = NormalizeDouble (Bid + (StopLoss * PointXAUUSD),Digits);
    double TakeProfitPipsSell = NormalizeDouble (Bid - (TakeProfit * PointXAUUSD), Digits);