Bonjour,
Je dispose bien d’un code PRT modifiable des bandes de mogalef, mais ultra simplifié et donc peu performant (j’ai fait ce que j’ai pu…).
Je dispose aussi d’un itf des bandes plus proche de l’original MAIS pas du code source. Je ne peux donc l’utiliser qu’en visuel et non en programmation…
J’ai déjà intégré le code “simple” dans des indicateurs “complexes” et des stratégies, avec succès, mais ce n’est pas le bon donc complications pour filtrer ce qui serait fait automatiquement avec le “bon” source.
Eric Lefort m’a communiqué les (derniers!) fichiers sources en Nano Trader de :
– Bandes de Mogalef
– stop des bandes de mogalef
Autant le code dont je dispose est à mon niveau, autant j’ai des craintes de ne pas réussir la conversion de Nano (dont je n’ai aucune connaissance) vers PRT.
J’attache les codes Nano et une capture d’écran des bandes avec le résultat (indicateur “fermé”).
Je ne dispose pas d’itf me donnant le stop, donc pas de copie d’écran.
Je me tiens à votre disposition pour toute question.
Le résultat profiterait potentiellement à au moins 5 personnes.
Grand merci par avance
>>>>>>>>>>>>>>>>>>>>>>>>
express EL_MOGALEF_Bands
>>>>>>>>>>>>>>>>>>>>>>>>>>
vars
input $N(2,10,3),$ET(5,15,7),$coef(1,7,2),$Visualisation(“yes;No”,0);
series X,Y,MogRegLin,MogH,MogB,MogM,etyp,MogMA;
series mh,mb,mm;
numeric j,SumXY,SumX2,SumY,SumX,AvgX,AvgY,b,a,SSumXY;
series MogStopL,MogStopS;
calculation
// Le programme s’exécute à la clôture de chaque barre et non à chaque tick
if IsFirstBar() then
begin
CalculateAtEveryTick(false);
end
// Calcul du cours pondéré Mogalef exprimé en ticks:
// Y étant un entier, on évite ainsi les risques d’erreurs dus aux arrondis
Y = round(((h+l+o+c+c)/5/TickSize()),0);
X = CurrentBarIndex(); // Indice de la barre
// Calcul des paramètres a et b de la régression linéaire
// b = Somme[(X – AvgX)(Y – AvgY)]/Somme[(X – AvgX)^2] pour les N dernières barres
// On définit les variables numériques suivantes: SumX = somme[X], SumY = somme[Y], AvgX = moyenne[X], AvgY = moyenne[Y]
// SumX2 = Somme[(X – AvgX)^2], SumXY = Somme[(X – AvgX)(Y – AvgY)] calculés sur les N dernières barres
if (X <= ($N-1)) then
begin
SumX = SumX + X;
SumY = SumY + Y;
MogRegLin = close;
// Calcul de SumX2 à la N ième barre
if (X = ($N-1)) then
begin
SumX2 = $N*(Power($N,2)-1)/12; // Il s'avère que le résultat est une constante dépendant de N
// Calcul de SumXY, a, b, MogRegLin à la N ième barre
for j = 0 to ($N-1)
begin
SSumXY = SSumXY + ($N*X[j] - SumX)*($N*Y[j] - SumY);
end
SumXY = SSumXY/power($N,2);
AvgX = SumX/$N;
AvgY = SumY/$N;
b = SumXY/SumX2;
a = AvgY - b*AvgX;
MogRegLin = (a + b*X)*TickSize(); //Le résultat est multilpié par la taille d'un tick
end
end
else
// Calcul de SumXY, a, b, MogRegLin après la N ième barre
begin
// On exploite les relations qui existent entre variables d'une barre à la suivante
// pour éliminer les itérations et augmenter la vitesse de calcul
SumX = SumX + X - X[$N];
SumY = SumY + Y - Y[$N];
SSumXY = SSumXY + ($N*X - SumX)*($N*Y - SumY)-($N*X[$N] - SumX)*($N*Y[$N] - SumY) + $N*(X - X[$N])*(Y - Y[$N]);
SumXY = SSumXY/power($N,2);
AvgX = SumX/$N;
AvgY = SumY/$N;
b = SumXY/SumX2;
a = AvgY - b*AvgX;
MogRegLin = (a + b*X)*TickSize();
end
if IsFinalBar() then
begin
// On est à la dernière barre et la série MogRegLin est entièrement calculée
// On calcule la série etyp qui est l'écart type de MogRegLin
// Sans l'instruction IsFinalBar, on calculerait autant de fois l'écart type qu'il y a de barres
// ce qui ralentirait considérablement la plateforme
StdDev(MogRegLin,etyp,$ET);
// Calcul des bandes de Mogalef MogMA, MogH et MogB
for j = CurrentBarIndex() downto 0
begin
// Pas de décallage si la RegLine est à l'intérieur des anciennes bandes
If (MogRegLin[j] < MogH[j+1]) and (MogRegLin[j] > MogB[j+1]) then
begin
MogH[j] = MogH[j+1];
MogB[j] = MogB[j+1];
MogM[j] = MogM[j+1];
MogMA[j] = MogMA[j+1];
MogStopS[j] = MogStopS[j+1];
MogStopL[j] = MogStopL[j+1];
end
else
// Si décallage tracé des nouvelles bandes
begin
MogH[j] = (MogRegLin[j] + (etyp[j]*$Coef));
MogB[j] = (MogRegLin[j] – (etyp[j]*$Coef));
MogM[j] = MogRegLin[j];
MogMA[j] = MogM[j+1];
//cas du décalage vers le haut
if (MogMA[j] < MogM[j]) then
begin
if (MogMA[j] < MogH[j]) and (MogMA[j] > MogB[j]) then // si l’ancien medium est à l’interieur nouvelle bande
begin
MogStopL[j] = MogStopL[j+1]; // on ne bouge pas le stop long
MogStopS[j] = MogStopS[j+1]; // ni le stop court bien sur. ???????
end
else // mais si l’ancien medium est hors des nouvelles bandes
begin
MogStopL[j] = MogMA[j]; // le nouveau stop long s’adapte.
MogStopS[j] = MogStopS[j+1]; //
end
end
//cas du décalage vers le bas
if (MogMA[j] > MogM[j]) then
begin
if (MogMA[j] < MogH[j]) and (MogMA[j] > MogB[j]) then // si l’ancien medium est à l’interieur de la nouvelle bande
begin
MogStopS[j] = MogStopS[j+1]; // on ne bouge pas le stop court
MogStopL[j] = MogStopL[j+1]; // ni le stop long bien sur. ???????
end
else // mais si l’ancien medium est hors des nouvelles bandes
begin
MogStopS[j] = MogMA[j]; // le nouveau stop court s’adapte.
MogStopL[j] = MogStopL[j+1]; // pas le long
end
end
end
mh[j]=void;
mb[j]=void;
mm[j]=void;
if $Visualisation=0 then begin
mh[j]=MogH[j];
mb[j]=mogB[j];
mm[j]=MogM[j];
end
end
end
interpretation // Must be modified, this is an exemple.
begin
if (h >= MogH) and (MogH = MogH[1]) then sentiment = 0;
if (l <= MogB) and (MogH = MogH[1]) then sentiment = 100;
end
plotband (MH,"Yellow",2,MM,"blue",1,"lightgreen");
plotband (MM,"Blue",1,MB,"cyan",2,"lightred");
// Begin
// plotband (MogH,"Yellow",2,MogM,"blue",1,"lightgreen");
// plotband (MogM,"Blue",1,MogB,"cyan",2,"lightred");
// end//@@@cs:1851506-4228835-1556514_cs@@@
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
express stop EL_MOGALEF_STOP
// version modifiée 2016
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
vars
input $N(2,10,3),$ET(5,15,7);
series MogH,MogB,MogM,etyp;
series xx,yy,zz,e,mm;
numeric i,SumXY,SumX2,SumY,SumX,a,b;
series X,Y,Z,MogRegLin,CoursP;
series position,Milieu, MilieuAncien1, MilieuAncien2,NivStop;
calculation
//if IsFirstBar() then CalculateAtEveryTick(false);
// Calcul du cours pondéré Mogalef
CoursP = ((h+l+o+c+c)/5); // Fin du calcul
// on calcule la régression linéaire—————————————-
// if isbarcompleted() then // à la clôture de la dernière barre?
for i = 0 to $N-1
begin
X[i] = i;
Y[i] = CoursP[i];
SumX = SumX + X[i];
SumX2 = SumX2 + Power(X[i],2);
SumXY = SumXY + X[i]*Y[i];
SumY = SumY + Y[i];
end
b = (SumXY – SumX*SumY/$N)/(SumX2 – (1/$N)*Power(SumX,2));
a = (SumY – b*SumX)/$N;
Z = a + b*X[0];
SumX = 0;
SumX2 = 0;
SumXY = 0;
SumY = 0;
if Z = void then // Si rég lin pas définie
MogRegLin = Close;
else
MogRegLin = Z; // Fin régression linéaire———————————
// Calcul des bandes Mogalef————————————————
// Reprise des niveaux Mogalef précédents.
StdDev(MogRegLin,etyp,$ET); //calcul écart type de longueur ET
xx=MogH[1];
yy=MogB[1];
e=etyp[1];
zz=Z[1];
mm=MogM[1];
// Pas de décalage si la RegLine est à l’intérieur des anciennes bandes
If ((MogRegLin < xx) and (MogRegLin >yy)) then
begin
etyp=e;
MogH=xx;
MogB=yy;
MogM=mm;
end
else //Si décalage tracé des nouvelles bandes
begin
MogH= (MogRegLin + (etyp*2));
MogB= (MogRegLin – (etyp*2));
MogM= MogRegLin;
end // Fin calcul bandes Mogalef—————————————
if MarketPosition() = 1 then position=1; // On met à jour la variable position
if MarketPosition() = -1 then position=-1;
MilieuAncien2=MilieuAncien2[1];
MilieuAncien1=MilieuAncien1[1];
Milieu=Milieu[1];
if MogM<>MogM[1] then begin // On met à jour les variables Milieu et MilieuAncien 1 et 2
MilieuAncien2=MilieuAncien1[1];
MilieuAncien1=Milieu[1];
Milieu=MogM;
end
NivStop=NivStop[1]; // par défaut, le stop est mis à son niveau antérieur
if (MarketPosition() = 1) then begin //Long position
if (Milieu>Milieu[1]) and (Milieu[1] position[1] then begin // si on entre en position
if MilieuAncien1 < MogB then begin
NivStop=MilieuAncien1; // si le milieu ancien 1 est utilisable on l'utilise
end
if (MilieuAncien1 >= MogB) and (MilieuAncien2 < MogB) then begin
NivStop=MilieuAncien2; // sinon, si le milieu ancien 2 est utilisable on l'utilise
end
else NivStop=MogB; // sinon on utilise simplement le bas de la bande mogalef
end
end
if (Position = -1) then begin
if (MilieuMogH) then NivStop=MilieuAncien1; // si décalage vers le bas et un nouveau stop est utilisable, on l’utilise
if position < position[1] then begin // si on entre en position
if MilieuAncien1 > MogH then begin
NivStop=MilieuAncien1; // si le milieu ancien 1 est utilisable on l’utilise
end
if (MilieuAncien1 <= MogH) and (MilieuAncien2 > MogH) then begin
NivStop=MilieuAncien2; // sinon, si le milieu ancien 2 est utilisable on l’utilise
end
if (MilieuAncien1 <= MogH) and (MilieuAncien2 <= MogH) then begin
NivStop=MogH; // sinon on utilise simplement le haut de la bande mogalef
end
end
end
if (date<01_06_2025) then begin
SetStopPrice(NivStop);
end//@@@cs:1347392-3996725-1114211_cs@@@