マルチMAリミットオーダー取引戦略

作者: リン・ハーンチャオチャン, 日時: 2023-09-22 14:16:20
タグ:

概要

これは,複数の移動平均値に基づいて制限オーダーを設定する取引戦略である.価格は異なるMAレベルを突破すると,ピラミッド状のマルチポジションを形成して,異なる数の長または短の制限オーダーを設定する.価格が再びMAを突破すると,逆の制限オーダーが開かれます.ポジションを保持する場合,価格が中間MAを突破した場合,ポジションは逆の市場オーダーで閉鎖されます.

戦略の論理

この戦略は,トレンド方向を決定するために移動平均値を使用します.具体的には,価格が3つのアップMAラインを突破するか否かに基づいて,ロングリーミットオーダーの数を決定します.そして価格が3つのダウンMAラインを突破するか否かに基づいて,ショートリーミットオーダーの数を決定します.

価格が逆転信号を示すとき,逆転ポジションが開かれます.中間MAは,既存のポジションの突破を判断し,接近信号を生成するために使用されます.

この戦略は,ピラミッド式開拓と突破式閉じるを組み合わせ,取引の論理を形成する.コスト削減のためによりよい平均価格でポジションを開くことを目的とし,リスクを制御するために中間MAをストップ損失に使用する.

利点分析

この戦略の利点は以下の通りです.

  1. MAs を使ってトレンドを特定します 操作が簡単で直感的です

  2. ピラミッド型開拓は 傾向の初期段階において 平均価格を向上させることができます

  3. 中間MAストップロスは,損失を間に合うように止め,リスクをコントロールできます.

  4. 制限命令は 滑り方を避ける

  5. パーソナライズ可能なパラメータは,異なる製品に適応します.

  6. 明確な構造で 分かりやすく 拡張できます

リスク分析

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

  1. MAの遅延が判断に誤りをもたらす可能性があります

  2. 制限命令が失敗すると 入場機会が失われます

  3. 中間MAストップ損失は 突破を判断するには 粗末すぎるかもしれません

  4. パラメータの設定が正しくない場合,位置が大きすぎる可能性があります.

  5. バックテスト期間が十分でない場合,オーバーフィッティングが発生する可能性があります.

  6. 取引コストは考慮されません

解決策は次のとおりです

  1. 確認のための他の指標を追加し,パラメータを最適化します.

  2. 期限を設定し 価格を調整する

  3. 中間MAのストップ損失で利益を取ることや論理を加える.

  4. パラメータを最適化し リスク・報酬比を評価します

  5. バックテスト期間を広げ 多市場バックテスト

  6. トランザクションコストとスリップロジックを加えます

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

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

  1. 機械学習方法を使って より多くの製品のためのパラメータを最適化します

  2. 確認のために他の指標を追加します.例えばMACD,KDJなど.

  3. 中央のMA線で利益を取った論理を加えます.

  4. ポジションのサイズとストップ・ロスのレベルを動的に調整します

  5. 制限価格を最適化し,より良い入場コストを設定します.

  6. 過剰な傾向を防ぐためにコストを管理する.

  7. パラメータプールを構築するために,異なる製品でパラメータをテストする.

結論

この戦略は,よりよい平均コストを達成するために,ピラミッド状のポジションを制限オーダーで開く.リスクを制御するために,ストップ損失のための中間MAを使用する.戦略構造はシンプルで明確で,理解し,拡張することは簡単です.しかし,他の指標を導入し,パラメータを最適化し,制限オーダーロジックを改善し,より堅牢なものにするために改善することができます.全体的に,この戦略は,いくつかの基準値を保持する制限オーダー取引のシンプルで実践的なアイデアを提供します.


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

//Noro
//2019

//@version=4
strategy(title = "Robot WhiteBox MultiMA", shorttitle = "Robot WhiteBox MultiMA", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 3)

