Prix par tuyau - page 3

 

Hehe un autre client heureux :)- pendant que nous y sommes, LEHayes pourrait-il m'aider à calculer le money management en pourcentage sans arrondir les pips. Voici ce que j'utilise actuellement lorsque je veux miser 1% de l'équité de mon compte :

double Profit_F=0.00001,Lots=0.1;
Lots=NormalizeDouble((AccountEquity()*Profit_F),1) ;
si (Lots < 0.1) Lots=0.1 ;
si (Lots > 1,0) Lots=1,0 ;

Cela fonctionne très bien pour mon stoploss de 100 lorsque j'ai un compte de 10 000 $ par exemple. Car 10 000 $ X 0,00001 = 0,1 lot. Mais lorsque j'ai 15 000 $, la taille du lot est maintenant de 0,15, mais elle est arrondie à 2,0, peut-être parce que mon courtier n'autorise pas les macro-lots. Comment puis-je l'obliger à rester à 0,1 jusqu'à ce que l'équité atteigne 20 000 $ ? Je suis debout depuis longtemps, après avoir lu votre fil, je suis trop fatigué pour chercher et étudier. Si vous avez une autre équation pour calculer mm s'il vous plaît fournir à la place.

 
LEHayes:

Cela me rend fou, cela fait des mois que je cherche un algorithme existant qui ne fait rien d'autre que de calculer le prix par pip, quelle que soit la paire sur laquelle il se trouve. J'ai trouvé deux très bonnes stratégies de gestion de l'argent qui dépendent toutes deux de cette valeur pour précalculer la taille des transactions et la gestion du risque monétaire, mais je ne peux pas trouver un seul exemple de calcul qui gère le prix par pip.

Je suis prêt à vous offrir mon système de gestion de l'argent en échange de cette fonction. Je vous fournirai les deux techniques suggérées par les mentors avec lesquels j'ai travaillé.


Tout d'abord, nous devons reconnaître qu'il existe cinq types de symboles de base. Cela est important lorsqu'il s'agit de questions telles que le calcul de la tick_value, l'effet de levier, etc.

Il n'existe pas de définition formelle du type de symbole, mais pour un compte libellé en USD, voici comment j'énumère les types de symboles : (il s'agit d'exemples spécifiques, non exhaustifs)
            SymbolType 1:  Symbol() = USDJPY
                           
                           Base = USD
                           Counter = JPY
            
            SymbolType 2:  Symbol() = EURUSD
                           
                           Base = EUR
                           Counter = USD

            SymbolType 3:  Symbol() = CHFJPY
                           
                           Base = CHF
                           Counter = JPY
                           
                           USD is base to the base currency pair - USDCHF
                           
                           USD is base to the counter currency pair - USDJPY
            
            SymbolType 4:  Symbol() = AUDCAD
                           
                           Base = AUD
                           Counter = CAD
                           
                           USD is counter to the base currency pair - AUDUSD
                           
                           USD is base to the counter currency pair - USDCAD
            
            SymbolType 5:  Symbol() = EURGBP
                           
                           Base = EUR
                           Counter = GBP
                           
                           USD is counter to the base currency pair - EURUSD
                           
                           USD is counter to the counter currency pair - GBPUSD

La pertinence est la façon dont la dénomination du compte est liée à la devise de base et à la contre devise de l'instrument financier en question. Il en va de même pour les CFD et les paires de devises.

Une fois que vous avez le type de symbole, vous pouvez alors calculer le levier par instrument financier - par exemple, voici le code nécessaire pour calculer le levier pour AUDCAD :

CalculatedLeverage=NormalizeDouble(MarketInfo(Symbol(),MODE_LOTSIZE)*(MarketInfo(CalculatedBasePairForCross,MODE_BID)+MarketInfo(CalculatedBasePairForCross,MODE_ASK))/(2*MarketInfo(Symbol(),MODE_MARGINREQUIRED)),2)
Dans cet exemple, la fonction d'appel que j'ai codée aurait déjà déterminé que pour AUDCAD la CalculatedBasePairForCross est AUDUSD :
CalculatedBasePairForCross=StringConcatenate(SymbolBase,AccountCurrency(),postfix);
Et le SymbolBase (c'est-à-dire la devise de base de l'instrument financier Symbol()) est :
SymbolBase=StringSubstr(Symbol(),0,3);
Et ainsi de suite.

Pour le calcul de la valeur du tick, vous devez tenir compte du type de symbole, car il est important lorsque l'évaluation change à la fois dans l'instrument financier concerné - Symbol() - et dans la paire de devises de connexion qui mène à la dénomination du compte. En poursuivant l'exemple ci-dessus, où nous discutons du type de symbole 4 - AUDCAD lorsque le compte est libellé en USD - la valeur du tick est explicitement définie comme suit :

