express stop EL_MOGALEF_STOP_V2023 // version modifiée 2016 vars input $N(2,10,3),$ET(5,15,7),$coef(1,7,2),$Use("yes;No",0); series xx,yy,zz,e; numeric i; series Z,CoursP; series position,Milieu, MilieuAncien1, MilieuAncien2,NivStop; series X,Y,MogRegLin,MogH,MogB,MogM,etyp,MogMA,MogMA2; series mh,mb,mm; series chgb, hh, bb,hhh,bbb; 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]; MogMA2[j]=MogMA2[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]; MogMA2[j]= MogMA[j+1]; end end end Position=0; 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 (MogM>MogM[1]) and (MogMA= MogB) and (MogMA2 < MogB) then NivStop=MogMA2; // sinon, si le milieu ancien 2 est utilisable on l'utilise // sinon on utilise simplement le bas de la bande mogalef if (MogMA >= MogB) and (MogMA2 > MogB) and (position<>position[1]) then NivStop=MogB; end if (Position = -1) then begin if (MogMMogH) then NivStop=MogMA; // si décalage vers le bas et un nouveau stop est utilisable, on l'utilise if MogMA > MogH then NivStop=MogMA; // si le milieu ancien 1 est utilisable on l'utilise if (MogMA <= MogH) and (MogMA2 > MogH) then NivStop=MogMA2; // sinon, si le milieu ancien 2 est utilisable on l'utilise if (MogMA <= MogH) and (MogMA2 <= MogH) and (position<>position[1]) then NivStop=MogH; // sinon on utilise simplement le haut de la bande mogalef end if $Use=0 then SetStopPrice(NivStop);//@@@cs:1854258-4243009-1590998_cs@@@