Ordre passé alors que la condition n'est pas remplie

Viewing 15 posts - 1 through 15 (of 19 total)
  • Author
    Posts
  • #117042 quote
    Stef1618
    Participant
    Average

    Bonjour,

    Quand on écrit

    if rsi[14] crosses over 50 then
    buy 1 contract at market
    endif

    un ordre est ouvert quand le RSI14 passe les 50, pas de problème.

     

    En revanche quand on écrit

    once n = 0
    
    if n = 0 and rsi[14] crosses over 50 then
    n = 1
    endif
    
    if n = 1 then
    buy 1 contract at market
    endif

    l’ordre est déclenché à la première lecture du code alors que la condition du RSI est fausse.

     

    J’ai besoin d’utiliser la seconde écriture dans le cadre d’un code plus développé. Il y a-til une explication?

     

    Merci,

    #117071 quote
    robertogozzi
    Moderator
    Master

    C’est parce que ProOrder charge certaines barres avant la date de début que vous avez définie.
    Ajoutez, comme ligne 1:

    DEFPARAM PreLoadBars = 0

    Gardez à l’esprit que n ne sera plus effacé, donc votre stratégie (telle qu’elle est dans l’exemple) cumulera continuellement les achats après la première entrée.

    #117084 quote
    Stef1618
    Participant
    Average

    Merci beaucoup pour votre retour rapide.

    Du coup en insérant “defparam prelodbars=0” dans le code ci-dessous j’obtiens le message d’erreur concernant cette instruction.

    defparam cumulateorders = false
    DEFPARAM PreLoadBars = 0
    
    once n = 0 and c = 0
    
    if onmarket then
    n = 0
    endif
     
    while rsi[14] < 50 do
    c = c + 1
    wend
    if rsi[14] crosses over 50 then
    n = 1
    endif
     
    if n = 1 then
    buy 1 contract at highest[c](high) stop
    endif
    
    set stop ploss 100
    
    Capture.png Capture.png
    #117086 quote
    Stef1618
    Participant
    Average

    petit oubli, je dois mettre

    if onmarket then
    n = 0
    c = 0
    endif

    au lieu de

    if onmarket then
    n = 0
    endif
    #117090 quote
    robertogozzi
    Moderator
    Master

    Le dernier exemple est meilleur.
    Avec lui, vous ne devriez même pas avoir besoin d’utiliser DEFPARAM PRELOADBARS = 0.

    #117095 quote
    Stef1618
    Participant
    Average

    En supprimant “DEFPARAM PRELOADBARS = 0” j’obtiens l’erreur “strategy.request.program.parsing.error”.

    defparam cumulateorders = false
    
    once n = 0 and c = 0
    
    if onmarket then
    n = 0
    c = 0
    endif
     
    while rsi[14] < 50 do
    c = c + 1
    wend
    if rsi[14] crosses over 50 then
    n = 1
    endif
    
    if n = 1 then
    buy 0.5 contract at highest[c](high) stop
    endif
    
    set stop ploss 100
    Capture-2.png Capture-2.png
    #117098 quote
    robertogozzi
    Moderator
    Master

    C’est parce que la ligne 3 doit être divisée en deux lignes:

    once n = 0
    once c = 0
    #117099 quote
    Stef1618
    Participant
    Average

    J’ai modifié en divisant en 2 lignes et j’ai toujours le même message d’erreur.

    #117102 quote
    robertogozzi
    Moderator
    Master

    Une PARSING ERROR signifie que lorsque ProOrder scanne les lignes a trouvé une erreur dans la construction d’une ou plusieurs lignes.
    Votre code fonctionne bien sur mon graphique DAX, 1 heure.
    On m’a renvoyé l’erreur “boucle infinie” dans la structure WHILE … WEND, j’ai donc ajouté une limite très élevée (il est important qu’il y en ait une) à la ligne 11:

    while rsi[14] < 50 and c < 999 do
    #117103 quote
    Stef1618
    Participant
    Average

    Je viens d’essayer en mettant c < 100 et je n’ai plus de message d’erreur.

    Je le fais fonctionner sur le DAX M1.

    Par contre un ordre stop est placé dès la première lecture du code et non à la validation des conditions.

    L’ordre buy stop a été placé au plus haut des 99 dernières bougies. Donc le code a d’emblé fait tourné la boucle c=c+1 jusqu’à sa limite 100 sans tenir compte de la condition RSI[14]<50, et placé l’ordre stop dès la première lecture sans tenir compte de la condition RSI[14] CROSSES OVER 50.

    Petit à petit on va y arriver!

    Merci beaucoup pour votre implication.

    #117104 quote
    Stef1618
    Participant
    Average

    Pour info j’ai testé en remettant DEFPARAM PRELOADBARS = 0 et je retrouve le message d’erreur joint

    Capture-3.png Capture-3.png
    #117110 quote
    robertogozzi
    Moderator
    Master

    Vous ne pouvez pas utiliser DEFPARAM PRELOADBARS = 0 si vous devez accéder en arrière aux chandeliers.

    Je n’ai pas pu trouver de solution au fait que N = 1 car RSI est calculé sur les barres préchargées.
    De plus, votre ligne 10 (la ligne WHILE) compare toujours la même valeur RSI tout au long du nombre de barres que vous avez écrites, donc C sera toujours 99. Je vous suggère d’ajouter le paramètre facultatif CLOSE avec une référence à ses valeurs passées.

    while rsi[14](close[c + 1]) < 50 and c < 100 do

    En tout cas, si vous me dites exactement ce que votre stratégie veut réaliser, je peux penser à un moyen de la coder différemment.

    #117299 quote
    Stef1618
    Participant
    Average

    Bonjour,

    La stratégie consiste en l’identification de toutes les bougies consécutives dont le RSI est > 50, ce qui inclue :

    –        la première bougie dont le RSI franchit à la hausse 50,

    –        toutes les bougies suivantes dont le RSI est >50

    –        la dernière bougie dont le RSI franchit à la baisse 50

    A partir de ce groupe de bougie on identifie le plus haut et le plus bas, puis on place un ordre buy stop au plus haut et un ordre sell stop au plus bas.

    Capture-4.png Capture-4.png
    #117337 quote
    Stef1618
    Participant
    Average

    J’ai rajouté DEFPARAM PRELOADBARS = 0 et j’ai encadré le code par IF BARINDEX > 14 then… ENDIF de manière à ce qu’aucun calcul du RSI[14] ne soit opéré avant le chargement de 14 barres.

    Du coup l’ordre n’est plus lancé automatiquement dès la première lecture du code.

    Mais une fois que la condition de franchissement des 50 par le RSI est observée je suis rejeté au motif PRELOADBARS pas assez d’historique disponible!

    Comment se fait-il que le code ai besoin d’aller chercher dans l’historique alors que depuis le lancement du robot jusqu’à la réalisation de la condition il y a suffisamment de barres pour calculer tous les indicateurs utilisés??

    #117363 quote
    Stef1618
    Participant
    Average

    Bonjour Roberto ou Nicolas,

    Je ne sais pas si vous avez eu la possibilité de travailler sur le sujets.

    Après 6 manières de coder différentes, j’ai trouvé une écriture qui lève tous les soucis rencontrés précédemment (problèmes de PRELOADBARS ou de passage d’ordre à la première lecture). Avec un RSI [14] comme indicateur j’attribue la valeur 15 à PRELOADBARS, et pour le comptage des bougies du range j’utilise BARINDEX et non plus une écriture qui est sensée s’incrémenter bougie par bougie. De plus je filtre les ranges composés seulement de 2 bougies.

    Le comportement du code est déjà plus propre mais des positions injustifiées sont toujours prises par moment, je vais me pencher dessus.

    Vous apports sur le sujet ou vos idées de codage me seraient d’une grande aide, merci par avance.

    defparam cumulateorders = false
    defparam preloadbars = 15
    
    X = 1
    
    once c1 = 0
    
    ctime = time > 080000 and time < 180000
    c = c2 - c1 + 1
    longlimit = highest[c](high)
    shortlimit = lowest[c](low)
    delta = longlimit - shortlimit
    
    if onmarket then
    c1 = 0
    endif
    
    if ctime then
    if c1 = 0 and RSI[14](close) crosses over 50 then
    c1 = barindex
    endif
    if RSI[14](close) crosses under 50 then
    c2 = barindex
    endif
    if c > 2 and RSI[14](close) > 30 and not onmarket then
    if close > longlimit - (delta/2) then
    buy X contracts at longlimit stop
    elsif close < longlimit - (delta/2) then
    sellshort X contracts at shortlimit stop
    endif
    endif
    endif
Viewing 15 posts - 1 through 15 (of 19 total)
  • You must be logged in to reply to this topic.

Ordre passé alors que la condition n'est pas remplie


ProOrder : Trading Automatique & Backtests

New Reply
Author
author-avatar
Stef1618 @stef1618 Participant
Summary

This topic contains 18 replies,
has 3 voices, and was last updated by Stef1618
6 years, 1 month ago.

Topic Details
Forum: ProOrder : Trading Automatique & Backtests
Language: French
Started: 01/17/2020
Status: Active
Attachments: 5 files
Logo Logo
Loading...