Bonjour,
j’ai développé un Robot qui intègre lui même 3 sous robots (disons conditions pour faire moins pompeux ). Donc, ce code génère des positions de 3 manières différentes et indépendante. (Ichi, RSI et Stoch ). Actuellement le choix des conditions à utilisé ce fait en fonction de la volatilité à l’instant T. Çà fonction plutôt bien.
J’aimerai optimiser ce système avec la création d’un code qui permette de tester mes 3 conditions dans le passé.
Sur la base d’une moyenne de positions gagnées fictives (+ réel si existantes ) détermine quelle conditions utilisé pour la position à venir et mettre les autres conditions sur off. Il faudrait que cet sorte de test soit permanent et glissant dans le temps.
Par exemple:
Si simulation dans le passé donne le résulta suivant: condition1 = gain 3, perte 0 / condition2 = gain 1, perte 2 / condition3= gain 2,perte=1
Dans ce cas, les conditions à retenir pour la prochaine prise de position sera le N°1 le reste sur off.
Le teste étant glissant le résultat changera au fur et à mesure du temps.
Mais si que tout les robots testés on des résultats inférieur à 75 % de taux de réussite ils passeraient tous en off en attendant un retour de conditions favorable.
Voilà l’idée.
Que l’on utilise une ou trois conditions d’achats, je pense que cela pourrait apporter une nette amélioration de toutes les stratégies , mais comment coder cela ???
Je compte sur les plus créatif et qualifiés d’entre nous. j’espère qu’on arrivera à avancer tous ensemble.
En attendant vous pouvez commencer à poster vos idées et ébauche de code.
Je compte bien entendu sur ta collaboration @Nicolas 🙂
Merci.
“en fonction de la volatilité”, cela suppose qu’il faudrait tester ces 3 types de trade fictifs confronter à plusieurs critères déterminant cette volatilité (je n’ai pas d’idée de comment tu la testes), de les comparer, de les classer, puis d’indiquer un résultat. Désolé, mais cela implique la création de tableaux de données dynamiques et multi dimensionnelles, puisqu’on ne peut pas connaître à l’avance la quantité de variables nécessaires et puisqu’il faudrait également faire des boucles entre des variables dynamiques, bref.. on ne peut pas le coder sous la forme actuelle du langage de programmation.
Je sais que PRT travaille à l’idée d’incorporer des tableaux de données (arrays), mais ça n’est pas pour tout de suite.
Une idée simple, c’est de séparer ces 3 stratégies en stratégie individuelle, de tester les résultats en “fonction de la volatilité” avec l’optimiseur de variables, de constater le bon compromis, puis d’introduire ces paramétries dans le robot global en configurant un switch en fonction de celles-ci pour activer ou non telle ou telle stratégie. J’espère avoir été clair.
L’optimisation des progs par rapport a un niveau de volatilité c’est exactement ce que je fais actuellement et ça fonctionne correctement. j’ai simplement déterminé quel prog à utilisé en fonction d’un fourchette volatilité (ex: if vola>=10 AND vola<20 then Prog 1 =1 )
Ce que je voudrait, c’est oublier la volatilité pour sélectionner les bonnes conditions.
j’aimerai trouver une autre manière de sélectionner mes sous programes.
j’aimerai faire cela en fonction des résultats passé (fictif ou existant).
Remarque je suis ouvert à d’autres solution mais mon idée me parait prometteuse même si elle demande certainement pas mal de codage
Vola = ((AverageTrueRange[14](close))
once vola=0 and MM=0 and SL=0 and C1=0 and RS=0
if vola>=60 AND vola<=90 then
MM=21
SL=45
RS=6
C1=RSI[RS](close) crosses over 26 and Stochastic[175,21](close)> 30//***C1
endif
@Nicolas
Pour faire plus simple:
On vas oublié la volatilité car ça complique vraiment la tache. On vas resté uniquement sur des positions réel du passé.
Je pense qu’il est possible de créer une boucles dans lequel tourne un de mes programmes. Si pendant la duré de la boucle, le nombre de positions gagnantes représente 75 % de réussite alors la condition est valide. Donc si valide 1=on else 0= off
Sachant que mon robot tourne en M1 et j’aimerai qu’il soit tester sur un semaine il faudrait que la boucle fasse 7 j x 24 h x 60 min =10 080 bougies de M1
time = 0
while time <10080 do
time=time
wend
Pour commencer, je pense que ma boucle est certainement fausse. De plus, il me semble qu’on sera limité à une journée soit 24h x 60= 1440 et non 10 080
Après, comment je peux insérer le teste de mon robot dans cette boucle et comment je peux déterminer sont taux de réussite et en fonction du résultat rendre la condition valide ou pas.
Dans ce cas faut-il aussi créer un des tableaux de données?
Arriverais-tu à écrire un code différent mais qui pourrait remplir la fonction décrite plus haut ?
Une boucle de 10.000 bougies me semble trop importante pour ProBacktest/ProOrder. Une solution plus viable serait d’utiliser une boucle dans les ordres, au lieu du temps (bougies) et de l’arrêter lorsque l’on trouver que le barindex de l’ordre date d’il y a une semaine, un code vite fait, à tester:
gain=0
ordre=0
//boucle dans les 1000 derniers ordres
for i = 1 to 1000 do
distance=barindex-tradeindex(i)<10080//si l'ordre n'a pas plus d'1 semaine
if distance then
ordre=ordre+1
if positionperf(i)>0 then
gain=gain+1
endif
endif
if not distance then
break
endif
next
ratio = gain/ordre
La variable ratio devrait donner la valeur en 1/100 de réussite.
Super Nicolas, merci.
j’ai 2 hypothèses:
j’intègre ton code directement dans le mon pro-order
ou
Je transforme mon robot + ton code en indicateur (sans la boucle mais en gardant la limitation de une semaine)
Ça devrais me données des positions de références fictives et me permettre de démarrer mon pro-Order avec un historique existant
Dans mon Pro-order j’utilise la fonction:
//c1= conditions du robot identique à l'indicateur créer avec l'aide ton code.
if call "my indicator">75 then
on=1
else
on=2
endif
if C1 and on then
buy 1 contrat at market
endif
quand pense tu ?
//c1= conditions du robot identique à l'indicateur créer avec l'aide ton code.
if call "my indicator">75 then
on=1
else
on=0
endif
if C1 and on then
buy 1 contrat at market
endif
l’option de l’indicateur permet entre autre de remettre le Pro-order en route quand les conditions de gain sont de nouveaux réuni
Les instructions utilisées dans le code que j’ai fourni ne sont compatibles qu’avec ProBacktest, impossible de l’utiliser en indicateur et de l’appeler en CALL.
Par ailleurs, le code donne un ratio et non un pourcentage, donc lire 0.75 plutôt que 75.
bonjour,
Existe t’il un indicateur sonore avec l’indicateur Ichimoku qui me signale la cloture de la bougie sous ou sur la kijun ?
Merci pour votre aide
j’ai testé ton code sur une stratégie simpliste au possible et ça ne fonctionne pas. J’ai beau chercher dans ma stratégie et ton code je ne vois pas d’ou cela peut venir.
Si dessous une stratégie faite à la volé sur Eur/Usd M1. Que tu mette 10% ou 90% tu as toujours le même nombre de positions et aucun stop de la stratégie. j’ai essayé de ré-initialisé la variable “ratio” mais sans succès non plus. Pourrais-tu jeter un œil STP
// Définition des paramètres du code
DEFPARAM CumulateOrders = False // Cumul des positions désactivé
// Empêche le système de placer des ordres pour entrer sur le marché ou augmenter la taille d'une position avant l'heure spécifiée
noEntryBeforeTime = 080000//
timeEnterBefore = time >= noEntryBeforeTime
//Empêche le système de placer des ordres pour entrer sur le marché ou augmenter la taille d'une position après l'heure spécifiée
noEntryAfterTime = 200000//
timeEnterAfter = time < noEntryAfterTime
IF ONMARKET AND DAYOFWEEK=5 AND TIME>=215900 THEN//Pour les gaps du lundi matin.
SELL AT MARKET
EXITSHORT AT MARKET
ENDIF
//STOP SI MOINS DE X% DE REUSSISTE
gain=0
ordre=0
//boucle dans les 1000 derniers ordres
for i = 1 to 1000 do
distance=barindex-tradeindex(i)<10080//si l'ordre n'a pas plus d'1 semaine
if distance then
ordre=ordre+1
if positionperf(i)>0 then
gain=gain+1
endif
endif
if not distance then
break
endif
next
ratio = gain/ordre
//ONCE RATIO=0
If ratio<90 then //% de réussite pour maintien de la stratégie
ON=1
else
ON=0
endif
// Conditions pour ouvrir une position acheteuse
//***C1
C1= RSI[11](close) crosses over 40 and Stochastic[128,8](close)> 50 //***C1
//Entrée en position
if ON AND C1 AND timeEnterBefore AND timeEnterAfter then//or c2 or c3 or c4 or C5
BUY 1 CONTRACT AT MARKET
ENDIF
//ReVente
if close crosses under average[20](close) then
sell at MARKET
endif
SET STOP pLOSS 20
je n’avais pas vu ton post concernant le retour de la variable en ratio et non en pourcentage. j’ai modifié et ça fonctionne. je suis en train de vérifier quelques détails et je post le résultat. Je précise que cette stratégie avait pour but de tester le code stop en cas de période défavorable. En aucun cas il s’agissait de faire une stratégie rentable.
voilà ça fonctionne très bien. Encore merci @Nicolat.
ça vas me permette de mettre en route des stratégies et ne pas être obligé de les surveiller tous les jours comme le lait sur le feu. Je vais bien sur optimiser la durée de la boucle en fonction et le taux de perte acceptable, mais ça ouvre pas mal de possibilité.
Par contre comment faire pour remettre en route(automatiquement) quand les conditions de marché re-deviennent favorable ?
// Définition des paramètres du code
DEFPARAM CumulateOrders = False // Cumul des positions désactivé
//STOP SI PLUS X% DE PERTE
gain=0
ordre=0
//boucle dans les 1000 derniers ordres
for i = 1 to 1000 do
distance=barindex-tradeindex(i)<10080//si l'ordre n'a pas plus d'1 semaine
if distance then
ordre=ordre+1
if positionperf(i)>0 then
gain=gain+1
endif
endif
if not distance then
break
endif
next
ratio = gain/ordre
If (ratio*100)<25 then // taux de perte acceptable avant arrêt de la stratégie
ON=1
else
ON=0
endif
// Conditions pour ouvrir une position acheteuse
C1= RSI[11](close) crosses over 40 and Stochastic[128,8](close)> 50 //***C1
//Entrée en position
if ON AND C1 THEN
BUY 1 CONTRACT AT MARKET
ENDIF
SET STOP pLOSS 20
SET TARGET pPROFIT 20
Je voulais vérifier ma théorie qui consiste à dire que si on démarre une stratégie basique (même médiocre) et qu’on l’arrête quand les variable ne sont plus en phase avec le marché actuel (soit gains sont inférieur à 75 %) on arrive à générer du profil.
Dans le screen ci dessous, la première courbe de gain est la stratégie de base, la deuxième c’est le même code avec l’ajout du stop codé par @nicolas. Pour la troisième courbe de gain, j’ai donc imaginé un ré-démarrage très basique (code ci-dessous) basé sur un croisement à la hausse d’une moyenne mobile. La stratégie qui au départ était médiocre devient rentable et inintéressante.
Maintenant, comment faire pour améliorer l’option de ré-démarrage de la stratégie ?
Des idées ?