Une stratégie de double EMA homogène de YouTube

Auteur:Le petit rêve, Créé: 2022-10-09 15:56:22, Mis à jour: 2023-09-15 20:50:38

img

Une stratégie de double EMA homogène de YouTube

Dans ce numéro, nous allons explorer une "stratégie de double EMA homogène magique" provenant de YouTube, cette stratégie est appelée "stratégie tueuse de l'action et du marché de la crypto-monnaie". Je viens de regarder la vidéo et j'ai appris que cette stratégie est une stratégie en langage pin de trading view, utilisant deux indicateurs de trading view.

Indicateurs utilisés par la stratégie

Les indicateurs de l'EMA

Pour simplifier la conception, nous n'utilisons pas l'exponentiel de moyenne mobile mentionné dans la vidéo. Nous utilisons ta.ema intégré à la vue de trading à la place (en fait, tout est le même).

Les résultats de cette enquête ont été publiés par le site officiel de l'UNICEF.

Il s'agit d'un indicateur dans Trading View, et nous devons aller dans Trading View et télécharger le code source.

img

Le code VuManChu Swing Free est le suivant:

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

// Credits to the original Script - Range Filter DonovanWall https://www.tradingview.com/script/lut7sBgG-Range-Filter-DW/
// This version is the old version of the Range Filter with less settings to tinker with

//@version=4
study(title="Range Filter - B&S Signals", shorttitle="RF - B&S Signals", overlay=true)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Functions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Size Function
rng_size(x, qty, n)=> 
//    AC       = Cond_EMA(abs(x - x[1]), 1, n)
    wper      = (n*2) - 1
    avrng     = ema(abs(x - x[1]), n)
    AC = ema(avrng, wper)*qty
    rng_size = AC

//Range Filter Function
rng_filt(x, rng_, n)=>
    r          = rng_
    var rfilt  = array.new_float(2, x)
    array.set(rfilt, 1, array.get(rfilt, 0))
    if x - r > array.get(rfilt, 1)
        array.set(rfilt, 0, x - r)
    if x + r < array.get(rfilt, 1)
        array.set(rfilt, 0, x + r)
    rng_filt1 = array.get(rfilt, 0)
    
    hi_band   = rng_filt1 + r
    lo_band   = rng_filt1 - r
    rng_filt  = rng_filt1
    [hi_band, lo_band, rng_filt]
 
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Source
rng_src = input(defval=close, type=input.source, title="Swing Source")

//Range Period
rng_per = input(defval=20, minval=1, title="Swing Period")

//Range Size Inputs
rng_qty   = input(defval=3.5, minval=0.0000001, title="Swing Multiplier")

//Bar Colors
use_barcolor = input(defval=false, type=input.bool, title="Bar Colors On/Off")

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Filter Values
[h_band, l_band, filt] = rng_filt(rng_src, rng_size(rng_src, rng_qty, rng_per), rng_per)

//Direction Conditions
var fdir = 0.0
fdir    := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir
upward   = fdir==1 ? 1 : 0
downward = fdir==-1 ? 1 : 0

