Количественная стратегия торговли на основе случайных чисел

Автор:Чао Чжан, Дата: 2023-12-07 17:14:20
Тэги:

img

Обзор

Основная идея этой стратегии заключается в моделировании вероятностных событий, таких как бросок монеты и качание кости, с использованием случайных чисел для определения длинных или коротких позиций, тем самым реализуя случайную торговлю.

Принцип стратегии

  1. ИспользуйтеflipИзменная для моделирования случайных событий и определения длинного или короткого на основеcoinLabelРазмер случайного числа.

  2. Использованиеriskиratioчтобы установить стоп-лосс и взять линию прибыли.

  3. Запускать следующий торговый сигнал случайным образом согласно установленному максимальному числу циклов.

  4. Управлять тем, чтобы отобразить поле позиции закрытия черезplotBox variable.

  5. stoppedOutиtakeProfitпеременные используются для обнаружения стоп-лосса или прибыли.

  6. Предоставление возможностей обратного тестирования для проверки эффективности стратегии.

Анализ преимуществ

  1. Структура кода ясна и легко понятна, и второстепенно развивается.

  2. Взаимодействие пользовательского интерфейса удобное, и различные параметры можно регулировать через графический интерфейс.

  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 )


   
    

Больше