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 aide pour problème de backtest EA: "EURUSD,M15: invalid takeprofit for OrderSend function" "OrderSend error 4107"

  • richelieu2609

    Bonsoir à tous,

    Me voici de retour pour solliciter l'aide du forum.

    Ayant fini de coder la stratégie principal de mon EA, j'ai voulu le soumettre au backtest.

    Mais, le journal m'affiche plusieurs fois le message d'erreur "OrderSend error 4107" là où les ordres devaient s'exécuter.

    Voici la portion de code chargé de passer les ordres:

    Code
    if ((prev<0)&&(older>0)) { AnnuleAchat(); int sell = OrderSend(Symbol(), OP_SELLSTOP, lots, Bid, 3, OrderOpenPrice() + (stop * Point), OrderOpenPrice() - (limite * Point), "Ordre Vente Stop - Liberty EA", magic, 0, Red); if(sell < 1) { err=GetLastError(); Print("erreur ordre vente (",err,"): ",ErrorDescription(err)); return(0); } } if ((prev>0)&&(older<0)) { AnnuleVente(); int buy = OrderSend(Symbol(), OP_BUYSTOP, lots, Ask, 3, OrderOpenPrice() + (stop * Point), OrderOpenPrice() - (limite * Point), "Ordre Achat Stop - Liberty EA", magic, 0, Blue); if(buy < 1) { err=GetLastError(); Print("erreur ordre achat (",err,"): ",ErrorDescription(err)); return(0); } } }

    Et la déclaration des variables:

    Code
    extern int period=10; extern int stop = 50; extern int limite = 200; extern int trailingStop = 40; extern double lots = 0.06; int magic = 12345678; int err;

    Après recherches, j'ai vu que cela pouvait se corriger en incluant NormalizeDouble(takeprofit, _Digits) mais après les avoir inclus avant les 2 OrderSend, puis avant les boucles "if" et enfin directement au début de la fonction start, mais rien ne changea en backtest...

    Auriez-vous une solution pour régler ce problème ?

    Merci pour votre aide :)
  • stani

    Tu doit normaliser ce que tu envoie a la plateforme et que tu as calculé toi même. Ce qu'elle te fournie, par exemple Bid, est déjà normalisé, donc tu peut le renvoyer tel quel.

    int sell = OrderSend(Symbol(), OP_SELLSTOP, lots, Bid, 3, NormalizeDouble(OrderOpenPrice() + (stop * Point),Digits), NormalizeDouble(OrderOpenPrice() - (limite * Point),Digits), "Ordre Vente Stop - Liberty EA", magic, 0, Red);
  • richelieu2609 — en réponse à stani dans son message #121061

    Merci Stani pour l'aide :)

    Mais pour une raison que j'ignore, après avoir normalisé le takeprofit et le stoploss, même retour dans le journal:

    Il y aurait-il une erreur dans les modifications ci-dessous ?

    Code
    extern int period=10; extern int limite = 200; extern int stop = 25; extern double lots = 0.06; int magic = 12345678; int err;
    Code
    double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL); double takeprofit=NormalizeDouble(OrderOpenPrice() - (limite * Point),Digits); double stoploss=NormalizeDouble(OrderOpenPrice() + (stop * Point),Digits); if ((prev<0)&&(older>0)) { AnnuleAchat(); int sell = OrderSend(Symbol(), OP_SELLSTOP, lots, Bid, 3, stoploss, takeprofit, "Ordre Vente Stop - Liberty EA", magic, 0, Red); if(sell < 1) { err=GetLastError(); Print("erreur ordre vente (",err,"): ",ErrorDescription(err)); return(0); } } if ((prev>0)&&(older<0)) { AnnuleVente(); int buy = OrderSend(Symbol(), OP_BUYSTOP, lots, Ask, 3, stoploss, takeprofit, "Ordre Achat Stop - Liberty EA", magic, 0, Blue); if(buy < 1) { err=GetLastError(); Print("erreur ordre achat (",err,"): ",ErrorDescription(err)); return(0); } } }
  • stani

    Tu ne peux pas mettre les mêmes stop et take sur un achat et une vente.
  • richelieu2609

    Effectivement, j'avais oublié ça, merci encore stani:)

    Voilà la correction:

    Code
    extern int period=10; extern int limite = 200; extern int stop = 20; extern int trailingStop = 40; extern double lots = 0.06; int magic = 12345678; int err;
    Code
    double TPS = NormalizeDouble(Bid - (limite * Point),Digits); double SLS = NormalizeDouble(Bid + (stop * Point),Digits); double TPB = NormalizeDouble(Ask + (limite * Point),Digits); double SLB = NormalizeDouble(Ask - (stop * Point),Digits); if ((prev<0)&&(older>0)) { AnnuleAchat(); int sell = OrderSend(Symbol(), OP_SELLSTOP, lots, Bid, 3, SLS, TPS, "Ordre Vente Stop - Liberty EA", magic, 0, Red); if(sell < 1) { err=GetLastError(); Print("erreur ordre vente (",err,"): ",ErrorDescription(err)); return(0); } } if ((prev>0)&&(older<0)) { AnnuleVente(); int buy = OrderSend(Symbol(), OP_BUYSTOP, lots, Ask, 3, SLB, TPB, "Ordre Achat Stop - Liberty EA", magic, 0, Blue); if(buy < 1) { err=GetLastError(); Print("erreur ordre achat (",err,"): ",ErrorDescription(err)); return(0); } } }

    Mais maintenant j'ai une erreur 130 (cf image)

    Comment puis-je régler ce nouveau problème svp ?
    richelieu2609 a joint une image
    cherche-aide-pour-probleme-de-backtest-ea-eurusdm15-invalid-takeprofit-for-ordersend-function-ordersend-error-4107-12698
  • stani

    Tes stop et take sont trop prés du prix.

    Utilise "MarketInfo(Symbol(),MODE_STOPLEVEL) pour connaitre la distance mini.

    Cela dit, de nos jours, un bon broker a couramment un Stoplevel a 0.
    Modifié le 2021-02-11 15:07:54 par stani
  • richelieu2609

    J'ai fait le backtest sur la paire EUR/USD et mon broker est AvaTrade. Le stop level minimum est de 20.

    Ducoup, j'ai réessayé avec un stop de 25 mais même résultat:

    Code
    extern int period=10; extern int limite = 200; extern int stop = 25; extern int trailingStop = 40; extern double lots = 0.06; int magic = 12345678; int err;

    Et même résultat:

    Ducoup je ne vois pas où se trouve le problème :(

    Auriez-vous une solution ?
    richelieu2609 a joint une image
    cherche-aide-pour-probleme-de-backtest-ea-eurusdm15-invalid-takeprofit-for-ordersend-function-ordersend-error-4107-12700
  • richelieu2609

    Bonjour tout le monde :),

    Je clos ce topic parce que j'ai trouvé la solution à mon problème qui peut sembler plutôt simple...J'ai tout simplement enlevé les stoploss et les takeprofits en remplaçant les OPBUYSTOP et OPSELLSTOP par des OPBUY et OPSELL:

    Code
    if ((prev<0)&&(older>0)) { AnnuleAchat(); int sell = OrderSend(Symbol(), OP_SELL, lots, Bid, 3, 0, 0, "Ordre Vente Stop - Liberty EA", magic, 0, Red); if(sell < 1) { err=GetLastError(); Print("erreur ordre vente (",err,"): ",ErrorDescription(err)); return(0); } } if ((prev>0)&&(older<0)) { AnnuleVente(); int buy = OrderSend(Symbol(), OP_BUY, lots, Ask, 3, 0, 0, "Ordre Achat Stop - Liberty EA", magic, 0, Blue); if(buy < 1) { err=GetLastError(); Print("erreur ordre achat (",err,"): ",ErrorDescription(err)); return(0); } } } TrailingStop();

    Moralité: Plus de stoploss, plus de problèmes ( ͡❛ ͜ʖ ͡❛).

    Et puis comme j'utilise une fonction de trailling stop, je n'en ai plus besoin (je ne suis pas fou non plus).

    Merci encore stani pour l'aide apportée et à bientôt !