固い移動平均システム戦略

作者: リン・ハーンチャオチャン,日付: 2023-11-24 15:11:18
タグ:

img

概要

この戦略は4つのSMMA (スムーズムービング・アベア) をベースとした移動平均システムで,異なる期間と1つのEMA指標を有する.複数の技術分析ツールを組み合わせ,トレンド判断を通じて取引戦略を形成する.この戦略は主に高レバレッジのEURUSD15分債の日中取引に適している.

戦略原則

この戦略は,複数のレベルの移動平均値システムを構築するために,異なるパラメータ (3, 6, 9, 50) と1 EMA (200) の4つのSMMAを使用する.SMMA指標は,市場のノイズを効果的にフィルタリングし,トレンド方向を決定することができます.EMA指標は,長期的なトレンドを検出します.具体的な取引論理は:

短期移動平均値 (例えば3期SMMA) が長期移動平均値 (例えば200期EMA) を越えると,購入信号が生成される.短期移動平均値が長期移動平均値を下回ると,販売信号が生成される.複数の移動平均値の配置を判断することで,トレンド方向が決定される.

さらに,戦略はリスク管理のために,利益停止と損失停止点を設定します.

利点分析

この戦略には以下の利点があります.

  1. 多レベル移動平均構造は,トレンド方向を効果的に決定し,誤った信号を減らすことができます.

  2. SMMA指標は市場の騒音を効果的にフィルターし,EMA指標は長期的傾向を検出します.

  3. 高レバレッジの口座で取引利益を増やすのに適しています

  4. リスクを効果的に制御するために,利益停止と損失停止ポイントが設定されています.

  5. 取引の種類 (EURUSD) とサイクル (15分) を最適化してより有利にします.

リスク分析

この戦略には次のリスクもあります

  1. 移動平均値の多さは短期的な逆転の機会を逃す可能性があります

  2. 高レバレッジは損失を拡大し 利益も拡大します

  3. 移動平均値が信号を出したとき,短期トレンドは既に逆転している可能性があります.

  4. EURUSDの為替レートは激変し,リスクが高まる可能性があります.

これらのリスクに対応して,レバレッジ比を適切に調整し,移動平均のパラメータを最適化し,トレンド逆転を判断するための他の指標を導入し,最適化することができます.

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

この戦略の主な最適化方向は以下の通りである.

  1. 異なる品種とサイクルの性能を評価し,最適なパラメータを選択する.

  2. 移動平均の異なる組み合わせと量をテストします

  3. 短期的な逆転点を決定するために,ボリュームまたは波動性指標を増加させる.

  4. ストップ・プロフィートとストップ・ロスの範囲を動的に調整する.

  5. 逆転点を決定するために ENU インジケーターを追加します.

多面的なテストと最適化によって 戦略の安定性と収益性が大幅に向上できます

概要

この移動平均戦略は,堅牢なトレンド判断システムを形成するために移動平均指標の利点を統合する. 取引の種類とサイクルを最適化し,高いレバレッジの日中取引に非常に適しています. パラメータ調整と最適化テストを通じて,この戦略は効率的で信頼性の高いアルゴリズム取引戦略になることができます.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © SoftKill21

//@version=4
strategy("Money maker EURUSD 15min" )
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2000, title = "From Year", minval = 1970)
 
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 8, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2021, title = "To Year", minval = 1970)
 


startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)




len = input(3, minval=1, title="Length")
src = input(hl2, title="Source")
smma = 0.0
sma1 = sma(src, len)
smma := na(smma[1]) ? sma1 : (smma[1] * (len - 1) + src) / len

len2 = input(6, minval=1, title="Length")
src2 = input(hl2, title="Source")
smma2 = 0.0
sma2 = sma(src2, len2)
smma2 := na(smma2[1]) ? sma2 : (smma2[1] * (len2 - 1) + src2) / len2

len3 = input(9, minval=1, title="Length")
src3 = input(hl2, title="Source")
smma3 = 0.0
sma3 = sma(src3, len3)
smma3 := na(smma3[1]) ? sma3 : (smma3[1] * (len3 - 1) + src3) / len3

len4 = input(50, minval=1, title="Length")
src4 = input(close, title="Source")
smma4 = 0.0
sma4 = sma(src4, len4)
smma4 := na(smma4[1]) ? sma4  : (smma4[1] * (len4 - 1) + src4) / len4

len5 = input(200, minval=1, title="Length")
src5 = input(close, title="Source")
out5 = ema(src5, len5)

timeinrange(res, sess) => time(res, sess) != 0
london=timeinrange(timeframe.period, "0300-1045")
londonEntry=timeinrange(timeframe.period, "0300-0845")

extraEntry =timeinrange(timeframe.period, "0745-1030")

time_cond = true
//time_cond2 = time >= startDate and time <= finishDate and extraEntry

//

longCond = close > out5 and close > smma4 and close > smma3 and close > smma2 and close > smma  and smma > smma2 and smma2>smma3 and smma3>smma4 and smma4>out5 and time_cond
shortCond = close < out5 and close < smma4 and close < smma3 and close < smma2 and close < smma  and smma < smma2 and smma2<smma3 and smma3<smma4 and smma4<out5 and time_cond


//longCond = close > out5 and close > smma4 and close > smma3 and close > smma2 and close > smma  and smma > smma2 and smma2>smma3 and smma3>smma4 and smma4>out5 and time_cond2
//shortCond = close < out5 and close < smma4 and close < smma3 and close < smma2 and close < smma  and smma < smma2 and smma2<smma3 and smma3<smma4 and smma4<out5 and time_cond2

//longCond2 = crossover(close,out5) and crossover(close,smma4) and crossover(close,smma3) and crossover(close,smma2) and crossover(close,smma) and time_cond
//shortCond2 = crossunder(close,out5) and crossunder(close,smma4) and crossunder(close,smma3) and crossunder(close,smma2) and crossunder(close,smma) and time_cond



tp=input(300,title="tp")
sl=input(300,title="sl")

strategy.initial_capital  = 50000

//MONEY MANAGEMENT--------------------------------------------------------------
balance = strategy.netprofit + strategy.initial_capital //current balance
floating = strategy.openprofit          //floating profit/loss
risk = input(1,type=input.float,title="Risk %")/100           //risk % per trade


    //Calculate the size of the next trade
temp01 = balance * risk     //Risk in USD
temp02 = temp01/sl        //Risk in lots
temp03 = temp02*100000      //Convert to contracts
size = temp03 - temp03%1000 //Normalize to 1000s (Trade size)
if(size < 1000)
    size := 1000           //Set min. lot size

dataL = (close-out5)*100000
dataS = (out5-close)*100000

minDistanceL = (smma4 - out5)*100000
minDistanceS= (out5 - smma4)*100000


strategy.entry("long",1,1,when=longCond )
strategy.exit("closelong","long", profit=tp,loss=sl)
    
strategy.entry("short",0,1,when=shortCond )
strategy.exit("closeshort","short", profit=tp,loss=sl)



strategy.close_all(when = not london, comment="london finish")
//strategy.close_all(when = not extraEntry, comment="london finish")



// maxEntry=input(2,title="max entries")
// strategy.risk.max_intraday_filled_orders(maxEntry)



もっと