Les EA doivent être codés pour se rétablir. Si l'alimentation électrique est coupée, si le système d'exploitation se bloque, si le terminal ou le graphique est accidentellement fermé, au prochain tick, toutes les variables statiques/globales du ticket auront été perdues. Vous aurez un ordre ouvert mais ne le saurez pas, donc l'EA n'essaiera jamais de le fermer, de suivre le SL, etc. Comment allez-vous récupérer ? Utilisez une boucleOrderSelect pour récupérer, ou un stockage persistant (GV/fichier) des numéros de tickets requis.
Bonjour, j'ai ajouté le changement de code de la manière suivante.
//---------------------- Buy/Sell function (limit orders) int BuyCall( double BC) { if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true) { if ( BuyTicket == 0) { BuyStopLoss = BC - (StopLoss * CalcPoint1); BuyTakeProfit = BC + (TakeProfit * CalcPoint1); BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green); SellTicket = 0; // counter trade// if( Bid < BuyStopLoss && SellTicket == 0 ) { if(!OrderSelect(SellTicket, SELECT_BY_TICKET) == true) { SellStopLoss = Bid + (StopLoss * CalcPoint1); SellTakeProfit = Bid - (TakeProfit * CalcPoint1); SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red); BuyTicket = 0; } } } }
Il prend toujours les mêmes ordres plusieurs fois à chaque tick.
De plus, si je supprime le signe " !", il ne prend aucune transaction.
Enfin, dois-je supprimer les contrôles buyticket et sellticket de ma fonction principale ?
Je vous remercie.
if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
-
Jouer la vidéoVeuillez modifier votre message.
Pour les grandes quantités de code, joignez-le.
- Vous n'écririez jamais if( (2+2 == 4) == true) n'est-ce pas ? if(2+2 == 4) est suffisant. N'écrivez donc pas if(bool == true), utilisez if(bool) ou if(! bool). Le code devient auto-documenté lorsque vous utilisez des noms de variables significatifs, comme bool isLongEnabled. Long_Entry ressemble à un prix de déclenchement ou à un numéro de billet et "if long entry" est une phrase incomplète.
- Où vérifiez-vous si le BuyTicket a été fermé ? La sélection par ticket sera toujours vraie (avec un numéro de ticket valide), l'ordre peut être en attente, ouvert, fermé ou supprimé.
- Vous avez complètement ignoré ma suggestion d'une boucle OrderSelect.
Bonjour WHReder, merci pour votre réponse.
Oui, j'ai ajouté ces éléments dans le code SRC. Mais cela ne s'est pas affiché lorsque j'ai édité.
J'ai supprimé == true terms comme vous l'avez suggéré.
Ne vous méprenez pas, j'ai un point faible dans la compréhension de cette boucle orderselect. Je ne l'ai pas ignorée. J'ai essayé de l'ajouter, mais c'est trop complexe, l'exécution montre 16 erreurs et 2 avertissements. Dans ce code, qu'est-ce que MN.Count ?
// extern int Magic.Number.Base = ... // int magic.number.max; // Export to OpenOrder/MySelect // string market.pair; // Export to OpenOrder/MySelect // int init(){ // market.pair = Symbol(); // magic.number.max = Magic.Number.Base + MN.COUNT - 1;
A propos de la vérification de la fermeture du ticket d'achat. Je ne l'ai pas vérifié parce que j'ai vérifié si le prix actuel est inférieur à la perte d'achat, alors l'opération d'achat a été fermée et j'ai ouvert un ordre de vente.
Bid < BuyStopLoss
Salutations
J'ai arrangé le code d'une certaine manière comme ceci... Mais je montre 2 erreurs maintenant... "Myselect" & "MyOrdersTotal" peuvent être déclearisés seulement dans la portée globale.
int BuyCall( double BC) { //-----------code bool MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){ if(!OrderSelect(iWhat, eSelect, ePool) ) return (false); int mn = OrderMagicNumber(); if(mn < MNB1 ) return (false); if(mn > MNB2 ) return (false); if(OrderSymbol() != Pair ) return (false); if(ePool != MODE_HISTORY ) return (true); return(OrderType() <= OP_SELL); } int MyOrdersTotal(int op=-1, int ePool=MODE_TRADES){ #define OP_ALL -1 if(ePool == MODE_TRADES) iPos = OrdersTotal() - 1; else iPos = OrdersHistoryTotal() - 1; for(nOrders=0; iPos >= 0; iPos--) if( MySelect(iPos, SELECT_BY_POS, ePool)) if( op == OP_ALL || op == OrderType() ) nOrders++; return(nOrders); } if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)) { if ( BuyTicket == 0) { BuyStopLoss = BC - (StopLoss * CalcPoint1); BuyTakeProfit = BC + (TakeProfit * CalcPoint1); BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green); SellTicket = 0; // counter trade// if( Bid < BuyStopLoss && SellTicket == 0 ) { if(!OrderSelect(SellTicket, SELECT_BY_TICKET)) { SellStopLoss = Bid + (StopLoss * CalcPoint1); SellTakeProfit = Bid - (TakeProfit * CalcPoint1); SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red); BuyTicket = 0; } } } } return(BuyTicket); }
Vous ne pouvez pas déclarer une fonction à l'intérieur d'une autre fonction
Alors comment puis-je le faire ? Je veux dire que j'ai beaucoup de conditions à vérifier individuellement pour ouvrir un ordre d'achat/de vente.
C'est pourquoi j'ai créé une fonction buycall/sellcall pour rendre le code plus facile.
C'est juste que l'EA prend tellement de transactions identiques. Je ne sais pas comment arrêter cela.
Vous ne pouvez pas déclarer une fonction à l'intérieur d'une autre fonction
Alors comment puis-je le faire ? Je veux dire que j'ai beaucoup de conditions à vérifier individuellement pour ouvrir un ordre d'achat/de vente.
C'est pourquoi j'ai créé une fonction buycall/sellcall pour rendre le code plus facile.
C'est juste que l'EA prend tellement de transactions identiques. Je ne sais pas comment arrêter cela.
Tout d'abord, n'essayez pas de déclarer une fonction à l'intérieur d'une autre fonction.
Je suis incapable de comprendre ce que vous essayez de faire en regardant le code que vous avez posté. Je ne peux donc pas vous aider.
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation
Bonjour, j'ai créé un Ea, mais lorsque je fais un back testing, il crée plusieurs ordres identiques en attente sur chaque tick. Comment arrêter cela ? J'ai juste besoin d'un ordre à la fois, je n'ai pas besoin de sa copie.
Si j'exécute cet EA sur un graphique horaire avec"prix ouvert uniquement", il ne crée pas de copie.
De plus, mon EA a une option pour le commerce de renversement si la limite d'achat échoue alors il ouvre le commerce de vente. S'il vous plaît, dites-moi également si je l'ai configuré correctement ou non. Toute aide sera appréciée.
Je vous remercie pour votre temps.