Répartition uniforme de la position du lot
Résultats de 1 é 7 sur 7

Sujet : Répartition uniforme de la position du lot

  1. #1
    Une autre demande avant de commencer à pirater le code - en espérant que quelqu'un ait fait quelque chose de similaire.

    Je donne l'option d'une splitPosition sur X nombre de lots demandés.

    C'est-à-dire que l'utilisateur peut avoir demandé 1 lot standard, ou un calcul de risque qui équivaut à 1 lot standard, et diviser cette position en 3 transactions multiples.

    J'ai donc juste besoin du code pour diviser ce lot en 3 tailles paires, et évidemment prendre soin de l'arrondi correct des nombres et de la possibilité qu'il ne s'agisse pas de nombres pairs.

    Donc, je suppose que dans ce cas, il reviendrait avec 3 positions différentes de quelque chose comme:

    Poste 1 : 0,35
    Poste 2 : 0,35
    Poste 3 : 0,3

    Oh et si cela prend en compte la position minimale des courtiers, etc., ce serait bien.

    J'apprécie beaucoup votre temps.

  2. #2

    Citation Envoy? par ;
    hé, je voulais vous remercier pour cela - mais je viens de le tester et j'ai obtenu un résultat amusant en divisant 0,3 en 3 positions - il revient avec 1er pos = 0,09000000 2e pos = 0,10500000 3e pos = 0,10500000 impair ? je m'attendrais évidemment à ce que les 3 positions soient de 0,1
    Hé mec, c'est BIZARRE. Lorsque j'utilise la formule équivalente dans Excel (c'est-à-dire remplacer MathFloor() par INT()), cela fonctionne exactement comme prévu, c'est-à-dire lots1 = 0,1 lots2 = 0,1 lots3 = 0,1 Mais quand je l'essaie dans Go Markets MT4, j'obtiens lots1 = 0,09 lots2 = 0,10 lots3 = 0,11 Par conséquent, je pense qu'il y a un bogue d'arrondi dans la fonction MathFloor() de MT4. J'ai écrit une fonction MathInt() qui contourne ce bogue. Il arrondit le nombre 'n' DOWN à 'd' décimales. Si vous omettez le deuxième paramètre, il est supposé être 0 : par ex. MathInt(5.33,0) renverra 5 MathInt(5.99) renverra 5 (deuxième paramètre supposé être 0) MathInt(5.66,1) renverra 5.6 (arrondi à 1 décimale) Essayez ce qui suit (incluez MathInt() fonction à la fin de votre EA): Code inséré double minlot = MarketInfo(Symbol(),MODE_MINLOT); lots doubles = #91;lots à diviser#93;; lots doubles1 = minlot*#91;b#93;#91;color=red#93;MathInt#91;/color#93;#91;/b#93;(lots/3/minlot); double lots2 = minlot*#91;b#93;#91;color=Red#93;MathInt#91;/color#93;#91;/b#93;((lots-lots1)/2/minlot); lots doubles3 = lots-lots1-lots2 ; #91;b#93;#91;couleur=Rouge#93;// ------------------------------- ----------------------------------- double MathInt(double n, int d=0)/ -------------------------------------------------- ---------------- { return(MathFloor(n*MathPow(10,d) 0.000000000001)/MathPow(10,d)); } #91;/couleur#93;#91;/b#93; Il donne le résultat attendu sur GoMarkets MT4 : lots1 = 0,1 lots2 = 0,1 lots3 = 0,1 David ________________________________ [EDIT] Voici une fonction compagnon, MathFix(), juste au cas où vous en auriez besoin. Cela fonctionne exactement de la même manière que MathInt(), sauf qu'il arrondit le nombre sur une base de 5/4, au lieu d'arrondir vers le bas, par ex. MathFix(5.33,0) renverra 5 (arrondi vers le bas car 5.33 est inférieur à 5.5) MathFix(5.99) renverra 6 (arrondi vers le haut car 5.99 gt; 5.5; le second paramètre est supposé être 0) MathFix(5.66,1) renverra return 5.7 (arrondi à 1 décimale ; 5.66 gt; 5.65) Code inséré/ ------------------------------ ------------------------------------ double MathFix(double n, int d=0)/ ------------------------------------------------------------- ----------------- /Renvoie N arrondi à D décimales - contourne un bogue de précision dans MQL4 { return(MathRound(n*MathPow(10,d) 0.000000000001* MathSign(n))/MathPow(10,d)); } En d'autres termes, utilisez MathInt(n) au lieu de MathFloor(n) utilisez MathFix(n) au lieu de MathRound(n)

  3. #3
    hé, je voulais vous remercier pour cela - mais je viens de le tester et j'ai obtenu un résultat amusant en divisant 0,3 en 3 positions - il revient avec 1er pos = 0,09000000 2e pos = 0,10500000 3e pos = 0,10500000 impair ? je m'attendrais évidemment à ce que les 3 positions soient de 0,1

  4. #4

    Citation Envoy? par ;
    Une autre demande avant de commencer à pirater le code - en espérant que quelqu'un ait fait quelque chose de similaire. ........
    pipmyride, En supposant que je vous comprends bien, le code suivant doit diviser la valeur en lots en lots1, lots2, lots3, aussi uniformément que possible, de la manière que vous avez décrite, étant donné que la taille de lot/étape minimale autorisée par le courtier est minlot : Code inséré double minlot = MarketInfo(Symbol(),MODE_MINLOT); lots doubles = #91;lots à diviser#93;; lots doubles1 = minlot*MathFloor(lots/3/minlot); double lots2 = minlot*MathFloor((lots-lots1)/2/minlot); lots doubles3 = lots-lots1-lots2 ; Essayez-le et voyez. Si cela ne fonctionne pas, veuillez poster à nouveau et j'enquêterai plus avant. À votre santé, David [EDIT] Remarque : la taille de lot minimale autorisée est donnée par : double minlot = MarketInfo(Symbol(),MODE_MINLOT); La taille du pas est donnée par : double lotstep = MarketInfo(Symbol(),MODE_LOTSTEP);

  5. #5
    Cogner au cas où il aurait été négligé

  6. #6
    Quelque chose dans le sens de... Inserted Code double Lots = 9.7 int NumTrades = 3; double MinLot = MarketInfo(Symbole(), MODE_MINLOT); double MinTotal = NumTrades * MinLot ;/Déterminer le multiplicateur double MinlotTest = MinLot; int TenPower = 0 ; while(MinlotTest lt; 1.0) { MinLotTest *= 10.0; TenPower ; } if(Lots gt;= MinTotal) { Reste = MathMod(MathPow(10.0, TenPower * 1.0), NumTrades)MathPow(10.0, TenPower * 1.0); PerTrade = NormalizeDouble(MathPow(10.0, TenPower * 1.0)NumTrades, 0)MathPow(10.0, TenPower * 1.0); FirstTrade = PerTrade Reste ; } else { FirstTrade = Lots ; } OrderSend(FirstTrade); if(FirstTrade != Lots) { for(int Trades = NumTrades; Trades gt; 1; Trades--) { OrderSend(PerTrade); } } Quelque chose comme ca.

  7. #7
    Vous êtes le BOSS .. très apprécié comme d'habitude - je le testerai sous peu

Régles des messages

  • Vous ne pouvez pas cr?er de sujets
  • Vous ne pouvez pas r?pondre aux sujets
  • Vous ne pouvez pas importer de fichiers joints
  • Vous ne pouvez pas ?diter vos messages
  •  
  • Les BB codes sont Activés
  • Les Smileys sont Activés
  • Le BB code [IMG] est Activé
  • Le code [VIDEO] est Désactivé
  • Le code HTML est Désactivé
Le site d'sundytrading utilise des cookies
Le site d'sundytrading utilise des cookies pour vous assurer la meilleure expérience sur notre site ; certains sont déjà effectifs. Vous pouvez consulter plus de détails sur leurs usages ici. Veuillez cliquer sur le bouton à droite pour accepter nos cookies. Si vous continuez à utiliser le site internet d???sundytrading, nous considérerons que vous acceptez nos cookies.