Probacktest et taille d’ordre variable

Viewing 6 posts - 1 through 6 (of 6 total)
  • Author
    Posts
  • #184678 quote
    rodmcban
    Participant
    Junior

    Bonjour tout le monde,

    J’essaie depuis des semaines d’implémenter une stratégie de trend following dont la taille des ordres décroit en fonction de l’ordre d’arrivée. Par exemple, le premier ordre est à 2 lots, le suivant à 1 lot, ensuite 0.5 puis 0.

    J’ai stocké les différentes tailles dans un tableau et je mets à jour un indice qui m’indique où en est la stratégie en nombre d’ordres passés depuis la première.

    Probacktest ne rend aucun résultat si l’ordre d’achat fait référence à un élément du tableau via l’indice variable.

    Si je supprime le once devant ix = 0, Probacktest rend un résultat, mais évidemment ix est toujours égal à 0 dans ce cas et le tableau des tailles d’ordres n’est pas parcouru.

    Quelqu’un aurait-il une idée ? J’avais déjà remarqué le même genre de problème avec cette fois une taille d’ordre qui était donnée par une fonction d’un indice. J’ai l’impression que le BUY dans le IF n’arrive pas accéder à la valeur de l’indice.

    Merci,

    Bien à vous,

    Rod

    $sizes[0] = 2
    $sizes[1] = 1.5
    $sizes[2] = 1
    
    
    ema200 = ExponentialAverage[200](close)
    ema50 = ExponentialAverage[50](close)
    ema5 = ExponentialAverage[5](close)
    
    buysignal = (close > ema200) and (ema5 crosses over ema50)
    sellsignal = (close < ema200) and (ema5 crosses under ema50)
    
    once ix = 0
    size = $sizes[ix]
    
    // Conditions pour ouvrir une position acheteuse
    IF buysignal THEN
    // cette ligne ne fonctionne pas, pas de sortie de Probacktest :
    BUY size CONTRACTS AT MARKET 
    // cette ligne fonctionne, mais ce n'est pas le résultat voulu pour les ordres BUY:
    // BUY $sizes[0] CONTRACTS AT MARKET
    ix = ix + 1
    ENDIF
    
    // Conditions pour fermer une position acheteuse
    exitlong = low crosses under ema200
    
    If LongOnMarket AND exitlong THEN
    SELL AT MARKET
    ix = 0
    ENDIF
    
    // Conditions pour ouvrir une position en vente à découvert
    
    IF sellsignal THEN
    // Cette ligne fonctionne :
    SELLSHORT size CONTRACTS AT MARKET
    ix = ix + 1
    ENDIF
    
    // Conditions pour fermer une position en vente à découvert
    covershort = high crosses over ema200
    
    IF ShortOnMarket AND covershort THEN
    EXITSHORT AT MARKET
    ix = 0
    ENDIF
    #184850 quote
    JC_Bywan
    Moderator
    Master

    Bonsoir,

    ça se fait sans tableau, ce qui évite les erreurs d’indexation ix, erreur de surcroit amplifiée par le mélange du même index ix pour long ou short. On peut tester comme ceci, en prenant soin de séparer comptage long et short:

    ema200 = ExponentialAverage[200](close)
    ema50 = ExponentialAverage[50](close)
    ema5 = ExponentialAverage[5](close)
    
    buysignal = (close > ema200) and (ema5 crosses over ema50)
    sellsignal = (close < ema200) and (ema5 crosses under ema50)
    
    once sizeL=2
    once sizeS=2
    
    // Conditions pour ouvrir une position acheteuse
    IF buysignal and countoflongshares<4.5 THEN
    BUY sizeL CONTRACTS AT MARKET
    if sizeL=2 then
    sizeL=1.5
    elsif sizeL=1.5 then
    sizeL=1
    endif
    ENDIF
    
    // Conditions pour fermer une position acheteuse
    exitlong = low crosses under ema200
    
    If LongOnMarket AND exitlong THEN
    SELL AT MARKET
    sizeL=2
    ENDIF
    
    // Conditions pour ouvrir une position en vente à découvert
    
    IF sellsignal and countofshortshares<4.5 THEN
    SELLSHORT sizeS CONTRACTS AT MARKET
    if sizeS=2 then
    sizeS=1.5
    elsif sizeS=1.5 then
    sizeS=1
    endif
    ENDIF
    
    // Conditions pour fermer une position en vente à découvert
    covershort = high crosses over ema200
    
    IF ShortOnMarket AND covershort THEN
    EXITSHORT AT MARKET
    sizeS=2
    ENDIF
    
    graph sizeL as "sizeL"
    graph -sizeS as "-sizeS"
    #184883 quote
    ticktack
    Participant
    Junior

    C’est faisable avec tableau mais avec une horrible rustine 😉

    La ligne qui bugge est “size=$sizes[ix]”   … si  on la remplace par

    FOR i=0 to 2 DO
    IF i=ix THEN
    size=$sizes[i]
    BREAK
    ENDIF
    NEXT

    ça marche … mais bon c’est vraiment horrible de devoir faire ça 🙁

    #185010 quote
    rodmcban
    Participant
    Junior

    Super, merci beaucoup à vous 2 !

    Je ne connaissais pas countoflongshares.

    Je vais essayer les 2 solutions, je pensais que les tableaux permettraient plus de souplesse.

    Bien à vous

    #185397 quote
    Nicolas
    Keymaster
    Master

    Tous les chemins mènent à Rome en programmation, cependant il y a des façons plus ou moins “élégante” d’arriver à ses fins 🙂

    ZeroCafeine thanked this post
    #185782 quote
    ZeroCafeine
    Participant
    Senior

    Tous les chemins mènent à Rome en programmation, cependant il y a des façons plus ou moins “élégante” d’arriver à ses fins 🙂

    Qui dit manière élégante dis aussi un code optimisé et lecture facile, consommation moindre sur les serveur et Surtout exécution plus rapide

Viewing 6 posts - 1 through 6 (of 6 total)
  • You must be logged in to reply to this topic.

Probacktest et taille d’ordre variable


ProOrder : Trading Automatique & Backtests

New Reply
Author
author-avatar
rodmcban @rodmcban Participant
Summary

This topic contains 5 replies,
has 5 voices, and was last updated by ZeroCafeine
4 years, 1 month ago.

Topic Details
Forum: ProOrder : Trading Automatique & Backtests
Language: French
Started: 01/05/2022
Status: Active
Attachments: No files
Logo Logo
Loading...