コネチカット ウミガメ システム


作成日: 2023-11-06 10:23:12 最終変更日: 2023-11-06 10:23:12
コピー: 1 クリック数: 663
1
フォロー
1617
フォロワー

コネチカット ウミガメ システム

概要

この戦略は,有名な海取引システムに基づいて開発され,可能な限り原始的な規則に従っています.これは,トレンドを追跡するシステムであり,二重均線によって入場と退出信号を形成しています.

戦略原則

  • 最高値計算 N1日線とN2日線 ((デフォルト 20日と55日) を使って二重均線を構築する。
  • 最低価格計算 N3日線とN4日線 ((デフォルト10日と20日) を使って二重均線を構築する。
  • 閉盘価格がN2日線を超えると,多額;閉盘価格がN4日線を下回ると,平仓.
  • 増額すると,増額ごとにN倍ATR ((デフォルトは1倍),増額1回,最大5回増額する。
  • 固定ストップを設定し,入場価格よりN倍ATR (デフォルトは2倍) をデフォルトに設定します.
  • 前回の取引が勝った後のみ,新しいポジションへの入場が許可されます.

優位分析

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

  • トレンド取引の原則に従い,中長線トレンドを捉える.
  • 双均線は,波動中の頻繁に取引を避けるために,フィルタリング条件を形成する.
  • 追跡ストップは合理的に設定し,ストップが過度に緩やかまたは過度に狭くならないようにする.
  • パラメータ設定により,システムのリスク・リターン特性を調整する.
  • 投資家は,投資先の利益を得るために,投資先の利益を得るために,投資先の利益を得るために,

リスク分析

この戦略にはいくつかのリスクがあります.

  • トレンドが逆転したときに, タイムリーで止まらなければ,大きな損失を招く可能性があります.
  • 投資の過剰な回数は 過剰取引の危険を招きます
  • パラメータの設定を間違えた場合,システムが過度に過激または保守的になる可能性があります.
  • 回測データ適合リスクは,実体効果が回測よりも弱くなる可能性がある.

リスクは以下の方法で軽減できます.

  • 逆転信号判断を増加させ,MACDの偏移など,逆転損失を減らす.
  • パラメータを最適化して,システムのパラメータを安定させる.
  • ポジションサイジング方法の追加.大きな損失が発生した場合のポジションの削減.

最適化の方向

この戦略は以下の点で最適化できます.

  • 空頭取引のロジックが加えられ,戦略は下落の状況でも利益を得ることができる.
  • ストップラインの最適化モジュールを追加し,ストップラインが価格変動に適した調整を可能にします.
  • ポジション管理モジュールを追加し,ポジションのサイズを最適化します.
  • ADXのようなトレンド指数と組み合わせて,トレンドの強さや弱さを見極め,誤った取引を避ける.
  • より平らな収益曲線を得るためにパラメータを最適化します.
  • リアルディスク取引のスライドポイント,手数料などの取引コストを考慮する.

要約する

この戦略は,トレンドを追跡することによって収益を得,一定の反測優位性を有する。しかし,実盤効果はまだ検証され,パラメータの安定性をさらに最適化し,ストップとポジション管理モジュールを完善する必要があり,戦略を実盤取引に適したものにすることができる。全体的に,この戦略は合理的な考えであり,大きな改善の可能性がある。

ストラテジーソースコード
/*backtest
start: 2022-10-30 00:00:00
end: 2023-11-05 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Turtle", overlay=true, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=10, commission_type=strategy.commission.percent, commission_value=0.1, pyramiding=5)

stopInput = input(2.0, "Stop N", step=.5)
pyramidInput = input(1, "Pyramid N", step=.5)
l1LongInput = input(20, "L1 Long", minval=5)
l2LongInput = input(55, "L2 Long", minval=5)
l1LongExitInput = input (10, "L1 Long Exit", minval=5)
l2LongExitInput = input (20, "L2 Long Exit", minval=5)

FromYear = input(2000, "From Year", minval=1900),   FromMonth = input(1, "From Month", minval=1, maxval=12),    FromDay = input(1, "From Day", minval=1, maxval=31)
ToYear = input(9999, "To Year", minval=1900),       ToMonth = input(1, "To Month", minval=1, maxval=12),        ToDay = input(1, "To Day", minval=1, maxval=31)
FromDate = timestamp(FromYear, FromMonth, FromDay, 00, 00),     ToDate = timestamp(ToYear, ToMonth, ToDay, 23, 59)
TradeDateIsAllowed() => time >= FromDate and time <= ToDate
l1Long = highest(l1LongInput)
l1LongExit = lowest(l1LongExitInput)
l2Long = highest(l2LongInput)
l2LongExit = lowest(l2LongExitInput)

// 
// ADX, +-DI
// https://www.tradingview.com/script/rlMJ05yl-ADX-and-DI-pine-script-3-0/
//
len = 14
th = 20
TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0
SmoothedTrueRange = 0.0
SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange
SmoothedDirectionalMovementPlus = 0.0
SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus = 0.0
SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus

DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
DX = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = sma(DX, len)

// Back to Turtle

filter = true // not (DIPlus < ADX and DIMinus < ADX) and DIPlus > DIMinus
var win = false
var totalPrice = 0.0
var buyPrice = 0.0
var avgPrice = 0.0
var nextBuyPrice = 0.0
var stopPrice = 0.0
var totalBuys = 0

var bool inBuy = false
var float l1LongPlot = highest(l1LongInput)
var float l2LongPlot = highest(l2LongInput)

n = atr(14)

var mode = 'L1'
string longLevel = na

if not inBuy 
    l1LongPlot := highest(l1LongInput)[1]
    l2LongPlot := highest(l2LongInput)[1]
    
    if (close > l2Long[1] and filter)
        mode := 'L2'
        if TradeDateIsAllowed() 
            strategy.close_all()
            strategy.entry("long", strategy.long, comment="L2")
            longLevel := 'L2'

        win := false
        buyPrice := close
        totalBuys := 1
        totalPrice := buyPrice
        avgPrice := buyPrice
        stopPrice := close-(stopInput*n)
        nextBuyPrice := high+(pyramidInput*n)
        inBuy := true
    else 
        if (close > l1Long[1] and filter)
            mode := 'L1'
            if not win
                if TradeDateIsAllowed()
                    strategy.close_all()
                    strategy.entry("long", strategy.long, comment="L1")
                    longLevel := 'L1'
            win := false
            buyPrice := close
            totalBuys := 1
            totalPrice := buyPrice
            avgPrice := buyPrice
            stopPrice := close-(stopInput*n)
            nextBuyPrice := high+(pyramidInput*n)
            inBuy := true
        else 
            inBuy := false

else
    l1LongPlot := l1LongPlot[1]
    l2LongPlot := l2LongPlot[1]
    
    if close > nextBuyPrice and TradeDateIsAllowed() and totalBuys < 6
        strategy.entry("long", strategy.long, comment="LP")
        longLevel := 'P'
        stopPrice := close-(stopInput*n)
        nextBuyPrice := high+(pyramidInput*n)
        totalBuys := totalBuys + 1
        totalPrice := totalPrice + buyPrice
        avgPrice := totalPrice / totalBuys

    if (close < stopPrice) 
        inBuy := false
        if TradeDateIsAllowed()
            if (close >= avgPrice)
                longLevel := 'SG'
            else 
                longLevel := 'SR'
            strategy.close("long", strategy.long)
        win := false
        buyPrice := 0
        avgPrice := 0
    else
        if (mode == 'L1' and close > l2Long[1] and filter)
            if win
                inBuy := true
                win := false
                mode := 'L2'
                if TradeDateIsAllowed()
                    strategy.close_all()
                    longLevel := 'L2'
                    strategy.entry("long", strategy.long, comment="L2")
                buyPrice := close
                totalBuys := 1
                totalPrice := buyPrice
                avgPrice := buyPrice
                stopPrice := close-(stopInput*n)
                nextBuyPrice := close+(pyramidInput*n)
        else
            if (close < l1LongExit[1] or close < l2LongExit[1])
                inBuy := false
                if TradeDateIsAllowed()
                    strategy.close("long", strategy.long)
                if close < avgPrice
                    longLevel := 'SR'
                    win := false
                else
                    longLevel := 'SG'
                    win := true
                buyPrice := 0

plot(l1LongPlot, title="l1 long", linewidth=3, style=plot.style_stepline, color=color.green)
plot(l1LongExit[1], title="l1 exit", linewidth=3, style=plot.style_stepline, color=color.red)

plot(l2LongPlot, title="l2 long", linewidth=2, style=plot.style_stepline, color=color.green)
plot(l2LongExit[1], title="l2 exit", linewidth=2, style=plot.style_stepline, color=color.red)

plot(stopPrice, title="stop", linewidth=2, style=plot.style_stepline, color=color.purple)

plotarrow(longLevel == 'L1' ? 1 : 0, colordown=color.black, colorup=color.green, transp=40)
plotarrow(longLevel == 'L2' ? 1 : 0, colordown=color.black, colorup=color.purple, transp=40)
plotarrow(longLevel == 'SR' ? -1 : 0, colordown=color.red, colorup=color.purple, transp=40)
plotarrow(longLevel == 'SG' ? -1 : 0, colordown=color.green, colorup=color.purple, transp=40)