Estratégia de negociação quantitativa baseada em números aleatórios

Autora:ChaoZhang, Data: 2023-12-07 17:14:20
Tags:

img

Resumo

A ideia central desta estratégia é simular eventos de probabilidade, como jogar moedas e dados, usando números aleatórios para determinar posições longas ou curtas, implementando assim negociações aleatórias.

Princípio da estratégia

  1. Utilize oflipA variável para simular eventos aleatórios e determinar longo ou curto com base nocoinLabeltamanho de número aleatório.

  2. Utilizaçãoriskeratiopara definir o stop loss e tomar as linhas de lucro.

  3. Ativar o próximo sinal de negociação aleatoriamente de acordo com o número máximo de ciclos definido.

  4. Controlar a exibição da caixa de posição de fechamento através doplotBox variable.

  5. stoppedOutetakeProfitAs variáveis são utilizadas para detectar stop loss ou take profit.

  6. Fornecer capacidades de backtesting para testar o desempenho da estratégia.

Análise das vantagens

  1. A estrutura do código é clara e fácil de entender e de desenvolvimento secundário.

  2. A interação da UI é amigável e vários parâmetros podem ser ajustados através da interface gráfica.

  3. A aleatoriedade é forte e não é afectada por flutuações do mercado, com uma elevada fiabilidade.

  4. O melhor retorno do investimento pode ser obtido através da otimização de parâmetros.

  5. Pode ser usado como demonstração ou teste para outras estratégias.

Análise de riscos

  1. A negociação aleatória não pode julgar o mercado e existe um certo risco de lucro.

  2. Não sendo possível determinar a combinação ideal de parâmetros, é necessário repetir os ensaios.

  3. Existe o risco de supercorrelação que pode resultar de sinais aleatórios excessivamente densos.

  4. Recomenda-se o uso de mecanismos de stop loss e take profit para controlar os riscos.

  5. Os riscos podem ser reduzidos através de um prolongamento adequado do intervalo de negociação.

Orientações de otimização

  1. Incorporar fatores mais complexos para gerar sinais aleatórios.

  2. Aumentar as variedades comercializadas para expandir o escopo dos testes.

  3. Otimizar a interação da UI e aumentar as capacidades de controle de estratégia.

  4. Fornecer mais ferramentas de ensaio e indicadores para otimização de parâmetros.

  5. Pode ser usado como um sinal de negociação ou um componente de stop loss take profit adicionado a outras estratégias.

Resumo

A estrutura geral desta estratégia é completa, gerando sinais de negociação baseados em eventos aleatórios, com alta confiabilidade. Ao mesmo tempo, fornece ajuste de parâmetros, backtesting e capacidades de gráficos. Pode ser usado para testar o desenvolvimento de estratégias novatas, e também como um módulo básico para outras estratégias. Através da otimização apropriada, o desempenho da estratégia pode ser melhorado.


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


   
    

Mais.