Hi, I have added this averaging down code to the bottom of a strategy and changed cumulateorders to true but I get an error saying that haopen and haclose are undefined.
What else do I need to do?
// averaging down
if longonmarket and haopen<haclose and haopen[1]>haclose[1] and haclose<tradeprice then
BUY 1 SHARE AT MARKET
endif
// monitor the average price of whole orders and close them accordingly
if longonmarket and haclose>positionprice and countofposition>-1 then
SELL AT MARKET
endif
if shortonmarket and haopen>haclose and haopen[1]<haclose[1] and haclose>tradeprice then
SELLSHORT 1 SHARE AT MARKET
endif
// monitor the average price of whole orders and close them accordingly
if shortonmarket and haclose<positionprice and countofposition<-1 then
EXITSHORT AT MARKET
endif
haopen and haclose need to be defined somewhere in the code. I suspect you have borrowed the snippet from someone that was using it in a hiekin ashi strategy where haclose and haopen were the calculated values for the HA candles.
This is the HA setup to be added to your code, at the beginning:
// HA - definizione Heikin-Ashi
//
once haOpen = open
haClose = (open+close+high+low)/4
if barindex > 0 then
haOpen = (haOpen+haClose[1])/2
endif
haLow = min(low,min(haClose,haOpen))
haHigh = max(high,max(haClose,haOpen))
any reference to unused variable shall be commented out.
Thanks Roberto, but I’m still a bit confused as Heikin-Ashi is new territory for me. I got the snippet here:
https://www.prorealcode.com/blog/trading/averaging-techniques-automated-trading/
Is Heikin-Ashi an essential component to the averaging down technique? or is it a part of the main strategy in Nicolas’s example?
This is the code I’m modifying, as devised by Soulintact. It’s a buy and hold strategy that only sells when in profit and I thought it ‘might’ benefit from averaging down.
Might also crash and burn.
I have tried adding your Heikin-Ashi definition at the top but not sure if I’m doing it right. Does not seem to have the expected effect.
//-------------------------------------------------------------------------
defparam cumulateorders=false
Defparam preloadbars=10000
amount = 1 //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
// HA - definizione Heikin-Ashi
//
once haOpen = open
haClose = (open+close+high+low)/4
if barindex > 0 then
haOpen = (haOpen+haClose[1])/2
endif
//haLow = min(low,min(haClose,haOpen))
//haHigh = max(high,max(haClose,haOpen))
//--------
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
endif
// averaging down
if longonmarket and haopen<haclose and haopen[1]>haclose[1] and haclose<tradeprice then
BUY 1 SHARE AT MARKET
endif
// monitor the average price of whole orders and close them accordingly
if longonmarket and haclose>positionprice and countofposition>-1 then
SELL AT MARKET
endif
//if shortonmarket and haopen>haclose and haopen[1]<haclose[1] and //haclose>tradeprice then
//SELLSHORT 1 SHARE AT MARKET
//endif
// monitor the average price of whole orders and close them accordingly
//if shortonmarket and haclose<positionprice and countofposition<-1 then
//EXITSHORT AT MARKET
//endif
Averaging down can be done on both common japanese and HA candlesticks.
Use CLOSE, OPEN, HIGH and LOW when you want to use common candlesticks.