
この記事では,単純移動平均に基づく取引戦略について論じます. この戦略は,長さ17の移動平均と閉店価格を比較し,閉店価格で移動平均を横切るときに多し,横切るときに空にする.
この戦略は,次のパラメータを使用して移動平均を計算します.
これらのパラメータに基づいて,getMAType () 関数を使用して,17周期の閉盘価格SMAを計算します.
閉店価格と移動平均の関係を比較すると,
閉盘価格が下から移動平均線を横切るときは多行シグナルを生じ,上から下を通るときは空行シグナルを生じます.
回測周期の中で,多做信号に遭遇すると多仓が開く,空做信号に遭遇すると空仓開く.
この戦略の最大の長所は,考え方が非常にシンプルで明快であることです. 方向の変化によってトレンドの変化を判断する指標のみです. 戦略は,理解しやすく,実行しやすく,初心者向けに適しています.
さらに,移動平均はトレンドフォロー型の指標であり,市場の短期的なノイズによる干渉を避け,トレンドの転換を効果的に追跡することができます.
パラメータの調整により,異なる周期と異なる品種に対応できます.
まず,この戦略は1つの指標にのみ基づいており,判断基準は単一であり,誤った信号を多く生み出す可能性があります.
この戦略はトレンド追跡システムであり, 整合や波動のある市場ではうまく機能しません.
また,ストップ・ストップが設定されていないため,損失の拡大の危険性があります.
解決策は,他の指標と組み合わせて,パラメータの組み合わせを最適化し,誤信号を減らすことです. 止損停止を設定し,リスクを制御し,撤回を最適化します.
戦略の最適化には,以下の要素が役立ちます.
移動平均のパラメータを調整し,周期数を最適化します.例えば,30周期または50周期に変更します.
EMA,VIDYAなど,さまざまな種類の移動平均を試してみてください. 価格の変化に対する感受性は異なります.
他の指標の組み合わせを追加する.例えば,MACDとの組み合わせは,強さを判断することができる.または,RSIとの組み合わせは,誤った信号を減らす.
追加ストップ・メカニズム。固定パーセントまたはATR値の移動ストップを設定。単発損失を制御。
利回りの目標パーセントを設定する. 利回りを最大化する.
これらの最適化は,戦略のパフォーマンスをより安定させ,過剰な撤回を回避します.
この記事では,17周期移動平均をベースにした簡単な取引戦略を分析する.戦略信号源はシンプルで,容易に理解し,実装する.典型的なトレンド追跡システムに属している.戦略を深く解読することで,その優位性とリスクを分析し,複数の次元での最適化思考が与えられている.継続的な最適化と充実によって,この戦略は徐々に進化し,現場で安定した収益を得ることができるという確信がある.
/*backtest
start: 2023-12-05 00:00:00
end: 2024-01-04 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Simple 17 BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)
/////////////// Time Frame ///////////////
testStartYear = input(2012, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)
testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)
testPeriod() => true
///////////// Moving Average /////////////
source = input(title="MA Source", defval=ohlc4)
maType = input(title="MA Type", defval="sma", options=["sma", "ema", "swma", "wma", "vwma", "rma"])
length = input(title="MA Length", defval=17)
///////////// Get MA Function /////////////
getMAType(maType, sourceType, maLen) =>
res = sma(close, 1)
if maType == "ema"
res := ema(sourceType, maLen)
if maType == "sma"
res := sma(sourceType, maLen)
if maType == "swma"
res := swma(sourceType)
if maType == "wma"
res := wma(sourceType, maLen)
if maType == "vwma"
res := vwma(sourceType, maLen)
if maType == "rma"
res := rma(sourceType, maLen)
res
MA = getMAType(maType, source, length)
/////////////// Strategy ///////////////
long = close > MA
short = close < MA
last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)
/////////////// Execution ///////////////
if testPeriod()
strategy.entry("L", strategy.long, when=long_signal)
strategy.entry("S", strategy.short, when=short_signal)
/////////////// Plotting ///////////////
p1 = plot(MA, color = long ? color.lime : color.red, linewidth=2)
p2 = plot(close, linewidth=2)
fill(p1, p2, color=strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=80)