Yauheni

YK Fuller Strategy

Backtesting of Fuller strategy.
オープンソーススクリプト

TradingViewの精神に則り、このスクリプトの作者は、トレーダーが理解し検証できるようにオープンソースで公開しています。作者に敬意を表します!無料で使用することができますが、このコードを投稿で再利用するには、ハウスルールに準拠する必要があります。 お気に入りに登録してチャート上でご利用頂けます。

免責事項

これらの情報および投稿は、TradingViewが提供または保証する金融、投資、取引、またはその他の種類のアドバイスや推奨を意図したものではなく、またそのようなものでもありません。詳しくは利用規約をご覧ください。

チャートでこのスクリプトを利用したいですか?
//@version=2
strategy("YK Fuller Strategy", overlay=true)

pTail = input(title="Tail (default 51), %", type=integer, defval=51,  minval=0, maxval=100)
tail = pTail * 0.01
tail1 = 1 - tail

ema1Value = input(title="EMA (default 8)", type=integer, defval=8,  minval=1)
ema2Value = input(title="EMA (default 21)", type=integer, defval=21,  minval=1)

minRlDistance = input(title="Minimum distance from Pin-Bar to the round level", type=float, defval=0,  minval=0)
floatCount = input(title="The count of digits after the decimal point (for example, 3 - for GBPJPY, 5 - for EURUSD )", type=integer, defval=5,  minval=3, maxval=5)

rDelimeter = (floatCount == 3) ? 1000 : (floatCount == 4 ? 10000 : 100000)

intRoundLevel = close * rDelimeter
intRemainder = intRoundLevel % 1000
toRound = (intRemainder >= 500) ? 1000 : 0

roundLevel = (intRoundLevel - intRemainder + toRound) / rDelimeter
rlDistance = abs(close - roundLevel)

showRl = input(title="Show round levels?", type=bool, defval=false)
roundLevelPlot = iff(showRl, roundLevel, na)
plot(roundLevelPlot, title='Round Level', color=lime, style=circles, linewidth=2)

iIb = input(title="Ignore inside bars?", type=bool, defval=false)
insideBar = iIb and ((high <= high[1] and low >= low[1]) or (high <= high[2] and low >= low[2] and high[1] <= high[2] and low[1] >= low[2]) or (high <= high[3] and low >= low[3] and high[2] <= high[3] and low[2] >= low[3] and high[1] <= high[3] and low[1] >= low[3]) or (high <= high[4] and low >= low[4] and high[3] <= high[4] and low[3] >= low[4] and high[2] <= high[4] and low[2] >= low[4] and high[1] <= high[4] and low[1] >= low[4]) or (high <= high[5] and low >= low[5] and high[4] <= high[5] and low[4] >= low[5] and high[3] <= high[5] and low[3] >= low[5] and high[2] <= high[5] and low[2] >= low[5] and high[1] <= high[5] and low[1] >= low[5]) or (high <= high[6] and low >= low[6] and high[5] <= high[6] and low[5] >= low[6] and high[4] <= high[6] and low[4] >= low[6] and high[3] <= high[6] and low[3] >= low[6] and high[2] <= high[6] and low[2] >= low[6] and high[1] <= high[6] and low[1] >= low[6]) or (high <= high[7] and low >= low[7] and high[6] <= high[7] and low[6] >= low[7] and high[5] <= high[7] and low[5] >= low[7] and high[4] <= high[7] and low[4] >= low[7] and high[3] <= high[7] and low[3] >= low[7] and high[2] <= high[7] and low[2] >= low[7] and high[1] <= high[7] and low[1] >= low[7]) or (high <= high[8] and low >= low[8] and high[7] <= high[8] and low[7] >= low[8] and high[6] <= high[8] and low[6] >= low[8] and high[5] <= high[8] and low[5] >= low[8] and high[4] <= high[8] and low[4] >= low[8] and high[3] <= high[8] and low[3] >= low[8] and high[2] <= high[8] and low[2] >= low[8] and high[1] <= high[8] and low[1] >= low[8]) or (high <= high[9] and low >= low[9] and high[8] <= high[9] and low[8] >= low[9] and high[7] <= high[9] and low[7] >= low[9] and high[6] <= high[9] and low[6] >= low[9] and high[5] <= high[9] and low[5] >= low[9] and high[4] <= high[9] and low[4] >= low[9] and high[3] <= high[9] and low[3] >= low[9] and high[2] <= high[9] and low[2] >= low[9] and high[1] <= high[9] and low[1] >= low[9]) or (high <= high[10] and low >= low[10] and high[9] <= high[10] and low[9] >= low[10] and high[8] <= high[10] and low[8] >= low[10] and high[7] <= high[10] and low[7] >= low[10] and high[6] <= high[10] and low[6] >= low[10] and high[5] <= high[10] and low[5] >= low[10] and high[4] <= high[10] and low[4] >= low[10] and high[3] <= high[10] and low[3] >= low[10] and high[2] <= high[10] and low[2] >= low[10] and high[1] <= high[10] and low[1] >= low[10])) ? true : false
            
