Long-Short Balanced Moving Average Trendfolgestrategie


Erstellungsdatum: 2024-01-18 12:07:52 zuletzt geändert: 2024-01-18 12:07:52
Kopie: 0 Klicks: 608
1
konzentrieren Sie sich auf
1617
Anhänger

Long-Short Balanced Moving Average Trendfolgestrategie

Überblick

Die Strategie ist eine einfache Moving-Average-Strategie für Bitcoin und Ethereum. Sie kombiniert mehrere Indikatoren wie die Durchschnittslinie, die MACD und der RSI, um die Richtung des Trends zu erkennen und den Trend mit einer langen Linie von festen Positionen zu verfolgen.

Strategieprinzip

Die Kernlogik der Strategie besteht darin, bei einem Durchschnittswert von 100 Tagen an der 20-Tage-EMA und bei einem Durchschnittswert von 200 Tagen an der 100-Tage-SMA zu profitieren; bei einem Durchschnittswert von 100 Tagen an der 20-Tage-EMA und bei einem Durchschnittswert von 100 Tagen an der 20-Tage-SMA auszugehen. Die Trendrichtung wird durch die Verwendung von Moving Averages aus drei verschiedenen Perioden bestimmt.

Konkret beurteilt die Strategie den Trend, indem sie die Werte der 20-Tage-EMA-Linie, der 100-Tage-SMA-Linie und der 200-Tage-SMA-Linie berechnet und ihre Größenverhältnisse miteinander vergleicht. Wenn die 20-Tage-EMA-Linie die 100-Tage-SMA-Linie überschreitet, d. h. wenn die 20-Tage-EMA-Linie größer als die 100-Tage-SMA-Linie ist, zeigt dies, dass der Preis zu steigen beginnt. Wenn die 100-Tage-SMA-Linie auch größer als die 200-Tage-SMA-Linie ist, zeigt dies, dass der mittelfristige Trend ebenfalls steigt.

Nach dem Eintritt in eine Mehrposition hält die Strategie die Position und folgt dem Trend. Wenn die 20-Tage-EMA die 100-Tage-SMA erneut durchbricht, zeigt dies ein Umkehrsignal für einen kurzfristigen Trend, in dem die Strategie einen Stillstand auswählt.

Die Strategie kombiniert auch Indikatoren wie MACD und RSI, um Trends zu bestätigen. Die Option, eine Position zu eröffnen, wird nur dann ausgewählt, wenn die MACD-DIF-Linie, die DEMA-Linie und die HIST-Säulenlinie steigen und der RSI-Indikator über 50 liegt.

Strategische Vorteile

Der größte Vorteil dieser Strategie besteht darin, dass sie klare Regeln für den Trendhandel entwickelt, die es ermöglichen, die langen Trends in der Mitte effektiv zu verfolgen. Die spezifischen Vorteile sind:

  1. Die Verwendung von mehreren Gruppen von Moving Averages in Verbindung mit Trends ist zuverlässiger.
  2. Trends werden mit Hilfe von Long-Line-Positionen verfolgt, die nicht von kurzfristigen Marktschwankungen beeinträchtigt werden können.
  3. Strategische Signalbestätigung in Kombination mit Indikatoren wie MACD und RSI, um falsche Durchbrüche zu filtern.
  4. Die Ein- und Ausstiegsplätze werden durch EMA- und SMA-Linien beurteilt. Die Regeln sind einfach und klar.
  5. Die Risiken können wirksam kontrolliert werden und die Verluste durch Stop Loss begrenzt werden.

Risiken und Lösungen

Die Strategie birgt auch einige Risiken, die hauptsächlich darauf zurückzuführen sind, dass sie nicht rechtzeitig gestoppt werden kann, wenn sich der Trend umkehrt. Die spezifischen Risiken und Lösungen sind wie folgt:

  1. Es ist nicht möglich, die Trendwende rechtzeitig zu verfolgen: Sie können den Durchschnittszyklus verkürzen oder mehr Indikatoren hinzufügen, um ein umfassendes Urteil zu fällen.

  2. Eine zu lange Haltedauer kann zu größeren Verlusten führen: Die Ausgangslinie kann angemessen verkürzt und die Verluste rechtzeitig eingestellt werden.

  3. Der Durchschnittswert kann leicht nachlässig werden: Sie können eine Stop-Line mit einem gewissen Rücknahmeanteil hinzufügen, aktiven Stop-Loss.

Optimierungsrichtung

Die Strategie kann auch in folgenden Bereichen optimiert werden:

  1. Test mehr Kombinationen mit mittlerer Zeitspanne, um die optimale Parameter zu finden.

  2. Versuchen Sie andere Indikatoren oder Modelle, um Trends und Einstiegszeiten zu beurteilen.

  3. Dynamische Optimierungsparameter mit Hilfe von Maschinellen Lerntechniken, z. B. durch die Anpassung der Stop-Loss-Marge mit Hilfe von Reinforcement Learning.

  4. In Kombination mit den Volumenindikatoren, um falsche Durchbrüche zu vermeiden, wie z. B. Energiemassage, Transaktionsvolumen usw.

  5. Entwicklung eines automatischen Stop-Loss- und Tracking-Systems, das die Stop-Loss-Position an die Marktlage anpasst.

Zusammenfassen

Die Strategie insgesamt ist eine einfache und direkte Trend-Follow-Strategie. Sie verwendet die bewegliche Mittel, um die Richtung der Tendenz zu bestimmen, MACD- und RSI-Filtersignale. Sie verwendet eine längere Haltedauer, um die Trends zu verfolgen.

Strategiequellcode
/*backtest
start: 2024-01-16 00:00:00
end: 2024-01-17 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="BTC_Long_Only_TV01_200507", overlay=true)

//////////// !!!!!!!!!!!!!!!! WORK BEST IN 2 HOURS for BTC, ETH and ETHXBT !!!!!!!!!!!!!!!!!!! /////////////////////
//280820 - After long esting this is the best script for ETHUSD in 4 hours. From 01/01/2020 til 28/08/2020


[macdLine, macdSignalLine, macdHist] = macd(close, 12, 26, 7)  

//_rsi_len = input(14, title="RSI length")
_rsi_len = 14 
  
NewValue = 0
PreviousValue = 0
leverage = 1

smaPercentageIncrease = 0.0
SMA_PERCENT_INCREASE = 0.0
float atrValue = 0
bool bPositionOpened = false
float stockPositionSize = 0 
float volatilityPercentage = 0.0
bool bDisplayArrow = false 
bool bEMAIsRising = false
bool bSMAIsRising = false
bool bSMASlowIsRising = false
bool bMACDIsRising = false
bool bMACDHistIsRising = false
bool bMACDSignalIsRising = false

float stopLoss = input (5, "StopLoss in %", type=input.float) //StopLoss associated with the order
//Best for alt versus BTC float stopLoss = input (3, "StopLoss in %", type=input.float) //StopLoss associated with the order 
float positionSize = 1000
float currentPrice = close 
float stopLossPrice = 0
float entryPrice = 0


//-----------------------------------------------------------


// === INPUT BACKTEST RANGE ONE YEAR 
//FromDay   = input(defval = 01, title = "From Day", minval = 1, maxval = 31)
//FromMonth = input(defval = 01, title = "From Month", minval = 1, maxval = 12)
//FromYear  = input(defval = 2020, title = "From Year", minval = 2017)
FromDay   = 01
FromMonth = 01
FromYear  = 2020

//ToDay     = input(defval = 01, title = "To Day", minval = 1, maxval = 31)
//ToMonth   = input(defval = 01, title = "To Month", minval = 1, maxval = 12)
//ToYear    = input(defval = 2023, title = "To Year", minval = 2017)
ToDay     = 14
ToMonth   = 05
ToYear    = 2029

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true // create function "within window of time"


//FUNCTION DEFINITIONS
//----------------------
IsRising(data, loopBack) =>
    bIsRising = true
    for n = 1 to loopBack
        if data[n] > data[n-1]
            bIsRising := false
        continue
    bIsRising
    
IsFalling(data, loopBack) =>
    bIsFalling = true
    for n = 1 to loopBack
        if data[n] < data[n-1]
            bIsFalling := false
        continue
    bIsFalling
    
// END OF FUNCTION DEFINITIONS //


emaLength = 20
smaLength = 100
smaSlowLength = 200
 
ema = ema(close, emaLength) 
sma = sma(close, smaLength)
smaSlow = sma(close, smaSlowLength)

plot(sma, color=color.green)
plot(smaSlow, color=color.orange)
plot(ema, color=color.yellow)

//reload previous values
stopLossPrice := na(stopLossPrice[1]) ? 0.0 : stopLossPrice[1]
entryPrice := na(entryPrice[1]) ? 0.0 : entryPrice[1]
bPositionOpened := na(bPositionOpened[1]) ? false : bPositionOpened[1]
positionSize := na(positionSize[1]) ? 1000 : positionSize[1]
stockPositionSize := na(stockPositionSize[1]) ? 0 : stockPositionSize[1]
//leverage := na(leverage[1]) ? 1 : leverage[1]

bEMAIsRising := IsRising(ema, 2) 
bSMAIsRising := IsRising(sma, 3)
bMACDIsRising := IsRising(macdLine, 3)
bMACDHistIsRising := IsRising(macdHist, 1)
bSMASlowIsRising := IsRising(smaSlow, 10)
bMACDSignalIsRising := IsRising(macdSignalLine, 3)


atrValue := atr(14)
volatilityPercentage := (atrValue/currentPrice)*100 //calcute the volatility. Percentage of the actual price

 
if (window()) 
    //Check if we can open a LONG
    if (bPositionOpened == false and bSMASlowIsRising == true and bMACDIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[0] > sma[0] and sma[0] < currentPrice)
        //Enter in short position 
        stockPositionSize := (positionSize*leverage)/currentPrice //Calculate the position size based on the actual price and the position Size (in $) configured.
        
        //calculate exit values
        stopLossPrice := currentPrice*(1-stopLoss/100) 
        strategy.entry("myPosition", strategy.long, qty=stockPositionSize, comment="BUY at " + tostring(currentPrice))
        entryPrice := currentPrice //store the entry price
        bPositionOpened := true  
        bDisplayArrow := true 
        
    if (bPositionOpened == true and (currentPrice <= stopLossPrice or crossunder(ema[1], sma[1])))
        strategy.close("myPosition", comment="" + tostring(currentPrice) ) //Stop
        //uncomment the below line to make the bot investing the full portfolio amount to test compounding effect.
        //positionSize := positionSize + ((stockPositionSize * currentPrice) - (positionSize*leverage)) 
        //reset some flags 
        bPositionOpened := false 
        bDisplayArrow := true 
        entryPrice := 0.0