Chiến lược giao dịch định lượng dựa trên số ngẫu nhiên

Tác giả:ChaoZhang, Ngày: 2023-12-07 17:14:20
Tags:

img

Tổng quan

Ý tưởng cốt lõi của chiến lược này là mô phỏng các sự kiện xác suất như ném tiền xu và ném xúc xắc bằng cách sử dụng số ngẫu nhiên để xác định các vị trí dài hoặc ngắn, do đó thực hiện giao dịch ngẫu nhiên.

Nguyên tắc chiến lược

  1. Sử dụngflipbiến để mô phỏng các sự kiện ngẫu nhiên và xác định dài hoặc ngắn dựa trêncoinLabelkích thước số ngẫu nhiên.

  2. Sử dụngriskratiođể thiết lập lệnh dừng lỗ và lấy lợi nhuận.

  3. Khởi động tín hiệu giao dịch tiếp theo ngẫu nhiên theo số chu kỳ tối đa được đặt.

  4. Kiểm soát xem có hiển thị hộp vị trí đóng thông quaplotBox variable.

  5. stoppedOuttakeProfitCác biến được sử dụng để phát hiện stop loss hoặc take profit.

  6. Cung cấp khả năng backtesting để kiểm tra hiệu suất chiến lược.

Phân tích lợi thế

  1. Cấu trúc mã là rõ ràng và dễ hiểu và phát triển thứ cấp.

  2. Sự tương tác của UI là thân thiện và các tham số khác nhau có thể được điều chỉnh thông qua giao diện đồ họa.

  3. Sự ngẫu nhiên là mạnh mẽ và không bị ảnh hưởng bởi biến động thị trường, với độ tin cậy cao.

  4. Lợi nhuận đầu tư tốt hơn có thể đạt được thông qua tối ưu hóa tham số.

  5. Có thể được sử dụng như một minh chứng hoặc thử nghiệm cho các chiến lược khác.

Phân tích rủi ro

  1. Giao dịch ngẫu nhiên không thể đánh giá thị trường và có một rủi ro lợi nhuận nhất định.

  2. Không thể xác định kết hợp tham số tối ưu, cần phải thử nghiệm lặp lại.

  3. Có nguy cơ siêu tương quan có thể là kết quả của các tín hiệu ngẫu nhiên quá dày đặc.

  4. Nên sử dụng các cơ chế dừng lỗ và lấy lợi nhuận để kiểm soát rủi ro.

  5. Rủi ro có thể được giảm bằng cách kéo dài khoảng thời gian giao dịch một cách thích hợp.

Hướng dẫn tối ưu hóa

  1. Kết hợp các yếu tố phức tạp hơn để tạo ra các tín hiệu ngẫu nhiên.

  2. Tăng các giống thương mại để mở rộng phạm vi thử nghiệm.

  3. Tối ưu hóa tương tác UI và tăng khả năng kiểm soát chiến lược.

  4. Cung cấp nhiều công cụ thử nghiệm và chỉ số để tối ưu hóa tham số.

  5. Có thể được sử dụng như một tín hiệu giao dịch hoặc dừng lỗ lấy lợi nhuận thành phần được thêm vào các chiến lược khác.

Tóm lại

Khung tổng thể của chiến lược này hoàn chỉnh, tạo ra các tín hiệu giao dịch dựa trên các sự kiện ngẫu nhiên, với độ tin cậy cao. Đồng thời, nó cung cấp khả năng điều chỉnh tham số, kiểm tra lại và biểu đồ. Nó có thể được sử dụng để kiểm tra phát triển chiến lược mới, và cũng là một mô-đun cơ bản cho các chiến lược khác. Thông qua tối ưu hóa thích hợp, hiệu suất chiến lược có thể được cải thiện hơn nữa.


/*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 )


   
    

Thêm nữa