Estrategia de negociación cuantitativa basada en números aleatorios

El autor:¿ Qué pasa?, Fecha: 2023-12-07 17:14:20
Las etiquetas:

img

Resumen general

La idea central de esta estrategia es simular eventos de probabilidad como lanzamiento de monedas y lanzamiento de dados utilizando números aleatorios para determinar posiciones largas o cortas, implementando así el comercio aleatorio.

Principio de la estrategia

  1. Utilice elflipvariable para simular eventos aleatorios y determinar largo o corto basado en elcoinLabeltamaño de número aleatorio.

  2. Utilizaciónriskyratiopara establecer el stop loss y tomar las líneas de ganancia.

  3. Activar la siguiente señal de negociación al azar de acuerdo con el número máximo de ciclos establecido.

  4. Controlar si se muestra el cuadro de posición cerrada a través delplotBox variable.

  5. stoppedOutytakeProfitlas variables se utilizan para detectar el stop loss o el take profit.

  6. Proporcionar capacidades de backtesting para probar el rendimiento de la estrategia.

Análisis de ventajas

  1. La estructura del código es clara y fácil de entender y de desarrollo secundario.

  2. La interacción de la interfaz de usuario es amigable y varios parámetros se pueden ajustar a través de la interfaz gráfica.

  3. La aleatoriedad es fuerte y no se ve afectada por las fluctuaciones del mercado, con una alta fiabilidad.

  4. Se puede obtener un mejor retorno de la inversión mediante la optimización de parámetros.

  5. Se puede utilizar como una demostración o prueba para otras estrategias.

Análisis de riesgos

  1. El comercio aleatorio no puede juzgar el mercado y existe cierto riesgo de ganancia.

  2. No se puede determinar la combinación óptima de parámetros, por lo que se requieren ensayos repetidos.

  3. Existe el riesgo de supercorrelación que puede resultar de señales aleatorias demasiado densas.

  4. Se recomienda utilizar los mecanismos de stop loss y take profit para controlar los riesgos.

  5. Los riesgos pueden reducirse ampliando adecuadamente el intervalo de negociación.

Direcciones de optimización

  1. Incorporar factores más complejos para generar señales aleatorias.

  2. Aumentar las variedades comerciales para ampliar el alcance de las pruebas.

  3. Optimizar la interacción de la interfaz de usuario y aumentar las capacidades de control de estrategias.

  4. Proporcionar más herramientas de ensayo e indicadores para la optimización de parámetros.

  5. Puede utilizarse como una señal de negociación o como un componente de stop loss take profit añadido a otras estrategias.

Resumen de las actividades

El marco general de esta estrategia es completo, generando señales comerciales basadas en eventos aleatorios, con alta confiabilidad. Al mismo tiempo, proporciona ajuste de parámetros, pruebas de retroceso y capacidades de gráficos. Se puede usar para probar el desarrollo de estrategias novatas, y también como un módulo básico para otras estrategias. A través de la optimización apropiada, el rendimiento de la estrategia puede mejorarse aún más.


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


   
    

Más.