Bonjour, ce site est absolument génial, si bien que j’ai eu envie de me jeter dans la programmation. Je me lance dans la programmation avec des tableaux, je m’entraine et là je bloque. Mon indicateur doit afficher un rectangle vert ou rouge en fonction d’une condition dans une boucle FOR NEXT. Lorsque je le lance il s’exécute parfaitement et les rectangle sont tracés, mais si je veux qu’il s’actualise je dois ouvrir le programme et relancer “valider programme”.
spread = 0.5
OBJECTIF = 5
///////////////////////// CONDITIONS ////////////////////////////////////
c0 = time >= 090000 and time < 172000
c1 = close > open
///////////////////////// TIMING ////////////////////////////////////
if time crosses over 085900 then
i = -1
Timing = 0
endif
if c0 then
Timing = Timing[1] + 1
endif
///////////////////////// ENTREE ////////////////////////////////////
if c0 and c1 then
i2 = i
i = i2 + 1
$result[i] = 1
$entryA[i] = close + spread
$TPa[i] = $entryA[i] + objectif + spread
$SLa[i] = lowest[2](low)
$entryAindex[i] = barindex
$PL[i] = 0
endif
///////////////////////// SORTIE ////////////////////////////////////
for j = 0 to lastset($TPa) do
if $result[j] = 1 then
if high >= $TPa[j] then
$result[j] = 2
drawrectangle($entryAindex[j], $SLa[j] - 5, $entryAindex[j] - 1, $SLa[j] - 8 )coloured(0,150,0,50)bordercolor(0,150,0)
elsif close <= $SLa[j] then
$result[j] = 0
drawrectangle($entryAindex[j], $SLa[j] - 5, $entryAindex[j] - 1, $SLa[j] - 8 )coloured(250,0,0,50)bordercolor(250,0,0)
endif
endif
next
///////////////////////// RESET////////////////////////////////////
if time crosses over 172500 then
UnSet($result)
UnSet($entryA)
UnSet($TPa)
UnSet($SLa)
UnSet($entryAindex)
i = 0
j = 0
endif
/////////////////////////////////////////////////////////////
return
Je serai reconnaissant d’un peu d’aide. Merci d’avance 😉
Voici le code
Bonjour,
Pour afficher les rectangles en continu, il faut placer l’instruction DrawRectangle … juste avant Next.
J’ai juste testé sur le Spot Gold 5 secondes. Je n’obtiens que des rectangles rouges. Je n’ai pas poussé mon investigation loin.
Très cordialement.
///////////////////////// SORTIE ////////////////////////////////////
for j = 0 to lastset($TPa) do
if $result[j] = 1 then
if high >= $TPa[j] then
$result[j] = 2
r= 0
g= 150
b= 0
a= 50
//drawrectangle($entryAindex[j], $SLa[j] - 5, $entryAindex[j] - 1, $SLa[j] - 8 )coloured(0,150,0,50)bordercolor(0,150,0)
elsif close <= $SLa[j] then
$result[j] = 0
r= 250
g= 0
b= 0
a= 50
//drawrectangle($entryAindex[j], $SLa[j] - 5, $entryAindex[j] - 1, $SLa[j] - 8 )coloured(250,0,0,50)bordercolor(250,0,0)
endif
endif
drawrectangle($entryAindex[j], $SLa[j] - 5, $entryAindex[j] - 1, $SLa[j] - 8 )coloured(r,g,b,a)bordercolor(r,g,b)
next
Salut Bernard13, forcément en sortant l’instruction de la boucle le tracé du rectangle n’est plus soumis à condition et il s’exécute sous chaque bougie 🤦♂️ .
On ne fait pas plus avancer le Schmilblick …
Re durden69
Sauf erreur de ma part DrawRectangle est bien … dans … la boucle FOR … NEXT dans ma proposition et les rectangles s’affichent bien en continu.
Peux-tu joindre une copie d’écran de ton problème ?
Cordialement.
Re Voici ce que j’obtiens en continu …
Re Bernard13, Merci pour tes recherches qui finalement font … avancer le Schmilblick 😉
Tu as entièrement raison, je te prie de m’excuser, le DRAW est bien dans la boucle mais les rectangles qui s’affichent ne sont pourtant pas corrects.
Ton approche m’a suggéré de placer le DRAW avant le NEXT mais dans la boucle ou le result[j] = 1 doit encore être vérifié.
endif
drawrectangle($entryAindex[j], $SLa[j] – 15, $entryAindex[j] – 1, $SLa[j] – 18 )coloured(r,g,b,a)bordercolor(r,g,b)
endif
next
je te joins une capture d’un échantillon avec 3 lignes de rectangles :
celui du haut : le modèle que l’on veut voir apparaitre
en dessous : le modèle issu de ta proposition
tout en bas : mon modèle issu de la modif ci-dessus
dis moi ce que tu en penses
Merci encore pour ton aide 🙏
Bonne journée
Re Bernard13, finalement j’y suis allé en force !
J’ai créé une autre boucle avec DRAW et les rectangles s’affichent et se remplissent en temps réel.
for j = 0 to lastset($TPa) do
if $result[j] = 2 then
drawrectangle($entryAindex[j], $SLa[j] – 20, $entryAindex[j] – 1, $SLa[j] – 23 )coloured(0,150,0,50)bordercolor(0,150,0)
elsif $result[j] = 0 then
drawrectangle($entryAindex[j], $SLa[j] – 20, $entryAindex[j] – 1, $SLa[j] – 23 )coloured(250,0,0,50)bordercolor(250,0,0)
endif
next
Mais j’ai toujours pas compris pourquoi ça fonctionnait pas initialement 😥
Le mystère reste entier
Merci pour ton aide
cordialement
Re durden69
Le texte ci-dessus de ta capture d’écran est tronqué …
J’attends la capture de l’échantillon …
Le diable se cache toujours dans les détails ! 😀
A bientôt. 🙂
Salut Bernard13, voici le code (surement pas très élégant) en entier. Les conditions sont très simples :
- échantillon en M1 de 9h à 17h25
- condition d’entrée : clôture > ouverture
- condition de sortie en gain : +5 points (moins 1 demi-spread à l’entrée et pareil en sortie)
- condition de sortie en perte : clôture en dessous du lowest[2] du point d’entrée
L’actualisation en temps réel se produit comme prévue mais lorsque la condition de sortie en perte
se réalise avant la clôture le programme conserve cette information même si à la clôture la condition
n’est plus réalisée.
Merci pour ton soutien Bernard 🙏
spread = 0.5
OBJECTIF = 5
///////////////////////// CONDITIONS ////////////////////////////////////
c0 = time >= 090000 and time < 172000
c1 = close < open
///////////////////////// TIMING ////////////////////////////////////
if time crosses over 085900 then
i = -1
Timing = 0
endif
if c0 then
Timing = Timing[1] + 1
endif
///////////////////////// ENTREE ////////////////////////////////////
if c0 and c1 then
i2 = i
i = i2 + 1
$result[i] = 1
$entryv[i] = close - spread
$TPV[i] = $entryv[i] - objectif - spread
$SLV[i] = highest[2](high)
$entryVindex[i] = barindex
$PL[i] = 0
drawrectangle($entryVindex[i], $SLv[i] + 5, $entryVindex[i] - 1, $SLv[i] + 8 )
endif
///////////////////////// SORTIE ////////////////////////////////////
for j = 0 to lastset($TPv) do
if $result[j] = 1 then
if low <= $TPv[j] then
$result[j] = 2
elsif close > $SLv[j] then
$result[j] = 0
endif
endif
next
for j = 0 to lastset($TPv) do
if $result[j] = 2 then
drawrectangle($entryVindex[j], $SLv[j] + 5, $entryVindex[j] - 1, $SLv[j] + 8 )coloured(0,150,0,50)bordercolor(0,150,0)
elsif $result[j] = 0 then
drawrectangle($entryVindex[j], $SLv[j] + 5, $entryVindex[j] - 1, $SLv[j] + 8 )coloured(250,0,0,50)bordercolor(250,0,0)
endif
next
///////////////////////// RESET////////////////////////////////////
if time crosses over 172500 then
UnSet($result)
UnSet($entryV)
UnSet($TPv)
UnSet($SLv)
UnSet($entryVindex)
i = 0
j = 0
endif
/////////////////////////////////////////////////////////////
return
Merci durden69, je vais essayer de regarder çà. 🙂