2つの移動平均勢圧縮戦略

作者: リン・ハーンチャオチャン開催日:2023年12月25日 17:01:28
タグ:

img

概要

この戦略は3つの異なる技術指標を組み合わせ,二重移動平均システムを使用して取引信号を生成し,キャンドルスタイルの色とボディに基づいて追加のフィルタを使用して,比較的安定して効果的な短期取引戦略を構築します.

戦略の論理

この戦略は,市場における圧縮と拡張相を特定するためにボリンジャーバンドとKCチャネルを組み合わせて使用する.特に,ボリンジャーバンドがKCチャネル内にいるときは圧縮とみなされ,ボリンジャーバンドがKCチャネルを突破すると拡大とみなされる.圧縮は強度の変動と潜在的なトレンド逆転を表し,この時点で線形回帰が主要な取引信号指標として使用される.

線形回帰ヒストグラムが正 (上昇傾向を表す) で,バーが赤色のキャンドルスタイク (閉じる低を表す) で,同時にキャンドルスタイクボディが過去30個のキャンドルスタイク平均ボディの1/3より大きい場合,そのような組み合わせ信号は長くなってしまう.逆に,線形回帰ヒストグラムが負であれば,バーは緑色のキャンドルスタイクで,ボディも大きい場合,短くなってしまう.

戦略はまた,市場の段階を判断するのに役立つ圧縮と拡張の背景の可視化を提供します.

利点分析

  • 複数の指標を組み合わせることで 誤った信号を効果的にフィルタリングできます
  • 圧縮は潜在的逆転点を表し,戦略のパフォーマンスを向上させる
  • 身体フィルターは,偽のブレイクによる小さな波によって誤導されるのを避ける
  • パラメータ最適化によってよりよい結果を得るのは簡単です

リスク分析

  • 線形回帰は,簡単に誤った信号を発信し,損失につながる可能性があります
  • 圧縮を判断するボリンガー帯とKCチャネルの効果は理想的ではありません.
  • フィルタリング基準が過酷で,より良いエントリーポイントが欠けている可能性があります
  • 引き上げは大きく ある程度の許容力を 持たなければならない

リスクは指標のパラメータを調整し,フィルタリング基準を最適化することで削減できる.

オプティマイゼーションの方向性

戦略は以下の側面で最適化できます.

  1. 最適なパラメータを見つけるために異なるパラメータの組み合わせと長さを試してみましょう
  2. 最適なフィルタリングレベルを見つけるためにフィルタリング条件を増加または減少させる
  3. 自動で最適なパラメータを見つけるために機械学習方法を使用する
  4. 特定の品種における試験効果と,異なる品種に応じてパラメータを調整する
  5. 単一の損失を制御するストップ損失戦略を追加

結論

この戦略は複数の指標を組み合わせ,圧縮機会を特定しながら,比較的堅牢な効率的な短期戦略を形成するためにフィルタリング条件を増加させる.パラメータとフィルタリング条件の最適化によって,より良い結果が得られる.また,戦略フレームワークは柔軟で,さまざまな種類で使用するために簡単に調整され,さらなるテストと最適化に価値がある.


/*backtest
start: 2023-11-24 00:00:00
end: 2023-12-24 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2017

//@version=2
strategy(shorttitle = "Squeeze str 1.0", title="Noro's Squeeze Momentum Strategy v1.0", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
length = input(20, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(20, title="KC Length")
multKC = input(1.5, title="KC MultFactor")
useTrueRange = true
usecolor = input(true, defval = true, title = "Use color of candle")
usebody = input(true, defval = true, title = "Use EMA Body")
needbg = input(false, defval = false, title = "Show trend background")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

// Calculate BB
source = close
basis = sma(source, length)
dev = multKC * stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev

// Calculate KC
ma = sma(source, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC

sqzOn  = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz  = (sqzOn == false) and (sqzOff == false)

val = linreg(source  -  avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)

bcolor = iff( val > 0, iff( val > nz(val[1]), lime, green), iff( val < nz(val[1]), red, maroon))
scolor = noSqz ? blue : sqzOn ? black : gray 

trend = val > 0 ? 1 : val < 0 ? -1 : 0

//Background
col = needbg == false ? na : trend == 1 ? lime : red
bgcolor(col, transp = 80)

//EMA Body
body = abs(close - open)
emabody = ema(body, 30) / 3

//Signals
bar = close > open ? 1 : close < open ? -1 : 0
up = trend == 1 and (bar == -1 or usecolor == false) and (body > emabody or usebody == false)
dn = trend == -1 and (bar == 1 or usecolor == false) and (body > emabody or usebody == false)

if up
    strategy.entry("Long", strategy.long)

if dn
    strategy.entry("Short", strategy.short)

もっと