Quantitative Handelsstrategie auf der Grundlage zufälliger Zahlen

Schriftsteller:ChaoZhang, Datum: 2023-12-07 17:14:20
Tags:

img

Übersicht

Die Kernidee dieser Strategie besteht darin, Wahrscheinlichkeitsereignisse wie Münzwerfen und Würfelrollen mit zufälligen Zahlen zu simulieren, um lange oder kurze Positionen zu bestimmen, wodurch ein zufälliger Handel implementiert wird.

Strategieprinzip

  1. VerwendenflipDiese Variablen werden von den einzelnencoinLabelZufallszahlgröße.

  2. Verwendungriskundratioum Stop-Loss- und Gewinnlinien zu setzen.

  3. Auslösen des nächsten Handelssignals nach dem festgelegten maximalen Zyklus.

  4. Steuern Sie, ob das Schließfeld über dieplotBox variable.

  5. stoppedOutundtakeProfitVariablen werden verwendet, um Stop Loss oder Take Profit zu erkennen.

  6. Bereitstellung von Backtesting-Fähigkeiten zur Prüfung der Strategieleistung.

Analyse der Vorteile

  1. Die Code-Struktur ist klar und leicht verständlich und zweitrangig zu entwickeln.

  2. Die Benutzeroberfläche ist freundlich und verschiedene Parameter können über die grafische Schnittstelle angepasst werden.

  3. Die Zufälligkeit ist stark und nicht von Marktschwankungen beeinflusst, mit hoher Zuverlässigkeit.

  4. Durch die Optimierung der Parameter kann eine bessere Kapitalrendite erzielt werden.

  5. Kann als Demonstration oder Test für andere Strategien verwendet werden.

Risikoanalyse

  1. Zufälliges Handeln kann den Markt nicht beurteilen, und es besteht ein gewisses Gewinnrisiko.

  2. Da die optimale Parameterkombination nicht ermittelt werden kann, ist eine wiederholte Prüfung erforderlich.

  3. Es besteht die Gefahr einer Superkorrelation, die durch zu dichte Zufallssignale entstehen kann.

  4. Es wird empfohlen, Stopp-Loss- und Gewinnmechanismen zur Risikokontrolle zu verwenden.

  5. Die Risiken können durch eine angemessene Verlängerung des Handelsintervalls verringert werden.

Optimierungsrichtlinien

  1. Komplexere Faktoren einbeziehen, um zufällige Signale zu erzeugen.

  2. Erhöhen Sie den Handel mit Sorten, um den Testumfang zu erweitern.

  3. Optimieren Sie die Interaktion mit der Benutzeroberfläche und erhöhen Sie die Fähigkeiten zur Strategiekontrolle.

  4. Bereitstellung weiterer Prüfwerkzeuge und Indikatoren für die Optimierung von Parametern.

  5. Kann als Handelssignal oder Stop Loss Take Profit-Komponente verwendet werden, die anderen Strategien hinzugefügt wird.

Zusammenfassung

Der Gesamtrahmen dieser Strategie ist vollständig, er erzeugt Handelssignale basierend auf zufälligen Ereignissen, mit hoher Zuverlässigkeit. Gleichzeitig bietet es Parameteranpassung, Backtesting und Charting-Fähigkeiten. Es kann verwendet werden, um Anfängerstrategieentwicklung zu testen, und auch als Basismodul für andere Strategien. Durch eine angemessene Optimierung kann die Strategieleistung weiter verbessert werden.


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


   
    

Mehr