A trading system based on the indicator One More Average MACD

Viewing 15 posts - 1 through 15 (of 21 total)
  • Author
    Posts
  • #115728 quote
    soulintact
    Participant
    Senior

    Good morning and a Happy New Year!

    I am trying to create a trading system based on the indicator posted by Nicolas, One More Average MACD, but I fail. I tried to tweak the different parameters but without any results. Any ideas why?

    Thanks!!

    //-------------------------------------------------------------------------
    defparam cumulateorders=false
    Defparam preloadbars=10000
    
    amount = 10 //quantity of shares/contracts to open for each new order
    
    //--------------------------------------------------------------------------------//
    
    //Indicators
    //Indicator: PRC_OneMoreAverage MACD
    //Release date: 23.11.2016
    //Web: https://www.prorealcode.com/prorealtime-indicators/one-more-average-macd/
    //Coded by: Nicolas @ www.prorealcode.com
    
    //--parameters
    //>OMA parameters
    Sensibility = 1
    Adaptive = 1
    //>MACD periods
    FLength = 24
    SLength = 52
    //>signal line
    SigLength = 9
    Sigma = 4
    Offset = 0.85
    //--------
    
    Speed = Sensibility
    Speed  = Max(Speed,-1.5)
    price = average[1](customclose)
    tconst=Speed
    
    //--Fast moving average
    FLength = Max(FLength,1)
    //adaptive period
    averagePeriod = FLength
    if adaptive=1 and averagePeriod > 1 then
    minPeriod = averagePeriod/2.0
    maxPeriod = minPeriod*5.0
    endPeriod = round(maxPeriod)
    signal    = Abs((price-stored[endPeriod]))
    noise     = 0.00000000001
    
    for k=1 to endPeriod do
    noise=noise+Abs(price-stored[k])
    averagePeriod = round(((signal/noise)*(maxPeriod-minPeriod))+minPeriod)
    next
    
    endif
    
    alpha = (2.0+tconst)/(1.0+tconst+averagePeriod)
    
    e1 = e1 + alpha*(price-e1)
    e2 = e2 + alpha*(e1-e2)
    v1 = 1.5 * e1 - 0.5 * e2
    e3 = e3 + alpha*(v1   -e3)
    e4 = e4 + alpha*(e3-e4)
    v2 = 1.5 * e3 - 0.5 * e4
    e5 = e5 + alpha*(v2   -e5)
    e6 = e6 + alpha*(e5-e6)
    Fast = 1.5 * e5 - 0.5 * e6
    
    //------------------------------------
    
    //--Slow moving average
    SLength = Max(SLength,1)
    //adaptive period
    averagePeriod = SLength
    if adaptive=1 and averagePeriod > 1 then
    minPeriod = averagePeriod/2.0
    maxPeriod = minPeriod*5.0
    endPeriod = round(maxPeriod)
    signal    = Abs((price-stored[endPeriod]))
    noise     = 0.00000000001
    
    for k=1 to endPeriod do
    noise=noise+Abs(price-stored[k])
    averagePeriod = round(((signal/noise)*(maxPeriod-minPeriod))+minPeriod)
    next
    
    endif
    
    alpha = (2.0+tconst)/(1.0+tconst+averagePeriod)
    
    e1 = e1 + alpha*(price-e1)
    e2 = e2 + alpha*(e1-e2)
    v1 = 1.5 * e1 - 0.5 * e2
    e3 = e3 + alpha*(v1   -e3)
    e4 = e4 + alpha*(e3-e4)
    v2 = 1.5 * e3 - 0.5 * e4
    e5 = e5 + alpha*(v2   -e5)
    e6 = e6 + alpha*(e5-e6)
    Slow = 1.5 * e5 - 0.5 * e6
    
    //------------------------------------
    
    //--Signal moving average
    OMAMACD = Slow-Fast
    SigLength = Max(SigLength,1)
    //---Signal MA
    n = (Offset * (SigLength - 1))
    t = SigLength/Sigma
    SWtdSum = 0
    SCumWt  = 0
    for k = 0 to SigLength - 1 do
    SWtd = Exp(-((k-n)*(k-n))/(2*t*t))
    SWtdSum = SWtdSum + SWtd * OMAMACD[SigLength - 1 - k]
    SCumWt = SCumWt + SWtd
    next
    SIGMACD = SWtdSum / SCumWt
    
    //------------------------------------
    
    stored=price
    
    //------------------------------------
    
    BullSMA=(SIGMACD<OMAMACD)
    BearSMA=(SIGMACD>OMAMACD)
    
    //--------------------------------------------------------------------------------//
    
    //Conditions when to act
    if (not longonmarket and BullSMA)then
    buy amount shares at market
    endif
     
    if (longonmarket and BearSMA and positionperf>0) then
    sell at market
    endif
    #115730 quote
    Matriciel
    Participant
    Master

    Vous utilisez le même nom pour 2 variables différentes.
    Il faut un nom différent pour chaque nouvelle variable.

    soulintact thanked this post
    #115731 quote
    Matriciel
    Participant
    Master
    You use the same name for 2 different variables.
    Each new variable needs a different name.
    #115734 quote
    soulintact
    Participant
    Senior

    Merci pour votre réponse rapide! Cependant, je ne comprends pas ce que vous voulez dire. OMAMACD et SIGMACD sont des variables différentes, ou voulez-vous dire quelques autres? Merci de votre patience!

    Thanks for your quick answer! However, I do not understand what you mean. OMAMACD and SIGMACD are different variables, or do you mean some others? Thanks for your patience!

    example.png example.png
    #115739 quote
    Matriciel
    Participant
    Master
    Like for example “averagePeriod” in the “Fast moving average”.
    “AveragePeriod” in the “Slow moving average” must be renamed differently as “SaveragePeriod” and so on for all the variables written in black color.
    soulintact thanked this post
    #115745 quote
    Vonasi
    Moderator
    Master

    You need to ensure that there are enough bars before starting the calculations. With the standard settings it seems a minimum of 129 bars are required.

    //-------------------------------------------------------------------------
    defparam cumulateorders=false
    Defparam preloadbars=10000
    
    amount = 1 //quantity of shares/contracts to open for each new order
    
    ///PRC_OneMoreAverage MACD | indicator
    //23.11.2016
    //Nicolas @ www.prorealcode.com
    //Sharing ProRealTime knowledge
    
    //--parameters
    //>OMA parameters
    Sensibility = 1
    Adaptive = 1
    //>MACD periods
    FLength = 24
    SLength = 52
    //>signal line
    SigLength = 9
    Sigma = 4
    Offset = 0.85
    //--------
    
    if barindex > 129 then
    Speed = Sensibility
    Speed  = Max(Speed,-1.5)
    price = average[1](customclose)
    tconst=Speed
    
    //--Fast moving average
    FLength = Max(FLength,1)
    //adaptive period
    averagePeriod = FLength
    if adaptive=1 and averagePeriod > 1 then
    minPeriod = averagePeriod/2.0
    maxPeriod = minPeriod*5.0
    endPeriod = round(maxPeriod)
    signal    = Abs((price-stored[endPeriod]))
    noise     = 0.00000000001
    
    for k=1 to endPeriod do
    noise=noise+Abs(price-stored[k])
    averagePeriod = round(((signal/noise)*(maxPeriod-minPeriod))+minPeriod)
    next
    
    endif
    
    alpha = (2.0+tconst)/(1.0+tconst+averagePeriod)
    
    e1 = e1 + alpha*(price-e1)
    e2 = e2 + alpha*(e1-e2)
    v1 = 1.5 * e1 - 0.5 * e2
    e3 = e3 + alpha*(v1   -e3)
    e4 = e4 + alpha*(e3-e4)
    v2 = 1.5 * e3 - 0.5 * e4
    e5 = e5 + alpha*(v2   -e5)
    e6 = e6 + alpha*(e5-e6)
    Fast = 1.5 * e5 - 0.5 * e6
    //------------------------------------
    
    //--Slow moving average
    SLength = Max(SLength,1)
    //adaptive period
    averagePeriod = SLength
    if adaptive=1 and averagePeriod > 1 then
    minPeriod = averagePeriod/2.0
    maxPeriod = minPeriod*5.0
    endPeriod = round(maxPeriod)
    signal    = Abs((price-stored[endPeriod]))
    noise     = 0.00000000001
    
    for k=1 to endPeriod do
    noise=noise+Abs(price-stored[k])
    averagePeriod = round(((signal/noise)*(maxPeriod-minPeriod))+minPeriod)
    next
    
    endif
    
    alpha = (2.0+tconst)/(1.0+tconst+averagePeriod)
    
    e1 = e1 + alpha*(price-e1)
    e2 = e2 + alpha*(e1-e2)
    v1 = 1.5 * e1 - 0.5 * e2
    e3 = e3 + alpha*(v1   -e3)
    e4 = e4 + alpha*(e3-e4)
    v2 = 1.5 * e3 - 0.5 * e4
    e5 = e5 + alpha*(v2   -e5)
    e6 = e6 + alpha*(e5-e6)
    Slow = 1.5 * e5 - 0.5 * e6
    //------------------------------------
    
    
    //--Signal moving average
    OMAMACD = Slow-Fast
    SigLength = Max(SigLength,1)
    //---Signal MA
    n = (Offset * (SigLength - 1))
    t = SigLength/Sigma
    SWtdSum = 0
    SCumWt  = 0
    for k = 0 to SigLength - 1 do
    SWtd = Exp(-((k-n)*(k-n))/(2*t*t))
    SWtdSum = SWtdSum + SWtd * OMAMACD[SigLength - 1 - k]
    SCumWt = SCumWt + SWtd
    next
    SIGMACD = SWtdSum / SCumWt
    //------------------------------------
    
    stored=price
    
    //Conditions when to act
    
    BullSMA=(SIGMACD<OMAMACD)
    BearSMA=(SIGMACD>OMAMACD)
    
    if (not longonmarket and BullSMA)then
    buy amount shares at market
    endif
     
    if (longonmarket and BearSMA and positionperf>0) then
    sell at market
    endif
    endif
    
    graph sigmacd
    graph omamacd
    
    soulintact thanked this post
    #115747 quote
    Vonasi
    Moderator
    Master

    Matriciel – Please only use English in the English speaking forums. Using two languages just bloats the topics.

    In the code it is OK to use the same variable name several times in different calculations as its new value for it is calculated prior to its use each time. Its previous value is not part of the calculation so that is fine.

    I just checked my code from my last post and it seems that the values of SIGMACD and OMAMACD are not calculated the same as the indicator returned values. Not sure why – might need to spend a little more time on this!

    soulintact thanked this post
    #115752 quote
    soulintact
    Participant
    Senior

    Thank you both! I tried to implement both your suggestions, but I still fail, now with an error… Thanks for your time!

     

    //-------------------------------------------------------------------------
    defparam cumulateorders=false
    Defparam preloadbars=10000
    
    amount = 10 //quantity of shares/contracts to open for each new order
    
    //--------------------------------------------------------------------------------//
    
    //Indicators
    //Indicator: PRC_OneMoreAverage MACD
    //Release date: 23.11.2016
    //Web: https://www.prorealcode.com/prorealtime-indicators/one-more-average-macd/
    //Code translator: Nicolas @ www.prorealcode.com
    
    //--parameters
    //>OMA parameters
    Sensibility = 1
    Adaptive = 1
    //>MACD periods
    FLength = 24
    SLength = 52
    //>signal line
    SigLength = 9
    Sigma = 4
    Offset = 0.85
    //--------
    if barindex > 129 then
    Speed = Sensibility
    Speed  = Max(Speed,-1.5)
    price = average[1](customclose)
    tconst=Speed
    
    //--Fast moving average
    FLength = Max(FLength,1)
    //adaptive period
    averagePeriod = FLength
    if adaptive=1 and averagePeriod > 1 then
    minPeriod = averagePeriod/2.0
    maxPeriod = minPeriod*5.0
    endPeriod = round(maxPeriod)
    signal    = Abs((price-stored[endPeriod]))
    noise     = 0.00000000001
    
    for k=1 to endPeriod do
    noise=noise+Abs(price-stored[k])
    averagePeriod = round(((signal/noise)*(maxPeriod-minPeriod))+minPeriod)
    next
    
    endif
    
    alpha = (2.0+tconst)/(1.0+tconst+averagePeriod)
    
    e1 = e1 + alpha*(price-e1)
    e2 = e2 + alpha*(e1-e2)
    v1 = 1.5 * e1 - 0.5 * e2
    e3 = e3 + alpha*(v1   -e3)
    e4 = e4 + alpha*(e3-e4)
    v2 = 1.5 * e3 - 0.5 * e4
    e5 = e5 + alpha*(v2   -e5)
    e6 = e6 + alpha*(e5-e6)
    Fast = 1.5 * e5 - 0.5 * e6
    
    //------------------------------------
    
    //--Slow moving average
    SLength = Max(SLength,1)
    //adaptive period
    SaveragePeriod = SLength
    if adaptive=1 and SaveragePeriod > 1 then
    SminPeriod = SaveragePeriod/2.0
    SmaxPeriod = SminPeriod*5.0
    SendPeriod = round(maxPeriod)
    Ssignal    = Abs((price-stored[SendPeriod]))
    Snoise     = 0.00000000001
    
    for k=1 to SendPeriod do
    Snoise=Snoise+Abs(price-stored[k])
    SaveragePeriod = round(((Ssignal/Snoise)*(SmaxPeriod-SminPeriod))+SminPeriod)
    next
    
    endif
    
    Salpha = (2.0+tconst)/(1.0+tconst+SaveragePeriod)
    
    Se1 = Se1 + Salpha*(price-Se1)
    Se2 = Se2 + Salpha*(Se1-Se2)
    Sv1 = 1.5 * Se1 - 0.5 * Se2
    Se3 = Se3 + Salpha*(Sv1   -Se3)
    Se4 = Se4 + Salpha*(Se3-Se4)
    Sv2 = 1.5 * Se3 - 0.5 * Se4
    Se5 = Se5 + Salpha*(Sv2   -Se5)
    Se6 = Se6 + Salpha*(Se5-Se6)
    Slow = 1.5 * Se5 - 0.5 * Se6
    
    //------------------------------------
    
    //--Signal moving average
    OMAMACD = Slow-Fast
    SigLength = Max(SigLength,1)
    //---Signal MA
    n = (Offset * (SigLength - 1))
    t = SigLength/Sigma
    SWtdSum = 0
    SCumWt  = 0
    for k = 0 to SigLength - 1 do
    SWtd = Exp(-((k-n)*(k-n))/(2*t*t))
    SWtdSum = SWtdSum + SWtd * OMAMACD[SigLength - 1 - k]
    SCumWt = SCumWt + SWtd
    next
    SIGMACD = SWtdSum / SCumWt
    
    //------------------------------------
    
    stored=price
    
    //------------------------------------
    
    BullSMA=(SIGMACD<OMAMACD)
    BearSMA=(SIGMACD>OMAMACD)
    
    //--------------------------------------------------------------------------------//
    
    //Conditions when to act
    if (not longonmarket and BullSMA)then
    buy amount shares at market
    endif
     
    if (longonmarket and BearSMA and positionperf>0) then
    sell at market
    endif
    #115764 quote
    GraHal
    Participant
    Master

    I used Vonasi version and got attached … no error messages.

    Ain’t never seen a Gain to Loss ratio as high as attached!!

    soulintact thanked this post
    Soul-3.jpg Soul-3.jpg Soul-4.jpg Soul-4.jpg
    #115767 quote
    GraHal
    Participant
    Master

    but I still fail, now with an error

    Your version just needs an extra endif  adding at line 131

    soulintact thanked this post
    #115769 quote
    Madrosat
    Participant
    Master

    for me in Soulintact  to plot an other endif a the end

    but Grahal what do you use  as code because for me  no result

    #115772 quote
    GraHal
    Participant
    Master

    @Madrosat here you are … attached is Soulintact v1.1 as the top image.

    All I did was add endif as the last line to Soulintact v1.1 version

    Attached is the code

    Soul-5.jpg Soul-5.jpg SoulVonNic1mreMACD-DJI-5M-v1.1.itf
    #115776 quote
    Vonasi
    Moderator
    Master

    Ain’t never seen a Gain to Loss ratio as high as attached!!

    That’s what happens if you never close any losing positions! The strategy does not exit unless it is profit. At some point you will find drawdown to be as impressive as gain/loss ratio!

    soulintact and winnie37 thanked this post
    #115782 quote
    soulintact
    Participant
    Senior

    Thank you for all your help. Truly appreciated! Take care and have a great start of 2020!

    #115784 quote
    GraHal
    Participant
    Master

    You too soulintact … keep on doing more of the same!!

    I wish I had put both versions Live … they’ve made nearly £80 over 3 trades in the last 3 hours!!!! hahahahaha

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

A trading system based on the indicator One More Average MACD


ProOrder: Automated Strategies & Backtesting

New Reply
Author
author-avatar
soulintact @soulintact Participant
Summary

This topic contains 20 replies,
has 6 voices, and was last updated by GraHal
6 years, 1 month ago.

Topic Details
Forum: ProOrder: Automated Strategies & Backtesting
Language: English
Started: 01/02/2020
Status: Active
Attachments: 9 files
Logo Logo
Loading...