Rejoindre la communauté
banner_forum
Devenez membre de la plus grande
communauté francophone sur le Forex
Partagez, échangez et apprenez en gagnant des crédits sur votre compte de trading

Cherche conseils pour programmer un EA

  • Jonathan75

    Bonjour à toutes et à tous,

    Je me présente, je suis un Trader Novice ayant réalisé une formation de programmation en MQL4. Malheureusement, ma formation se limite aux bases ce qui est embêtant pour une réelle envie de programmation.

    Pouvez-vous m'aider dans l'écriture de mon code ci-dessous svp ?

    // ---------------- Ordre Buy
    // si la bougie 1 est inférieur ou égale à la bougie 0
    // si aucun ordre n'est en cours
    // si le RSI [1] est inférieur ou égale à RSI [0] et le RSI [0] est supérieur ou égal à 35
    // si la bougie 0 (Close) est supérieur ou égale à la Moyenne Mobile 15

    extern int TakeProfit = 500 ; (50 points sur le DAX30)
    extern int StopLoss = 300 ;
    extern double LotSize = 1.00 ;
    extern int period_RSI = 14 ;
    extern int slipage = 3 ;

    void OnTick()
    {
    //----------------- Ordre Buy

    double RMA15B0 = iMA("DAX30",0,15,0,MODE_SMA,PRICE_CLOSE,0);
    double RSI0 = iRSI ("DAX30",0,period_RSI,PRICE_CLOSE,0);
    double RSI1 = iRSI ("DAX30",0,period_RSI,PRICE_CLOSE,1);
    double SL = 0 ;
    double TP = 0 ;

    if (Close [0] >= RMA15B0 )
    {
    if (OrdersTotal () == 0 && Open [1] <= Open [0]);
    if (RSI1 <= RSI0 && RSI0 >= 35 ) ;
    if (TakeProfit != 0) TP = NormalizeDouble (Ask+TakeProfit*Point,Digits);
    if (StopLoss != 0 ) SL = NormalizeDouble (Ask-StopLoss*Point,Digits);

    OrderSend ("DAX30",OP_BUY,LotSize,Ask,slipage,SL,TP,"BUY",0,0,Green) ;
    }


    // --------------- Ordre Close Buy
    // si le TP/SL est atteint
    // si la bougie 0 (Close) est inférieur à la bougie 2 (Close)
    // si le RSI de la bougie 0 est inférieur ou égale à 50

    int order_id = OrderTicket () ;
    if (OrdersTotal () >= 1)
    {
    if (Close [0] <= Close [2] || RSI0 <= 50);
    OrderClose (order_id,LotSize,Ask,slipage,Red);
    return (0);
    }

    // ------------------- Ordre Sell
    // si la bougie 1 est supérieure ou égale à la bougie 0
    // si aucun ordre n'est en cours
    // si le RSI [1] est supérieur ou égal au RSI [0] et que le RSI [0] <= 55
    // si la bougie 0 (Close) est inférieure ou égale à la MM15

    if (Close [0] <= RMA15B0)
    {
    if (OrdersTotal () == 0 && Open [1] >= Open [0]);
    if (RSI1 >= RSI0 && RSI0 <= 55);
    }
    OrderSend ("DAX30",OP_SELL,LotSize,Bid,slipage,SL,TP,"SELL",0,0,Red);

    // ------------------ Ordre Close Sell
    // si le TP/SL est atteint
    // si la bougie 0 est supérieure à la bougie 3 (Close)
    // si le RSI [0] est supérieur ou égale à 50

    if (OrdersTotal () >= 1)
    {
    if (Close [0] >= Close [3]|| RSI0 >= 50);

    OrderClose (order_id,LotSize,Bid,slipage,Red);
    return (0);

    }
    }


    Pour faciliter la compréhension, cet EA est destiné au DAX30, j'ai également décrit ma logique avec les // . Mais je rencontre un problème quant aux TP et SL ( Error Code : 130 - sur OrderSend
    et Error Code 4051 - sur OrderClose ).

    Ps : je n'ai pas notifié de MagicNumber car l'objectif est d'avoir un compte de trading uniquement réservé à un EA.
    J'en demande beaucoup, mais toutes aides ou conseils seront appréciés.
    En espérant avoir posté mon topic dans la bonne rubrique.

    Merci d'avance.
  • stani

    Salut

    Error Code : 130 - sur OrderSend
    Tu as une distance mini pour poser ton stop. Elle varie selon les brokers, elle peut même être a zéro chez certains. Tu la trouves dans "spécifications, niveau de stop". Tu l'obtient avec MarketInfo, MODE_STOPLEVEL. A employer systématiquement.

    Error Code 4051 - sur OrderClose
    Pour obtenir le ticket de ton ordre il faut d'abord le sélectionner avec...OrderSelect().

    Bon courage
  • Jonathan75

    Merci Stani pour ton aide :)

    Je vais essayer d'intégrer les modifications.
  • Jonathan75

    Petite update de mon code et malheureusement update de mes problèmes. J’ai essayé d’intégrer les modifications mais sans succès.

    // ---------------- Ordre Buy
    // si la bougie 1 est inférieur ou égale à la bougie 0
    // si aucun ordre n'est en cours
    // si le RSI [1] est inférieur ou égale à RSI [0] et le RSI [0] est supérieur ou égal à 35
    // si la bougie 0 (Close) est supérieur ou égale à la Moyenne Mobile 15

    extern int TakeProfit = 630 ;
    extern int StopLoss = 630 ;
    extern double LotSize = 1.00 ;
    extern int period_RSI = 14 ;
    extern int slipage = 3 ;

    void OnTick()
    {
    //----------------- Ordre Buy
    double RMA15B0 = iMA("DAX30",0,15,0,MODE_SMA,PRICE_CLOSE,0);
    double RSI0 = iRSI ("DAX30",0,period_RSI,PRICE_CLOSE,0);
    double RSI1 = iRSI ("DAX30",0,period_RSI,PRICE_CLOSE,1);
    double SL = 0 ;
    double TP = 0 ;
    int ticket ;

    if (Close [0] >= RMA15B0 )
    {
    if (OrdersTotal () == 0 && Open [1] <= Open [0]);
    if (RSI1 <= RSI0 && RSI0 >= 35 ) ;
    if (TakeProfit != 0) TP = NormalizeDouble (Ask+TakeProfit*Point,Digits);
    if (StopLoss != 0 ) SL = NormalizeDouble (Ask-StopLoss*Point,Digits);

    ticket=OrderSend ("DAX30",OP_BUY,LotSize,Ask,slipage,SL,TP,"BUY",0,0,Green) ;
    }
    // --------------- Ordre Close Buy
    // si le TP/SL est atteint
    // si la bougie 0 (Close) est inférieur à la bougie 2 (Close)
    // si le RSI de la bougie 0 est inférieur ou égale à 50

    if (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES));
    {
    if (OrdersTotal () >= 1)
    if (Close [0] <= Close [2]|| RSI0 <= 50);

    OrderClose (ticket,LotSize,Ask,slipage,Red);
    return (0);
    }

    // ------------------- Ordre Sell
    // si la bougie 1 est supérieure ou égale à la bougie 0
    // si aucun ordre n'est en cours
    // si le RSI [1] est supérieur ou égal au RSI [0] et que le RSI [0] <= 55
    // si la bougie 0 (Close) est inférieure ou égale à la MM15

    if (Close [0] <= RMA15B0)
    {
    if (OrdersTotal () == 0 && Open [1] >= Open [0]);
    if (RSI1 >= RSI0 && RSI0 <= 55);
    }
    ticket=OrderSend ("DAX30",OP_SELL,LotSize,Bid,slipage,SL,TP,"SELL",0,0,Red);


    // ------------------ Ordre Close Sell
    // si le TP/SL est atteint
    // si la bougie 0 est supérieure à la bougie 3 (Close)
    // si le RSI [0] est supérieur ou égale à 50

    if (OrderSelect(ticket,SELECT_BY_TICKET)==true);
    {
    if (OrdersTotal () >= 1)
    if (Close [0] >= Close [3]|| RSI0 >= 50);

    OrderClose (ticket,LotSize,Bid,slipage,Red);
    return (0);
    }

    }


    Je rencontre les mêmes codes erreurs ainsi qu'une non reconnaissance du "ticket" dans la fonction OrderClose ...
    Le Market Info m'a indiqué un SL min à 500 points (+ un spread à 130) d'ou ma modification à 630.
    Cependant, l'erreur est toujours là ... peut-elle venir de l'initialisation de mon SL (prix non reconnu par la formule ) :

    if (StopLoss != 0 ) SL = NormalizeDouble (Ask-StopLoss*Point,Digits) ;

    Merci d'avance pour votre aide et votre patiente.
  • stani

    for(int i=OrdersTotal() -1; i>=0; i--)//Parcours tous les ordres dans une boucle pour trouver le tien.
    {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
    {
    //erreur a gerer ici
    }
    if(OrderMagicNumber()==Magic)//tu peux trier par magic, symbol,type...
    {
    OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),... // Ensuite quand
    //tu pointe dessus le tien, utilise les données contenues dans le pool. Se
    // sont les seules qui sont fiables, celle que tu mets dans des variables
    // peuvent être perdues au moindre incident.
  • Jonathan75

    En intégrant tes modifications, je n'ai plus de codes erreurs ... mais aucun ordre ne se lance.
    Mon code ressemble désormais à ça :

    // ---------------- Ordre Buy
    // si la bougie 1 est inférieur ou égale à la bougie 0
    // si aucun ordre n'est en cours
    // si le RSI [1] est inférieur ou égale à RSI [0] et le RSI [0] est supérieur ou égal à 35
    // si la bougie 0 (Close) est supérieur ou égale à la MM15

    extern int TakeProfit = 630 ;
    extern int StopLoss = 650 ;
    extern double LotSize = 1.00 ;
    extern int period_RSI = 14 ;
    extern int slipage = 3 ;
    extern int Magic = 1234 ;

    void OnTick()
    {
    //----------------- Ordre Buy

    double RMA15B0 = iMA("DAX30",0,15,0,MODE_SMA,PRICE_CLOSE,0);
    double RSI0 = iRSI ("DAX30",0,period_RSI,PRICE_CLOSE,0);
    double RSI1 = iRSI ("DAX30",0,period_RSI,PRICE_CLOSE,1);
    double SL = 0 ;
    double TP = 0 ;

    for (int i= OrdersTotal()-1;i>=0;i--)
    if (OrderSelect (i , SELECT_BY_POS , MODE_TRADES)==false);
    if (Magic == OrderMagicNumber ());
    return ;

    if (Close [0] >= RMA15B0 )
    {
    if (OrdersTotal () == 0 && Open [1] <= Open [0]);
    if (RSI1 <= RSI0 && RSI0 >= 35 ) ;
    if (TakeProfit != 0) TP = NormalizeDouble (Ask+TakeProfit*Point,Digits);
    if (StopLoss != 0 ) SL = NormalizeDouble (Ask-StopLoss*Point,Digits);

    OrderSend ("DAX30",OP_BUY,LotSize,Ask,slipage,SL,TP,"BUY",0,0,Green) ;

    }

    // --------------- Ordre Close Buy
    // si le TP/SL est atteint
    // si la bougie 0 (Close) est inférieur à la bougie 2 (Close)
    // si le RSI de la bougie 0 est inférieur ou égale à 50

    if (OrderSelect(OrderTicket(),SELECT_BY_TICKET,MODE_TRADES));
    {
    if (OrdersTotal () >= 1)
    if (Close [0] <= Close [3]|| RSI0 <= 50);

    OrderClose (OrderTicket(),LotSize,Ask,slipage,Red);
    return (0);
    }

    // ------------------- Ordre Sell
    // si la bougie 1 est supérieure ou égale à la bougie 0
    // si aucun ordre n'est en cours
    // si le RSI [1] est supérieur ou égal au RSI [0] et que le RSI [0] <= 55
    // si la bougie 0 (Close) est inférieure ou égale à la MM15

    for (i;i>=0;i--)
    if (OrderSelect (i , SELECT_BY_POS , MODE_TRADES)==false);
    if (Magic == OrderMagicNumber ());
    return ;

    if (Close [0] <= RMA15B0)

    {
    if (OrdersTotal () == 0 && Open [1] >= Open [0]);
    if (RSI1 >= RSI0 && RSI0 <= 55);

    }
    OrderSend ("DAX30",OP_SELL,LotSize,Bid,slipage,SL,TP,"SELL",0,0,Red);


    // ------------------ Ordre Close Sell
    // si le TP/SL est atteint
    // si la bougie 0 est supérieure à la bougie 3 (Close)
    // si le RSI [0] est supérieur ou égale à 50

    if (OrderSelect(OrderTicket(),SELECT_BY_TICKET)==true);
    {
    if (OrdersTotal () >= 1)
    if (Close [0] >= Close [3]|| RSI0 >= 50);

    OrderClose (OrderTicket(),LotSize,Bid,slipage,Red);
    return (0);
    }

    }


    Je pense avoir mal assimilé les modifs que Stani m'a apporté.
    Savez-vous d'ou peux venir mes erreurs ?

    Merci d'avance.
  • AliX

    ( vous pouvez utiliser les balises code si vous le souhaitez [code] [/code ] )
  • Jonathan75

    A nouveau bonjour,

    Tout d'abord merci aux personnes qui me répondent.
    Alix par contre, je n'ai pas compris l'histoire des balises ...

    Petit changement de stratégie pour ma part, je vais faire mon code par plus petit bloc :


    Code
    extern int TakeProfit = 630 ; extern int StopLoss = 650 ; extern double LotSize = 1.00 ; extern int period_RSI = 14 ; extern int slipage = 3 ; extern int Magic = 1234 ; int start () { double RMA15B0 = iMA("DAX30",0,15,0,MODE_SMA,PRICE_CLOSE,0); double RSI0 = iRSI ("DAX30",0,period_RSI,PRICE_CLOSE,0); double RSI1 = iRSI ("DAX30",0,period_RSI,PRICE_CLOSE,1); double SL = 0 ; double TP = 0 ; int NumPos ; // Nb de position // ---------------- Ordre Buy // si la bougie 1 est inférieur ou égale à la bougie 0 // si aucun ordre n'est en cours // si le RSI [1] est inférieur ou égale à RSI [0] et le RSI [0] est supérieur ou égal à 35 // si la bougie 0 (Close) est supérieur ou égale à la MM15 for (int i=0 ; i < OrdersTotal () ; i++) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) { break ; } NumPos++ ; } if (!NumPos && Close [0] >= RMA15B0) { if (Open [1] <= Open [0]); if (RSI1 <= RSI0 && RSI0 >= 35 ) ; if (TakeProfit != 0) TP = NormalizeDouble (Ask+TakeProfit*Point,Digits); if (StopLoss != 0 ) SL = NormalizeDouble (Ask-StopLoss*Point,Digits); } OrderSend ("DAX30",OP_BUY,LotSize,Ask,slipage,SL,TP,"BUY",Magic,0,Green) ; // ---------------------- Ordre Sell // si la bougie 1 est supérieure ou égale à la bougie 0 // si aucun ordre n'est en cours // si le RSI [1] est supérieur ou égal au RSI [0] et que le RSI [0] <= 55 // si la bougie 0 (Close) est inférieure ou égale à la MM15 if (!NumPos && Close [0] <= RMA15B0) { if (Open [1] >= Open [0]); if (RSI1 >= RSI0 && RSI0 <= 55); } OrderSend ("DAX30",OP_SELL,LotSize,Bid,slipage,SL,TP,"SELL",Magic,0,Red); return (0) ; }


    A ce niveau là, je n'ai pas de message bloquant mais aucun ordre n'est passé...
    J'ai déplacé mon script dans la partie int start () car de ce que j'ai compris, cette partie est actualisée à chaque mouvement - donc mise à jours plus fréquemment.

    Je ne comprends pas pourquoi aucun ordre n'est passé.
    Pouvez-vous encore m'aidez svp ?

    Merci d'avance.
    Modifié le 2019-04-12 17:54:26 par AliX
  • AliX — en réponse à Jonathan75 dans son message #113967

    Si je le fais tu ne le verra pas, tu met [code] puis tu colle ton code [/code sans l'espace]

    Modifié le 2019-04-16 18:32:26 par AliX
  • Jonathan75

    Ah ok, ça permet de rendre le message plus clair.

    Merci pour l'astuce :)
    Je le ferai la prochaine fois si une personne me permet d'avancer dans mon code ;)
  • Jonathan75

    Rebonjour à toutes et à tous,

    Après d'innombrables tentatives de codage, je reviens dans l'espoir qu'une personne puisse m'aider.
    Mise à part des messages d'avertissement, je n'ai aucun message bloquant ni aucun code erreur durant le backtest et pourtant ... aucun trade ne se lance automatiquement.

    Voici mon code lancement d'une opération d'achat :

    [code]
    int start ()

    {

    double RMA15B0 = iMA("DAX30",0,15,0,MODE_SMA,PRICE_CLOSE,0);
    double RSI0 = iRSI ("DAX30",0,period_RSI,PRICE_CLOSE,0);
    double RSI1 = iRSI ("DAX30",0,period_RSI,PRICE_CLOSE,1);
    double SL = NormalizeDouble (Ask-StopLoss*Point,Digits) ;
    double TP = NormalizeDouble (Ask+TakeProfit*Point,Digits) ;
    int NumPos ; // Nb de position

    // ---------------- Ordre Buy
    // si la bougie 1 est inférieur ou égale à la bougie 0
    // si aucun ordre n'est en cours
    // si le RSI [1] est inférieur ou égale à RSI [0] et le RSI [0] est supérieur ou égal à 35
    // si la bougie 0 (Close) est supérieur ou égale à la MM15

    for (int i=OrdersTotal ()-1 ; i < OrdersTotal () ; i++)
    {
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
    {
    break ;
    }
    NumPos++ ;

    }

    if (!NumPos && Close [0] >= RMA15B0)
    {
    if ( Open [1] <= Open [0]
    && RSI1 <= RSI0 && RSI0 >= 35
    )

    {
    OrderSend ("DAX30",OP_BUY,LotSize,Ask,slipage,SL,TP,"BUY",Magic,0,Green) ;
    }
    }
    [/codes]

    Merci d'avance pour toute aide.
  • stani

    As tu corrigé les avertissements?
  • Jonathan75

    Bonjour Stani :) ,

    Les messages d'avertissements me parlent moins que les messages bloquants. J'ai du mal à les comprendre et travailler dessus.

    Par exemple, j'ai :
    - possible use of uninitialized variable "Numpos" - sachant que je l'a déclare avant ( int NumPos ; )

    - return value of 'OrderSend' should be checked - ??
    - return value of 'OrderClose' should be checked - même message, je ne le comprends pas ...

    - check operator precedence for possible error ; use parenthese to clarify precedence :
    + ce message semble être lié à la partie suivante :
    && Close [0] <= Close [3] || RSI0 <= 48) // - au niveau des doubles traits

    Merci pour avoir appuyé sur les messages d'avertissements, j'ai quand même réussi à en corriger une dizaine :)
  • stani

    Les message d'avertissements t'indique que ton code fonctionnera mais qu'il risque de ne pas faire ce que tu crois qu'il fera. Ce qui t'arrive.

    En l’occurrence ta variable "Numpos" qui n'est pas initialisée peut contenir n'importe quoi, d'ou tes difficultés.

    Par ailleurs tu la déclare comme int et tu l'utilises comme bool. Même si ce n'est pas bloquant tu devrais choisir.

    Met des parenthèses entre tes conditions, le compilateur comprendra mieux ce que tu veux faire, là, même s'il s'en sort, il a un doute.
  • Jonathan75

    Merci Stani :)

    J'ai modifié la déclaration en bool NumPos ; mais cela ne change pas le message d'erreur.

    Concernant le message " return value of 'OrderSend' should be checked " , je ne vois vraiment pas la correction à faire.

    En tout cas merci beaucoup pour ton aide, même si mon code n'est toujours pas opérationnel, ton aide m'a fais grandement avancé.
  • stani

    bool NumPos=false;
  • Jonathan75

    Pas facile le codage.
    Seuls les messages liés aux OrderClose sont encore présents mais aucun trade ne se lance.

    Pourtant la logique de mon code n'est pas si compliquée... en théorie...

    Dans tous les cas, merci du soutien.

    Je replace mon code en entier dans l'espoir de corriger ce maudit script.
    En espérant que l'erreur (ou les erreurs surement) soit flagrante.

    [code]extern int TakeProfit = 3500 ;
    extern int StopLoss = 1500 ;
    extern double LotSize = 1.00 ;
    extern int period_RSI = 14 ;
    extern int slipage = 500 ;
    extern int Magic = 1234 ;

    int start ()
    {
    double RMA20B0 = iMA("DAX30",0,20,0,MODE_SMA,PRICE_CLOSE,0);
    double RSI0 = iRSI ("DAX30",0,period_RSI,PRICE_CLOSE,0);
    double RSI1 = iRSI ("DAX30",0,period_RSI,PRICE_CLOSE,1);
    double SL = NormalizeDouble (Ask-StopLoss*Point,Digits) ;
    double TP = NormalizeDouble (Ask+TakeProfit*Point,Digits) ;
    bool NumPos=false ; // Nb de position
    int ticket ;

    // ---------------- Ordre Buy
    // si la bougie 1 est inférieur ou égale à la bougie 0
    // si aucun ordre n'est en cours
    // si le RSI [1] est inférieur ou égale à RSI [0] et le RSI [0] est supérieur ou égal à 25
    // si la bougie 0 (Close) est supérieur ou égale à la MM20

    for (int i=OrdersTotal ()-1 ; i < OrdersTotal () ; i++)
    {
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
    {
    break ;
    }
    NumPos++ ;

    }

    if (!NumPos && Close [0] >= RMA20B0)
    {
    if ( Open [1] <= Open [0]
    && RSI1 <= RSI0 && RSI0 >= 25
    )
    {
    ticket = OrderSend ("DAX30",OP_BUY,LotSize,Ask,slipage,SL,TP,"BUY",Magic,0,Green) ;

    }
    }

    // ---------------------- Ordre Sell
    // si la bougie 1 est supérieure ou égale à la bougie 0
    // si aucun ordre n'est en cours
    // si le RSI [1] est supérieur ou égal au RSI [0] et que le RSI [0] <= 70
    // si la bougie 0 (Close) est inférieure ou égale à la MM20

    if (!NumPos && Close [0] <= RMA20B0)
    {
    if (Open [1] >= Open [0]
    && RSI1 >= RSI0 && RSI0 <= 70

    {

    ticket = OrderSend ("DAX30",OP_SELL,LotSize,Bid,slipage,SL,TP,"SELL",Magic,0,Red);

    }
    }
    // --------------- Order Buy Close
    // si le TP/SL est atteint
    // si la bougie 0 (Close) est inférieur à la bougie 2 (Close)
    // si le RSI de la bougie 0 est inférieur ou égale à 50

    for (int i=OrdersTotal();i>=0;i--)
    {
    if (OrderSelect(OrderTicket(),SELECT_BY_TICKET,MODE_TRADES)==true)
    {
    if (OrdersTotal () >= 1
    && OrderType () == OP_BUY
    && (Close [0] <= Close [2]|| RSI0 <= 50))

    {
    OrderClose (OrderTicket(),LotSize,Ask,slipage,Red);
    }
    }


    // ------------------ Ordre Close Sell
    // si le TP/SL est atteint
    // si la bougie 0 est supérieure à la bougie 2 (Close)
    // si le RSI [0] est supérieur ou égale à 50

    if (OrderSelect(OrderTicket(),SELECT_BY_TICKET)==true)
    {
    if (OrdersTotal () >= 1
    && OrderType () == OP_SELL
    && (Close [0] >= Close [2]|| RSI0 >= 50))

    {
    OrderClose (OrderTicket(),LotSize,Bid,slipage,Red);
    }
    }
    }
    return (0) ;
    }


    [/codes ]

    Merci pour tout retour/aide/conseil
  • Jonathan75

    Bonjour à toutes et à tous,

    Je me permets de forcer un peu concernant mon code et demander de l'aide ... à nouveau.
    En fait, je ne comprends absolument pas pourquoi aucun trade ne se lance. J'ai vérifié mes paramétrages et le mode Trading automatique est activé.
    J'ai remplacé mon code pour qu'il soit applicable à tout indice et éviter une erreur causée par la syntaxe - Symbol ()
    Corrigé toutes les erreurs (bloquantes et d'avertissements).
    Malgré tout cela, le backtest reste stoïque - zéro trade.

    En espérant qu'une âme charitable trouve LA solution pour faire fonctionner ce maudit script.

    Merci d'avance.

    extern int TakeProfit = 3500 ;
    extern int StopLoss = 1500 ;
    extern double LotSize = 1.00 ;
    extern int period_RSI = 14 ;
    extern int slipage = 500 ;
    extern int Magic = 1234 ;


    int start ()
    {

    double RMA20B0 = iMA(Symbol(),0,20,0,MODE_SMA,PRICE_CLOSE,0);
    double RSI0 = iRSI (Symbol(),0,period_RSI,PRICE_CLOSE,0);
    double RSI1 = iRSI (Symbol(),0,period_RSI,PRICE_CLOSE,1);
    double SL = NormalizeDouble (Ask-StopLoss*Point,Digits) ;
    double TP = NormalizeDouble (Ask+TakeProfit*Point,Digits) ;
    bool NumPos=false ; // Nb de position
    bool openbuy=false ;
    bool opensell=false ;
    // ---------------- Ordre Buy
    // si la bougie 1 est inférieur ou égale à la bougie 0
    // si aucun ordre n'est en cours
    // si le RSI [1] est inférieur ou égale à RSI [0] et le RSI [0] est supérieur ou égal à 25
    // si la bougie 0 (Close) est supérieur ou égale à la MM20

    for (int i=OrdersTotal ()-1 ; i < OrdersTotal () ; i++)
    {
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
    {
    break ; // quitte la boucle
    }
    NumPos++ ;

    }

    if (!NumPos && Close [0] >= RMA20B0)
    {
    if ( Open [1] <= Open [0]
    && RSI1 <= RSI0 && RSI0 >= 25
    )

    {
    openbuy = OrderSend (Symbol(),OP_BUY,LotSize,Ask,slipage,SL,TP,"BUY",Magic,0,Green) ;

    }
    }

    // ---------------------- Ordre Sell
    // si la bougie 1 est supérieure ou égale à la bougie 0
    // si aucun ordre n'est en cours
    // si le RSI [1] est supérieur ou égal au RSI [0] et que le RSI [0] <= 65
    // si la bougie 0 (Close) est inférieure ou égale à la MM20

    if (!NumPos && Close [0] <= RMA20B0)
    {
    if (Open [1] >= Open [0]
    && RSI1 >= RSI0 && RSI0 <= 65

    {

    opensell = OrderSend (Symbol(),OP_SELL,LotSize,Bid,slipage,SL,TP,"SELL",Magic,0,Red);

    }
    }
    // --------------- Order Buy Close
    // si le TP/SL est atteint
    // si la bougie 0 (Close) est inférieur à la bougie 2 (Close)
    // si le RSI de la bougie 0 est inférieur ou égale à 48

    for (int i=OrdersTotal();i>=0;i--)
    {
    if (OrderSelect(OrderTicket(),SELECT_BY_TICKET,MODE_TRADES)==true)
    {
    if (OrdersTotal () >= 1
    && OrderType () == OP_BUY
    && (Close [0] <= Close [2]|| RSI0 <= 48))

    {
    int OrderBuyClose=OrderClose (OrderTicket(),LotSize,Ask,slipage,Red);
    }
    }


    // ------------------ Ordre Close Sell
    // si le TP/SL est atteint
    // si la bougie 0 est supérieure à la bougie 2 (Close)
    // si le RSI [0] est supérieur ou égale à 50

    if (OrderSelect(OrderTicket(),SELECT_BY_TICKET)==true)
    {
    if (OrdersTotal () >= 1
    && OrderType () == OP_SELL
    && (Close [0] >= Close [3]|| RSI0 >= 50))

    {
    int OrderSellClose=OrderClose (OrderTicket(),LotSize,Bid,slipage,Red);
    }
    }
    }
    return (0) ;
    }
  • Jonathan75

    Salut à toutes et à tous,

    Pour ceux qui seraient face aux mêmes problèmes que moi. J'ai trouvé la solution :
    - au début du code, initialiser les OrderSend en fonction bool. Par exemple, bool openbuy=false ;
    - utiliser la portion void OnTick ()

    Par contre, je me demande si qqn à rencontrer le problème suivant :
    - mes trades se lancent automatiquement, exemple la bougie 0 croit à la hausse la Moyenne Mobile [X] (condition d'achat) mais lorsque une bougie ou cette même bougie croise à la baisse cette Moyenne Mobile, le trade se coupe alors que cela n'est pas indiqué dans les conditions de fermeture du trade.

    Je ne comprends pas pourquoi le programme ferme ce trade et surtout comment fixer ce bug.

    Avez-vous des pistes sur mon problème ?

    Merci d'avance.
  • riden — en réponse à Jonathan75 dans son message #114110

    Jonathan75, le 23/04/2019 dit :
    Par contre, je me demande si qqn à rencontrer le problème suivant : - mes trades se lancent automatiquement, exemple la bougie 0 croit à la hausse la Moyenne Mobile [X] (condition d'achat) mais lorsque une bougie ou cette même bougie croise à la baisse cette Moyenne Mobile, le trade se coupe alors que cela n'est pas indiqué dans les conditions de fermeture du trade. Je ne comprends pas pourquoi le programme ferme ce trade et surtout comment fixer ce bug. Avez-vous des pistes sur mon problème ? Merci d'avance.


    La valeur de Open[0] ou iOpen(Symbol(),Period(),0) est fixe. C'est le prix d'ouverture de la bougie actuelle.
    Par contre la valeur de Close[0] ou iClose(Symbol(),Period(),0) n'est pas fixe c'est équivalent au prix actuel. Close[0] = Bid.

    Donc, par exemple, si la condition de sortie est "la bougie doit clôturer au dessous la moyenne mobile".
    Si on utilise Close[0]--> Dès que le prix actuel passe au dessous de la mm la position sera fermée puis le prix peut changer de direction et la bougie clôture au-dessus de cette mm (la condition n'a pas été réellement validée).
    Donc, à ce moment, on doit utiliser Close[1]. comme ça, dès la clôture de la bougie actuelle au dessous de la mm, et dès l'ouverture de la nouvelle bougie la position sera fermée (la condition est réellement validée).