
この戦略は,移動平均がトレンド方向を判断し,K線形が逆転点を判断する方法を組み合わせて,トレンド追跡取引を実現している.戦略は,まず移動平均を使用して,全体的なトレンド方向を判断し,その後,トレンド方向で潜在的な逆転K線形を入場信号として探して,トレンドの実行を追跡する.
策略は10日間の単純な移動平均を用いて価格の傾向の方向を判断する.価格が移動平均より高いとき,上昇傾向にあると考えられる.価格が移動平均より低いとき,下降傾向にあると考えられる.
トレンドの方向を判定した後,戦略は,陽線K線形状と陰線K線形状の連続によって潜在的なトレンドの逆転点を判断する.一般的な陽線形状は,開星,明星,三白兵などを含む.一般的な陰線形状は,夕暮れ,三カラスなどを含む.上昇傾向で陽線信号が認識されたときに,戦略は買い物を行います.下降傾向で陰線信号が認識されたときに,戦略は売り物を行います.
さらに,戦略は,主要なサポート・レジスタンス・ポイントと組み合わせて,入場の具体的な価格を決定する.上昇傾向で購入する場合,最初のサポート・ポイントを破るときに購入する.
この戦略の最大の利点は,トレンド判断と反転シグナルを同時に組み合わせることで,トレンドのターニングポイントをタイムリーに捕捉し,トレンド追跡を実行できるようにすることです.この戦略は,単純な移動平均戦略と比較して,利益の確率を大幅に向上させることができます.
さらに,戦略にK線形判断を加えることで,突発的な出来事を処理する能力も強化される.市場において,低確率の出来事が偽突破を引き起こす場合,K線形はフィルタリングの役割を果たし,誤った取引を防ぐことができる.
この戦略の主なリスクは,移動平均のパラメータ設定とK線形状判断の正確さにある.移動平均周期が不適切に設定されれば,トレンド判断の誤りが生じ,K線形状判断の誤りが生じると,取引決定の誤りが生じることもあります.
さらに,反転K線形はトレンドの反転を100%保証するものではないので,戦略にも一定のリスクがある.市場がより広範な反転に遭遇すると,戦略に大きな損失をもたらす可能性がある.
この戦略の最適化の余地はまだ比較的大きい.例えば,移動平均のパラメータを動的に調整し,異なる市場段階において異なる移動平均周期を採用することを考慮することができる.また,K線形状判断モデルを歴史データを使って訓練し,判断の正確性を向上させるための機械学習の方法も加えることができる.
また,トレンドやホットスポット,取引量変化,変動指数などの要因を追加することも考えられます.
この戦略は,全体として,株式市場の中期トレンドを追跡するのに非常に適しており,高い安定した利益を得ることができます.さらに最適化されれば,うまく機能する量化戦略になる可能性があります.投資家は,この戦略の使用を習得すれば,長期にわたって持てるポートフォリオを構築して,個人株のリスクを制御しながら,より良い余剰利益を得ることができます.
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Trend Following Strategy with Candlestick Patterns", overlay=true)
// Moving Average
ma_period = input(10, title="Moving Average Period")
moving_average = ta.sma(close, ma_period)
// Candlestick Patterns
// Custom Function
abs(x) => x >= 0 ? x : -x
// Candlestick Patterns
isDoji() =>
(close - open) <= (high - low) * 0.1
isMarubozuWhite() =>
close == high and open == low and close > open
isHammer() =>
(high - low) >= 3 * abs(open - close) and (close - low) / (0.001 + high - low) > 0.6 and (open - low) / (0.001 + high - low) > 0.6
isInvertedHammer() =>
(high - low) >= 3 * abs(open - close) and (high - close) / (0.001 + high - low) > 0.6 and (high - open) / (0.001 + high - low) > 0.6
isLongLowerShadow() =>
(low - close) > 2 * abs(open - close) and (low - open) / (0.001 + high - low) > 0.6
isUpsideTasukiGap() =>
close[1] < open[1] and open > close and open > close[1] and close < open[1]
isRisingWindow() =>
high[1] < low and close > open
isPiercing() =>
close[1] < open[1] and close > open and close > ((open + low) / 2) and close < open[1] and open < close[1]
isBullishEngulfing() =>
close[1] < open[1] and close > open and high > high[1] and low < low[1]
isTweezerBottom() =>
low == ta.valuewhen(low == ta.lowest(low, 10), low, 0) and low == ta.valuewhen(low == ta.lowest(low, 20), low, 0)
isBullishAbandonedBaby() =>
close[2] < open[2] and close[1] > open[1] and low[1] > ta.valuewhen(high == ta.highest(high, 2), high, 0) and open > close and close > ta.valuewhen(high == ta.highest(high, 2), high, 0)
isMorningStar() =>
close[2] < open[2] and close[1] < open[1] and close > open[1] and open < close[2] and open > close[1]
isMorningDojiStar() =>
close[2] < open[2] and close[1] < open[1] and isDoji() and close > open[1] and open < close[2] and open > close[1]
isDragonflyDoji() =>
isDoji() and (high - close) / (0.001 + high - low) < 0.1 and (open - low) / (0.001 + high - low) > 0.6
isThreeWhiteSoldiers() =>
close[2] < open[2] and close[1] < open[1] and close > open and open < close[2] and open < close[1] and close > open[1]
isRisingThreeMethods() =>
close[4] < open[4] and close[1] < open[1] and close > open and open < close[4] and open < close[1] and close > open[1]
isMarubozuBlack() =>
close == low and open == high and open > close
isGravestoneDoji() =>
isDoji() and (close - low) / (0.001 + high - low) < 0.1 and (high - open) / (0.001 + high - low) > 0.6
isHangingMan() =>
(high - low) >= 4 * abs(open - close) and (open - close) / (0.001 + high - low) > 0.6 and (high - open) / (0.001 + high - low) > 0.6
isLongUpperShadow() =>
(high - open) > 2 * abs(open - close) and (high - close) / (0.001 + high - low) > 0.6
isDownsideTasukiGap() =>
close[1] > open[1] and open < close and open < close[1] and close > open[1]
isFallingWindow() =>
low[1] > high and close < open
isDarkCloudCover() =>
close[1] > open[1] and close < open and close < ((open + high) / 2) and close > open[1] and open > close[1]
isBearishEngulfing() =>
close[1] > open[1] and close < open and high > high[1] and low < low[1]
isTweezerTop() =>
high == ta.valuewhen(high == ta.highest(high, 10), high, 0) and high == ta.valuewhen(high == ta.highest(high, 20), high, 0)
isAbandonedBaby() =>
close[2] > open[2] and close[1] < open[1] and high[1] < ta.valuewhen(low == ta.lowest(low, 2), low, 0) and open < close and close < ta.valuewhen(low == ta.lowest(low, 2), low, 0)
isEveningDojiStar() =>
close[2] > open[2] and close[1] > open[1] and isDoji() and close < open[1] and open > close[2] and open < close[1]
isEveningStar() =>
close[2] > open[2] and close[1] > open[1] and close < open[1] and open > close[2] and open < close[1]
isThreeBlackCrows() =>
close[2] > open[2] and close[1] > open[1] and close < open and open > close[2] and open > close[1] and close < open[1]
isFallingThreeMethods() =>
close[4] > open[4] and close[1] > open
isShootingStar() =>
(high - low) >= 3 * abs(open - close) and (high - close) / (0.001 + high - low) > 0.6 and (high - open) / (0.001 + high - low) > 0.6
doji = isDoji()
marubozuWhite = isMarubozuWhite()
hammer = isHammer()
invertedHammer = isInvertedHammer()
longLowerShadow = isLongLowerShadow()
upsideTasukiGap = isUpsideTasukiGap()
risingWindow = isRisingWindow()
piercing = isPiercing()
bullishEngulfing = isBullishEngulfing()
tweezerBottom = isTweezerBottom()
bullishAbandonedBaby = isBullishAbandonedBaby()
morningStar = isMorningStar()
morningDojiStar = isMorningDojiStar()
dragonflyDoji = isDragonflyDoji()
threeWhiteSoldiers = isThreeWhiteSoldiers()
risingThreeMethods = isRisingThreeMethods()
marubozuBlack = isMarubozuBlack()
gravestoneDoji = isGravestoneDoji()
hangingMan = isHangingMan()
longUpperShadow = isLongUpperShadow()
downsideTasukiGap = isDownsideTasukiGap()
fallingWindow = isFallingWindow()
darkCloudCover = isDarkCloudCover()
bearishEngulfing = isBearishEngulfing()
tweezerTop = isTweezerTop()
abandonedBaby = isAbandonedBaby()
eveningDojiStar = isEveningDojiStar()
eveningStar = isEveningStar()
threeBlackCrows = isThreeBlackCrows()
fallingThreeMethods = isFallingThreeMethods()
shootingStar = isShootingStar()
isBullishPattern() =>
(isMarubozuWhite() or isHammer() or isInvertedHammer() or isDoji() or isMorningStar() or isBullishEngulfing() or isThreeWhiteSoldiers() or isMarubozuBlack() or isHangingMan() or isDownsideTasukiGap() or isDarkCloudCover())
isBearishPattern() =>
(isMarubozuBlack() or isInvertedHammer() or isLongUpperShadow() or isTweezerTop() or isGravestoneDoji() or isEveningStar() or isBearishEngulfing() or isThreeBlackCrows() or isShootingStar())
isBullishCandle = isBullishPattern()
isBearishCandle = isBearishPattern()
// Calculate Pivot Points
pivotPoint(high, low, close) =>
(high + low + close) / 3
r1 = pivotPoint(high[1], low[1], close[1]) * 2 - low[1]
s1 = pivotPoint(high[1], low[1], close[1]) * 2 - high[1]
r2 = pivotPoint(high[1], low[1], close[1]) + (high[1] - low[1])
s2 = pivotPoint(high[1], low[1], close[1]) - (high[1] - low[1])
r3 = high[1] + 2 * (pivotPoint(high[1], low[1], close[1]) - low[1])
s3 = low[1] - 2 * (high[1] - pivotPoint(high[1], low[1], close[1]))
// Trend Identification
is_uptrend = close > moving_average
is_downtrend = close < moving_average
// Entry and Exit Conditions with Trend Identification
enterLong = is_uptrend and isBullishCandle and close > r1
exitLong = is_uptrend and (bearishEngulfing or doji or close < s1)
enterShort = is_downtrend and isBearishCandle and close < s1
exitShort = is_downtrend and (bullishEngulfing or doji or close > r1)
// Strategy Execution
if enterLong and strategy.position_size == 0 and strategy.position_size[1] == 0 and close > r1
strategy.entry("Buy", strategy.long, qty=1)
if exitLong and strategy.position_size > 0
strategy.close("Buy")
if enterShort and strategy.position_size == 0 and close < s1
strategy.entry("Sell", strategy.short, qty=1)
if exitShort and strategy.position_size < 0
strategy.close("Sell")
// Stop-Loss and Trailing Stop-Loss
stop_loss_pct = input(2.0, title="Stop Loss Percentage")
trailing_stop_loss_pct = input(1.0, title="Trailing Stop Loss Percentage")
trailing_stop_loss_active = input(true, title="Trailing Stop Loss Active")
// Stop-Loss
stop_loss_level = strategy.position_avg_price * (1 - stop_loss_pct / 100)
strategy.exit("Stop Loss", "Buy", loss=stop_loss_level)
// Trailing Stop-Loss
// Plotting Moving Average
plot(moving_average, color=color.blue, title="Moving Average", linewidth=2)
// Plotting Candlestick Patterns
plotshape(isBullishCandle, title="Bullish Candle", location=location.belowbar, color=color.green, style=shape.labelup)
plotshape(isBearishCandle, title="Bearish Candle", location=location.abovebar, color=color.red, style=shape.labeldown)
// Plotting Support and Resistance Levels
//hline(r1, "Resistance Level 1", color=color.red, linestyle=hline.style_dotted)
//hline(s1, "Support Level 1", color=color.green, linestyle=hline.style_dotted)