Analyse des résultats des tests et optimisation dans le testeur de stratégie MetaTrader 5 - page 8

 
Quelqu'un peut-il m'aider à élaborer une stratégie ?

J'ai fait tout ce qu'il fallait mais je n'arrive toujours pas à résoudre l'erreur,
Erreur : 'advanctradingapproch.mq5'
advanctradingapproch.mq5 (ligne) 1 (colonne) 1
pas de graphe indicateur défini pour l'indicateur 0 0
';' - parenthèse ouverte attendue advanctradingapproch.mq5 119 61
';' - parenthèse ouverte attendue advanctradingapproch.mq5 125 63

voici le code:

//+------------------------------------------------------------------+
//|                                        advancetradingapproch.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window

input int BuyArrow = 233;
input int SellArrow = 234;

#define  CHART_ARROW_FIRST  0
#define  CHART_ARROW_LAST   1
#define  MODE_MAIN 0
#define  MODE_SIGNAL 1

int BuySignalBar = 0;
int SellSignalBar = 0;
double lastDayClose;
double adxValue, rsiValue, macdMain, macdSignal, stochasticMain, stochasticSignal;
datetime Time[];

double emaBuffer[];
double adxBuffer[];
double rsiBuffer[];
double macdBuffer[];
double stochasticBuffer[];

int OnInit()
{
    emaBuffer[0] = iMA(_Symbol, PERIOD_D1, 8, 0, MODE_EMA, PRICE_CLOSE);
    emaBuffer[1] = iMA(_Symbol, PERIOD_D1, 16, 0, MODE_EMA, PRICE_CLOSE);

    adxBuffer[0] = iADX(_Symbol, PERIOD_D1, 14);
    rsiBuffer[0] = iRSI(_Symbol, PERIOD_D1, 14, PRICE_CLOSE);
    macdBuffer[0] = iMACD(_Symbol, PERIOD_D1, 12, 26, 9, PRICE_CLOSE);
    macdBuffer[1] = iMACD(_Symbol, PERIOD_D1, 12, 26, 9, PRICE_CLOSE);
    stochasticBuffer[0] = iStochastic(_Symbol, PERIOD_D1, 5, 3, 3, MODE_SMA, STO_LOWHIGH);
    stochasticBuffer[1] = iStochastic(_Symbol, PERIOD_D1, 5, 3, 3, MODE_SMA, STO_LOWHIGH);
    
    
    ChartSetInteger(0, CHART_ARROW_FIRST, BuyArrow);
    ChartSetInteger(0, CHART_ARROW_LAST, SellArrow);
    
    ArraySetAsSeries(emaBuffer, true);
    ArraySetAsSeries(adxBuffer, true);
    ArraySetAsSeries(rsiBuffer, true);
    ArraySetAsSeries(macdBuffer, true);
    ArraySetAsSeries(stochasticBuffer, true);

    IndicatorSetInteger(INDICATOR_DIGITS, _Digits);
    SetIndexBuffer(0, emaBuffer);
    SetIndexBuffer(1, adxBuffer);
    SetIndexBuffer(2, rsiBuffer);
    SetIndexBuffer(3, macdBuffer);
    SetIndexBuffer(4, stochasticBuffer);

     return(INIT_SUCCEEDED);
}

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[])
{
    double emaDiff = emaBuffer[0] - emaBuffer[1];
    bool isUptrend = emaDiff > 0;
    bool isDowntrend = emaDiff < 0;

    bool emaCrossoverBuy = (emaBuffer[0] > emaBuffer[1]) && (low[0] < emaBuffer[0]);
    bool emaCrossoverSell = (emaBuffer[0] < emaBuffer[1]) && (high[0] > emaBuffer[0]);

    double currentPrice = close[0];

    bool isHighAdx = adxBuffer[0] > 25;
    bool isOversoldRsi = rsiBuffer[0] < 30;
    bool isBullishMacd = macdBuffer[0] > macdBuffer[1];
    bool isBullishStochastic = (stochasticBuffer[0] > stochasticBuffer[1]) && (stochasticBuffer[0] < 80);

    
    if (isUptrend && emaCrossoverBuy) {
        // Generate Buy signal
    } else if (isDowntrend && emaCrossoverSell) {
        // Generate Sell signal
    }

    return(rates_total);
}

