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

EA ne fonctionne pas correctement en live

  • stepaustras

    Bonsoir,

    Voilà j'ai fais un petit EA pour placer des buy stop et sell stop a une heure précise seulement je ne comprend pas il fonctionne bien en back test mais en live il ne me place aucun stop buy et sell quand l'heure H arrive il ne me pose pas mes stop !

    Voici le code si quelqu'un pourrais me dire pourquoi !

    Merci a vous ;)
    Code
    #include <stdlib.mqh> #include <WinUser32.mqh> // exported variables extern int OpenOrdersLimit17 = 2; extern int Hour18 = 16; extern int Minute18 = 20; extern double BuyLots21 = 0.1; extern int BuyStoploss21 = 3; extern int BuyTakeprofit21 = 3; extern int PriceOffset21 = 5; extern double SellLots19 = 0.1; extern int SellStoploss19 = 3; extern int SellTakeprofit19 = 3; extern int PriceOffset19 = 5; // local variables double PipValue=1; // this variable is here to support 5-digit brokers bool Terminated = false; string LF = "\n"; // use this in custom or utility blocks where you need line feeds int NDigits = 4; // used mostly for NormalizeDouble in Flex type blocks int ObjCount = 0; // count of all objects created on the chart, allows creation of objects with unique names int current = 0; int Today18 = -1; int init() { NDigits = Digits; if (false) ObjectsDeleteAll(); // clear the chart Comment(""); // clear the chart } // Expert start int start() { if (Bars < 10) { Comment("Not enough bars"); return (0); } if (Terminated == true) { Comment("EA Terminated."); return (0); } OnEveryTick14(); } void OnEveryTick14() { if (true == false && false) PipValue = 10; if (true && (NDigits == 3 || NDigits == 5)) PipValue = 10; IfOrderExists2(); IfOrderExists3(); LimitOpenOrders17(); AtCertainTime18(); } void IfOrderExists2() { bool exists = false; for (int i=OrdersTotal()-1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderType() == OP_BUYSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1) { exists = true; } } else { Print("OrderSelect() error - ", ErrorDescription(GetLastError())); } if (exists) { DeletePendingOrder4(); } } void DeletePendingOrder4() { for (int i=OrdersTotal()-1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderType() == OP_SELLSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1) { bool ret = OrderDelete(OrderTicket(), Red); if (ret == false) { Print("OrderDelete() error - ", ErrorDescription(GetLastError())); } } } } void IfOrderExists3() { bool exists = false; for (int i=OrdersTotal()-1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderType() == OP_SELLSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1) { exists = true; } } else { Print("OrderSelect() error - ", ErrorDescription(GetLastError())); } if (exists) { DeletePendingOrder5(); } } void DeletePendingOrder5() { for (int i=OrdersTotal()-1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderType() == OP_BUYSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1) { bool ret = OrderDelete(OrderTicket(), Red); if (ret == false) { Print("OrderDelete() error - ", ErrorDescription(GetLastError())); } } } } void LimitOpenOrders17() { int count = 0; for (int i=OrdersTotal()-1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol()) if (OrderMagicNumber() == 1) { count++; } } else { Print("OrderSend() error - ", ErrorDescription(GetLastError())); } if (count < OpenOrdersLimit17) { } } void AtCertainTime18() { int datetime800 = TimeLocal(); int hour0 = TimeHour(datetime800); int minute0 = TimeMinute(datetime800); if (DayOfWeek() != Today18 && hour0 == Hour18 && minute0 == Minute18) { Today18 = DayOfWeek(); IfOrderDoesNotExist20(); IfOrderDoesNotExist16(); } } void IfOrderDoesNotExist20() { bool exists = false; for (int i=OrdersTotal()-1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderType() == OP_BUYSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1) { exists = true; } } else { Print("OrderSelect() error - ", ErrorDescription(GetLastError())); } if (exists == false) { BuyPendingOrder21(); } } void BuyPendingOrder21() { int expire = TimeCurrent() + 60 * 120; double price = NormalizeDouble(Ask, NDigits) + PriceOffset21*PipValue*Point; double SL = price - BuyStoploss21*PipValue*Point; if (BuyStoploss21 == 0) SL = 0; double TP = price + BuyTakeprofit21*PipValue*Point; if (BuyTakeprofit21 == 0) TP = 0; if (120 == 0) expire = 0; int ticket = OrderSend(Symbol(), OP_BUYSTOP, BuyLots21, price, 3, SL, TP, "My Expert", 1, expire, Blue); if (ticket == -1) { Print("OrderSend() error - ", ErrorDescription(GetLastError())); } } void IfOrderDoesNotExist16() { bool exists = false; for (int i=OrdersTotal()-1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderType() == OP_SELLSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1) { exists = true; } } else { Print("OrderSelect() error - ", ErrorDescription(GetLastError())); } if (exists == false) { SellPendingOrder19(); } } void SellPendingOrder19() { int expire = TimeCurrent() + 60 * 120; double price = NormalizeDouble(Bid, NDigits) - PriceOffset19*PipValue*Point; double SL = price + SellStoploss19*PipValue*Point; if (SellStoploss19 == 0) SL = 0; double TP = price - SellTakeprofit19*PipValue*Point; if (SellTakeprofit19 == 0) TP = 0; if (120 == 0) expire = 0; int ticket = OrderSend(Symbol(), OP_SELLSTOP, SellLots19, price, 3, SL, TP, "My Expert", 1, expire, Red); if (ticket == -1) { Print("OrderSend() error - ", ErrorDescription(GetLastError())); } } int deinit() { if (false) ObjectsDeleteAll(); }
    Modifié le 2013-10-11 21:40:20 par stepaustras
  • riden

    Salut,
    Tu peux nous donner l'erreur affiché dans le journal .
    Tu mets des SL et TP à 3 pips et des ordres diff. à 5pips. Les TP/SL/Ordres diff doivent respecter l’écart minimum autorisé, et cela varie selon les broker. Tu peux utiliser MarketInfo avec MODE_STOPLEVEL pour connaitre cet écart.
    En attendant, si le problème vient de là, il y a une méthode pour contourner cet écart (ex: définir des TP à partir de 1pip)
    Modifié le 2013-10-11 22:24:15 par riden
  • stepaustras — en réponse à riden dans son message #83101

    Hello merci de ta réponse.
    J'ai regardé le journal mais je ne vois aucune erreur il faut peu être que je rajoute print info to chart dans le code pour la voir ?
    Sinon ça serais quoi la méthode pour contourner cet écart ?

    En même temps je suis chez Armada Market et j'ai l'impression qu'il disent qu'il n' y a pas de limite

    Order Types
    We set no limits on placing orders as you can even place orders within the spread. FX traders can execute a number of orders with Armada Markets, including:

    Market execution Buy limit Sell limit Buy stop
    Sell stop Take profit Stop loss Good till cancelled

    Et j'avais fais le même code sans les tranches horaires et il mettait bien mes stops c'est pour ça je ne comprend plus trop !
    Modifié le 2013-10-12 06:02:29 par stepaustras
  • riden

    Salut,
    Si tu as fermé la plateforme le journal se réinitialise et tu ne verra pas l'erreur, dans ce cas il faut aller dans logs (Armada Market mt4/logs/fichier log d'hier) et là tu verra le message d'erreur.
    J'ai copié le code pour le backtester et aucun problème à part l'erreur 130 (à cause de l'écart), j'ai modifié l'écart et ça marche.
    les ordre diff sont lancés à partir d'une minute donné, s'il n'y a pas de changement de prix pendant une minute les ordres ne seront pas envoyés ,c'est rare mais ça peut arriver (la même chose si on backtest avec TF>1) . Je te conseille de définir une plage de 3 minutes par exemple, comme ça tu es sûr que les ordre seront placés.
    Lundi, essayes: comment(MarketInfo(Symbol(),MODE_STOPLEVEL)); pour être sûr que l'écart est 0 chez ton broker


    Pour définir un TP/SL à partir de 1 pip (utile en scalping), c'est simple, on peut définir une fonction

    void take_stop(int tp,int sl){
    for..............
    if orderselect................
    if orderprofit() >= tp
    orderclose............
    if orderprofit() <= -sl
    orderclose............ }

    c'est le même principe pour les ordres diff, si tu veux placer des ordres diff à n pips à partir d'un moment tu enregistres le prix à ce moment dans une variable prix, ensuite:
    if ask>prix && ask-prix>=n ordersend..................
  • stepaustras — en réponse à riden dans son message #83115

    oui c'est bien là que j'avais regardé mais je ne vois aucune erreur a l'heure H ou le robot était censé placer les stops j'ai du virer le code des horaires pour voir si le robot fonctionnais sans et là il m'a placé les stops.

    voir le log il était censé prendre a 15h55
    Code
    07:47:20 '2088378112': login 07:47:21 '2088378112': previous successful authorization performed from 46.193.138.5 14:19:09 Expert robot EURUSD.arm,M5: loaded successfully 15:59:02 Expert robot EURUSD.arm,M5: removed 16:17:49 Expert robot EURUSD.arm,M5: loaded successfully 16:18:00 '2088378112': pending order sell stop 0.02 EURUSD.arm at 1.35502 sl: 1.35602 tp: 1.35402 16:18:00 '2088378112': request was accepted by server 16:18:00 '2088378112': order was opened : #15489997 sell stop 0.02 EURUSD.arm at 1.35502 sl: 1.35602 tp: 1.35402 16:18:00 '2088378112': pending order buy stop 0.02 EURUSD.arm at 1.35609 sl: 1.35509 tp: 1.35709 16:18:01 '2088378112': request was accepted by server

    en faite je pense que c'est le code qui pourrais être amélioré car normalement ça aurais du fonctionner puisque sans ce bout de code de plage horaire il a fonctionné.
    Modifié le 2013-10-12 09:56:58 par stepaustras
  • stepaustras — en réponse à stepaustras dans son message #83118

    Par contre c'est ça que je ne comprend pas. Tu peux détailler ? :(

    Citation :
    Je te conseille de définir une plage de 3 minutes par exemple, comme ça tu es sûr que les ordre seront placés. Lundi, essayes: comment(MarketInfo(Symbol(),MODE_STOPLEVEL)); pour être sûr que l'écart est 0 chez ton broker
    Modifié le 2013-10-12 16:07:59 par stepaustras
  • riden

    if (DayOfWeek() != Today18 && hour0 == Hour18 && minute0 == Minute18)
    {
    Today18 = DayOfWeek();

    C'est rare où ça arrive mais le prix peut ne pas changer pendant une minute, si le prix ne change pas pendant Minute18 les ordres ne seront pas placés.

    if (DayOfWeek() != Today18 && hour0 == Hour18 && (minute0 == Minute18 || minute0 == Minute18+1 || minute0 == Minute18+2))
    {
    Today18 = DayOfWeek(); // après il faut vérifier que Minute18<=57 sinon étudier les cas 58 et 59 (if....if...)

    Un ordre peut ne pas passer au premier coup, il faut donc donner une chance à l'expert de réessayer d'envoyer l'ordre. Dans ton cas ça ne sera pas possible à cause de DayOfWeek() != Today18 (je ne vois pas l'utilité car tu as déjà des fonctions qui vérifie si l'expert a envoyé des ordres avant de placer des nouveaux ordres).

    comment(MarketInfo(Symbol(),MODE_STOPLEVEL)); tu le mets à la fin de start dans l'expert pour avoir une idée sur l'écart minimum (sur le log tes SL/TP sont à 10pips)
    Modifié le 2013-10-12 17:25:36 par riden
  • stepaustras — en réponse à riden dans son message #83146

    OK merci a toi ;) je vais essayer ça dès lundi car en mode demo je crois que cela ne fonctionne pas le dimanche soir sur armada market

    J'ai recompilé le code avec ce que tu m'as dis des fois que j'ai fais une boulette lol

    Code
    #include <stdlib.mqh> #include <WinUser32.mqh> // exported variables extern int OpenOrdersLimit12 = 2; extern int Hour13 = 12; extern int Minute13 = 30; extern double BuyLots19 = 0.1; extern int BuyStoploss19 = 10; extern int BuyTakeprofit19 = 10; extern int PriceOffset19 = 10; extern double SellLots17 = 0.1; extern int SellStoploss17 = 10; extern int SellTakeprofit17 = 10; extern int PriceOffset17 = 10; // local variables double PipValue=1; // this variable is here to support 5-digit brokers bool Terminated = false; string LF = "\n"; // use this in custom or utility blocks where you need line feeds int NDigits = 4; // used mostly for NormalizeDouble in Flex type blocks int ObjCount = 0; // count of all objects created on the chart, allows creation of objects with unique names int current = 0; int Today13 = -1; int init() { NDigits = Digits; if (false) ObjectsDeleteAll(); // clear the chart Comment(""); // clear the chart } // Expert start int start() { if (Bars < 10) { Comment("Not enough bars"); return (0); } if (Terminated == true) { Comment("EA Terminated."); return (0); } OnEveryTick10(); } Comment(MarketInfo(Symbol(),MODE_STOPLEVEL)); void OnEveryTick10() { if (true == false && false) PipValue = 10; if (true && (NDigits == 3 || NDigits == 5)) PipValue = 10; IfOrderExists20(); IfOrderExists14(); LimitOpenOrders12(); } void IfOrderExists20() { bool exists = false; for (int i=OrdersTotal()-1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1) { exists = true; } } else { Print("OrderSelect() error - ", ErrorDescription(GetLastError())); } if (exists) { DeletePendingOrder21(); } } void DeletePendingOrder21() { for (int i=OrdersTotal()-1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderType() == OP_SELLSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1) { bool ret = OrderDelete(OrderTicket(), Red); if (ret == false) { Print("OrderDelete() error - ", ErrorDescription(GetLastError())); } } } } void IfOrderExists14() { bool exists = false; for (int i=OrdersTotal()-1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == 1) { exists = true; } } else { Print("OrderSelect() error - ", ErrorDescription(GetLastError())); } if (exists) { DeletePendingOrder15(); } } void DeletePendingOrder15() { for (int i=OrdersTotal()-1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderType() == OP_BUYSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1) { bool ret = OrderDelete(OrderTicket(), Red); if (ret == false) { Print("OrderDelete() error - ", ErrorDescription(GetLastError())); } } } } void LimitOpenOrders12() { int count = 0; for (int i=OrdersTotal()-1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol()) if (OrderMagicNumber() == 1) { count++; } } else { Print("OrderSend() error - ", ErrorDescription(GetLastError())); } if (count < OpenOrdersLimit12) { AtCertainTime13(); } } void AtCertainTime13() { int datetime800 = TimeLocal(); int hour0 = TimeHour(datetime800); int minute0 = TimeMinute(datetime800); if ((DayOfWeek() != Today13 && hour0 == Hour13 && minute0 == Minute13 || minute0 == Minute13+1 || minute0 == Minute13+2)) { Today13 = DayOfWeek(); IfOrderDoesNotExist18(); IfOrderDoesNotExist16(); } } void IfOrderDoesNotExist18() { bool exists = false; for (int i=OrdersTotal()-1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderType() == OP_BUYSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1) { exists = true; } } else { Print("OrderSelect() error - ", ErrorDescription(GetLastError())); } if (exists == false) { BuyPendingOrder19(); } } void BuyPendingOrder19() { int expire = TimeCurrent() + 60 * 120; double price = NormalizeDouble(Ask, NDigits) + PriceOffset19*PipValue*Point; double SL = price - BuyStoploss19*PipValue*Point; if (BuyStoploss19 == 0) SL = 0; double TP = price + BuyTakeprofit19*PipValue*Point; if (BuyTakeprofit19 == 0) TP = 0; if (120 == 0) expire = 0; int ticket = OrderSend(Symbol(), OP_BUYSTOP, BuyLots19, price, 3, SL, TP, "My Expert", 1, expire, Blue); if (ticket == -1) { Print("OrderSend() error - ", ErrorDescription(GetLastError())); } } void IfOrderDoesNotExist16() { bool exists = false; for (int i=OrdersTotal()-1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderType() == OP_SELLSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1) { exists = true; } } else { Print("OrderSelect() error - ", ErrorDescription(GetLastError())); } if (exists == false) { SellPendingOrder17(); } } void SellPendingOrder17() { int expire = TimeCurrent() + 60 * 120; double price = NormalizeDouble(Bid, NDigits) - PriceOffset17*PipValue*Point; double SL = price + SellStoploss17*PipValue*Point; if (SellStoploss17 == 0) SL = 0; double TP = price - SellTakeprofit17*PipValue*Point; if (SellTakeprofit17 == 0) TP = 0; if (120 == 0) expire = 0; int ticket = OrderSend(Symbol(), OP_SELLSTOP, SellLots17, price, 3, SL, TP, "My Expert", 1, expire, Red); if (ticket == -1) { Print("OrderSend() error - ", ErrorDescription(GetLastError())); } } int deinit() { if (false) ObjectsDeleteAll(); }

    et je crois aussi que j'avais fais une boulette sur le premier code en haut je sais pas si ça joue mais normalement si le sell stop existe qu'il supprime le buy stop alors évidemment ça peu pas coller et ceux idem pour l'autre donc j'ai corrigé si un buy ou un sell existe qu'il supprime le sell ou buy stop :(
    Modifié le 2013-10-12 17:55:38 par stepaustras
  • stepaustras — en réponse à stepaustras dans son message #83150

    C'est ce morceaux de code qui ne fonctionne pas correctement
    Code
    void AtCertainTime18() { int datetime800 = TimeLocal(); int hour0 = TimeHour(datetime800); int minute0 = TimeMinute(datetime800); if (DayOfWeek() != Today18 && hour0 == Hour18 && minute0 == Minute18) { Today18 = DayOfWeek(); IfOrderDoesNotExist20(); IfOrderDoesNotExist16();

    Qu'est ce que je pourrais mettre a la place pour placer un sell stop ou buy stop a heure et minute précis?
    Modifié le 2013-10-13 23:03:52 par stepaustras
  • stepaustras — en réponse à stepaustras dans son message #83299

    Juste pour remonter le post quelqu'un aurais une petite idée pour refaire soit un nouveau code complet ou un petit bout. L'idée d'avoir un EA qui place un sell stop et un buy stop a une heure et minute qu'on lui aura pré réglé et quand un stop est prit on supprime l'autre stop.

    Merci a ceux qui pourrons m'aider