ランダム数に基づく定量的な取引戦略

作者: リン・ハーンチャオチャン, 日付: 2023-12-07 17:14:20
タグ:

img

概要

この戦略の主なアイデアは,コインフリップやダースロールなどの確率イベントをランダム数を使用して,ロングまたはショートポジションを決定し,ランダムな取引を実装することです.この種の取引戦略は,シミュレーションテストに使用され,より複雑な戦略開発のための基本的な枠組みとしても使用できます.

戦略原則

  1. 試しにflipランダムなイベントをシミュレートし,coinLabelランダムな数のサイズです

  2. 使用riskそしてratioストップ・ロスを設定し 利益ラインを設定します

  3. 設定された最大サイクルの数に従って次の取引信号をランダムに起動します.

  4. クローズ位置ボックスを表示するかどうかを制御します.plotBox variable.

  5. stoppedOutそしてtakeProfitストップ・ロスの検出や 利益の取得に変数を使用します.

  6. 戦略のパフォーマンスをテストするためのバックテスト能力を提供する.

利点分析

  1. コード構造は明確で分かりやすく 開発が次要です

  2. UIのインタラクションはフレンドリーで,様々なパラメータはグラフィカルインターフェースで調整できます.

  3. ランダム性が高く,市場の変動の影響を受けず,信頼性が高い.

  4. パラメータの最適化によって投資の収益性が向上します

  5. 他の戦略の実証やテストとして使用できます

リスク分析

  1. ランダムな取引は 市場を判断できず 利益リスクもあります

  2. 最適なパラメータ組み合わせを決定できないため,再試験が必要です.

  3. 過剰に密度の高いランダム信号によって 超相関の危険性があります

  4. リスクをコントロールするためにストップ・ロスのメカニズムと利益のメカニズムを使用することが推奨されます.

  5. 取引間隔を適切に延長することで リスクを軽減できます

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

  1. ランダムな信号を生成するために より複雑な要素を組み込む

  2. 試験範囲を拡大するために 取引品種を増やします

  3. ユーザーインタラクションを最適化し 戦略制御能力を高めます

  4. パラメータ最適化のためのより多くのテストツールと指標を提供すること.

  5. 他の戦略に追加されたストップ・ロスト・テイク・プロフィート・コンポーネントとして使用できます.

概要

この戦略の全体的なフレームワークは完全であり,ランダムなイベントに基づいて高い信頼性で取引信号を生成する.同時に,パラメータ調整,バックテスト,チャート機能を提供します. 初期戦略開発をテストするために使用され,他の戦略のための基本的なモジュールとしても使用できます.適切な最適化によって,戦略パフォーマンスはさらに改善できます.