CalculatedTickValue=MarketInfo(Symbol(),MODE_POINT)*MarketInfo(Symbol(),MODE_LOTSIZE)/MarketInfo(CalculatedCounterPairForCross,MODE_BID)
Où la variable CalculatedCounterPairForCross pour AUDCAD a été précédemment déterminée comme étant USDCAD :
CalculatedCounterPairForCross=StringConcatenate(AccountCurrency(),SymbolCounter,postfix);
Et SymbolCounter a été déterminé par :
SymbolCounter=StringSubstr(Symbol(),3,3);

En programmant le calcul de ces valeurs explicitement de cette manière, vous pouvez déterminer les informations de marché sans tenir compte des courtiers.

Gardez à l'esprit que le code ici n'est utile que pour symboltype = 4 dans lequel la devise de dénomination du compte est la contre devise lorsqu'elle est appariée avec la devise de base de Symbol() et de même la devise de dénomination du compte est la devise de base lorsqu'elle est appariée avec la contre devise qui forme la paire Symbol().

(AUDCAD -> AUDUSD & USDCAD)

Il s'avère que, bien qu'il existe cinq types de symboles universels, vous n'avez besoin d'en classer que quatre pour calculer l'effet de levier, la marge et la valeur du tick. Et les mathématiques ne deviennent un point de friction spécifique que lorsqu'il s'agit de paires de devises croisées par rapport à la dénomination du compte.

J'ai élaboré les relations spécifiques entre toutes les combinaisons de base et de contrepartie parce que mon approche de la gestion de l'argent consiste à définir explicitement la valeur à risque de perte pour chaque transaction et cela nécessite de connaître exactement la valeur de prix à laquelle la transaction doit être sortie de manière à ce que la perte respecte le budget des pertes défini précédemment. Pour les paires croisées, il s'avère naturellement que la valeur à risque est basée sur le prix des deux paires de devises à un instant donné (à moins que vous ne vous couvriez contre l'une ou l'autre).

Cette information est-elle d'une quelconque utilité ?

 
cloudbreaker:

TICKVALUE, lorsqu'il est utilisé seul, peut être peu fiable.

Il serait intéressant de savoir à quel(s) courtier(s) cela s'applique, ou s'il y a d'autres considérations telles que l'ouverture/la fermeture du marché. Je n'ai jamais été en mesure de reproduire vos résultats.

 
Ha ha. Je réalise que JJC. Mais ça ne fait pas de mal d'utiliser le ratio. Le plus souvent, on divise par 1. Il vaut mieux prévenir que guérir, non ? CB
 
1005phillip:

Cette information est-elle utile ?

Je n'ai jamais remarqué la distinction que vous faites entre les symboles de type 3-5 (ou peut-être n'y ai-je pas pensé dans ce contexte). Quoi qu'il en soit, cela donne matière à réflexion... Félicitations pour cet excellent résumé !
 

Je n'avais jamais réalisé qu'il y avait tant de choses à faire pour calculer la valeur d'un pip, dans mon EA je le faisais en laissant l'EA le calculer en utilisant le premier ordre ouvert, si c'est un achat, le prix actuel de l'offre - le prix de l'ordre ouvert / le profit de l'ordre = la valeur du pip dans la devise de base actuelle, ou si c'est une vente, l'offre actuelle + le prix ouvert / le profit de l'ordre = la valeur du pip, est-ce que cela ne va pas fonctionner correctement ?

Edit : Je réalise que j'ai écrit cela à l'envers, je voulais dire orderprofit/(currentbid-openprice)=valeur du pip.

 
SDC:

je n'avais jamais réalisé qu'il y avait tant de choses à faire pour calculer la valeur d'un pip, dans mon EA je le faisais en laissant l'EA le calculer en utilisant le premier ordre ouvert si c'est un achat, prix actuel de l'offre - prix ouvert de l'ordre /profit de l'ordre = valeur du pip dans la devise de base actuelle, ou si c'est une vente, prix actuel+prix ouvert/profit de l'ordre=valeur du pip, est-ce que cela ne va pas fonctionner correctement ?


Ce calcul est valable dans la mesure où chaque pip a la même valeur, quel que soit le cours acheteur ou vendeur actuel.

Ceci est rigoureusement vrai pour les paires de devises qui sont de type de symbole = 2 comme je les ai définies ci-dessus, c'est-à-dire EURUSD, etc. (toute paire de devises dans laquelle la dénomination du compte est la contre devise de la paire).

Pour la plupart des gens, les différences ne sont pas susceptibles d'avoir de l'importance, les erreurs résultantes sont faibles. Dans mon cas, je voulais calculer de manière robuste les valeurs avec des expressions analytiques correctes.

