Créateur de grilles 1.1 - page 3

 
Rebonjour

Merci pour votre réponse, je vous ajouterai quand je serai chez moi.
 
Je trouve que ce code a parfois des problèmes pour garder la grille parfaite (au moins quand je l'exécute comme une grille de pullback et non de breakout). J'ai vu des trous se former et ne pas être mis à jour et j'ai vu la grille ne pas se former complètement à certains moments avec les 10 ordres. En outre, il semble ne pas aimer les paramètres de temps de mise à jour qui sont très courts et je ne comprends pas pourquoi. Il semble que 15 minutes soient beaucoup trop longues pour mettre à jour une grille (plutôt 15 secondes !), ce qui constitue un problème majeur. J'apprécierais de savoir si vous avez rencontré ce genre de problème. Cependant, c'est un excellent travail d'avoir réussi à faire fonctionner le système. Bon travail.
 
soma,

Vous avez raison, il y avait un bug que quelqu'un m'a signalé et qui semble être corrigé. Voici la nouvelle version. J'ai aussi changé l'intervalle à 1 min - mais je pense que 15 à 30 min est mieux... cela évitera quelques contre-opérations quand le marché bouge très vite.

Salutations,

//+------------------------------------------------------------------+ //| MakeGrid.mq4 | //| Copyright © 2005, hdb | //| http://www.dubois1.net/hdb | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, hdb" #property link "http://www.dubois1.net/hdb" //#property version "1.4beta" extern string GridName = "Grid" ; // identifie la grille. permet de faire coexister plusieurs grilles extern double Lots = 0.1 ; // extern double GridSize = 6 ; // pips entre les ordres - grille ou taille de la maille extern double GridSteps = 12 ; // nombre total d'ordres à placer extern double TakeProfit = 6 ; // nombre de ticks pour prendre le profit. normalement = taille de la grille mais vous pouvez le remplacer extern double StopLoss = 0 ; // si vous voulez ajouter un stop loss. Les grilles normales n'utilisent pas de stop loss. extern double UpdateInterval = 1 ; // mise à jour des ordres toutes les x minutes extern bool wantLongs = true ; // nous voulons des positions longues extern bool wantShorts = true ; // nous voulons des positions courtes extern bool wantBreakout = true ; // nous voulons des longs au-dessus du prix, des shorts au-dessous du prix extern bool wantCounter = true ; // nous voulons des longs au-dessous du prix, des shorts au-dessus du prix extern bool limitEMA34 = false ;      // veut-on des longs au-dessus de l'ema seulement, des shorts en dessous de l'ema seulement extern double LastUpdate = 0 ; // compteur utilisé pour noter l'heure de la dernière mise à jour extern double GridMaxOpen = 0 ; // nombre maximum de positions ouvertes //+------------------------------------------------------------------+ //| fonction d'initialisation de l'expert | //+------------------------------------------------------------------+ int init() { //---- #property show_inputs // montre les paramètres - merci Slawa...    
 if ( TakeProfit <= 0 ) // { TakeProfit = GridSize ; } //---- return(0) ; } //+------------------------------------------------------------------------+ //| teste s'il existe une position ouverte ou un ordre dans la région de atRate | //| vérifiera les longs si checkLongs est vrai, sinon vérifiera | //| les shorts | //+------------------------------------------------------------------------+ bool IsPosition(double atRate, double inRange, bool checkLongs ) { int totalorders = OrdersTotal() ;
     for(int j=0;j<totalorders;j++) // analyse tous les ordres et positions... { OrderSelect(j, SELECT_BY_POS) ; if ( OrderSymbol()==Symbol() && OrderComment() == GridName )  // ne regarde que si mygrid et le symbole... { int type = OrderType() ; if (MathAbs( OrderOpenPrice() - atRate ) < inRange) // ne cherche pas le prix exact mais la proximité du prix (moins que gridsize) { if ( ( checkLongs && ( type == OP_BUY || type == OP_BUYLIMIT || type == OP_BUYSTOP ) )  || (!checkLongs && ( type == OP_SELL || type == OP_SELLLIMIT || type == OP_SELLSTOP ) ) ) { return(true) ; } } } } } 

   return(false) ; } //+------------------------------------------------------------------+ //| fonction de démarrage du programme de script | //+------------------------------------------------------------------+ int start() { //---- int i, j,k, ticket, entermode, totalorders ; bool doit ; double point, startrate, traderate ; //---- if (MathAbs(CurTime()-LastUpdate)> UpdateInterval*60) // nous mettons à jour la première fois qu'elle est appelée et toutes les minutes UpdateInterval { LastUpdate = CurTime() ;
   Print("Updating") ; point = MarketInfo(Symbol(),MODE_POINT) ; startrate = ( Ask + point*GridSize/2 ) / point / GridSize ; // arrondir à un nombre de ticks divisible par GridSize k = startrate ; k = k * GridSize ; startrate = k * point - GridSize*GridSteps/2*point ;          // calculer le point d'entrée le plus bas double EMA34=iMA(NULL,0,34,0,MODE_EMA,PRICE_CLOSE,0) ; for( i=0;i<GridSteps;i++) {traderate = startrate + i*point*GridSize ; if ( wantLongs && ( !limitEMA34 || traderate > EMA34)) { if ( IsPosition(traderate,point*GridSize,true) == false )           // test si je n'ai pas d'ordres ouverts proches de mon prix : si oui, en mettre un { double myStopLoss = 0 ; if ( StopLoss > 0 ) { myStopLoss = traderate-point*StopLoss ; } if ( traderate > Ask ) { entermode = OP_BUYSTOP ; } 
              else { entermode = OP_BUYLIMIT ; } 
              
              si ((traderate > Ask ) && (wantBreakout)) || ((traderate <= Ask ) && (wantCounter)) ) 

              { ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate+point*TakeProfit,GridName,16384,0,Green) ; } } } if ( wantShorts && (!limitEMA34 || traderate < EMA34)) { if (IsPosition(traderate,point*GridSize,false)== false )           // tester si je n'ai pas d'ordres ouverts proches de mon prix : si oui, en mettre un { myStopLoss = 0 ; if ( StopLoss > 0 ) { myStopLoss = traderate+point*StopLoss ; } if ( traderate > Bid ) { entermode = OP_SELLLIMIT ; } 
              else { entermode = OP_SELLSTOP ; } 
              
              si ((traderate < Bid ) && (wantBreakout)) || ((traderate >= Bid ) && (wantCounter)) ) 
                { ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate-point*TakeProfit,GridName,16384,0,Red) ; } } } return(0) ; } //+------------------------------------------------------------------+
 
