多指標条件フィルタリングに基づいた定量戦略に従う日中の傾向

作者: リン・ハーンチャオチャン開催日:2023年12月15日 15:59:37
タグ:

img

概要

この戦略は,価格動向を判断するためのPSAR,トレンド強さを判断するためのADX,過買い・過売りゾーンを特定するためのRSI,資金流動を判断するためのCMFを組み合わせて,サイクルを通して日中のトレンドをフォローする定量的な取引戦略を構築する.価格が統合から突破して新しいトレンドを形成するときに新しいトレンド方向性を迅速に特定し,その後もトレンドを追跡し続けることができます.主要なトレンドの利益が捕獲されることを保証しながら,保有リスクを減らすためにフィルタリング条件もプロセス中に設定されています.

原則

この戦略の主な判断基準は次のとおりです.

  1. 価格が上昇傾向にあるかどうかを判断するためにPSAR指標を使用します.PSARの価格を下回ることは上昇傾向の終わりと下落傾向の始まりを示します.

  2. RSIが50の真ん中値以上で 過剰売り場での誤ったブレイクをフィルタリングします

  3. ADX が EMA 線より上にあることを要求し,傾向分析において持続的信号を示します.

  4. CMFが0より大きいことを要求します. 資金の流れが増加すると判断します.

上記の4つの条件がすべて満たされたときに購入信号が生成される.PSARが価格を超え,RSIが50を下回り,ADXがEMAを下回り,CMFが0未満になると販売条件が発生する.

この戦略は,取引規則を設定する際に価格傾向の方向,傾向強度,過買い/過売り状態,資金流を包括的に考慮する.取引信号を生成する際に厳格な論理的規則を設定することによって,偽のブレイクを効果的にフィルタリングし,高い確率の持続的なトレンド方向を捕捉することができます.

利点

この戦略の主な利点は以下の通りである.

  1. 複数の指標を組み合わせて取引規則を設定することで,偽のブレイクを効果的に防ぐことができ,信号の質も確保できます.

  2. トレンドの方向性を迅速に特定し追跡することで トレンドの利益の大半を把握できます

  3. プロセスフィルタリング条件を設定することで,リスクを効果的に制御し,追跡効果を保証できます.

  4. トレンド強さを考慮すると,取引範囲の混雑を避けるのに役立ちます.

リスク分析

この戦略の主なリスクは以下のとおりです.

  1. 単一の戦略の蓄積は,適切なポジションサイズを要するポートフォリオリスクをもたらす.

  2. 追跡中にフィルタリング状態の変化を注意深く監視し,キャンセル時に損失を避ける.

  3. この中期・長期戦略は短期間で変動によって混乱し,ストップ・ロスのリスクを伴う.

対応するリスク管理措置には,ポジションサイズを最適化するルール,リスク警告ラインの設定,停止距離の拡大などが含まれます.

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

オプティマイゼーション領域には,以下が含まれます.

  1. マシン学習によるパラメータ最適化 現在の主観的な設定を考慮して

  2. リスクに基づいて動的にサイズするポジションサイズアップモジュールを追加します.

  3. ストップメカニズムの強化,例えば遅延ストップ,タイムストップ,ブレイクストップ

結論

この指標を組み合わせた戦略は,新興トレンドを迅速に特定し,追跡し,トレンドやファンドなどの複数の次元に基づいて定量的な取引を検証するのに効果的であることが証明されました. ベースとして,サイクルの間でもインデックスできます. パラメータ調節とモジュール強化により,中期・長期間の安定した戦略にもなり得ます.


/*backtest
start: 2023-11-14 00:00:00
end: 2023-12-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("psar+ adx + cmf + rsi Strategy", overlay=true,initial_capital = 1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent , commission_value=0.1 )

start = input(1.02)
increment = input(1.02)
maximum = input(1.2)
var bool uptrend = na
var float EP = na
var float SAR = na
var float AF = start
var float nextBarSAR = na
if bar_index > 0
	firstTrendBar = false
	SAR := nextBarSAR
	if bar_index == 1
		float prevSAR = na
		float prevEP = na
		lowPrev = low[1]
		highPrev = high[1]
		closeCur = close
		closePrev = close[1]
		if closeCur > closePrev
			uptrend := true
			EP := high
			prevSAR := lowPrev
			prevEP := high
		else
			uptrend := false
			EP := low
			prevSAR := highPrev
			prevEP := low
		firstTrendBar := true
		SAR := prevSAR + start * (prevEP - prevSAR)
	if uptrend
		if SAR > low
			firstTrendBar := true
			uptrend := false
			SAR := max(EP, high)
			EP := low
			AF := start
	else
		if SAR < high
			firstTrendBar := true
			uptrend := true
			SAR := min(EP, low)
			EP := high
			AF := start
	if not firstTrendBar
		if uptrend
			if high > EP
				EP := high
				AF := min(AF + increment, maximum)
		else
			if low < EP
				EP := low
				AF := min(AF + increment, maximum)
	if uptrend
		SAR := min(SAR, low[1])
		if bar_index > 1
			SAR := min(SAR, low[2])
	else
		SAR := max(SAR, high[1])
		if bar_index > 1
			SAR := max(SAR, high[2])
	nextBarSAR := SAR + AF * (EP - SAR)

//rsi strat
length = input( 50 )
middle_RSI=input(49)
price = close
vrsi = rsi(price, length)

//cmf
lengthCMF = input(20, minval=1)
ad = close==high and close==low or high==low ? 0 : ((2*close-low-high)/(high-low))*volume
mf = sum(ad, lengthCMF) / sum(volume, lengthCMF)

//ADX
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
dirmov(len) =>
	up = change(high)
	down = -change(low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
	minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(plusDM, len) / truerange)
	minus = fixnan(100 * rma(minusDM, len) / truerange)
	[plus, minus]
adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)
ema_length=input(10)
ema_sig= ema(sig,ema_length)


long = not uptrend  and vrsi > middle_RSI and sig > ema_sig   and mf>0 
short= uptrend   and vrsi < middle_RSI and sig<ema_sig and mf<0

strategy.entry("long",1,when=long)
strategy.close('long',when=short)

もっと