Calquer les ordres sur l'indicateur

par plataxis » 20 déc. 2015 12:03

Bonjour,

Dans ma modélisation du système des "turtles", je butte sur un os : celui de faire concorder les ordres du backtest avec les simulations de mon indicateur.

Mon indicateur donne un PRU (bleu) qui évolue avec les prises de positions successives (jusqu'à 4) en pyramidage au dessus du plus haut des 20 derniers jours (ligne verte). La ligne noire donne en principe le niveau de stop

Logiquement, mes positions devraient évoluer à l'identique, de l'indicateur, et c'est loin d'être le cas, dès l'entrée (qui conditionne la sortie, à cause de "positionprice" qui calcul ensuite le stop). Je ne comprends notamment pas pourquoi les positions (entrées "stop") sont anticipées par rapport à l'indicateur, qui a pourtant été codé sur le même modèle.

Est-ce qu'un expert aurait le temps d'y jeter un coup d'oeuil pour m'aider à avancer ?

Voici l'indicateur :
Spoiler:

Code : #

REM defining the donchian channels
LongEntryCurrent = Highest [20] (high)

LongExitCurrent = lowest [10] (low)
REM adjusting channels so that current bar is not included
LongEntry = LongEntryCurrent[1]
LongExit = LongExitCurrent[1]

REM Define ATR
ATR = AverageTrueRange[20]

once longstop = 0
once longcount = 0
once longPRU = 0

breakout = 0.1

pyramidage = ATR/2
stopinitial = 2 * ATR



IF longcount = 0 THEN // pas du tout investit
// premier niveau d'entrée long
longposition1 = LongEntry + breakout
longposition2 = longposition1+pyramidage
longposition3 = longposition2 + pyramidage
longposition4 = longposition3 + pyramidage
// première entrée long
IF High > longposition1 THEN
longcount = 1
longPRU = longposition1
longstop = longposition1 - stopinitial
ENDIF
ENDIF

// deuxième entrée long
IF High > longposition2 AND longcount = 1 THEN
longcount = 2
longPRU = (longposition1 + longposition2)/2
longstop = longposition2 -stopinitial
ENDIF

// troisième entrée long
IF High > longposition3 AND longcount =2 THEN
longcount = 3
longPRU = (longposition1 + longposition2 + longposition3)/3
longstop = longposition3 -stopinitial
ENDIF

// quatrième entrée long
IF High > longposition4 AND longcount =3 THEN
longcount = 4
longPRU = (longposition1 + longposition2 + longposition3 + longposition4)/4
longstop = longposition4 - stopinitial
ENDIF


//gestion des stops : le plus bas rapide prend le pas sur le stop initial
IF longcount > 0 AND longstop < LongExit THEN
longstop = LongExit
ENDIF

// sortie de position
IF Low < longstop THEN
longstop = 0
longPRU = 0
longcount =0
ENDIF

REM return values
RETURN LongEntry COLOURED(0, 255, 0) AS "LongEnttry", LongExit COLOURED(255, 0, 0) AS"LongExit", longstop AS "longstop", longPRU COLOURED(0, 0, 255) AS "longPRU"


Voici le backtest :
Spoiler:

Code : #

REM defining the donchian channels
LongEntryCurrent = Highest [20] (high)

LongExitCurrent = lowest [10] (low)
REM adjusting channels so that current bar is not included
LongEntry = LongEntryCurrent[1]
LongExit = LongExitCurrent[1]

REM Define ATR
ATR = AverageTrueRange[20]

IF not onmarket THEN
longstop = 0
longcount =0
ENDIF

breakout = 0.1

pyramidage = ATR/2
stopinitial = 2 * ATR
ncontrats = 1


IF longcount = 0 THEN // pas du tout investit
// premier niveau d'entrée long
longposition1 = LongEntry + breakout
longposition2 = longposition1+pyramidage
longposition3 = longposition2 + pyramidage
longposition4 = longposition3 + pyramidage
BUY ncontrats shares at longposition1 Stop
BUY ncontrats shares at longposition2 Stop
BUY ncontrats shares at longposition3 Stop
BUY ncontrats shares at longposition4 Stop
// première entrée long
IF High > longposition1 THEN
longcount = 1
longstop = longposition1 - stopinitial
ENDIF
ENDIF

// deuxième entrée long
IF High > longposition2 AND longcount = 1 THEN
longcount = 2
longstop = longposition2 -stopinitial
ENDIF

// troisième entrée long
IF High > longposition3 AND longcount =2 THEN
longcount = 3
longstop = longposition3 -stopinitial
ENDIF

// quatrième entrée long
IF High > longposition4 AND longcount =3 THEN
longcount = 4
longstop = longposition4 - stopinitial
ENDIF

//gestion des stops : le plus bas rapide prend le pas sur le stop initial
IF longcount > 0 AND longstop < LongExit THEN
longstop = LongExit
ENDIF

stoplong = (positionprice) - longstop // permet de placer le stop en points ou unités
SET STOP LOSS stoplong