Backtest fonctionne OK, mais division par zéro en trading réel

Viewing 5 posts - 1 through 5 (of 5 total)
  • Author
    Posts
  • #148038 quote
    Khaled
    Participant
    Veteran

    Bonjour, J’ai testé le code ci-dessous trouvé sur ce site et alors que le backtest fonctionne correctement, en réel le trading s’arrête en affichant le message d’erreur (copie d’écran ci-dessous) “division par zéro lors de l’évaluation du dernier chandelier”. Pourriez-vous m’aider à trouver d’où vient l’erreur dans le code?

    Merci

    //-------------------------------------------------------------------------
    //main code : Paul/Bard Renko 1M ML2 v4b machine learning (ml2)
    MLx2 applied to Long and Short Boxsize
     
    //https://www.prorealcode.com/topic/machine-learning-in-proorder/page/3/#post-121130
    //-------------------------------------------------------------------------
    //https://www.prorealcode.com/topic/why-is-backtesting-so-unreliable/#post-110889
    //definition of code parameters
     
    defparam cumulateorders = false // cumulating positions deactivated
    defparam preloadbars    = 1000
     
    //once mode       = 0//1 // [0] with minimum distance stop; [1] without
    //once minstopdistance = 20
     
    //once percentage = 0 // [1] percentage; [0] points
     
    //Money Management
    //Capital = 10000 + strategyprofit //Current profit made by the closed trades of the running strategy.
    N = 1//30*Capital / Close
     
    heuristicscyclelimit = 2
     
    once heuristicscycle = 0
    once heuristicsalgo1 = 1
    once heuristicsalgo2 = 0
     
    if heuristicscycle >= heuristicscyclelimit then
    if heuristicsalgo1 = 1 then
    heuristicsalgo2 = 1
    heuristicsalgo1 = 0
    elsif heuristicsalgo2 = 1 then
    heuristicsalgo1 = 1
    heuristicsalgo2 = 0
    endif
    heuristicscycle = 0
    else
    once valuex = startingvalue
    once valuey = startingvalue2
    endif
     
    if heuristicsalgo1 = 1 then
     
    //heuristics algorithm 1 start
     
    if (onmarket[1] = 1 and onmarket = 0) or (longonmarket[1] = 1 and longonmarket and countoflongshares < countoflongshares[1]) or (longonmarket[1] = 1 and longonmarket and countoflongshares > countoflongshares[1]) or (shortonmarket[1] = 1 and shortonmarket and countofshortshares < countofshortshares[1]) or (shortonmarket[1] = 1 and shortonmarket and countofshortshares > countofshortshares[1]) or (longonmarket[1] and shortonmarket) or (shortonmarket[1] and longonmarket) then
    optimise = optimise + 1
    endif
     
    //Settings 1 & 2
     
    startingvalue   = 40 //5, 100, 10 //LONG BOXSIZE
    ResetPeriod     = 3 //1, 0.5 Specify no of months after which to reset optimisation
    increment       = 10 //5, 20, 10
    maxincrement    = 20 //5, 10 limit of no of increments either up or down
    reps            = 3  //1 number of trades to use for analysis //2
    maxvalue        = 50 //50, 20, 300, 150 //maximum allowed value
    minvalue        = increment //15, 5, minimum allowed value
     
    startingvalue2  = 40 //5, 100, 50 //SHORT BOXSIZE
    ResetPeriod2    = 3 //1, 0.5 Specify no of months after which to reset optimisation
    increment2      = 10 //5, 10
    maxincrement2   = 20 //1, 30 limit of no of increments either up/down //4
    reps2           = 3  //1, 2 nos of trades to use for analysis //3
    maxvalue2       = 50 //50, 20, 300, 200 maximum allowed value
    minvalue2       = increment //15, 5, minimum allowed value
     
    once monthinit = month
    once yearinit = year
    If (year = yearinit and month = (monthinit + ResetPeriod)) or (year = (yearinit + 1) and ((12 - monthinit) + month = ResetPeriod)) Then
    ValueX = StartingValue
    WinCountB = 0
    StratAvgB = 0
    BestA = 0
    BestB = 0
    monthinit = month
    yearinit = year
    EndIf
     
    once valuex  = startingvalue
    once pincpos = 1 //positive increment position
    once nincpos = 1 //negative increment position
    once optimise = 0 //initialize heuristicks engine counter (must be incremented at position start or exit)
    once mode1 = 1 //switches between negative and positive increments
    //once wincountb = 3 //initialize best win count
    //graph wincountb coloured (0,0,0) as "wincountb"
    //once stratavgb = 4353 //initialize best avg strategy profit
    //graph stratavgb coloured (0,0,0) as "stratavgb"
     
    if optimise = reps then
    wincounta = 0 //initialize current win count
    stratavga = 0 //initialize current avg strategy profit
    heuristicscycle = heuristicscycle + 1
     
    for i = 1 to reps do
    if positionperf(i) > 0 then
    wincounta = wincounta + 1 //increment current wincount
    endif
    stratavga = stratavga + (((positionperf(i)*countofposition[i]*close)*-1)*-1)
    next
    stratavga = stratavga/reps //calculate current avg strategy profit
    //graph (positionperf(1)*countofposition[1]*100000)*-1 as "posperf1"
    //graph (positionperf(2)*countofposition[2]*100000)*-1 as "posperf2"
    //graph stratavga*-1 as "stratavga"
    //once besta = 300
    //graph besta coloured (0,0,0) as "besta"
    if stratavga >= stratavgb then
    stratavgb = stratavga //update best strategy profit
    besta = valuex
    endif
    //once bestb = 300
    //graph bestb coloured (0,0,0) as "bestb"
    if wincounta >= wincountb then
    wincountb = wincounta //update best win count
    bestb = valuex
    endif
     
    if wincounta > wincountb and stratavga > stratavgb then
    mode1 = 0
    elsif wincounta < wincountb and stratavga < stratavgb and mode1 = 1 then
    valuex = valuex - (increment*nincpos)
    nincpos = nincpos + 1
    mode1 = 2
    elsif wincounta >= wincountb or stratavga >= stratavgb and mode1 = 1 then
    valuex = valuex + (increment*pincpos)
    pincpos = pincpos + 1
    mode1 = 1
    elsif wincounta < wincountb and stratavga < stratavgb and mode1 = 2 then
    valuex = valuex + (increment*pincpos)
    pincpos = pincpos + 1
    mode1 = 1
    elsif wincounta >= wincountb or stratavga >= stratavgb and mode1 = 2 then
    valuex = valuex - (increment*nincpos)
    nincpos = nincpos + 1
    mode1 = 2
    endif
     
    if nincpos > maxincrement or pincpos > maxincrement then
    if besta = bestb then
    valuex = besta
    else
    if reps >= 10 then
    weightedscore = 10
    else
    weightedscore = round((reps/100)*100)
    endif
    valuex = round(((besta*(20-weightedscore)) + (bestb*weightedscore))/20) //lower reps = less weight assigned to win%
    endif
    nincpos = 1
    pincpos = 1
    elsif valuex > maxvalue then
    valuex = maxvalue
    elsif valuex < minvalue then
    valuex = minvalue
    endif
     
    optimise = 0
    endif
     
    // heuristics algorithm 1 end
     
    elsif heuristicsalgo2 = 1 then
     
    // heuristics algorithm 2 start
     
    if (onmarket[1] = 1 and onmarket = 0) or (longonmarket[1] = 1 and longonmarket and countoflongshares < countoflongshares[1]) or (longonmarket[1] = 1 and longonmarket and countoflongshares > countoflongshares[1]) or (shortonmarket[1] = 1 and shortonmarket and countofshortshares < countofshortshares[1]) or (shortonmarket[1] = 1 and shortonmarket and countofshortshares > countofshortshares[1]) or (longonmarket[1] and shortonmarket) or (shortonmarket[1] and longonmarket) then
    optimise2 = optimise2 + 1
    endif
     
    //Settings 2
     
    once monthinit2 = month
    once yearinit2 = year
    If (year = yearinit2 and month = (monthinit2 + ResetPeriod2)) or (year = (yearinit2 + 1) and ((12 - monthinit2) + month = ResetPeriod2)) Then
    ValueY = StartingValue2
    WinCountB2 = 0
    StratAvgB2 = 0
    BestA2 = 0
    BestB2 = 0
    monthinit2 = month
    yearinit2 = year
    EndIf
     
    once valuey = startingvalue2
    once pincpos2 = 1 //positive increment position
    once nincpos2 = 1 //negative increment position
    once optimise2 = 0 //initialize heuristicks engine counter (must be incremented at position start or exit)
    once mode2 = 1 //switches between negative and positive increments
    //once wincountb2 = 3 //initialize best win count
    //graph wincountb2 coloured (0,0,0) as "wincountb2"
    //once stratavgb2 = 4353 //initialize best avg strategy profit
    //graph stratavgb2 coloured (0,0,0) as "stratavgb2"
     
    if optimise2 = reps2 then
    wincounta2 = 0 //initialize current win count
    stratavga2 = 0 //initialize current avg strategy profit
    heuristicscycle = heuristicscycle + 1
     
    for i2 = 1 to reps2 do
    if positionperf(i2) > 0 then
    wincounta2 = wincounta2 + 1 //increment current wincount
    endif
    stratavga2 = stratavga2 + (((positionperf(i2)*countofposition[i2]*close)*-1)*-1)
    next
    stratavga2 = stratavga2/reps2 //calculate current avg strategy profit
    //graph (positionperf(1)*countofposition[1]*100000)*-1 as "posperf1-2"
    //graph (positionperf(2)*countofposition[2]*100000)*-1 as "posperf2-2"
    //graph stratavga2*-1 as "stratavga2"
    //once besta2 = 300
    //graph besta2 coloured (0,0,0) as "besta2"
    if stratavga2 >= stratavgb2 then
    stratavgb2 = stratavga2 //update best strategy profit
    besta2 = valuey
    endif
    //once bestb2 = 300
    //graph bestb2 coloured (0,0,0) as "bestb2"
    if wincounta2 >= wincountb2 then
    wincountb2 = wincounta2 //update best win count
    bestb2 = valuey
    endif
     
    if wincounta2 > wincountb2 and stratavga2 > stratavgb2 then
    mode2 = 0
    elsif wincounta2 < wincountb2 and stratavga2 < stratavgb2 and mode2 = 1 then
    valuey = valuey - (increment2*nincpos2)
    nincpos2 = nincpos2 + 1
    mode2 = 2
    elsif wincounta2 >= wincountb2 or stratavga2 >= stratavgb2 and mode2 = 1 then
    valuey = valuey + (increment2*pincpos2)
    pincpos2 = pincpos2 + 1
    mode2 = 1
    elsif wincounta2 < wincountb2 and stratavga2 < stratavgb2 and mode2 = 2 then
    valuey = valuey + (increment2*pincpos2)
    pincpos2 = pincpos2 + 1
    mode2 = 1
    elsif wincounta2 >= wincountb2 or stratavga2 >= stratavgb2 and mode2 = 2 then
    valuey = valuey - (increment2*nincpos2)
    nincpos2 = nincpos2 + 1
    mode2 = 2
    endif
     
    if nincpos2 > maxincrement2 or pincpos2 > maxincrement2 then
    if besta2 = bestb2 then
    valuey = besta2
    else
    if reps2 >= 10 then
    weightedscore2 = 10
    else
    weightedscore2 = round((reps2/100)*100)
    endif
    valuey = round(((besta2*(20-weightedscore2)) + (bestb2*weightedscore2))/20) //lower reps = less weight assigned to win%
    endif
    nincpos2 = 1
    pincpos2 = 1
    elsif valuey > maxvalue2 then
    valuey = maxvalue2
    elsif valuey < minvalue2 then
    valuey = minvalue2
    endif
     
    optimise2 = 0
    endif
    // heuristics algorithm 2 end
    endif
     
    //
    boxsizel = ValueX
    boxsizes = ValueY
     
    //
    renkomaxl = round(close / boxsizel) * boxsizel
    renkominl = renkomaxl - boxsizel
     
    renkomaxs = round(close / boxsizes) * boxsizes
    renkomins = renkomaxs - boxsizes
     
    //
    if high > renkomaxl + boxsizel then
    renkomaxl = renkomaxl + boxsizel
    renkominl = renkominl + boxsizel
    endif
    if low < renkomins - boxsizes then
    renkomaxs = renkomaxs - boxsizes
    renkomins = renkomins - boxsizes
    endif
     
     
    // Conditions to enter long positions
    Buy N CONTRACT at renkoMaxL + boxSizeL stop
     
    // Conditions to enter short positions
    Sellshort N CONTRACT at renkoMinS - boxSizeS stop
     
     
    //
    //if percentage then
    //set stop %loss 0.25 %trailing 0.5
    //set target %profit 2
    //else
    set stop ptrailing 50 //50 + 100
    set target pprofit 500
    //endif
    2020-10-22-011938.png 2020-10-22-011938.png
    #148062 quote
    Nicolas
    Keymaster
    Master

    Je n’ai pas décelé de valeur nulle dans une division à la première lecture, mais il semble en avoir discuté dans le sujet d’où provient ce code, aurais-tu l’URL ?

    Une division par zéro provoque l’arrêt du système quoi qu’il arrive, si cela arrive dés l’envoi de la stratégie dans ProOrder, c’est parce qu’une variable utilisée dans une division n’a pas encore de valeur. Il faut donc relire le code et vérifier que chaque variable utilisée comme diviseur a bien une valeur supérieure à 0 lors de la première lecture du code.

    #148065 quote
    Khaled
    Participant
    Veteran

    Merci Nicolas, le code vient de https://www.prorealcode.com/reply/128486/

    mais pourquoi cela fonctionne-t-il correctement dans le Backtest alors?

    j’ai changé les lignes 267 et 268 comme suit et j’ai un Win Rate % qui chute de 80% à 60%. L’Algo n’est plus arrêté par “division à zéro” dans certains TF (pas tous).

    boxsizel = max (ValueX , increment)
    
    boxsizes = max (ValueY , increment2)
    #148068 quote
    Nicolas
    Keymaster
    Master

    Concernant les performances de l’algo, je ne vais pas pouvoir t’aider, tu devrais en discuter dans le sujet approprié.

    ProBacktest n’a pas de problème à exécuter du code avec des erreurs de programmation, contrairement à ProOrder qui lui ne veut te faire prendre aucun risque. Quelle est le but de faire une division par zéro ? 🙂

    #148072 quote
    Khaled
    Participant
    Veteran

    Merci Nicolas

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

Backtest fonctionne OK, mais division par zéro en trading réel


ProBuilder : Indicateurs & Outils Personnalisés

New Reply
Author
author-avatar
Khaled @khaled Participant
Summary

This topic contains 4 replies,
has 2 voices, and was last updated by Khaled
5 years, 4 months ago.

Topic Details
Forum: ProBuilder : Indicateurs & Outils Personnalisés
Language: French
Started: 10/22/2020
Status: Active
Attachments: 1 files
Logo Logo
Loading...