//Trading Condition
longCond = rng_src > filt and rng_src > rng_src[1] and upward > 0 or rng_src > filt and rng_src < rng_src[1] and upward > 0 
shortCond = rng_src < filt and rng_src < rng_src[1] and downward > 0 or rng_src < filt and rng_src > rng_src[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

//Colors
filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc
bar_color  = upward and (rng_src > filt) ? (rng_src > rng_src[1] ? #05ff9b : #00b36b) :
             downward and (rng_src < filt) ? (rng_src < rng_src[1] ? #ff0583 : #b8005d) : #cccccc

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Filter Plot
filt_plot = plot(filt, color=filt_color, transp=67, linewidth=3, title="Filter")

//Band Plots
h_band_plot = plot(h_band, color=color.new(#05ff9b, 100), title="High Band")
l_band_plot = plot(l_band, color=color.new(#ff0583, 100), title="Low Band")

//Band Fills
fill(h_band_plot, filt_plot, color=color.new(#00b36b, 92), title="High Band Fill")
fill(l_band_plot, filt_plot, color=color.new(#b8005d, 92), title="Low Band Fill")

//Bar Color
barcolor(use_barcolor ? bar_color : na)

//Plot Buy and Sell Labels
plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor = color.white, style=shape.labelup, size = size.normal, location=location.belowbar, color = color.new(color.green, 0))
plotshape(shortCondition, title = "Sell Signal", text ="SELL", textcolor = color.white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = color.new(color.red, 0))

//Alerts
alertcondition(longCondition, title="Buy Alert", message = "BUY")
alertcondition(shortCondition, title="Sell Alert", message = "SELL")

La logique stratégique

Indicateur EMA: la stratégie utilise deux moyennes EMA, une ligne rapide (paramètres de petites cycles) et une ligne lente (paramètres de grandes cycles). Le rôle des deux moyennes EMA est principalement d'aider à déterminer la direction de la tendance du marché.

  • La ligne à tête multiple La ligne rapide est au-dessus de la ligne lente.

  • Liste de tête vide La ligne rapide est en dessous de la ligne lente.

VuManChu Swing Free Indicateur: VuManChu Swing Free Indicateur est utilisé pour émettre un signal, qui est ensuite combiné avec d'autres conditions pour déterminer si une transaction doit être passée.

Les conditions de déclenchement des signaux de négociation stratégiques sont les suivantes:

1° Les règles pour accéder à plusieurs titres: Le prix de clôture de la ligne K doit être au-dessus de la ligne rapide de l'EMA, les deux lignes moyennes de l'EMA doivent présenter un ordre multi-tête (la ligne rapide est au-dessus de la ligne lente) et l'indicateur VuManChu Swing Free doit afficher un signal d'achat (la condition longue est vraie).

2, les règles pour entrer en tête vide (contrairement au pluriel): Le prix de clôture de la ligne K doit être en dessous de la ligne rapide de l'EMA, les deux lignes moyennes de l'EMA doivent présenter une rangée de têtes vides (la ligne rapide est en dessous de la ligne lente) et l'indicateur VuManChu Swing Free doit afficher un signal de vente (la condition courte est vraie).

La logique de transaction est-elle très simple, car il n'y a pas d'explication spécifique du stop-loss dans la vidéo, les éditeurs sont libres de jouer ici en utilisant une méthode de stop-loss comparative, en utilisant un nombre de points fixes de stop-loss et de suivi du stop-loss.

La conception du code

Le code de l'indicateur VuManChu Swing Free, que nous avons mis directement dans notre code stratégique.

img

Ensuite, nous avons écrit un morceau de code dans le langage Pine pour réaliser des transactions:

// extend
fastEmaPeriod = input(50, "fastEmaPeriod")         // 快线周期
slowEmaPeriod = input(200, "slowEmaPeriod")        // 慢线周期
loss = input(30, "loss")                           // 止损点数
trailPoints = input(30, "trailPoints")             // 移动止盈触发点数
trailOffset = input(30, "trailOffset")             // 移动止盈偏移量(点数)
amount = input(1, "amount")                        // 下单量

emaFast = ta.ema(close, fastEmaPeriod)             // 计算快线EMA
emaSlow = ta.ema(close, slowEmaPeriod)             // 计算慢线EMA

buyCondition = longCondition and emaFast > emaSlow and close > open and close > emaFast         // 做多入场条件
sellCondition = shortCondition and emaFast < emaSlow and close < open and close < emaFast       // 做空入场条件

if buyCondition and strategy.position_size == 0
    strategy.entry("long", strategy.long, amount)
    strategy.exit("exit_long", "long", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset)
if sellCondition and strategy.position_size == 0
    strategy.entry("short", strategy.short, amount)
    strategy.exit("exit_short", "short", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset)

A.可以看到,当buyCondition为真时即:

1, la variable long Condition est vraie (l'indicateur VuManChu Swing Free émet plus de signaux). 2, emaFast > emaSlow (EMA classé en plusieurs titres) ‖ 3, close > open (indiquant que le BAR actuel est la ligne du soleil), close > emaFast (indiquant que le prix de clôture est au-dessus de la ligne rapide de l'EMA) ;

Les trois conditions suivantes sont remplies:

B.当sellCondition为真时,则做空的三个条件成立(这里不再赘述)。

Ensuite, en cas de déclenchement d'un signal de jugement des conditions, utilisez la fonction stratégie.entry pour entrer dans la position et définissez la fonction stratégie.exit pour arrêter les pertes, suivre les arrêts.

Le code complet

/*backtest
start: 2022-01-01 00:00:00
end: 2022-10-08 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
args: [["ZPrecision",0,358374]]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

// Credits to the original Script - Range Filter DonovanWall https://www.tradingview.com/script/lut7sBgG-Range-Filter-DW/
// This version is the old version of the Range Filter with less settings to tinker with

//@version=4
study(title="Range Filter - B&S Signals", shorttitle="RF - B&S Signals", overlay=true)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Functions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Size Function
rng_size(x, qty, n)=> 
//    AC       = Cond_EMA(abs(x - x[1]), 1, n)
    wper      = (n*2) - 1
    avrng     = ema(abs(x - x[1]), n)
    AC = ema(avrng, wper)*qty
    rng_size = AC

//Range Filter Function
rng_filt(x, rng_, n)=>
    r          = rng_
    var rfilt  = array.new_float(2, x)
    array.set(rfilt, 1, array.get(rfilt, 0))
    if x - r > array.get(rfilt, 1)
        array.set(rfilt, 0, x - r)
    if x + r < array.get(rfilt, 1)
        array.set(rfilt, 0, x + r)
    rng_filt1 = array.get(rfilt, 0)
    
    hi_band   = rng_filt1 + r
    lo_band   = rng_filt1 - r
    rng_filt  = rng_filt1
    [hi_band, lo_band, rng_filt]
 
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Source
rng_src = input(defval=close, type=input.source, title="Swing Source")

//Range Period
rng_per = input(defval=20, minval=1, title="Swing Period")

//Range Size Inputs
rng_qty   = input(defval=3.5, minval=0.0000001, title="Swing Multiplier")

//Bar Colors
use_barcolor = input(defval=false, type=input.bool, title="Bar Colors On/Off")

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Filter Values
[h_band, l_band, filt] = rng_filt(rng_src, rng_size(rng_src, rng_qty, rng_per), rng_per)

//Direction Conditions
var fdir = 0.0
fdir    := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir
upward   = fdir==1 ? 1 : 0
downward = fdir==-1 ? 1 : 0

//Trading Condition
longCond = rng_src > filt and rng_src > rng_src[1] and upward > 0 or rng_src > filt and rng_src < rng_src[1] and upward > 0 
shortCond = rng_src < filt and rng_src < rng_src[1] and downward > 0 or rng_src < filt and rng_src > rng_src[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

//Colors
filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc
bar_color  = upward and (rng_src > filt) ? (rng_src > rng_src[1] ? #05ff9b : #00b36b) :
             downward and (rng_src < filt) ? (rng_src < rng_src[1] ? #ff0583 : #b8005d) : #cccccc

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Filter Plot
filt_plot = plot(filt, color=filt_color, transp=67, linewidth=3, title="Filter")

//Band Plots
h_band_plot = plot(h_band, color=color.new(#05ff9b, 100), title="High Band")
l_band_plot = plot(l_band, color=color.new(#ff0583, 100), title="Low Band")

//Band Fills
fill(h_band_plot, filt_plot, color=color.new(#00b36b, 92), title="High Band Fill")
fill(l_band_plot, filt_plot, color=color.new(#b8005d, 92), title="Low Band Fill")

//Bar Color
barcolor(use_barcolor ? bar_color : na)

//Plot Buy and Sell Labels
plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor = color.white, style=shape.labelup, size = size.normal, location=location.belowbar, color = color.new(color.green, 0))
plotshape(shortCondition, title = "Sell Signal", text ="SELL", textcolor = color.white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = color.new(color.red, 0))

//Alerts
alertcondition(longCondition, title="Buy Alert", message = "BUY")
alertcondition(shortCondition, title="Sell Alert", message = "SELL")


// extend
fastEmaPeriod = input(50, "fastEmaPeriod")
slowEmaPeriod = input(200, "slowEmaPeriod")
loss = input(30, "loss")
trailPoints = input(30, "trailPoints")
trailOffset = input(30, "trailOffset")
amount = input(1, "amount")

emaFast = ta.ema(close, fastEmaPeriod)
emaSlow = ta.ema(close, slowEmaPeriod)

buyCondition = longCondition and emaFast > emaSlow and close > open and close > emaFast
sellCondition = shortCondition and emaFast < emaSlow and close < open and close < emaFast

if buyCondition and strategy.position_size == 0
    strategy.entry("long", strategy.long, amount)
    strategy.exit("exit_long", "long", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset)
if sellCondition and strategy.position_size == 0
    strategy.entry("short", strategy.short, amount)
    strategy.exit("exit_short", "short", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset)

Le test de répétition

La période de test de réévaluation est choisie entre janvier 2022 et octobre 2022, le cycle de la ligne K est de 15 minutes et est réévalué à l'aide du modèle de prix de clôture. Le marché choisit le contrat perpétuel ETH_USDT de Binance. Les paramètres sont définis selon la ligne rapide 50 cycles, la ligne lente 200 cycles, les autres paramètres ne changent pas par défaut.

img

img

Les paramètres de l'interrupteur ont une certaine influence sur le résultat du test. Je pense que cette partie doit être optimisée pour le design.

Nous avons changé un contrat à durée déterminée en BTC_USDT pour essayer ceci:

img

Le résultat est aussi explosif en BTC:

img

img

L'adresse de la stratégie:https://www.fmz.com/strategy/385745

Il semble que cette méthode de négociation pour la prise de tendance est encore plus fiable et peut continuer à optimiser la conception sur cette base. Dans cet article, nous avons non seulement appris l'idée d'une stratégie à double ligne droite, mais aussi comment utiliser la stratégie du dieu suprême du pétrole pour l'élaboration et l'apprentissage. OK, le code de la stratégie ci-dessus n'est qu'un petit extrait que j'ai jeté une référence, les résultats des retests ne représentent pas non plus l'effet réel concret, pour la conception du code de la stratégie, uniquement pour référence. Merci pour votre soutien, à bientôt!


Relationnée

Plus de

le fantadongEst-ce que cette tactique peut aussi être un paramètre?

hyc1743Mon grand-père, pourquoi les icônes affichent le signal mais les disques ne sont pas ouverts? Je suis désolée pour le manque de respect que tu as pour moi. Je ne sais pas si je peux vous aider. Je suis désolée de ne pas avoir pu le faire.

Des nuages légersMon grand-père, il est recommandé de trouver deux ou trois stratégies représentatives dans les canalisations pétrolières, de plus grande difficulté à réécrire, avec plus de fonctions, de paramètres et de méthodes d'exploitation. J'ai appris à modifier des stratégies de combinaisons qui ne sont pas très complexes, j'ai changé une douzaine de stratégies de combinaisons, dont une ou deux sont vraiment de 21 à 22 ans. Les résultats de la récupération de données sont très bons, et j'ai testé sur disque réel, mais j'ai rencontré des opérations de paramètres de fonctions complexes telles que: Merci beaucoup.

Il est mort.Le temps est choisi 21 Avril - Octobre, le BTC est moins bon.

YingshuangSi vous ne comprenez pas ce que cela signifie, pouvez-vous m'expliquer? Par exemple, 30 par défaut signifie que le BTC a chuté de 30 pièces?

Des nuages légersMon grand-père, s'il vous plaît, est-ce que PINE peut écrire des méthodes un peu plus complexes pour arrêter les piqûres? Par exemple, une méthode de piqûre par niveaux? Merci. Si le PINE peut être combiné avec le JS, il est plus pratique d'écrire des indicateurs avec le PINE et la partie transactionnelle avec le JS.

YingshuangLe disque réel pourrait faire une erreur en 2022

Je suis zéro.La stratégie de sauvegarde suggère cette astuce. REST: sql: pas de lignes dans le résultat

Je suis zéro.Le rêve est audacieux

Le petit rêveLa stratégie de tendance en elle-même est la suivante: si le marché est en tendance, alors la stratégie de bouleversement.

Le petit rêveJe suis désolée.

hyc1743Merci à Dreama.

Le petit rêveBonjour, c'est parce que le signe BUY sur le graphique est juste un signal de l'indicateur dans l'article, avec une ligne droite derrière. Je ne sais pas. //Plot Étiquettes acheter et vendre plotshape ((longCondition, title = "Buy Signal", text ="BUY", textcolor = color.white, style=shape.labelup, size = size.normal, location=location.belowbar, color = color.new(color.green, 0)) Plotshape ((shortCondition, title = "Sell Signal", text ="SELL", textcolor = color.white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = color.new(color.red, 0)) Je ne sais pas. plotshape ((longCondition, title = "Buy Signal", text ="BUY Le graphique affiche que les conditions longCondition sont remplies. Les conditions suivantes s'appliquent à cette zone: Je ne sais pas. condition et stratégie. position_size == 0 La stratégie.entry (en anglais: strategy.long, quantité) La stratégie.exit (("exit_long", "long", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset) est une stratégie qui consiste à démarrer une ligne de démarrage à partir d'une ligne de démarrage. condition et stratégie. position_size == 0 La stratégie.entry (en anglais: strategy.short, amount) est une stratégie utilisée par les entreprises pour obtenir des informations sur leurs clients. La stratégie.exit (("exit_short", "short", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset) est une stratégie qui consiste à démarrer une stratégie en utilisant les points de départ. Je ne sais pas.

Des nuages légersC'est pas étonnant. Je comprends. Merci.

Le petit rêveL'objet line n'est pas encore pris en charge sur FMZ, donc il est possible que certaines lignes ne puissent pas être modifiées. Certaines stratégies utilisent cet objet pour participer aux calculs.

Le petit rêveIl semble que le temps de retouche soit trop long et que les données soient trop nombreuses.

Le petit rêveLe tutoriel de la langue Pine contient des chapitres et des descriptions, que vous pouvez consulter ici: https://www.fmz.com/bbs-topic/9390#%E5%B8%A6%E8%B7%F%E8%B8%AA%E6%AD%A2%E6%8D%9F%E6%AD%A2%E7%9B%88%E7%9A%84%E8%B6%85%E7%BA%A7%E8%B6%8B%E5%8A%BF%E7%AD%96%E7%95%A5

Des nuages légersEh bien, je me suis fixé un an ou 10 mois, et je peux essentiellement le faire, et après un an, j'aurai ce conseil ou une tonne d'autres choses.

Le petit rêveIl n'y a pas de limite, l'erreur devrait être trop grande dans le temps de réévaluation.

Des nuages légersBon, merci, et s'il vous plaît, y a-t-il une limite de temps entre le PINE et le test? RuntimeError: abort ((undefined) at Error at jsStackTrace (eval at self.onmessage (https://www.fmz.com/scripts/worker_detours.393054f7.js:1:147), :1:2096171) at stackTrace (eval at self.onmessage (https://www.fmz.com/scripts/worker_detours.393054f7.js:1:147), :1:2096345) at abort (eval at self.onmessage (https://www.fmz.com/scripts/worker_detours.393054f7.js:147), :192x:1408) at stackTrace (eval at self.onmessage (https://www.fmz.com/scripts/worker_detours.393054f7.js:147), :12096171) at stackTrace (eval at self.onmessage (https://www.fmz.fm Mais si vous ne modifiez pas la période de temps, vous réessayez normalement........

Le petit rêvePine devrait être en mesure de concevoir des barrières plus sophistiquées, qui n'ont pas encore été intégrées au code JS.

Le petit rêveVous pouvez envoyer une capture d'écran pour voir les erreurs signalées.

Le petit rêveOh, désolé, l'adresse de la politique a été mal placée, elle a été modifiée.