Par exemple, si je budgétise 200 $ pour la perte maximale possible sur une transaction à venir et que mes stops sont fixés à 200 points, je veux connaître la taille du lot pour mon ordre de sorte que mes pertes ne puissent pas dépasser 200 $... pour être robuste à ce sujet, je dois calculer correctement l'évaluation du pip au point du prix du stop-loss. L'improvisation n'était pas une option acceptable pour moi ou mes clients ;)
 

Je suis heureux que LEHayes ait résolu le problème. Et Phillip, tu as complètement démystifié TickValue & layout pairs-synthesizing très bien pour que tout le monde en profite. C'est génial !

Je voudrais juste ajouter : les opérations de synthèse ...

CalculatedCounterPairForCross=StringConcatenate(AccountCurrency(),SymbolCounter,postfix);

SymbolCounter=StringSubstr(Symbol(),3,3);

... doivent faire attention à l'appendice supplémentaire comme USDJPYm dans certains courtiers de mini-lots. Je ne sais pas si un courtier peut modifier les six premières lettres des symboles en mettant ou en ajoutant une lettre devant ou entre la base et le compteur, si vous cherchez la robustesse, IMO lire à partir d'un fichier .set ou .sel est un pari plus sûr.

 
cameofx:

Je suis heureux que LEHayes ait résolu le problème. Et Phillip, tu as complètement démystifié TickValue & layout pairs-synthesizing très bien pour que tout le monde en profite. C'est génial !

Je voudrais juste ajouter : les opérations de synthèse ...

CalculatedCounterPairForCross=StringConcatenate(AccountCurrency(),SymbolCounter,postfix);

SymbolCounter=StringSubstr(Symbol(),3,3);

... doivent faire attention à l'appendice supplémentaire comme USDJPYm dans certains courtiers de mini-lots. Je ne sais pas si un courtier peut modifier les six premières lettres des symboles en mettant ou en ajoutant une lettre devant ou entre la base et le compteur, si vous cherchez la robustesse, IMO lire à partir d'un fichier .set ou .sel est un pari plus sûr.


Bon point ! Cependant, je ne cherche pas ce genre de robustesse lorsque je parle de calculs robustes.

Les courtiers peuvent nommer leurs paires de devises comme ils le veulent, on pourrait espérer que j'aurais la présence d'esprit de le remarquer et de modifier mes codes en conséquence avant d'essayer de faire du commerce en direct avec un nouveau courtier utilisant le symbole de devise lovelyUSDmoonCADcheese ! :P

Ce code traite simplement 100% des cas que j'ai rencontrés jusqu'à présent (Alpari, CitiFX, CMS forex, forex.com, FXCM, FXDD, IBFX, MIG, et ODL)... Je ne m'inquiète pas de le rendre à l'épreuve du futur, simplement à l'épreuve du présent. Maintenant, si vous avez quelque chose en tête pour le rendre à l'épreuve du futur... c'est le bon moment pour dire ce que vous pensez :)

 

lovelyUSDmoonCADcheese! ...

Lol ! J'ai vu des courtiers qui ont mal saisi la description du symbole dans la propriété du symbole (pas le paramètre Symbol(), mais ils doivent aussi le saisir à un moment donné !) Qui sait ! :))

Je ne peux pas dire si cela serait jamais 100% infaillible (qu'est-ce qui l'est ?). Mais je pense à quelque chose comme ceci :

  • créer une liste/inventaire des noms de base/compteur possibles en 3 lettres majuscules.
  • Lire la chaîne de paire à partir de .set ou .sel.
  • Rechercher une correspondance possible en déplaçant une lettre à la fois. En ignorant l' acceptation des combinaisons majuscules/minuscules possibles (la valeur ASCII serait différente de x entiers, à vérifier), nous pouvons utiliser une boucle pour mettre toutes les lettres en majuscules par exemple.
  • Si une correspondance est trouvée, enregistrez-la comme nom de "courtier"/"alias" par opposition au nom d'"inventaire" que nous avons. Continuez à chercher la deuxième partie de la paire et faites de même.
  • Nous devons également vérifier si un nom de base/compteur est cohérent à travers tous les Symbol(). Et sauvegarder également ses 'alias'.
  • utiliser les alias pour synthétiser la paire.
  • si un nouveau nom de base/compteur est modifié ou ajouté. Ajoutez-le aux alias.

Il y a quelque temps, Gordon m'a fait part de son point de vue sur les mérites d'un contrôle automatique infaillible dans un EA. Ayant cela à l'esprit (et le respectant), je continue à penser que cela peut être quelque chose de valable, même juste pour le plaisir ! :)