ProRealCode - Trading & Coding with ProRealTime™
Bonjour
Débutant en programmation, et nouvel utilisateur du forum, bien que retraité, j’ai besoin de votre aide
Je voudrais écrire un code qui utilise le résultat journalier fixe, gain ou perte d’une stratégie pour faire varier à la hausse ou à la baisse le nombre de contrats achetés les jours suivants.
Dans l’exemple joint : DAX 3 minutes
Je souhaite
Exemple :
Jour 1 n=1 gain
Jour 2 n=1 gain
Jour3 n=1 perte
Jour4 n=2 perte
Jour5 n=3 gain
Jour6 n=2 gain
Jour7 n=1 gain
Jour8 n=1 ………
Merci d’avance
// Définition des paramètres du code
DEFPARAM CumulateOrders = False // Cumul des positions désactivé
// Annule tous les ordres en attente et ferme toutes les positions à 0:00, puis empêche toute création d'ordre avant l'heure "FLATBEFORE".
DEFPARAM FLATBEFORE = 090000
// Annule tous les ordres en attente et ferme toutes les positions à l'heure "FLATAFTER"
DEFPARAM FLATAFTER = 171500
// Empêche le système de placer de nouveaux ordres sur les jours de la semaine spécifiés
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
// Gain et perte journalière (20 avec stoploss)
MaxDailyprofit= 20//Max daily loss allowed (in money)
MaxDailyLoss= 3 //Max daily loss allowed (in money)
// first time we launch the code, the trading is allowed
once TradeAllowed=1
// first time we launch the code, the number of contracts is 1
once n = 1
// reset the current state of the strateygprofit each new day
If intradaybarindex=0 then
MyProfit=STRATEGYPROFIT
DailyProfit=0
TradeAllowed=1
endif
//compute live daily profit & automatic takeprofit
dailyprofit = strategyprofit-myprofit
autotakeprofit = MaxDailyProfit-dailyprofit
If StrategyProfit>=MyProfit+MaxDailyProfit or Strategyprofit<=MyProfit-MaxDailyLoss then
EXITSHORT AT MARKET
TradeAllowed=0
endif
// Conditions pour ouvrir une position acheteuse
indicator1 = Average[20](close)
indicator2 = Average[20](close)
c1 = (indicator1 > indicator2[1])
IF c1 AND not daysForbiddenEntry and tradeallowed = 1 THEN
BUY n CONTRACT AT MARKET
ENDIF
// Conditions pour fermer une position acheteuse
indicator3 = Average[20](close)
indicator4 = Average[50](close)
c2 = (indicator3 <= indicator4[1])
IF c2 THEN
SELL AT MARKET
ENDIF
// Conditions pour ouvrir une position en vente à découvert
indicator5 = Average[20](close)
indicator6 = Average[20](close)
c3 = (indicator5 < indicator6[1])
IF c3 AND not daysForbiddenEntry and tradeallowed = 1 THEN
SELLSHORT n CONTRACT AT MARKET
ENDIF
// Conditions pour fermer une position en vente à découvert
indicator7 = Average[20](close)
indicator8 = Average[20](close)
c4 = (indicator7 >= indicator8[1])
IF c4 THEN
EXITSHORT AT MARKET
ENDIF
// Stops et objectifs
SET STOP pLOSS 20
SET TARGET $Profit autotakeprofit
Entre les lignes 19 et 20 insérez ces lignes (je ne l'ai pas essayé):
If StrategyProfit > StrategyProfit[1] Then
n = max(1,n - 1)
Elsif StrategyProfit < StrategyProfit[1] Then
n = n + 1
Endif
Bonjour,
Désolé toutes les études statistiques (Et j’ai fit pas mal de Code auto sur ce sujet) montrent que les martingales ne fonctionnent pas notamment car à un moment on est limité par le capital
Ce qui est important c’est la régularité, plus vite on peut gagner, plus vite on peut perdre
Très bonne fin de journée
Avant tout un grand merci Roberto
J’ai appliqué la modification, il reste un problème voici le résultat :
J
// Définition des paramètres du code
DEFPARAM CumulateOrders = False // Cumul des positions désactivé
// Annule tous les ordres en attente et ferme toutes les positions à 0:00, puis empêche toute création d'ordre avant l'heure "FLATBEFORE".
DEFPARAM FLATBEFORE = 090000
// Annule tous les ordres en attente et ferme toutes les positions à l'heure "FLATAFTER"
DEFPARAM FLATAFTER = 171500
// Empêche le système de placer de nouveaux ordres sur les jours de la semaine spécifiés
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
// Gain et perte journalière (20 avec stoploss)
MaxDailyprofit= 20//Max daily loss allowed (in money)
MaxDailyLoss= 3 //Max daily loss allowed (in money)
// first time we launch the code, the trading is allowed
once TradeAllowed=1
// first time we launch the code, the number of contracts is 1
once n = 1
if strategyprofit>strategyprofit[1] then
n =max(1, n-1)
elsif strategyprofit<strategyprofit[1] then
n =n+1
endif
// reset the current state of the strateygprofit each new day
If intradaybarindex=0 then
MyProfit=STRATEGYPROFIT
DailyProfit=0
TradeAllowed=1
endif
//compute live daily profit & automatic takeprofit
dailyprofit = strategyprofit-myprofit
autotakeprofit = MaxDailyProfit-dailyprofit
If StrategyProfit>=MyProfit+MaxDailyProfit or Strategyprofit<=MyProfit-MaxDailyLoss then
EXITSHORT AT MARKET
TradeAllowed=0
endif
// Conditions pour ouvrir une position acheteuse
indicator1 = Average[20](close)
indicator2 = Average[20](close)
c1 = (indicator1 > indicator2[1])
IF c1 AND not daysForbiddenEntry and tradeallowed = 1 THEN
BUY n CONTRACT AT MARKET
ENDIF
// Conditions pour fermer une position acheteuse
indicator3 = Average[20](close)
indicator4 = Average[50](close)
c2 = (indicator3 <= indicator4[1])
IF c2 THEN
SELL AT MARKET
ENDIF
// Conditions pour ouvrir une position en vente à découvert
indicator5 = Average[20](close)
indicator6 = Average[20](close)
c3 = (indicator5 < indicator6[1])
IF c3 AND not daysForbiddenEntry and tradeallowed = 1 THEN
SELLSHORT n CONTRACT AT MARKET
ENDIF
// Conditions pour fermer une position en vente à découvert
indicator7 = Average[20](close)
indicator8 = Average[20](close)
c4 = (indicator7 >= indicator8[1])
IF c4 THEN
EXITSHORT AT MARKET
ENDIF
// Stops et objectifs
SET STOP pLOSS 20
SET TARGET $Profit autotakeprofit
our 1 n=1 perte 20
Jour 2 n= 2 perte 40
Jour3 n =1 gain 20 ici n aurait dû être égal à 3 et le gain de 60.
Je vous joins le code corrigé et le tableau des résultats.
Bien cordialement
Jean
Merci Zilliq pour ta mise en garde
Bien cordialement
jean
Je ne sais pas comment se fait le calcul PERF.ABS.
Excuse moi Roberto, je n’ai pas ta pratique et le terme PERF.ABS ne me parle pas.
Avec la correction que tu m’as indiquée, que j’ai incluse dans le dernier code ci-dessus, voici le résultat : (Résultats du tableau joins plus haut dans mon dernier message pour la période du 9 juillet au 7 août)
Pour un strategyprofit journalier de 20€ :
Avec la correction que tu m’as indiquée, que j’ai incluse dans le dernier code ci-dessus, voici le résultat :
Pour un strategyprofit journalier de 20€ :
9 Juillet perte n=1 -20 ok
10 Juillet perte n=2 -40 ok
13 Juillet gain n=1 +20 problème pour le jour 3, n devrait être égal à 3 et donner un profit de 60, ce n’est pas le cas.
14 Juillet gain n =1 +20 ……
Bien cordialement
Le code qu’a donné Roberto doit être placé juste avant de lancer les ordres (dans le même bloc conditionnel), sinon à chaque lecture du code, la variable n sera recalculé et la taille de position ajustée, même si on ne rentre pas au marché (pas de conditions pour).
Roberto, Nicolas,
Merci pour votre implication.
Roberto, en vérifiant, je vois que le code fonctionne au niveau de l’augmentation et de la diminution du nombre de contrats.
Je pense que si l’évolution du nombre de contrats est résolue, il doit rester un problème au niveau du stratégyprofit en fonction de l’évolution de n.
Car le Perf Abs ne semble pas refléter le nombre de contrats n.
Nicolas j’ai déplacé le code de Roberto, mais cela ne change rien.
Je continue à travailler sur le code.
Je joins le dernier code en vigueur.
Bien Cordialement
// Définition des paramètres du code
DEFPARAM CumulateOrders = False // Cumul des positions désactivé
// Annule tous les ordres en attente et ferme toutes les positions à 0:00, puis empêche toute création d'ordre avant l'heure "FLATBEFORE".
DEFPARAM FLATBEFORE = 090000
// Annule tous les ordres en attente et ferme toutes les positions à l'heure "FLATAFTER"
DEFPARAM FLATAFTER = 171500
// Empêche le système de placer de nouveaux ordres sur les jours de la semaine spécifiés
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
// Gain et perte journalière (20 avec stoploss)
MaxDailyprofit= 20//Max daily loss allowed (in money)
MaxDailyLoss= 3 //Max daily loss allowed (in money)
// first time we launch the code, the trading is allowed
once TradeAllowed=1
// first time we launch the code, the number of contracts is 1
once n = 1
// reset the current state of the strateygprofit each new day
If intradaybarindex=0 then
MyProfit=STRATEGYPROFIT
DailyProfit=0
TradeAllowed=1
endif
//compute live daily profit & automatic takeprofit
dailyprofit = strategyprofit-myprofit
autotakeprofit = MaxDailyProfit-dailyprofit
If StrategyProfit>=MyProfit+MaxDailyProfit or Strategyprofit<=MyProfit-MaxDailyLoss then
EXITSHORT AT MARKET
TradeAllowed=0
endif
// Conditions pour ouvrir une position acheteuse
indicator1 = Average[20](close)
indicator2 = Average[20](close)
c1 = (indicator1 > indicator2[1])
if strategyprofit>strategyprofit[1] then
n =max(1, n-1)
elsif strategyprofit<strategyprofit[1] then
n =n+1
endif
IF c1 AND not daysForbiddenEntry and tradeallowed = 1 THEN
BUY n CONTRACT AT MARKET
ENDIF
// Conditions pour fermer une position acheteuse
indicator3 = Average[20](close)
indicator4 = Average[50](close)
c2 = (indicator3 <= indicator4[1])
IF c2 THEN
SELL AT MARKET
ENDIF
// Conditions pour ouvrir une position en vente à découvert
indicator5 = Average[20](close)
indicator6 = Average[20](close)
c3 = (indicator5 < indicator6[1])
IF c3 AND not daysForbiddenEntry and tradeallowed = 1 THEN
SELLSHORT n CONTRACT AT MARKET
ENDIF
// Conditions pour fermer une position en vente à découvert
indicator7 = Average[20](close)
indicator8 = Average[20](close)
c4 = (indicator7 >= indicator8[1])
IF c4 THEN
EXITSHORT AT MARKET
ENDIF
// Stops et objectifs
SET STOP pLOSS 20
SET TARGET $Profit autotakeprofit
Tu n’as pas compris, le calcul de taille de position doit être placé juste avant la ligne BUY et aussi celle avant le SELLSHORT, car c’est à ces moments précis où tu dois choisir ta taille de lot et pas à chaque lecture du code.
Je n’ai pas pu tester mais c’est la première chose à laquelle je pense, il y a peut-être autre chose à vérifier.
Ajoutez ces lignes à la fin du code pour voir la valeur que les variables ont à chaque barre:
Graph n
Graph autotakeprofit
Graph StrategyProfit
graph DailyProfit
Cependant, le problème est que vous avec
$Profit
vous avez limité le bénéfice à 20 €, que ce soit 1 contrat ou 3 contrats. Remplacez-le par:
pProfit
et vous verrez que cela fonctionne comme vous le souhaitez.
Essayez-le aussi avec:
SET TARGET $Profit autotakeprofit * n
Bonjour Nicolas
J’avais fait l’essai en déplaçant le code de Roberto, mais le résultat était moins bon, n restait à la valeur 1, maintenant j’ai peut-être mal placé le code, je joins le code.
Le problème vient du Perf Abs car avec le code de Roberto positionné entre les lignes 19 et 20, on obtient bien le résultat souhaité au niveau des contrats, lors d’une perte n augmente, lors d’un gain n diminue.
Comme me l’a fait remarquer Roberto dans sa pièce jointe du 08 09 à 4 pm, n varie bien, mais la variation du Perf Abs pose problème
Le 9 juillet 1 contrat perte Perf Abs -20 € ok
Le 10 juillet 2 contrats perte Perf Abs – 40€ ok
Le 13 juillet 3 contrats gain Perf Abs +20,1€ Problème, le Perf Abs aurait du être de 60 €
Le 14 juillet 2 contrats gain Perf Abs +20€ Problème, le Perf Abs aurait du être de 40 €
Est-ce que le Strategyprofit est la bonne référence ???
Bien cordialement
// Définition des paramètres du code
DEFPARAM CumulateOrders = False // Cumul des positions désactivé
// Annule tous les ordres en attente et ferme toutes les positions à 0:00, puis empêche toute création d'ordre avant l'heure "FLATBEFORE".
DEFPARAM FLATBEFORE = 090000
// Annule tous les ordres en attente et ferme toutes les positions à l'heure "FLATAFTER"
DEFPARAM FLATAFTER = 171500
// Empêche le système de placer de nouveaux ordres sur les jours de la semaine spécifiés
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
// Gain et perte journalière (20 avec stoploss)
MaxDailyprofit= 20//Max daily loss allowed (in money)
MaxDailyLoss= 3 //Max daily loss allowed (in money)
// first time we launch the code, the trading is allowed
once TradeAllowed=1
// first time we launch the code, the number of contracts is 1
once n = 1
// reset the current state of the strateygprofit each new day
If intradaybarindex=0 then
MyProfit=STRATEGYPROFIT
DailyProfit=0
TradeAllowed=1
endif
//compute live daily profit & automatic takeprofit
dailyprofit = strategyprofit-myprofit
autotakeprofit = MaxDailyProfit-dailyprofit
If StrategyProfit>=MyProfit+MaxDailyProfit or Strategyprofit<=MyProfit-MaxDailyLoss then
EXITSHORT AT MARKET
TradeAllowed=0
endif
// Conditions pour ouvrir une position acheteuse
indicator1 = Average[20](close)
indicator2 = Average[20](close)
c1 = (indicator1 > indicator2[1])
IF c1 AND not daysForbiddenEntry and tradeallowed = 1 then
if strategyprofit>strategyprofit[1] then
n =max(1, n-1)
elsif strategyprofit<strategyprofit[1] then
n =n+1
endif
BUY n CONTRACT AT MARKET
ENDIF
// Conditions pour fermer une position acheteuse
indicator3 = Average[20](close)
indicator4 = Average[50](close)
c2 = (indicator3 <= indicator4[1])
IF c2 THEN
SELL AT MARKET
ENDIF
// Conditions pour ouvrir une position en vente à découvert
indicator5 = Average[20](close)
indicator6 = Average[20](close)
c3 = (indicator5 < indicator6[1])
IF c3 AND not daysForbiddenEntry and tradeallowed = 1 THEN
if strategyprofit>strategyprofit[1] then
n =max(1, n-1)
elsif strategyprofit<strategyprofit[1] then
n =n+1
endif
SELLSHORT n CONTRACT AT MARKET
ENDIF
// Conditions pour fermer une position en vente à découvert
indicator7 = Average[20](close)
indicator8 = Average[20](close)
c4 = (indicator7 >= indicator8[1])
IF c4 THEN
EXITSHORT AT MARKET
ENDIF
// Stops et objectifs
SET STOP pLOSS 20
SET TARGET $Profit autotakeprofit
Pour être clair, on doit garder la même taille de contrat toute la journée ? La taille varie donc une seule fois par jour en fonction des gains/pertes de la veille ? Ai-je bien compris ? 🙂
Calcul de position de type Martingale en fonction des résultats de la veille
This topic contains 15 replies,
has 4 voices, and was last updated by jeannord
5 years, 7 months ago.
| Forum: | ProOrder : Trading Automatique & Backtests |
| Language: | French |
| Started: | 08/08/2020 |
| Status: | Active |
| Attachments: | 7 files |
The information collected on this form is stored in a computer file by ProRealCode to create and access your ProRealCode profile. This data is kept in a secure database for the duration of the member's membership. They will be kept as long as you use our services and will be automatically deleted after 3 years of inactivity. Your personal data is used to create your private profile on ProRealCode. This data is maintained by SAS ProRealCode, 407 rue Freycinet, 59151 Arleux, France. If you subscribe to our newsletters, your email address is provided to our service provider "MailChimp" located in the United States, with whom we have signed a confidentiality agreement. This company is also compliant with the EU/Swiss Privacy Shield, and the GDPR. For any request for correction or deletion concerning your data, you can directly contact the ProRealCode team by email at privacy@prorealcode.com If you would like to lodge a complaint regarding the use of your personal data, you can contact your data protection supervisory authority.