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


Data de criação: 2023-12-07 17:14:20 última modificação: 2023-12-07 17:14:20
cópia: 0 Cliques: 823
1
focar em
1619
Seguidores

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

Visão geral

A idéia central desta estratégia é usar um número aleatório para simular eventos de probabilidade, como um pixel de uma moeda, e decidir fazer um multi-cabeça ou um cabeçalho vazio, de acordo com o resultado do evento, para realizar uma negociação aleatória. Esta estratégia de negociação pode ser usada em testes de simulação ou como uma estrutura básica para o desenvolvimento de estratégias mais complexas.

Princípio da estratégia

  1. passarflipVariabilidade simula eventos aleatórios, de acordo comcoinLabelO número aleatório decide o que fazer ou não.

  2. UtilizaçãoriskeratioConfigure o fio de suspensão.

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

  4. passarplotBoxControle de variáveis para mostrar a caixa de depósito.

  5. stoppedOutetakeProfitAs variáveis são usadas para detetar a perda ou o bloqueio.

  6. Fornecer estratégias de teste de desempenho de função de feedback.

Análise de vantagens

  1. A estrutura do código é clara, fácil de entender e reutilizar.

  2. A interface do usuário é amigável e os parâmetros podem ser ajustados através da interface gráfica.

  3. É altamente aleatória, não é afetada pelas flutuações do mercado e é altamente confiável.

  4. Otimizando os parâmetros, você pode obter melhores retornos de receita.

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

Análise de Riscos

  1. A negociação aleatória não é uma forma de julgar o mercado, existindo um certo risco de lucro.

  2. Não é possível determinar a melhor combinação de parâmetros e é necessário testar repetidamente.

  3. Existe um risco de super correlação que pode ser causado por sinais aleatórios muito densos.

  4. Recomenda-se a combinação de um mecanismo de prevenção de perdas para controlar o risco.

  5. O risco pode ser reduzido com o prolongamento apropriado do intervalo de negociação.

Direção de otimização

  1. A combinação de fatores mais complexos gera um sinal aleatório.

  2. Aumentar a variedade de transações e ampliar o alcance dos testes.

  3. Otimizar a interação da interface do usuário e adicionar o controle de políticas.

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

  5. Pode ser adicionado a outras estratégias como um componente de sinal de negociação ou de parada de perda.

Resumir

O quadro geral da estratégia é completo, gerando sinais de negociação com base em eventos aleatórios, com alta confiabilidade. Ao mesmo tempo, oferece ajustes de parâmetros, retroalimentação e funções de mapeamento. Pode ser usado tanto para testar estratégias de desenvolvimento de novatos quanto como módulo básico de outras estratégias.

Código-fonte da estratégia
/*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 )