emaCrossing = input(title="ЕМА crossing?", type=bool, defval=true)

ema1 = ema(close, ema1Value)
ema2 = ema(close, ema2Value)

height = high - low
bodyHeight = abs(open - close)

fakeHighUp = high - close
fakeLowUp = open - low

pinHeightUp = height - min(fakeHighUp, fakeLowUp)

getPinBarUp(ema1, ema2) => open < close and 
           ((rlDistance > minRlDistance and 
           fakeHighUp * 2 < fakeLowUp and 
           bodyHeight > fakeHighUp and 
           ema1 >= low and 
           close > ema1 and 
           open > ema1 and 
           close > ema2 and 
           open > ema2 and 
           ((emaCrossing and ema1 > ema2) or emaCrossing == false) and 
           open > (close - pinHeightUp * tail1) and 
           close > (high - pinHeightUp * tail1)) 
           or 
           (rlDistance > minRlDistance and 
           fakeHighUp > fakeLowUp * 2 and 
           bodyHeight > fakeLowUp and 
           high >= ema1 and 
           close < ema1 and 
           close < ema2 and 
           ((emaCrossing and ema1 < ema2) or emaCrossing == false) and 
           open < (high - pinHeightUp * tail) and 
           close < (high - pinHeightUp * tail))) 
           ? true : false
           
pinBarUp = getPinBarUp(ema1, ema2)
          
fakeHighDn = high - open
fakeLowDn = close - low

pinHeightDn = height - min(fakeHighDn, fakeLowDn)

getPinBarDn(ema1, ema2) => open > close and 
           ((rlDistance > minRlDistance and 
           fakeHighDn > fakeLowDn * 2 and 
           bodyHeight > fakeLowDn and 
           high >= ema1 and 
           close < ema1 and 
           open < ema1 and 
           close < ema2 and 
           open < ema2 and 
           ((emaCrossing and ema1 < ema2) or emaCrossing == false) and 
           open < (high - pinHeightDn * tail) and 
           close < (high - pinHeightDn * tail))
           or 
           (rlDistance > minRlDistance and 
           fakeHighDn * 2 < fakeLowDn and 
           bodyHeight > fakeHighDn and 
           ema1 >= low and 
           ema1 < close and 
           ema2 < close and 
           ((emaCrossing and ema1 > ema2) or emaCrossing == false) and 
           open > (open - pinHeightDn * tail1) and 
           close > (open - pinHeightDn * tail1)))
           ? true : false

pinBarDn = getPinBarDn(ema1, ema2)

highlightBars = input(title="Highlight bars", type=bool, defval=true)

barcolor((pinBarUp and highlightBars and insideBar == false) ? lime : na, title="Bullish bar")
barcolor((pinBarDn and highlightBars and insideBar == false) ? red : na, title="Bearish bar")

longCondition = ((pinBarUp and fakeHighUp < fakeLowUp) or (pinBarDn and fakeHighDn < fakeLowDn)) and insideBar == false

lossProfit = input(title="Loss / Profit = 1 / X", type=float, defval=1,  minval=0, maxval=10000)

if longCondition and strategy.position_size == 0
    strategy.entry("Long", strategy.long)
    lossValue = (close - low) * rDelimeter
    profitValue = lossValue * lossProfit
    strategy.exit("Close", "Long", loss=lossValue, profit=profitValue)

shortCondition = ((pinBarDn and fakeHighDn > fakeLowDn) or (pinBarUp and fakeHighUp > fakeLowUp)) and insideBar == false

if shortCondition and strategy.position_size == 0
    strategy.entry("Short", strategy.short)
    lossValue = (high - close) * rDelimeter
    profitValue = lossValue * lossProfit
    strategy.exit("Close", "Short", loss=lossValue, profit=profitValue)