Bonjour Nicolas,
Pourriez-vous jeter un oeil à ce bout de code et essayer de trouver ce qui cloche SVP ?
Ca fait deux jours que je m’arrache les cheveux à essayer de trouver d’où vient le problème sans y parvenir… Le code est pour ainsi dire identique pour les ventes comme pour les achats, il n’y a que les noms de variables qui changent et le sens “<” et “>” dans les conditions IF…THEN.
(Testé du Dow en M15)
ONCE signalAchat=0
ONCE signalVente=0
RepereHaut = 0 // aura pour valeur le +haut de la bougie de repère haussière
RepereBas = 0 // aura pour valeur le +bas de la bougie de repère baissière
monOpen = open
monClose = close
monHigh = high
monLow = low
//=================================================================
// MACD Zero Lag (code pris dans PRC) :
p = 12
q = 26
r = 9
z1=DEMA[p](Close)
z2=DEMA[q](Close)
e = z1 - z2
z3=DEMA[r](e)
f = z3
g = e-f
//return e AS "MACD ZEROLAG",f AS "signal",g as "macd-signal",0 as "zero"
//=================================================================
maEMMacdZL = ExponentialAverage[9](e) // Moyenne mobile Exponentielle du MACD Zero Lag
maMMC = Average[7](close) // Moyenne mobile Simple courte
//****************************************************** VENTES
IF NOT SHORTONMARKET THEN
CV1 = maMMC < maMMC[1] AND maEMMacdZL < maEMMacdZL[1] // la MM7 et la EM9(macdZL) sont baissières
CV2 = monClose < maMMC // cloture au-dessous de la MM7
IF CV1 AND CV2 AND signalVente=0 THEN
RepereBas = monLow
signalVente=1
ENDIF
IF CV1 AND CV2 AND signalVente=1 AND monLow < RepereBas THEN
// Bougie courante a cassé le plus bas de la "bougie repère"
SELLSHORT 1 CONTRACT AT MARKET
signalVente=0
SET STOP pLOSS 60
SET TARGET pPROFIT 120
ENDIF
ENDIF
// exit SHORT
IF ShortOnMarket THEN
IF monHigh > maMMC THEN //OR NOT TimeOK THEN
// on clôture la position si le haut du cours passe au-dessus de la moyenne mobile courte 7
EXITSHORT AT MARKET
RepereBas=0
ENDIF
ENDIF
// ************************************************************ ACHATS
IF NOT LONGONMARKET THEN
CA1 = maMMC > maMMC[1] AND maEMMacdZL > maEMMacdZL[1] // la MM7 et la EM9(macdZL) sont haussières
CA2 = monClose > maMMC // cloture au-dessus de la MM7
IF CA1 AND CA2 AND signalAchat=0 THEN
RepereHaut = monHigh
signalAchat= 1
ENDIF
IF CA1 AND CA2 AND signalAchat=1 AND monHigh > RepereHaut THEN
// Bougie courante a cassé le plus haut de la "bougie repère"
signalAchat=0
BUY 1 CONTRACT AT MARKET
SET STOP pLOSS 60
SET TARGET pPROFIT 120
ENDIF
ENDIF
// exit Long
IF LongOnMArket THEN
IF monLow < maMMC THEN // OR NOT TimeOK THEN
// on clôture la position si le bas du cours passe SOUS la moyenne mobile courte 7
SELL AT MARKET
Reperehaut=0
ENDIF
ENDIF
graph repereBas coloured(255,0,0) AS "signal Achat" // rouge
graph repereHaut coloured(0,0, 255) AS "Signal Vente" // bleu
Logiquement je devrais donc avoir des achats et des shorts sur mon graph, et pourtant je n’ai QUE des achats.
La variable “RepereHaut” contient bien les bonnes valeurs et ça se vérifie avec “graph”, alors que “RepereBas” est toujours à “0”.
—————————-
IF CV1 AND CV2 AND signalVente=0 THEN
RepereBas = monLow
signalVente=1
ENDIF
—————————–
“Grapher” la variable “monLow” donne un résultat correct alors que “Grapher” la variable “RepereBas” renvoie “0”, alors que le même code pour les achats ne pose aucun problème… Je ne comprends pas d’où vient le problème, d’où ma requête…
En espérant que vous pourrez m’aider… merci d’avance
Il y a effectivement un problème, mais non lié à ton code, sauf erreur de ma part.
Dans les images suivantes on peut voir que lorsqu’on teste si “signalvente=0”, alors les autres tests sont buggés (ne retourne rien), donc ta condition située à la ligne 39 ne peut jamais être vérifiée, et donc pas de niveau bas et pas d’ordres de vente.
Par ailleurs le graph signalvente=0 ne retourne pas non plus la bonne valeur du booléen, elle devrait être inversé dans la seconde image.
Je vais faire une demande de support en référant ce topic, merci de faire de même. Merci.
Merci pour ton retour Nicolas.
Dans les tests de “graph” que j’ai fait, j’avais “signalvente” toujours = à 1, j’en ai déduit que le test IF THEN mettant signalvente=1 fonctionnait, mais qu’il ne repassait ensuite jamais à 0 car l’ordre de vente n’est jamais exécuté.
J’ai fait des tests graph et j’ai une différence avec la ligne 44 entre :
-> IF CV1 AND CV2 AND signalVente=1 AND monLow < RepereBas
et
->IF CV1 AND CV2 AND signalVente=1
ce qui m’a fait penser que “RepereBas” ne conserve pas la valeur donnée par “monLow” d’une bougie précédente, car cette condition là n’est jamais remplir, alors que côté ACHATS pas de problème… incompréhensible…
Comment dois-je faire pour faire une demande officielle au support ?
Merci encore
Je me rends compte qu’en fait ton explication donne la réponse à mon dernier commentaire !… j’ai fait tellement de tests pour essayer de trouver que je ne sais plus ce que j’ai fait et ce qui a marché ou pas LOL !!
Ce matin, ça fonctionne correctement, en ajoutant ONCE devant ces lignes, ou en les supprimant directement :
once RepereHaut = 0 // aura pour valeur le +haut de la bougie de repère haussière
once RepereBas = 0 // aura pour valeur le +bas de la bougie de repère baissière
il me semblait pourtant avoir tenté cette approche la semaine dernière, bref 🙄
Effectivement il y a des signaux dans les deux sens… mais les conditions ne sont pas respectées systématiquement car il devrait y avoir beaucoup plus d’ordres que ce qui est affiché 🙁 … les mystères de l’informatique.
Il faut que tu vérifies RepereHaut et RepereBas, à quel moment ils changent, en les graphant sur le graphique du prix, ce sera plus clair selon moi.