Stratégie de négociation quantitative basée sur des nombres aléatoires

Auteur:ChaoZhang est là., Date: 2023-12-07 17:14:20 Les résultats sont publiés dans les journaux.
Les étiquettes:

img

Résumé

L'idée de base de cette stratégie est de simuler des événements de probabilité tels que le lancer de pièces et le lancer de dés en utilisant des nombres aléatoires pour déterminer les positions longues ou courtes, mettant ainsi en œuvre le trading aléatoire.

Principe de stratégie

  1. Utilisez leflipLa variable de simulation des événements aléatoires et de déterminer long ou court basé sur lecoinLabeltaille de nombre aléatoire.

  2. Utilisationrisketratiopour définir un stop-loss et prendre des lignes de profit.

  3. Trigger le signal de négociation suivant au hasard selon le nombre de cycles maximum défini.

  4. Contrôler l'affichage de la case de position de fermeture par leplotBox variable.

  5. stoppedOutettakeProfitles variables sont utilisées pour détecter les arrêts de perte ou les prises de bénéfices.

  6. Fournir des capacités de backtesting pour tester les performances de la stratégie.

Analyse des avantages

  1. La structure du code est claire et facile à comprendre et secondaire à développer.

  2. L'interaction de l'interface utilisateur est conviviale et divers paramètres peuvent être ajustés via l'interface graphique.

  3. Le hasard est fort et n'est pas affecté par les fluctuations du marché, avec une fiabilité élevée.

  4. Un meilleur retour sur investissement peut être obtenu grâce à l'optimisation des paramètres.

  5. Peut être utilisé comme démonstration ou test pour d'autres stratégies.

Analyse des risques

  1. Le trading aléatoire ne peut pas juger le marché et il y a un certain risque de profit.

  2. En l'impossibilité de déterminer la combinaison optimale de paramètres, des essais répétés sont nécessaires.

  3. Il existe un risque de supercorrélation qui peut résulter de signaux aléatoires trop denses.

  4. Il est recommandé d'utiliser des mécanismes de stop loss et de profit pour contrôler les risques.

  5. Les risques peuvent être réduits en allongeant de manière appropriée l'intervalle de négociation.

Directions d'optimisation

  1. Incorporer des facteurs plus complexes pour générer des signaux aléatoires.

  2. Augmenter les variétés de commerce pour élargir la portée des tests.

  3. Optimiser l'interaction de l'interface utilisateur et augmenter les capacités de contrôle de la stratégie.

  4. Fournir davantage d'outils de test et d'indicateurs pour optimiser les paramètres.

  5. Peut être utilisé comme signal de trading ou comme composante stop loss take profit ajoutée à d'autres stratégies.

Résumé

Le cadre global de cette stratégie est complet, générant des signaux de trading basés sur des événements aléatoires, avec une grande fiabilité. En même temps, il fournit des capacités d'ajustement de paramètres, de backtesting et de cartographie. Il peut être utilisé pour tester le développement de stratégies novices, et également comme un module de base pour d'autres stratégies. Grâce à une optimisation appropriée, la performance de la stratégie peut être encore améliorée.


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


   
    

Plus de