Bonjour à tous,
Est-ce possible de paramétrer un code afin de déclencher un achat ou une vente suivant la couleur d’un indicateur ? (par exemple : vert = achat et rouge = vente)
Merci pour vos réponses.
Bien à vous.
Bonjour, oui si cette couleur correspond à une variable que l’on peut tester dans le code. Ou sinon, il faudrait la créer pour la rendre exploitable par une stratégie de trading automatique.
De quel indicateur en particulier s’agit-il ?
Cela tombe bien que ce soit toi qui me réponde Nicolas car il s’agit d’un indicateur que tu as développé en partie (DSS Bressert Scalper Improved).
Tout d’abord, je voulais te remercier pour ton travail qui nous aide beaucoup.
Voilà, j’aimerais déclencher un achat lorsque ton indicateur se situe sous le niveau 20 et qu’il soit en phase ascendante pendant 2 bougies (DSS dans le vert). La couleur verte matérialisant la hausse dans mon paramétrage.
Merci beaucoup pour ton aide !
OK, donc tu fais référence à cet indicateur : http://www.prorealcode.com/prorealtime-indicators/dss-bressert-scalper-improved/
Je n’en suis pas l’auteur, je l’ai convertit depuis le code MT4.
L’indicateur est-il appelé dans ta stratégie depuis une fonction CALL ? Si oui pourrais-tu me poster le code pour utiliser les mêmes définitions de variables, merci.
Pour tout te dire, je débute dans le trading automatique car j’ai perdu pied dans le trading manuel ! Je ne maîtrise pas du tout la programmation sous PRT.
J’ai remarqué que lorsque je lançais un programme qui comportait la mention “Positionsize” en Probacktest elle fonctionnait mais pas en réel, sauf si je met “1” à la place, pourquoi ? Voir exemple ci-dessous :
IF Not SHORTONMARKET AND ShortCondition THEN
SELLSHORT Positionsize CONTRACT AT MARKET
ENDIF
IF Not SHORTONMARKET AND ShortCondition THEN
SELLSHORT 1 CONTRACT AT MARKET
ENDIF
Merci pour ta patience ! 🙂
Bien, positionsize n’est pas une instruction du langage prorealtime.
En réel le serveur du courtier refusera de lancer un trade de 0 volume et c’est ce que tu cherches à faire si tu ne définis pas sa valeur.
Positionsize est un libéllé de variable, je pense que tu en herites dans ton code à cause d’un copier/coller.
Tu pourras aussi bien faire :
Chouxfleur=1
BUY Chouxfleur CONTRACT AT MARKET
Concernant le DSS, rappelle moi de m’en occuper dans les prochains jours.
Voilà comment faire pour tester ta condition acheteuse au sujet de l’indicateur DSS Bressert dont on a parlé plus haut:
// appel de l'indicateur et définition des 3 variables qu'il retourne
dss, lowlevel, highlevel = CALL "PRC_Bressert Scalper Improved"[8, 13, 2.6]
// test des conditions pour un achat (sous le lowlevel et en phase ascendante pendant 2 bougies)
buycondition = summation[2](dss<20 and dss>dss[1])=2
// achat au marché si les conditions sont remplies
if not longonmarket and buycondition then
BUY 1 CONTRACT AT MARKET
endif
J’ai commenté le code. Je n’ai pas testé, merci de me faire un retour. Bon Dimanche.
Voilà ce que j’ai pu faire (c’est vraiment un code de débutant !) :
// Définition des paramètres du code
DEFPARAM CumulateOrders = False // Cumul des positions désactivé
Defparam flatafter = 180000
// Conditions pour ouvrir une position acheteuse
// appel de l'indicateur et définition des 3 variables qu'il retourne
dss, lowlevel, highlevel = CALL "DSS Bressert Scalper"
// test des conditions pour un achat (sous le lowlevel et en phase ascendante pendant 2 bougies)
buycondition = summation[2](dss<20 and dss>dss[1])=2
buycondition = lowlevel[20]
buycondition = highlevel[80]
// achat au marché si les conditions sont remplies
if not longonmarket and buycondition and time > 080000 and time < 174500 then
BUY 1 CONTRACT AT MARKET
endif
// Conditions pour fermer une position acheteuse
sellcondition = summation[2](dss>80 and dss<dss[1])=2
sellcondition = lowlevel[20]
sellcondition = highlevel[80]
IF time > 080000 and time < 174500 THEN
SELLSHORT AT MARKET
ENDIF
// test des conditions pour une vente (au-dessus du highevel et en phase descendante pendant 2 bougies)
sellcondition = summation[2](dss>80 and dss<dss[1])=2
sellcondition = lowlevel[20]
sellcondition = highlevel[80]
// vente au marché si les conditions sont remplies
if not shortonmarket and sellcondition and time > 080000 and time < 174500 then
SELLSHORT 1 CONTRACT AT MARKET
endif
// Conditions pour fermer une position en vente à découvert
buycondition = summation[2](dss<20 and dss>dss[1])=2
buycondition = lowlevel[20]
buycondition = highlevel[80]
IF time > 080000 and time < 174500 THEN
BUY AT MARKET
ENDIF
Ca fonctionne mais les gains et les pertes s’équilibrent. Ce code prends beaucoup trop de positions à mon goût ! 🙂
Merci encore de m’avoir aidé Nicolas.
Merci pour le retour de ta stratégie.
Il y a quelques énigmes pour moi dans ce que tu as écrit 🙂
Pourquoi tous ces ‘buycondition’ et ‘sellcondition’ dupliqués en testant le lowlevel et le highlevel 20 et 80 périodes en arrière? Les lignes syntaxées que la ligne 11 suffisent déjà à tester la condition que tu voulais en début du topic.
Ensuite, dés que tu achètes, tu vends immédiatement et inversement. Les trades n’ont pas le temps de “vivre” qu’ils sont déjà fermés 🙂
Tu devrais commencer par supprimer les lignes de conditions inutiles (buycondition et sellcondition, lignes 12/13 par exemple) et les tests de conditions de sorties, tu verras beaucoup plus claire dans le backtest ensuite et tu pourras voir que les achats clôturent naturellement les ordres de vente et inversement.
Bonjour Nicolas,
Tu sais, même moi, je ne comprends pas tout ! 😀
D’accord, je vais rectifier tout ça et je te dis.
Voilà, mon code fonctionne très bien comme ça :
// Définition des paramètres du code
DEFPARAM CumulateOrders = False // Cumul des positions désactivé
Defparam flatafter = 180000
// Conditions pour ouvrir une position acheteuse
// appel de l'indicateur et définition des 3 variables qu'il retourne
dss, lowlevel, highlevel = CALL "DSS Bressert Scalper"
// test des conditions pour un achat (sous le lowlevel et en phase ascendante pendant 2 bougies)
buycondition = summation[2](dss<lowlevel[20] and dss>dss[1])=2
// achat au marché si les conditions sont remplies
if not longonmarket and buycondition and time > 080000 and time < 174500 then
BUY 1 CONTRACT AT MARKET
endif
// Conditions pour fermer une position acheteuse
sellcondition = summation[2](dss>highlevel[80] and dss<dss[1])=2
IF not shortonmarket and sellcondition and time > 080000 and time < 174500 THEN
SELLSHORT AT MARKET
ENDIF
// test des conditions pour une vente (au-dessus du highevel et en phase descendante pendant 2 bougies)
sellcondition = summation[2](dss>highlevel[80] and dss<dss[1])=2
// vente au marché si les conditions sont remplies
if not shortonmarket and sellcondition and time > 080000 and time < 174500 then
SELLSHORT 1 CONTRACT AT MARKET
endif
// Conditions pour fermer une position en vente à découvert
buycondition = summation[2](dss<lowlevel[20] and dss>dss[1])=2
IF not longonmarket and buycondition and time > 080000 and time < 174500 THEN
BUY AT MARKET
ENDIF
Merci encore pour tes conseils Nicolas ! 🙂
De rien.
Si tu supprimes les lignes 25 à 38, tes résultats seront identiques. Car tes conditions de sorties sont les mêmes qui stimulent des entrées contraires et puisque un BUY ferme un SELLSHORT et vice-versa, ces lignes sont inutiles.
OK.
Par contre, mon code achète ou vends 2 lots par moment, pourquoi ?