Stratégie de prédiction morphologique


Date de création: 2023-09-28 11:11:35 Dernière modification: 2023-09-28 11:11:35
Copier: 0 Nombre de clics: 785
1
Suivre
1617
Abonnés

Aperçu

La stratégie de prévision de la forme utilise la forme de la courbe pour juger de l’évolution future des prix et est largement utilisée dans le monde du trading. La stratégie capture les opportunités de revirement de tendance en identifiant deux formes simples, la courbe de l’araignée et l’étoile filante.

Principe de stratégie

La stratégie est basée sur les principes suivants:

  1. L’indicateur ATR est utilisé pour identifier les tendances fortes et faibles et filtrer les marchés en crise. Les transactions sont considérées lorsque l’ATR est inférieur au seuil minimum ou supérieur au seuil maximum.

  2. Calculer la ligne de rétractation de Fibonacci de 33,3% de la ligne K actuelle. Si le cours de clôture est supérieur à cette ligne, il est considéré comme étant de la ligne de l’araignée, et si le cours de clôture est inférieur à cette ligne, il est considéré comme étant de l’étoile filante.

  3. Une confirmation supplémentaire est effectuée pour les formes identifiées, la forme est requise pour être terminée ((la partie de l’entité est supérieure ou inférieure au prix d’ouverture) et pour les lignes K non confirmées。

  4. Après l’entrée, le stop loss et le stop stop sont réglés, le stop loss est un certain multiple de l’ATR, le stop stop est le multiple de retour sur risque du stop loss.

La stratégie utilise les indicateurs ATR et les techniques de Fibonacci pour identifier les lignes de la souris et les formes des étoiles de tir, tout en définissant des indicateurs de contrôle du risque, conformément aux principes généraux du trading de tendance.

Analyse des avantages

Cette stratégie présente les avantages suivants:

  1. Le principe est simple, la mise en œuvre est facile à comprendre.

  2. Il est possible d’utiliser des positions à court terme dans la journée, sans avoir à attendre longtemps pour les détenir, avec une grande flexibilité.

  3. Les paramètres ATR permettent de maîtriser le risque d’exagération. Les paramètres peuvent être optimisés pour différentes variétés.

  4. Le risque peut être maîtrisé par la mise en place d’un point d’arrêt et de perte raisonnable combiné avec un rapport de retour sur risque.

  5. Les signaux de trading automatisés sont directement connectés aux positions de stop loss et de plafonnement, et sont faciles à utiliser.

  6. Il est adapté à de nombreuses variétés et est universel.

Analyse des risques

Cette stratégie comporte aussi des risques:

  1. Les transactions formelles présentent un certain taux d’erreur et ne sont pas entièrement fiables.

  2. Les frais de transaction ne sont pas pris en compte et la marge de profit réelle est plus faible.

  3. Les transactions sur courte durée peuvent entraîner une augmentation de la fréquence des transactions et du coût des points de glissement.

  4. L’optimisation des paramètres ATR repose sur des données historiques et ne peut être garantie pour toujours.

  5. Les commandes automatiques présentent un risque d’échec de la commande et un mécanisme de retest doit être mis en place.

  6. Un mauvais réglage du stop-loss peut entraîner une surremption ou une sous-remption.

Direction d’optimisation

La stratégie peut être optimisée dans les directions suivantes:

  1. Ajout d’autres conditions de filtrage, telles que le volume des transactions, pour améliorer l’efficacité de la forme.

  2. Considérez les réglages de frais et optimisez les points de stop-loss.

  3. Optimiser dynamiquement les paramètres ATR pour les adapter à différentes périodes de temps.

  4. Évaluer les paramètres de chaque paire de variétés négociées et définir des paramètres personnalisés.

  5. L’augmentation du mécanisme de retest automatique et la réduction du risque individuel.

  6. L’apprentissage automatique améliore la précision de la reconnaissance de formes.

  7. Ajouter un suivi de stop-loss pour verrouiller plus de bénéfices.

Résumer

En résumé, la stratégie de trading intègre des indicateurs techniques couramment utilisés, les principes sont simples et faciles à comprendre et à mettre en œuvre. Dans le cas où les paramètres sont optimisés et le contrôle du risque est en place, il est probable que les gains stables soient obtenus. Cependant, les traders doivent toujours être attentifs aux risques, garder le nombre de trades modéré et éviter la radicalisation excessive.

Code source de la stratégie
/*backtest
start: 2023-08-28 00:00:00
end: 2023-09-27 00:00:00
period: 2h
basePeriod: 15m
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/
// © ZenAndTheArtOfTrading / PineScriptMastery
// Last Updated: 28th April, 2021
// @version=4
strategy("Hammers & Stars Strategy [v1.0]", shorttitle="HSS[v1.0]", overlay=true)

// Get user input
atrMinFilterSize = input(title=">= ATR Filter", type=input.float, defval=0.0, minval=0.0, tooltip="Minimum size of entry candle compared to ATR", group="Strategy Settings")
atrMaxFilterSize = input(title="<= ATR Filter", type=input.float, defval=3.0, minval=0.0, tooltip="Maximum size of entry candle compared to ATR", group="Strategy Settings")
stopMultiplier   = input(title="Stop Loss ATR", type=input.float, defval=1.0, tooltip="Stop loss multiplier (x ATR)", group="Strategy Settings")
rr               = input(title="R:R", type=input.float, defval=1.0, tooltip="Risk:Reward profile", group="Strategy Settings")
fibLevel         = input(title="Fib Level", type=input.float, defval=0.333, tooltip="Used to calculate upper/lower third of candle. (For example, setting it to 0.5 will mean hammers must close >= 50% mark of the total candle size)", group="Strategy Settings")
i_startTime      = input(title="Start Date Filter", defval=timestamp("01 Jan 2000 13:30 +0000"), type=input.time, tooltip="Date & time to begin trading from", group="Strategy Settings")
i_endTime        = input(title="End Date Filter", defval=timestamp("1 Jan 2099 19:30 +0000"), type=input.time, tooltip="Date & time to stop trading", group="Strategy Settings")
oandaDemo        = input(title="Use Oanda Demo?", type=input.bool, defval=false, tooltip="If turned on then oandapractice broker prefix will be used for AutoView alerts (demo account). If turned off then live account will be used", group="AutoView Oanda Settings")
limitOrder       = input(title="Use Limit Order?", type=input.bool, defval=true, tooltip="If turned on then AutoView will use limit orders. If turned off then market orders will be used", group="AutoView Oanda Settings")
gtdOrder         = input(title="Days To Leave Limit Order", type=input.integer, minval=0, defval=2, tooltip="This is your GTD setting (good til day)", group="AutoView Oanda Settings")
accountBalance   = input(title="Account Balance", type=input.float, defval=1000.0, step=100, tooltip="Your account balance (used for calculating position size)", group="AutoView Oanda Settings")
accountCurrency  = input(title="Account Currency", type=input.string, defval="USD", options=["AUD", "CAD", "CHF", "EUR", "GBP", "JPY", "NZD", "USD"], tooltip="Your account balance currency (used for calculating position size)", group="AutoView Oanda Settings")
riskPerTrade     = input(title="Risk Per Trade %", type=input.float, defval=2.0, step=0.5, tooltip="Your risk per trade as a % of your account balance", group="AutoView Oanda Settings")

// Set up AutoView broker prefix
var broker = oandaDemo ? "oandapractice" : "oanda"

// See if this bar's time happened within date filter
dateFilter = true

// Get ATR
atr = atr(14)

// Check ATR filter
atrMinFilter = abs(high - low) >= (atrMinFilterSize * atr) or atrMinFilterSize == 0.0
atrMaxFilter = abs(high - low) <= (atrMaxFilterSize * atr) or atrMaxFilterSize == 0.0
atrFilter = atrMinFilter and atrMaxFilter

// Calculate 33.3% fibonacci level for current candle
bullFib = (low - high) * fibLevel + high
bearFib = (high - low) * fibLevel + low

// Determine which price source closes or opens highest/lowest
lowestBody = close < open ? close : open
highestBody = close > open ? close : open

// Determine if we have a valid setup
validHammer = lowestBody >= bullFib and atrFilter and close != open and not na(atr)
validStar = highestBody <= bearFib and atrFilter and close != open and not na(atr)

// Check if we have confirmation for our setup
validLong = validHammer and strategy.position_size == 0 and dateFilter and barstate.isconfirmed
validShort = validStar and strategy.position_size == 0 and dateFilter and barstate.isconfirmed

//------------- DETERMINE POSITION SIZE -------------//
// Get account inputs
var tradePositionSize = 0.0
var pair = syminfo.basecurrency + "/" + syminfo.currency

// Check if our account currency is the same as the base or quote currency (for risk $ conversion purposes)
accountSameAsCounterCurrency = accountCurrency == syminfo.currency
accountSameAsBaseCurrency = accountCurrency == syminfo.basecurrency

// Check if our account currency is neither the base or quote currency (for risk $ conversion purposes)
accountNeitherCurrency = not accountSameAsCounterCurrency and not accountSameAsBaseCurrency

// Get currency conversion rates if applicable
conversionCurrencyPair = accountSameAsCounterCurrency ? syminfo.tickerid : accountNeitherCurrency ? accountCurrency + syminfo.currency : accountCurrency + syminfo.currency
conversionCurrencyRate = security(symbol=syminfo.type == "forex" ? "BTC_USDT:swap" : "BTC_USDT:swap", resolution="D", expression=close)

// Calculate position size
getPositionSize(stopLossSizePoints) =>
    riskAmount = (accountBalance * (riskPerTrade / 100)) * (accountSameAsBaseCurrency or accountNeitherCurrency ? conversionCurrencyRate : 1.0)
    riskPerPoint = (stopLossSizePoints * syminfo.pointvalue)
    positionSize = (riskAmount / riskPerPoint) / syminfo.mintick
    round(positionSize)
    
// Custom function to convert pips into whole numbers
toWhole(number) =>
    return = atr(14) < 1.0 ? (number / syminfo.mintick) / (10 / syminfo.pointvalue) : number
    return := atr(14) >= 1.0 and atr(14) < 100.0 and syminfo.currency == "JPY" ? return * 100 : return
//------------- END POSITION SIZE CODE -------------//

// Calculate our stop distance & size for the current bar
stopSize = atr * stopMultiplier
longStopPrice = low < low[1] ? low - stopSize : low[1] - stopSize
longStopDistance = close - longStopPrice
longTargetPrice = close + (longStopDistance * rr)
shortStopPrice = high > high[1] ? high + stopSize : high[1] + stopSize
shortStopDistance = shortStopPrice - close
shortTargetPrice = close - (shortStopDistance * rr)

// Save trade stop & target & position size if a valid setup is detected
var tradeStopPrice = 0.0
var tradeTargetPrice = 0.0

// Set up our GTD (good-til-day) order info
gtdTime = time + (gtdOrder * 1440 * 60 * 1000) // 86,400,000ms per day
gtdYear = year(gtdTime)
gtdMonth = month(gtdTime)
gtdDay = dayofmonth(gtdTime)
gtdString = " dt=" + tostring(gtdYear) + "-" + tostring(gtdMonth) + "-" + tostring(gtdDay)

// Detect valid long setups & trigger alert
if validLong
    tradeStopPrice := longStopPrice
    tradeTargetPrice := longTargetPrice
    tradePositionSize := getPositionSize(toWhole(longStopDistance) * 10)
    // Trigger AutoView long alert
    alert(message="e=" + broker + " b=long q="
     + tostring(tradePositionSize) 
     + " s=" + pair
     + " t=" + (limitOrder ? "limit fp=" + tostring(close) : "market")
     + " fsl=" + tostring(tradeStopPrice)
     + " ftp=" + tostring(tradeTargetPrice)
     + (gtdOrder != 0 and limitOrder ? gtdString : ""), 
     freq=alert.freq_once_per_bar_close)
   
// Detect valid short setups & trigger alert
if validShort
    tradeStopPrice := shortStopPrice
    tradeTargetPrice := shortTargetPrice
    tradePositionSize := getPositionSize(toWhole(shortStopDistance) * 10)
    // Trigger AutoView short alert
    alert(message="e=" + broker + " b=short q="
     + tostring(tradePositionSize)
     + " s=" + pair
     + " t=" + (limitOrder ? "limit fp=" + tostring(close) : "market")
     + " fsl=" + tostring(tradeStopPrice)
     + " ftp=" + tostring(tradeTargetPrice)
     + (gtdOrder != 0 and limitOrder ? gtdString : ""),
     freq=alert.freq_once_per_bar_close)

// Enter trades whenever a valid setup is detected
strategy.entry(id="Long", long=strategy.long, when=validLong)
strategy.entry(id="Short", long=strategy.short, when=validShort)

// Exit trades whenever our stop or target is hit
strategy.exit(id="Long Exit", from_entry="Long", limit=tradeTargetPrice, stop=tradeStopPrice, when=strategy.position_size > 0)
strategy.exit(id="Short Exit", from_entry="Short", limit=tradeTargetPrice, stop=tradeStopPrice, when=strategy.position_size < 0)

// Draw trade data
plot(strategy.position_size != 0 or validLong or validShort ? tradeStopPrice : na, title="Trade Stop Price", color=color.red, style=plot.style_linebr, transp=0)
plot(strategy.position_size != 0 or validLong or validShort ? tradeTargetPrice : na, title="Trade Target Price", color=color.green, style=plot.style_linebr, transp=0)
plot(strategy.position_size != 0 or validLong or validShort ? tradePositionSize : na, color=color.purple, transp=100, title="AutoView Position Size")

// Draw price action setup arrows
plotshape(validLong ? 1 : na, style=shape.triangleup, location=location.belowbar, color=color.green, title="Bullish Setup")
plotshape(validShort ? 1 : na, style=shape.triangledown, location=location.abovebar, color=color.red, title="Bearish Setup")