Bonjour,
Mon système de trading automatique n’ouvre pas de positions sur des CFD Actions (courtier IG) via ProOrder, alors qu’il fonctionne très bien avec les paires Forex et les Indices… !
Pas de problème en revanche en backtest.
C’est à n’y rien comprendre. Auriez-vous une explication svp ?
Merci !
Taille de position ? Marge requise éventuellement ? Y-a t’il des ordres rejetés dans la liste idoine ?
Au lancement d’une stratégie, il est demandé la taille de position maximale allouée à la stratégie, est-elle supérieure ou égale à celle qui est présente dans le code ?
Merci Nicolas pour tes pistes. Il n’y a aucune notification ou rejet d’ordre car les positions ne sont mêmes pas ouvertes. J’ai également pris soin d’indiquer une taille de position max largement supérieure aux besoins du système.
Quelque part sur Internet, j’ai lu que pour trader les CFD actions (par exemple sur Euronext) il y aurait une option (payante) “accès temps réel” à activer chez IG. Je me demande si ça ne serait pas lié à mon problème…
Cela te dit-il quelque chose ?
En effet, il faut bien entendu souscrire aux cours en temps réel, cela se fait simplement depuis ton interface IG (voir image jointe).
Merci, j’ai activé l’option (Euronext) mais le système n’ouvre toujours pas de position…
Pour info, je suis en train de tester sur mon compte démo, avant de passer sur mon compte réel.
Je vois pourtant bien les chandeliers bouger (en timeframe 1 minute)
Quelle action et timeframe en particulier stp ?
J’étais sur l’action AXA SA (Euronext). Le timeframe de la stratégie est H1, mais afin de ne pas attendre les clotures de bougie dans cette UT, les entrées et suivi de positions se font en M1.
//DEFPARAM Preloadbars = 300
DEFPARAM CumulateOrders = false
Capital = 8000
RisqueMax = 2 // Risque max par trade en % du capital
DistStopMin = 0.1
//Timeframe(Default)
// -------------------------------------------------------------------------------- //
// Déclenchement et Positionnement des niveaux
// -------------------------------------------------------------------------------- //
DateOpening = 20210111 // AAAAMMJJ Ouverture différée (backtest uniquement)
TimeOpening = 141700 // HHMMSS
ImmediateOpening = 1 // Type d'ouverture (0:différée, 1:Immediate)
Once StartTime = CurrentTime
StopLoss = 20.150 // Niveau initial de Stop
IF NOT ONMARKET AND ((ImmediateOpening AND CurrentTime >= StartTime) OR (NOT ImmediateOpening AND Date >= DateOpening AND Time >= TimeOpening)) THEN
// ----------------------------------------------------------------------------- //
// Calcul du Stop initial
// ----------------------------------------------------------------------------- //
StopValue = StopLoss
DistanceStopL = abs(Close - StopValue)/PointSize // en points
IF DistanceStopL < DistStopMin THEN
StopValue = Close - DistStopMin*PointSize
DistanceStopL = DistStopMin
ENDIF
// ----------------------------------------------------------------------------- //
// Calcul de la taille de position
// ----------------------------------------------------------------------------- //
PerteMax = Round((Capital+StrategyProfit)*RisqueMax/100)
PositionSize = Round(PerteMax / (DistanceStopL*PipValue))
IF PositionSize < 1 THEN
PositionSize = 1
ENDIF
//GraphOnPrice StopValue Coloured (255,0,0) AS "Stop Long"
BUY PositionSize SHARES AT MARKET
SET STOP LOSS (Close - StopValue)
ENDIF
Voici le code tout simple que j’utilise pour ouvrir une position immédiate (au lancement de la stratégie avec le niveau de Stop défini dans le code) en timeframe M1 sur mon compte Démo.
Aucune position n’est ouverte avec les CFD Actions. Cela fonctionne pourtant bien en manuel et en automatique avec le Forex et les Indices !
Je ne comprends vraiment pas ce qui ne va pas ??
Il y a peut être un problème avec la taille de la position suite à ton calcul. En backtest, la taille est correct et adapté à cette action en particulier ?
Merci Nicolas pour ta réponse. La taille de position est OK.
En revanche, j’ai fait plein de tests en simplifiant au maximum le code pour cerner le problème et il semble que le système ne fonctionne pas lorsque j’utilise l’instruction “Once” pour initialiser la variable qui sert au démarrage. Cela a l’air de fonctionner lorsque je n’utilise pas Once.
Je vais faire d’autres essais aujourd’hui, avec plusieurs actions, pour confirmer et clore le sujet si possible 😉
En utilisant ONCE tu n’affectes qu’une seule fois une valeur à la variable, donc en effet si au lancement le CurrentTime n’est pas supérieur à StartTime (selon ton code ligne 20), alors il n’y aura pas de prise de position du tout.
Oui, c’est effectivement ce que je voulais faire : StartTime est l’heure de démarrage du système. Lorsque la ligne 20 est interprétée le nouveau CurrentTime devrait être nécessairement >= au StartTime. Une position devrait donc être ouverte à tous les coups au démarrage du Système.
Est-ce que je me trompe ?
Avec un prealoadbars = 0, peut être ? Je n’ai pas d’autre idée sur le pourquoi du ONCE et spécifique aux actions .. j’attends ton retour de tests.
Avec un Preloadbars = 0 c’est KO car la stratégie a besoin d’un petit historique.
Je viens de terminer mes tests et je pense que l’initialisation avec Once ne doit pas être exécutée lorsque le Timeframe est petit (ici 1 minute) et qu’il n’y a pas assez de cotation. Cela te parait-il cohérent ?
Je n’ai réussi à faire fonctionner le système (à tous les coups me semble-t-il) qu’en supprimant cette initialisation avec Once et en remplaçant la condition d’ouverture par le code suivant :
IF (ImmediateOpening AND NOT ONMARKET AND NOT ONMARKET[1] AND NOT ONMARKET[2]) OR (NOT ImmediateOpening AND Date = DateOpening AND Time = TimeOpening) THEN
La première parenthèse est pas très jolie avec les NOT ONMARKET !!! J’ai écrit cela car je voudrais que l’ouverture ne se fasse qu’une fois (au démarrage du système uniquement) et non à chaque cloture de bougie lorsque le code est relu par l’interpréteur.
Or, j’ai des cas où il n’y a pas de position ouverte, bien que l’on ne soit pas au démarrage du système, parce que l’ai fermée précédemment totalement pour la rouvrir à moitié plus loin dans le code de la stratégie (c’est la seule manière que j’ai trouvée pour faire des clotures partielles…).
Cela serait plus élégant, s’il y avait une instruction qui renverrait le nombre de positions précédemment ouvertes par le système. Ainsi, s’il était égal à 0, cela voudrait dire qu’il s’agit du premier démarrage et donc que je pourrais ouvrir une position. Je n’ai pas trouvé cette instruction ???
Pour compter le nombre de positions ouvertes par la stratégie, tu crées une variable que tu incrémentes dés que tu rentres en position, tout simplement.