Problemi con il mio bot di trading in MQL5: Errore con gli indicatori e i trailing stop/Problems with my trading bot in MQL5: Error with indicators and trailing stops

 

Ciao a tutti,

sto cercando di sviluppare un bot di trading in MQL5 che utilizza gli indicatori ATR, ADX e RSI per generare segnali di acquisto e impostare un trailing stop. Tuttavia, sto riscontrando due principali problemi che non riesco a risolvere. 

Gli errori principali sono relativi a un problema con le parentesi mancanti e la gestione dei parametri in alcune funzioni, nonostante mi sembri che le parentesi siano presenti:

Gli errori segnalati dal compilatore sono i seguenti:

  1. Errore alla riga 52 colonna 81:

    • Messaggio dell'errore: ')' - open parenthesis expected    mentre la riga in questione è :      trailingStop = askPrice + (atrValue * trailingStopMultiplier * Point);  
    • Lo stesso errore appare anche alla riga 96 colonna 87 quando cerco di aggiornare il trailing stop
    • Messaggio di errore 
    • ')' - open parenthesis expected mentre la riga in questione è :                               double newTrailingStop = askPrice + (atrValue * trailingStopMultiplier * Point);



    • Ho allegato il codice qui sotto per riferimento. Grazie in anticipo per il supporto!

    • // Parametri personalizzabili
    • int magicNumber = 12345;
    • int trailingStopMultiplier = 2;
    • int atrPeriod = 14;
    • int adxPeriod = 14;
    • int adxThreshold = 25; // Soglia per considerare presente un trend
    • double initialLot = 0.01;
    • int maxConsecutiveLosses = 2;
    • double lossFactor = 1.5;
    • int rsiPeriod = 14;
    • int rsiOverbought = 80;
    • int rsiOversold = 20;

    • // Variabili globali
    • double atrValue, adxValue;
    • int consecutiveLosses = 0;
    • double lot;

    • // Funzione di inizializzazione (OnInit)
    • int OnInit()
    • {
    •     // Inizializzazione degli indicatori e dei parametri (senza librerie esterne)
    •     return(INIT_SUCCEEDED);
    • }

    • // Funzione di tick (OnTick)
    • void OnTick()
    • {
    •     // Calcolo degli indicatori (ATR, ADX, RSI)
    •     atrValue = iATR(Symbol(), PERIOD_CURRENT, atrPeriod);   // Usa il timeframe corrente
    •     adxValue = iADX(Symbol(), PERIOD_CURRENT, adxPeriod);   // Usa il timeframe corrente
    •     double rsiValue = iRSI(Symbol(), PERIOD_CURRENT, rsiPeriod, 0);   // Usa il timeframe corrente

    •     // Verifica delle condizioni di ingresso (ADX sopra la soglia e RSI)
    •     if (adxValue > adxThreshold && (rsiValue > rsiOverbought || rsiValue < rsiOversold))
    •     {
    •         // Calcolo del lotto
    •         lot = initialLot * pow(lossFactor, MathMin(consecutiveLosses, maxConsecutiveLosses));

    •         // Otteniamo i prezzi correnti (Ask per acquisto, Bid per vendita)
    •         double askPrice = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
    •         if (askPrice == 0)
    •         {
    •             Print("Errore nel recupero del prezzo Ask");
    •             return;
    •         }

    •         // Calcolo del trailing stop basato sull'ATR
    •         double trailingStop = 0;
    •         if (atrValue > 0 && trailingStopMultiplier > 0 && askPrice > 0)
    •         {
    •             trailingStop = askPrice + (atrValue * trailingStopMultiplier * Point);
    •         }
    •         else
    •         {
    •             Print("Errore nei valori: atrValue=", atrValue,
    •                   ", trailingStopMultiplier=", trailingStopMultiplier,
    •                   ", askPrice=", askPrice);
    •             return;
    •         }

    •         // Creazione della struttura per l'ordine
    •         MqlTradeRequest request = {};
    •         MqlTradeResult result = {};

    •         request.action = TRADE_ACTION_DEAL;
    •         request.symbol = Symbol();
    •         request.volume = lot;
    •         request.type = ORDER_TYPE_BUY;
    •         request.price = askPrice;
    •         request.sl = trailingStop;
    •         request.tp = 0;  // Non specificato
    •         request.deviation = 3;  // Slippage
    •         request.magic = magicNumber;
    •         request.comment = "MyOrder";

    •         // Invia l'ordine
    •         if (OrderSend(request, result))
    •         {
    •             Print("Posizione aperta con successo: ", result.order);
    •             consecutiveLosses = 0;
    •         }
    •         else
    •         {
    •             Print("Errore nell'aprire la posizione: ", GetLastError());
    •         }
    •     }

    •     // Gestione della posizione
    •     if (PositionSelect(Symbol()))
    •     {
    •         // Otteniamo il prezzo corrente di Ask
    •         double askPrice = SymbolInfoDouble(Symbol(), SYMBOL_ASK);

    •         // Aggiornamento del trailing stop
    •         double newTrailingStop = askPrice + (atrValue * trailingStopMultiplier * Point);
    •         double currentStopLoss = PositionGetDouble(POSITION_SL);

    •         // Se il nuovo trailing stop è maggiore di quello attuale, aggiorniamo
    •         if (newTrailingStop > currentStopLoss)
    •         {
    •             // Creazione della richiesta di modifica
    •             MqlTradeRequest modifyRequest = {};
    •             MqlTradeResult modifyResult = {};

    •             modifyRequest.action = TRADE_ACTION_MODIFY;
    •             modifyRequest.symbol = Symbol();
    •             modifyRequest.volume = lot;
    •             modifyRequest.type = ORDER_TYPE_BUY;  // Tipo di ordine
    •             modifyRequest.price = askPrice;
    •             modifyRequest.sl = newTrailingStop;
    •             modifyRequest.tp = PositionGetDouble(POSITION_TP);  // Prendi il valore attuale del TakeProfit
    •             modifyRequest.deviation = 3;  // Slippage
    •             modifyRequest.magic = magicNumber;
    •             modifyRequest.comment = "ModifyOrder";

    •             // Modifica dell'ordine
    •             if (OrderSend(modifyRequest, modifyResult))
    •             {
    •                 Print("Trailing Stop aggiornato con successo.");
    •             }
    •             else
    •             {
    •                 Print("Errore nell'aggiornare il trailing stop: ", GetLastError());
    •             }
    •         }
    •     }
    • }

    • // Funzione per ottenere il numero di perdite consecutive
    • int GetConsecutiveLosses()
    • {
    •     return consecutiveLosses;
    • }
 
Con il codice sotto vai a creare gli handle (gestori) degli indicatori che dovrebbero essere di tipo int e non double. Per ottenere poi i valori degli indicatori devi utilizzare la funzione CopyBuffer https://www.mql5.com/it/docs/series/copybuffer. Consulta la documentazione per capirne l'uso.
// Calcolo degli indicatori (ATR, ADX, RSI)
    atrValue = iATR(Symbol(), PERIOD_CURRENT, atrPeriod);   // Usa il timeframe corrente
    adxValue = iADX(Symbol(), PERIOD_CURRENT, adxPeriod);   // Usa il timeframe corrente
    double rsiValue = iRSI(Symbol(), PERIOD_CURRENT, rsiPeriod, 0);   // Usa il timeframe corrente
Documentazione su MQL5: Accesso alle Timeseries ed Indicatori / CopyBuffer
Documentazione su MQL5: Accesso alle Timeseries ed Indicatori / CopyBuffer
  • www.mql5.com
Ottiene dati di un buffer specificato di un certo indicatore nella quantità necessaria. Il conteggio degli elementi di dati copiati (buffer...