Problème de compilation EA - TradeAssistant

 

Bonjour a tous,

J'essaie de créer un assistant pour le prise de positions sur Metatrader5 mais je ne parviens pas a compiler en mlq5.


J'ai les erreus de compilations suivante qui se répètes partout, que j'utilise ObjectSetDouble ou ObjectSetInteger impossible de compiler.

-undeclared identifier

-cannot convert enum

-wrong parameters count

-could be one of 2 function

-   built-in: bool ObjectSetInteger(long,const string,ENUM_OBJECT_PROPERTY_INTEGER,long)

-    built-in: bool ObjectSetInteger(long,const string,ENUM_OBJECT_PROPERTY_INTEGER,int,long)


J'ai aussi un probleme ici : if(!PositionSelectByIndex(i)) continue;

- undeclared identifier

- 'i' - some operator expected

(J'ai essayé avec (idx) = même probleme)


Le but est de créer un Trade assistant simple et fonctionnel qui s'adapte dans le temps durant toute la durée du trade.

- s'active a l'ouverture d'un ordre (directe ou programmé) avec sl et tp par defaut (réglable en live)

-rectangle ajustable (style tradingview) qui s'adapte => défilement vers la droite le temps du Trade (ici j'ai mis un an, je ne sais pas si c'est possible de faire  autrement ?)

j'aimerais idéalement qu'il respecte les couleur vert vers le zone de tp et rouge vers la zone de sl = s'adapte en fonction du sens Long/Short.

  -Annule l'offre au tp si l'ordre n'a pas été déclenché (prévoir éventuel coupure de courant, data ou autre) 


Voici mon script :

Edité par modo
utilisé le bouton  ou ALT + S pour insérer votre code ou mettez le en PJ

//+------------------------------------------------------------------+
//|               TradeAssistant.mq5                       |
//+------------------------------------------------------------------+
#property strict
#include <Trade/Trade.mqh>
#include <ChartObjects/ChartObjectsShapes.mqh>
#include <ChartObjects/ChartObjectsTxtControls.mqh>
#include <ChartObjects\ChartObject.mqh>
#include <ChartObjects\ChartObjectsLines.mqh>
#include <Trade\PositionInfo.mqh>

CTrade trade;

// Couleurs rectangles
input color ColorSLRed   = clrRed;
input color ColorTPGreen = clrGreen;

// Taille du lot par défaut
input double LotSize = 0.10;

// Points par défaut SL/TP si création depuis chart
input int DefaultSL_Points = 500;
input int DefaultTP_Points = 2000;

// ---------------------------------------------------------------
// Vérifie si l'ordre est un Buy
bool IsBuyType(const int type)
{
    return (type == ORDER_TYPE_BUY || type == ORDER_TYPE_BUY_LIMIT || type == ORDER_TYPE_BUY_STOP);
}

// ---------------------------------------------------------------
// Annulation des pending si TP touché avant activation
void CheckCancelIfTPHit(ulong ticket, int type, double tp)
{
    if(tp==0) return;

    double bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
    double ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);

    bool isBuy = IsBuyType(type);

    if(isBuy && bid >= tp)
    {
        Print("TP touché avant activation → suppression BUY pending #", ticket);
        trade.OrderDelete(ticket);
    }
    else if(!isBuy && ask <= tp)
    {
        Print("TP touché avant activation → suppression SELL pending #", ticket);
        trade.OrderDelete(ticket);
    }
}

// ---------------------------------------------------------------
// Mise à jour des rectangles SL/TP pour un trade
void UpdateTradeRectangle(ulong ticket, double entry, double sl, double tp, int type)
{
    string obj_name = "TradeRect_" + (string)ticket;

    datetime t_now = TimeCurrent();
    datetime t_far = t_now + 3600*24*365; // reste visible tant que trade ouvert

    // Ajuste les valeurs pour Buy/Sell
    double low_price, high_price;
    if(IsBuyType(type))
    {
        low_price  = sl; // rouge bas
        high_price = tp; // vert haut
    }
    else
    {
        low_price  = tp; // vert bas
        high_price = sl; // rouge haut
    }

    if(ObjectFind(0,obj_name) < 0)
    {
        ObjectCreate(0,obj_name,OBJ_RECTANGLE,0,t_now,low_price,t_far,high_price);
        ObjectSetInteger(0,obj_name,OBJPROP_COLOR,ColorTPGreen);  // couleur principale (TP)
        ObjectSetInteger(0,obj_name,OBJPROP_BGCOLOR,ColorTPGreen);
        ObjectSetInteger(0,obj_name,OBJPROP_TRANSPARENCY,60);
    }
    else
    {
        ObjectSetDouble(0,obj_name,OBJPROP_PRICE1,low_price);
        ObjectSetDouble(0,obj_name,OBJPROP_PRICE2,high_price);
        ObjectSetInteger(0,obj_name,OBJPROP_TIME1,(long)t_now);
        ObjectSetInteger(0,obj_name,OBJPROP_TIME2,(long)t_far);
    }
}

