複数の指標を組み合わせた取引戦略

作者: リン・ハーンチャオチャン,日付: 2023年10月26日 15:22:28
タグ:

img

概要

この戦略は,CCI,ADX,AOインジケーターを組み合わせて,ロングとショートポジションの取引信号を生成する.CCIはオーバーバイトとオーバーセールレベルを特定し,ADXはトレンド強さと方向性を決定し,AOは振動する市場を支援する.多指標の組み合わせは,取引システムの安定性と効率性を向上させる.

戦略の論理

  1. CCIは100以上の買い過ぎと -100以下の売り過ぎを示します.CCIが0以下になるとこの戦略は長引きます.

  2. ADXはトレンド強さを測定する.DI+は上昇傾向強さを示し,DI-は下落傾向強さを示します.ADXは平均トレンド強度です.DI+が25を下回るとこの戦略は長くなります.

  3. AOは高速SMAマイナス遅いSMAである.上昇するAOは上昇勢力の強化を表し,低下するAOは下落勢力の強化を表する.この戦略はAOが0未満であるときに長引く.

  4. 取引規則は,CCI <0とDI+ <25とAO <0でロングに,DI+ >25でロングに.

  5. オーダーのサイズを,閉店価格で割った自己資本として動的に計算し,収支自己資本の変化に応じてオーダーを調整するために,下方に丸める.

  6. 長い信号では戦略.エントリー,退出信号では戦略.クローズ.

利点

  1. CCIは様々な市場からのノイズをフィルタリングし,誤った信号を減らす.

  2. ADXは早期に強い傾向を特定します

  3. AOは不安定な市場を避ける.

  4. 複数の指標が信号を検証し 信頼性を高めます

  5. ダイナミックなポジションサイズ化により リスクを効果的に管理できます

  6. シンプルで明快な論理で 簡単に実行できます

リスク

  1. CCIは vkosd の範囲を特定するのに苦労しています

  2. ADXはトレンド転換に遅れをとっている.

  3. AOは不安定な統合に苦しんでいます

  4. 指標の設定が悪ければ 過剰にフィルタリングされ 取引が失敗します

  5. 変動と市場に依存するダイナミック・サイジング

  6. リスク管理を厳格にする必要のある 大量の引き上げの可能性

改良

  1. CCIパラメータを異なる市場に最適化する

  2. ADXパラメータを最適化して 傾向の変化を把握する

  3. 波動性環境の AO パラメータを調整する.

  4. 最適な指標の重みを見つけるための試験組み合わせ.

  5. 減量制御のためにストップ損失を追加します.

  6. 偽の突破を避けるために音量を組み込む.

  7. 固定位置のサイズを機器によって調整する.

結論

この戦略は,CCI,ADX,AOを組み合わせて,かなり信頼性の高いロング信号を生成する. ダイナミックサイジングとポジション管理リスク制御. 論理は,初心者にとってシンプルで明白です. しかし,さまざまな市場で苦労し,さまざまな市場に重要な最適化可能性が必要です. 機器や環境の強さのために,さらなるテストとチューニングが必要です.


/*backtest
start: 2022-10-19 00:00:00
end: 2023-10-25 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Strategy Niel", shorttitle="Strategy Niel", max_bars_back=2000, initial_capital=1000)

//Input variables
buywhenadxabove = input(25)
buywhendiplusbelow = input(10)
buywhenccibelow = input(0)
buywhenawesomeoscillatorbelow = input(0)
sellwhendiplusabove = input(25)

//CCI script
numberofbarsforcci = input(20)
CCI = cci(close,numberofbarsforcci)

//+DI and ADX
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
dirmov(len) =>
	up = change(high)
	down = -change(low)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, len) / truerange)
	minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, 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)
	[adx, plus, minus]

[sig, up, down] = adx(dilen, adxlen)

//plot(sig, color=red, title="ADX")
//plot(up, color=blue, title="+DI")
//plot(down, color=orange, title="-DI")


//Awesome Oscillator
nLengthSlow = input(34, minval=1, title="Length Slow")
nLengthFast = input(5, minval=1, title="Length Fast")
xSMA1_hl2 = sma(hl2, nLengthFast)
xSMA2_hl2 = sma(hl2, nLengthSlow)
xSMA1_SMA2 = xSMA1_hl2 - xSMA2_hl2
cClr = xSMA1_SMA2 > xSMA1_SMA2[1] ? blue : red
//plot(xSMA1_SMA2, style=histogram, linewidth=1, color=cClr)

buy = sig > buywhenadxabove and up < buywhendiplusbelow  and CCI < buywhenccibelow and xSMA1_SMA2 < buywhenawesomeoscillatorbelow 

ordersize=floor(strategy.equity/close) // Floor returns largest integer, strategy.equity gives total equity remaining - allows to dynamically calculate the order size as the account equity increases or decreases.
strategy.entry("long",strategy.long,ordersize,when= buy) //strategy.entry let's you enter the market variables id ("long"), strategy.long (long position entry), size of the order and when the order should happen
bought = strategy.position_size[0] > strategy.position_size[1]
entry_price = valuewhen(bought, open, 0)
sell = up > sellwhendiplusabove 
strategy.close("long", when=sell ) //strategy.close let's you close your position with variables id ('long') and when this should happen




もっと