/*backtest
start: 2022-11-30 00:00:00
end: 2023-12-06 00:00:00
period: 1d
basePeriod: 1h
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/
// © melodicfish

//@version=4
strategy("Coin Flipper Pro",overlay=true,max_bars_back=100)

// ======= User Inputs variables=========

h1=input(title="------- Trade Activity -------",defval=false)
maxBars=input(25.0,title="Max Bars between Coin Filps",step=1.0,minval=4.0)

h2=input(title="------- Position Settings -------",defval=false)
risk=input(defval=5.0,title="Risk in % ",type=input.float, minval=0.001 ,step=0.1)
ratio= input(defval=1.5,title="Risk to Reward Ratio x:1 ",type=input.float, minval=0.001,step=0.1)

h3=input(title="------- Plot Options -------",defval=false)
showBox=input(defval=true, title="Show Position Boxes")

h4=input(title="------- Back Testing -------",defval=false)
runTest=input(defval=true, title="Run Strategy Back Test")
customTime=input(defval=false, title="Use Custom Date Range for back test")


tsYear = input(2021,minval=1000,maxval=9999,title= "Test Start Year")
tsMonth = input(1,minval=1,maxval=12,title= "Test Start Month")
tsDay = input(1,minval=1,maxval=31,title= "Test Start Day")
start = timestamp(tsYear,tsMonth,tsDay,0,0)

teYear = input(2021,minval=1000,maxval=9999,title=  "Test Stop Year")
teMonth = input(5,minval=1,maxval=12,title=  "Test Stop Month")
teDay = input(1,minval=1,maxval=31,title=  "Test Stop Day")
end = timestamp(teYear,teMonth,teDay,0,0)

// ======= variables =========
var barsBetweenflips=25
var coinFlipResult=0.0
var flip=true
var coinLabel=0.0
var stoppedOut= true
var takeProfit=true
var posLive=false
var p1=0.0
var p2=0.0
var p3=0.0
var plotBox=false
var posType=0
long=false
short=false


// ===== Functions ======

getColor() => 
    round(random(1,255))


// ===== Logic ========
if barssince(flip==true)>barsBetweenflips and posLive==false
    flip:=true
    coinLabel:=random(1,10)

    // Candle Colors   
candleColor= flip==true and flip[1]==false and barstate.isconfirmed==false?color.rgb(getColor(),getColor(),getColor(),0):flip==false and close>=open?color.green:color.red
candleColor:= barstate.ishistory==true and close>=open?color.green: barstate.ishistory==true and close<open? color.red:candleColor 
barcolor(candleColor)

if flip[1]==true and posLive==false
    flip:=false
    barsBetweenflips:=round(random(3,round(maxBars)))
    posLive:=true
    
long:= flip[1]==true and coinLabel[1]>=5.0
short:= flip[1]==true and coinLabel[1]<5.0


    // Calculate Position Boxes
if long==true and posType!=1 

    riskLDEC=1-(risk/100) 
    p1:= close[1]*(1+((risk/100)*ratio)) // TargetLine
    p2:=close[1]
    p3:= close[1]*riskLDEC // StopLine
    plotBox:=true
    posType:=1
  
if short==true and posType!=-1 

    riskSDEC=1-((risk*ratio)/100)
    p1:= close[1]*riskSDEC   // TargetLine
    p2:=close[1]
    p3:= close[1]*(1+(risk/100)) // StopLine
    plotBox:=true
    posType:=-1

    
    // Check Trade Status 
stoppedOut:= posType==1 and long==false and low<= p3? true: posType==-1 and short==false and high>=p3? true: false  
takeProfit:= posType==1 and long == false and high>= p1? true: posType==-1 and short==false and low<=p1? true: false  
if stoppedOut==true or takeProfit==true
    posType:=0
    plotBox:=false
    posLive:=false


// ====== Plots ========
plot1=plot(plotBox and showBox? p1:na,style=plot.style_linebr,color=color.white, transp= 100)
plot2=plot(plotBox and showBox? p2:na,style=plot.style_linebr,color=color.white, transp= 100)
plot3=plot(plotBox and showBox? p3:na,style=plot.style_linebr,color=color.white, transp= 100)
fill(plot1,plot2,color= color.green)
fill(plot2,plot3,color= color.red)
plotshape(flip==true and flip[1]==false and coinLabel>=5.0,style=shape.labelup,location=location.belowbar, color=color.green,size=size.tiny,title="short label",text="Heads",textcolor=color.white)
plotshape(flip==true and flip[1]==false and coinLabel<5.0,style=shape.labeldown,location=location.abovebar, color=color.red,size=size.tiny,title="short label",text="Tails",textcolor=color.white)
if stoppedOut==true
    label.new(bar_index-1, p3, style=label.style_xcross, color=color.orange)
if takeProfit==true
    label.new(bar_index-1, p1, style=label.style_flag, color=color.blue)
    
    

if runTest==true and customTime==false or runTest==true and customTime==true and time >= start and time <= end 
    strategy.entry("Sell", strategy.short,when=short==true)
    strategy.close("Sell", comment="Close Short", when=stoppedOut==true or takeProfit==true)
    strategy.entry("Long", strategy.long,when=long==true)
    strategy.close("Long",comment="Close Long", when= stoppedOut==true or takeProfit==true )


   
    

もっと