// ---------------------------------------------------------------
// Modification SL/TP draggable
void ApplyDraggedSLTP(ulong ticket)
{
    string obj_name = "TradeRect_" + (string)ticket;
    double low_new = 0.0, high_new = 0.0;

    if(ObjectGetDouble(0,obj_name,OBJPROP_PRICE1,low_new) &&
       ObjectGetDouble(0,obj_name,OBJPROP_PRICE2,high_new))
    {
        if(PositionSelectByTicket(ticket))
        {
            double sl_current, tp_current;
            if(IsBuyType((int)PositionGetInteger(POSITION_TYPE)))
            {
                sl_current = low_new;
                tp_current = high_new;
            }
            else
            {
                sl_current = high_new;
                tp_current = low_new;
            }
            trade.PositionModify(ticket, sl_current, tp_current);
        }
    }
}

// ---------------------------------------------------------------
// ONTICK : main logic
void OnTick()
{
    int total = PositionsTotal();

    for(int i=0; i<total; i++)
    {
        if(!PositionSelectByIndex(i)) continue;

        string symbol = PositionGetString(POSITION_SYMBOL);
        if(symbol != _Symbol) continue;

        ulong ticket = PositionGetInteger(POSITION_TICKET);
        double entry = PositionGetDouble(POSITION_PRICE_OPEN);
        double sl    = PositionGetDouble(POSITION_SL);
        double tp    = PositionGetDouble(POSITION_TP);
        int type     = (int)PositionGetInteger(POSITION_TYPE);

        // Annule pending si TP touché avant activation
        if(type == ORDER_TYPE_BUY_LIMIT || type == ORDER_TYPE_BUY_STOP ||
           type == ORDER_TYPE_SELL_LIMIT || type == ORDER_TYPE_SELL_STOP)
        {
            CheckCancelIfTPHit(ticket, type, tp);
        }

        // Mise à jour rectangle SL/TP
        UpdateTradeRectangle(ticket, entry, sl, tp, type);

        // SL/TP draggable
        ApplyDraggedSLTP(ticket);
    }
}

// ---------------------------------------------------------------
// ONDEINIT : nettoyage
void OnDeinit(const int reason)
{
    ObjectsDeleteAll(0);
 

C'est le problème quand on utilise une IA pour générer du code, il utilise des fonctions inexistantes, il mélange MQL4 et MQL5. Il faut savoir programmer pour comprendre et corriger les erreurs.

Surtout pour MQL5 qui est un langage de niche avec peu de données pour entraîner un modèle LLM.

Vous pouvez soit apprendre à programmer un minimum pour comprendre les problèmes, soit faire appel à un vrai programmeur humain.

 



Merci, Problème résolu.
 
Nicolas Bouche #:

Merci, Problème résolu.
Comment ?
 
JustAnMQLGuy #:
Comment ?
Lecture, documentation, recherche, nuit blanche et acharnement...En d'autre terme plus poétique, Apprendre :) Il y a beaucoup de documentation sur le code mql5 qui sont indispensable pour mener à bien un projet. Comme le dit Alain, l'IA travail avec les informations que tu lui donne et qui ne sont pas toujours correcte. De plus pour arriver à un rendu propre qui peu être mis a jour dans le temps il faut respecter une logique d'écriture pour éviter les bug fantôme qui arrive trois mois plus tard "sans raison". Personnellement j'ai commencé ce projet pour moi, pour avoir quelque chose de fiable et que je puisse modifier en fonction de mes besoins. Je me suis fait quelque cheveux blanc et ai probablement perdu quelque années de vie mais je suis aujourd'hui extrêmement satisfait du résultat et je continue quotidiennement à utiliser mon outil de travail et a le mettre a jour en fonction des mes besoins. J'ai décidé de partager mon projet sur le market car pour moi il fait la différence et si j'avais pu avoir un outil comme celui la quand j'ai commencé j'aurais probablement économisé beaucoup de temps et d'argent.