void OnTimer()
{
    // Implement timer-related functionality if needed
}

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
    datetime chartTime[];
    double high[], low[];
    datetime time[];

    if(id == CHARTEVENT_OBJECT_CREATE) {
        if(ObjectFind(0, "BuySignalArrow") != -1)
            ObjectDelete(0, "BuySignalArrow");
        if(ObjectFind(0, "SellSignalArrow") != -1)
            ObjectDelete(0, "SellSignalArrow");

        if(BuySignalBar != -1 && BuySignalBar < ArraySize(high) && BuySignalBar < ArraySize(low)) {
           double buyPrice = high[BuySignalBar] + 10 * Point;
            ObjectCreate(0, "BuySignalArrow", OBJ_ARROW, 0, Time[BuySignalBar], buyPrice);
            ObjectSetInteger(0, "BuySignalArrow", OBJPROP_ARROWCODE, BuyArrow);
        }

        if(SellSignalBar != -1 && SellSignalBar < ArraySize(high) && SellSignalBar < ArraySize(low)) {
            double sellPrice = low[SellSignalBar] - 10 * Point;
            ObjectCreate(0, "SellSignalArrow", OBJ_ARROW, 0, Time[SellSignalBar], sellPrice);
            ObjectSetInteger(0, "SellSignalArrow", OBJPROP_ARROWCODE, SellArrow);
        }
    }
}


 
@Ezio Evan # Est-ce que quelqu'un peut m'aider à construire une stratégie ? car j'ai fait tout ce qu'il fallait mais je n'arrive toujours pas à résoudre l'erreur,
Erreur : 'advanctradingapproch.mq5'
advanctradingapproch.mq5 (ligne) 1 (colonne) 1
pas de graphe indicateur défini pour l'indicateur 0 0
';' - parenthèse ouverte attendue advanctradingapproch.mq5 119 61
';' - parenthèse ouverte attendue advanctradingapproch.mq5 125 63

voici le code:

S'il vous plaît, ne demandez pas d'aide pour le code généré par ChatGPT (ou d'autres I.A.) . Il génère un code horrible, mélangeant MQL4 et MQL5. Veuillez utiliser la section Freelance pour de telles demandes.

  • En général, les personnes qui ne savent pas coder ne reçoivent pas d'aide gratuite sur ce forum.
  • Si vous montrez vos tentatives et décrivez clairement votre problème, vous recevrez très probablement une réponse de la part de la communauté. Utilisez le bouton CODE (Alt-S) lorsque vous insérez du code.
  • Pour apprendre la programmation MQL, vous pouvez consulter les nombreux articles disponibles sur le sujet, ou les exemples dans la base de code, ainsi que la documentation en ligne.
  • Si vous ne souhaitez pas apprendre à coder, ce n'est pas un problème. Vous pouvez soit consulter la base de code si quelque chose de gratuit existe déjà, soit consulter le marché pour des produits payants (parfois gratuits également). Cependant, les recommandations ou suggestions pour les produits du marché ne sont pas autorisées sur le forum, vous devrez donc faire vos propres recherches.
  • Enfin, vous avez également la possibilité d'engager un programmeur dans la section Freelance.
Trading applications for MetaTrader 5 to order
Trading applications for MetaTrader 5 to order
  • 2023.11.30
  • www.mql5.com
The largest freelance service with MQL5 application developers
 

Bonjour à tous,

Je cherche à comprendre quels sont les composants idéaux d'un ordinateur qui aideront les grandes optimisations de stratégie (100 000 combinaisons ou plus sur plusieurs années de données M1) à se terminer plus rapidement. Je vous demande cela afin de pouvoir prendre vos recommandations et créer une instance AWS EC2 (ordinateur virtuel personnalisé) avec les spécifications souhaitées (x nombre de vCPUs, x quantité de mémoire, etc) pour aider à rationaliser l'obtention des résultats de l'optimisation plus rapidement.

Je partagerai les résultats de mes coûts EC2 et le temps de réalisation par la suite si cela peut aider la communauté.

Merci d'avance pour vos réponses réfléchies.

 

J'AI BESOIN D'AIDE POUR RÉSOUDRE CE PROBLÈME DANS MON EA MT5



J'essaie de créer un EA qui utilise 2 bandes de Bollinger (une avec 1 std et une autre avec 1,5 std).

et j'entre en position avec une clôture en dessous de la bb(1 std) et un prix de marché avec un sl à la plus grande bb et un tp à la ligne médiane, je veux modifier automatiquement l'ordre de sorte qu'il déplace le sl et le tp à la dernière valeur de la bande de bollinger et de la ligne médiane, c'est-à-dire que la bougie actuelle a un indice de 0 et la bougie précédente a un indice de 1, donc la bb vaut à l'indice 1 . je veux que cela se produise jusqu'à ce que l'un ou l'autre sl/tp soit atteint. quelqu'un peut-il me guider dans la bonne direction ???? Je sais que je peux obtenir le ticket de position et l'utiliser pour modifier le sl/tp mais j'ai du mal à extraire les 2 valeurs du bb, le tp/sl initial et le sl/tp modifié à chaque bougie. Je peux obtenir les valeurs de la fonction ibands et utiliser la fonction copy buffer pour extraire les valeurs, mais je n'y parviens que pour le sl/tp initial, comment puis-je extraire les valeurs pour le sl/tp roulant, s'il vous plaît aidez-moi, merci pour votre aide, j'apprécie.

Raison: