Die Strategie ist eine einfache, automatische, auf technischen Kennzahlen basierende Mehrkopftrendstrategie für Kryptowährungen wie Bitcoin und Ethereum, die darauf abzielt, wichtige Aufwärtstrends zu erfassen und die Verluste durch Gebühren aufgrund häufiger Transaktionen zu reduzieren.
Der MACD wird verwendet, um die Richtung des Trends zu bestimmen, wobei der MACD bei Aufwärtskreuzungen zu hoch ist.
Berechnen Sie die 20-Zyklus-EMA, 100-Zyklus-SMA und 200-Zyklus-SMA, wobei die EMA und die SMA nach oben betrachtet werden.
Die EMA überschreitet die SMA und die SMA überschreitet die SMA.
Setzen Sie eine Stop-Loss-Linie, und wenn der Preis die Stop-Loss-Linie überschreitet, beenden Sie den Stop-Loss.
Wenn der Preis sinkt, brechen Sie den EMA unter dem SMA aus.
Die Strategie kombiniert mehrere Indikatoren, um Trends und Einstiegsmomente zu bestimmen und Profite zu erzielen, indem die wichtigsten Aufwärtstrends verfolgt werden.
Die Mehrfachdurchmesser-Kombination kann Fehlsignale wie falsche Durchbrüche wirksam filtern.
Es ist wichtig, dass die Anbieter von Online-Handelsgeschäften, die sich auf die Entwicklung von Online-Handelsgeschäften konzentrieren, sich auf die Entwicklung von Online-Handelsgeschäften konzentrieren und sich auf die Entwicklung von Online-Handelsgeschäften konzentrieren.
Die Stop-Loss-Strategie kann den maximalen Verlust eines einzelnen Geschäfts effektiv kontrollieren.
Die Rückmeldung zeigt, dass Bitcoin und Ethereum bessere Erträge bringen können.
Die Strategie ist einfach, klar und verständlich und für Anfänger geeignet.
Es ist skalierbar und kann mit weiteren Kennzahlen optimiert werden.
Es gibt eine große Wahrscheinlichkeit, dass die Märkte zufällig verlaufen, und es besteht die Gefahr von Fehleinschätzungen.
Ein einziger Haltungsansatz ist nicht geeignet, um Systemrisiken zu vermeiden.
Die falsche Einstellung der Stopps kann zu übermäßigen Stopps führen.
Die Rücklaufdaten sind nicht repräsentativ für die reale Leistung, die Wirksamkeit muss noch verifiziert werden.
Die Effektivität der Festplatte kann ohne Berücksichtigung der Auswirkungen der Transaktionsgebühren variieren.
Es gibt keine spezifischen Merkmale der verschiedenen Sorten, die es zu optimieren gilt.
Verschiedene Parameterkombinationen zu testen und die Parameter für die Kennzahlen zu optimieren;
Ein zusätzliches Filtersystem für Eingangssignale wie KDJ;
Optimierung der Stop-Loss-Strategie und Einführung von dynamischen Stop-Losses;
Erwägung der Verwaltung der Konten und Anpassung der Positionsgröße;
Das Projekt wurde von der Universität von München mit dem Ziel unterstützt, die Entwicklung von Züchtungen zu fördern.
Das ist eine sehr wichtige Frage, die wir uns stellen müssen.
Verschiedene Sorten werden getestet, um die besten zu finden.
Die Gesamtkonzeption der Strategie ist klar und verständlich, und die Verwendung von mehreren Indikatoren kann die Fehlsignale wirksam filtern. Es sind jedoch weitere Optimierungen der Parameter, Risikokontrollen usw. erforderlich, die in Kombination mit der Live-Verifizierung praktisch angewendet werden können.
/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="BTC Long strategy", overlay=true, max_bars_back=3000, initial_capital=1000, commission_value=0.075)
//////////// !!!!!!!!!!!!!!!! WORK BEST IN 2 HOURS for BTC, ETH and ETHXBT !!!!!!!!!!!!!!!!!!! /////////////////////
[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 (1.5, "StopLoss in %", type=input.float) //StopLoss associated with the order
//positionSize = input (1000, "in $")
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 = 2019
//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 = 31
ToMonth = 12
ToYear = 2099
// === 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"
//emaLength = input(20, "EMA Length")
//smaLength = input(100, "SMA Length")
//smaSlowLength = input(200, "SMA Length")
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]) ? 50000 : positionSize[1]
stockPositionSize := na(stockPositionSize[1]) ? 0 : stockPositionSize[1]
//leverage := na(leverage[1]) ? 1 : leverage[1]
//ReEvaluate the direction of indicators
bEMAIsRising := rising(ema, 2)
bSMAIsRising := rising(sma, 3)
bMACDIsRising := rising(macdLine, 3)
bMACDHistIsRising := rising(macdHist, 1)
bSMASlowIsRising := rising(smaSlow, 10)
bMACDSignalIsRising := rising(macdSignalLine, 3)
atrValue := atr(14)
volatilityPercentage := (atrValue/currentPrice)*100 //calcute the volatility. Percentage of the actual price
//There is too many signal in tranding market, to avoid this we need to make sure that the smaSlow has a mininal increase
//THIS DOES NOT WORK AT ALL!!!!!
//if bSMASlowIsRising == true
// //calculate the percentegage difference over the last 10 bars
// smaPercentageIncrease := ((smaSlow[0]/sma[10])-1)*100
// if smaPercentageIncrease < SMA_PERCENT_INCREASE
// //Not enough increase we reset the flag
// bSMASlowIsRising := false
if (window())
//Check if we can open a LONG
//sma > smaSlow and
if ( volatilityPercentage < 2 and bPositionOpened == false and bSMASlowIsRising == true and bMACDIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[0] > sma[0] and sma[0] < currentPrice)
// add comparaison between macd and macd signal line
//if (bPositionOpened == false and macdSignalLine < macdLine and bMACDIsRising == true and bMACDHistIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[1] > sma[1] and sma[1] < 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]) or currentPrice < sma[1]))
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