//Settings
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot")
len = input(3, minval = 1, title = "MA Length")
s = input(defval = "7. OHLC4", options = ["1. Open", "2. High", "3. Low", "4. Close", "5. HL2", "6. HLC3", "7. OHLC4", "8. OC2", "9. PCMA"], title = "Data")
short3 = input(true, title = "short 3")
short2 = input(true, title = "short 2")
short1 = input(true, title = "short 1")
long1 = input(true, title = "long 1")
long2 = input(true, title = "long 2")
long3 = input(true, title = "long 3")
shortlevel3 = input(15.0, title = "Short line 3")
shortlevel2 = input(10.0, title = "Short line 2")
shortlevel1 = input(5.0, title = "Short line 1")
longlevel1 = input(-5.0, title = "Long line 1")
longlevel2 = input(-10.0, title = "Long line 2")
longlevel3 = input(-15.0, title = "Long line 3")
needoffset = input(true, title = "Offset")
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")

//Variables
size = strategy.position_size
mult = 1 / syminfo.mintick
needtime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)

//MA
oc2 = (open + close) / 2
pcma = (highest(high, len) + lowest(low, len)) / 2
src = s == "1. Open" ? open : s == "2. High" ? high : s == "3. Low" ? low : s == "4. Close" ? close : s == "5. HL2" ? hl2 : s == "6. HLC3" ? hlc3 : s == "7. OHLC4" ? ohlc4 : s == "8. OC2" ? oc2: close
sma = sma(src, len)
ma = s == "9. PCMA" ? round(pcma * mult) / mult : round(sma * mult) / mult

//Levels
longline1 = long1 ? round(ma * ((100 + longlevel1) / 100) * mult) / mult : close
longline2 = long2 ? round(ma * ((100 + longlevel2) / 100) * mult) / mult : close
longline3 = long3 ? round(ma * ((100 + longlevel3) / 100) * mult) / mult : close
shortline1 = short1 ? round(ma * ((100 + shortlevel1) / 100) * mult) / mult : close
shortline2 = short2 ? round(ma * ((100 + shortlevel2) / 100) * mult) / mult : close
shortline3 = short3 ? round(ma * ((100 + shortlevel3) / 100) * mult) / mult : close

//Lines
colorlong1 = long1 ? color.lime : na
colorlong2 = long2 ? color.lime : na
colorlong3 = long3 ? color.lime : na
colorshort1 = short1 ? color.red : na
colorshort2 = short2 ? color.red : na
colorshort3 = short3 ? color.red : na
offset = needoffset ? 1 : 0
plot(shortline3, offset = offset, color = colorshort3, title = "Short line 3")
plot(shortline2, offset = offset, color = colorshort2, title = "Short line 2")
plot(shortline1, offset = offset, color = colorshort1, title = "Short line 1")
plot(ma, offset = offset, color = color.blue, title = "MA line")
plot(longline1, offset = offset, color = colorlong1, title = "Long line 1")
plot(longline2, offset = offset, color = colorlong2, title = "Long line 2")
plot(longline3, offset = offset, color = colorlong3, title = "Long line 3")

//Trading
lot = 0.0
lot := size == 0 ? strategy.equity / close * capital / 100 : lot[1]
lots = 0.0
if ma > 0
    lots := round(size / lot)
    strategy.entry("L1", strategy.long, lot, limit = longline1, when = (lots == 0 and long1 and needtime))
    lots := round(size / lot)
    strategy.entry("L2", strategy.long, lot, limit = longline2, when = (lots <= 1 and long2 and needtime))
    lots := round(size / lot)
    strategy.entry("L3", strategy.long, lot, limit = longline3, when = (lots <= 2 and long3 and needtime))
    lots := round(size / lot)
    strategy.entry("S1", strategy.short, lot, limit = shortline1, when = (lots == 0 and short1 and needtime))
    lots := round(size / lot)
    strategy.entry("S2", strategy.short, lot, limit = shortline2, when = (lots >= -1 and short2 and needtime))
    lots := round(size / lot)
    strategy.entry("S3", strategy.short, lot, limit = shortline3, when = (lots >= -2 and short3 and needtime))
if size > 0
    strategy.entry("TPL", strategy.short, 0, limit = ma)
if size < 0
    strategy.entry("TPS", strategy.long, 0, limit = ma)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()

もっと