Merci, hdb. Mais peut-être ne comprends-je pas exactement comment vous concevez les grilles, car je ne vois pas pourquoi une mise à jour trop rapide serait néfaste. Manquer une entrée empêcherait la grille d'atteindre son plein potentiel. Quand je l'exécute manuellement, je mets à jour les ordres à la seconde où quelque chose change. J'exécute des grilles de pullback et non des grilles de breakout, c'est peut-être là que réside la différence, mais avec les pullbacks, vous profitez de l'agitation et l'idéal est de garder la grille sans trous.
 
soma,

Oui, vous avez peut-être raison... donc le mieux serait de faire des mises à jour fréquentes mais seulement dans quelques créneaux de grille... il faut cependant faire des tests. Je n'ai pas d'avis tranché.

reagrds,
 
J'attendais un moment favorable pour poster une mise à jour de la grille - puisque ses performances ont été vraiment mauvaises ces derniers temps.
La semaine après ma dernière mise à jour, j'étais en vacances et la grille était arrêtée. La semaine dernière, la grille a fonctionné la plupart du temps.
Je l'ai désactivé à quelques reprises lorsque la marge disponible était nulle et j'ai défini "longs only" sur la plupart des majors.
Aujourd'hui a été une journée de retour en force.

Solde : 93 (+10 depuis 10 jours)
Marge utilisée : +15k
Marge disponible : +28k
P&l irréel : -49k (-11 depuis 10 jours)
Solde : 44k

Le solde net est inférieur de 1k à celui d'il y a 10 jours et de 5k au solde de départ.

La partie la plus difficile dans tout cela est d'essayer de limiter le drawdown. Je dois vraiment trouver des moyens de le faire !
 
Je pense que la seule façon d'éviter le drawdown est d'utiliser des méthodes discrétionnaires
Je pense que la seule façon d'éviter le drawdown est d'utiliser des méthodes discrétionnaires, c'est-à-dire de savoir quand arrêter d'ajouter des ordres et quand, comme vous l'avez fait, arrêter d'ajouter des positions courtes.

J'ai commencé avec un solde de 100K après avoir mal commencé en utilisant une taille de lot trop importante et en étant obligé de fermer de nombreuses positions.

Solde : 97 594.19 Solde il y a environ 2 semaines 83k
Marge libre : 6 016.88
P/L flottant : -38 960.45 était aussi mauvais que -56k
Marge : 52 616.86

les deux derniers jours ont été vraiment lents, le niveau de marge était aussi bas que 93%.

mais maintenant toutes les majors semblent avoir fait un retournement de situation pour le moment
le niveau de marge est remonté à environ 130%.
 
Je suis d'accord, darkstonexa, je pense que tu as peut-être raison - mais je teste quelques variations automatisées basées sur ema et macd... Je ne suis pas trop optimiste cependant.

Un ami en a aussi un avec un stoploss en cours... et il a du mal à rester à flot ! Mais cela résout vraiment le problème du drawdown !

Pendant ce temps, j'ai nettoyé mes positions - toutes les positions avec un carry interest négatif important et bien en perte (quelques 100 pips) ont été fermées.

Donc mes grilles sont maintenant prêtes pour un autre coup sur la tête (marge bact à 430%) !
 
Eh bien, quels beaux jours nous avons eu... hier, j'ai vu ma grille +5k dans le vert (l'équité était de 54k, j'ai commencé avec 49k) après des semaines de trading assez catastrophiques.

Heureusement que nous pouvons essayer sur des comptes de démonstration!

Maintenant que je suis de retour dans une position "raisonnable", j'ai configuré toutes les paires de devises pour faire ce qui suit :
1) trader uniquement dans la direction du carry interest positif (à moins que l'intérêt soit proche de 0, alors faites-le dans les deux sens)
2) positions longues uniquement au-dessus de l'ema 34, positions courtes uniquement en dessous de l'ema 34.
3) pour les devises à double sens, utilisez le macd sur le graphique 5 min pour décider si vous êtes long ou short.

Nous verrons ce que cela donne !

ps. J'aimerais que le back testing fonctionne !
 
Bonjour hdb,

J'ai pris votre conseiller sur EURUSD, en tradant les deux côtés comme breakout.

Maintenant, je voudrais vous demander si vous avez déjà rencontré le problème suivant :

Après un certain temps, j'ai plus d'un ordre sur certaines des mêmes positions de la grille. Parfois il y en a deux, mais j'en ai aussi vu 5 et plus.

D'après ce que je comprends du code, il ne devrait y avoir qu'un seul ordre ouvert sur une position de grille à la fois.

J'ai essayé de convertir tous les doubles en int avant de les comparer, car dans MQL2, j'ai rencontré un problème similaire lors de la comparaison de valeurs doubles.

Avez-vous rencontré quelque chose de similaire ?

Avec mes salutations,

cori