"Чудесная стратегия двойной EMA" от YouTube-богов

Автор:Маленькие мечты, Создано: 2022-10-09 15:56:22, Обновлено: 2023-09-15 20:50:38

img

"Чудесная стратегия двойной EMA" от YouTube-богов

В этом выпуске мы рассмотрим "чудесную двухуровневую стратегию EMA", полученную на YouTube, которая называется "убийца рынок акций и криптовалют". Я посмотрел видео и узнал, что эта стратегия - это стратегия на языке пина для торгового просмотра с использованием двух индикаторов торгового просмотра.

Показатели стратегии

Индекс EMA 1.

Для упрощения дизайна мы не используем экспоненциальный движущийся средний, как в видео; вместо этого мы используем встроенный ta.ema в торговом просмотре (в действительности все то же самое).

Второй показатель - "VuManChu Swing Free".

Это индикатор в Trading View, и нам нужно скачать исходный код в Trading View.

img

Код VuManChu Swing Free:

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

Стратегическая логика

Индикаторы EMA: Стратегия использует две средние линии EMA, одну быструю (маленький параметр цикла) и одну медленную (большой параметр цикла). Двух средних линий EMA в основном помогают нам определить направление тренда рынка.

  • Многоголовые строки Позже мы увидим, что скоростная линия находится над медленной.

  • Пустые строки Позже мы увидим, что скоростная линия находится ниже медленной.

VuManChu Swing Free: VuManChu Swing Free используется для выпуска сигналов, которые в сочетании с другими условиями определяют, следует ли выполнить заказ. Из исходного кода VuManChu Swing Free можно увидеть: переменная longCondition представляет сигнал покупки, переменная shortCondition представляет сигнал продажи.

Теперь давайте поговорим о стратегических условиях для запуска торговых сигналов:

1, Правила для многоголового входа: Закрытие линии K должно быть выше быстрой линии EMA, две средние линии EMA должны иметь многоголовые ряды (быстрая линия выше медленной линии), а показатель VuManChu Swing Free должен иметь сигнал покупки (долгое условие истинно). Три условия выполняются: эта линия K является ключевой K-линией для большого количества входов, а закрытие линии K - это позиция входа.

2, правила для входа в пустое место (в противоположность множественному): Закрытие линии K должно быть ниже быстрой линии EMA, две протяженные линии EMA должны иметь пустое расположение (быстрая линия ниже медленной линии), а показатель VuManChu Swing Free должен иметь сигнал продажи (короткое условие истинно).

Логика торговли не очень проста, поскольку в видео нет конкретных указаний на стоп-стоп-потери, мы здесь свободно играем, используя метод стоп-стоп-потери, который сравнивается со средним, с использованием фиксированного количества стоп-стопов, отслеживания стоп-стопов.

Кодный дизайн

Код VuManChu Swing Free, который мы вставляем непосредственно в наш стратегический код.

img

Мы начали с того, что мы написали код на языке Pine, чтобы реализовать функцию транзакции:

// 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, переменная longCondition истинна ((ВуManChu Swing Free индикатор дает больше сигналов)). 2,emaFast > emaSlow (эма с множественными заголовками). 3, close > open (который показывает, что текущий BAR - это солнечная линия) и close > emaFast (который показывает, что цена закрытия находится выше EMA).

Если вы хотите больше, вы должны выполнять три условия.

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

Затем в случае, если сигнал "if" вызван, используйте функцию "strategy.entry" для входа в позицию, при этом устанавливая функцию "strategy.exit" для остановки или отслеживания остановки.

Полный код

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

Повторный тест

Период повторного тестирования выбран с января 2022 года по октябрь 2022 года, цикл линии K составляет 15 минут, используя модель закрытия; рынок выбирает бессрочный контракт ETH_USDT от Binance; параметры настроены в соответствии с видео, в котором говорится о быстрой линии 50 циклов, медленной линии 200 циклов, другие параметры не меняются по умолчанию. Стоп-потери, отслеживание количества стоп-центров. Я субъективно настроен на 30 пунктов.

img

img

Результаты рецензирования Мама Махауру Тигр, многократное рецензирование показало, что эти параметры влияют на результаты рецензирования. Считается, что в этом аспекте также необходимо оптимизировать дизайн.

Мы можем поменять бессрочный контракт на BTC_USDT и попробовать:

img

В результате в BTC-рецензировании также произошел взрыв:

img

img

Политический адрес:https://www.fmz.com/strategy/385745

По-видимому, этот метод торговли по-прежнему является более надежным для отслеживания тенденций, и можно продолжать оптимизировать дизайн на основе этой идеи. В этой статье мы не только узнали об идее двулинейной стратегии, но и узнали о том, как использовать стратегию на нефтяных трубах (youtube) для обработки и изучения.


Связанные

Больше

ФантадонгМожет быть, эта стратегия также является параметром х?

Hyc1743Дун Да, почему на значках есть сигнал, а на диске нет? /upload/asset/23cc031609caa7a896da3.jpg /upload/asset/23cc031609caa7a896da3.jpg /upload/asset/23cc031609caa7a896da3.jpg /upload/asset/23cc031609caa7a896da3.jpg /upload/asset/23cc031609caa7a896da3.jpg /upload/asset/23cae1c5d5b26ec763ea6.jpg /upload/asset/23d49ff4aec3475793e5e.jpg /upload/asset/23d49ff4aec3475793e5e.jpg /upload/asset/23d49ff4aec3475793e5e.jpg /upload/asset/23d49ff4aec3475793e5e.jpg /upload/asset/23d49ff4aec3475793e5e.jpg /upload/

Легкие облака.Мун-да, рекомендует найти из нефтепровода два или три репрезентативных, переписать более сложные, функции, параметры, методы вычислений стратегии, чтобы сделать несколько текстовых версий учебников, например, с аналогичным наклейкой наклейки. Я теперь с этой двулинейной стратегии, я научился изменить некоторые не очень сложные комбинации стратегии, изменил несколько десятков комбинаций стратегии, один или два из которых действительно 21 22 года результаты обратной связи данных очень хорошие, и уже прошел тестирование на дискете, но столкнулся с сложными параметрами функций операций, такие как подсказки: line: 62 Could not find function or function reference 'line.delete', а в FMZ PINE Script документации не найти line.delete соответствующие объяснения, описание метода, кружок, так что надеюсь, что малыш может придумать немного сложнее стратегии изменить написать, конечно, комментарии и больше лучше. Спасибо, Джимми.

ХайгоВремя выбора: 21 апреля - 10 октября.

ИньцзюньПосмотрите на документацию и не поймите, что это значит. Может быть, вы можете объяснить? Например, по умолчанию 30 означает, что BTC упал на 30 копеек?

Легкие облака.Мун Да, пожалуйста, может быть, PINE может написать более сложные методы борьбы с эпилепсией? Если PINE может быть совмещен с JS, то, например, написание показателей с помощью PINE, и написание транзакций в JS будет более удобным.

ИньцзюньВ 2022 году на реальных устройствах будут ошибки.

ФмнуроСохранение стратегии подсказывает эту игрушку. REST: sql: no rows in result set (РЕСТ: SQL: нет строк в наборе результатов)

ФмнуроМечта - это дерзость.

Маленькие мечтыХа-ха, сама по себе стратегия тренда - это "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да", "да" ".

Маленькие мечтыНепристойность.

Hyc1743Спасибо, Дим.

Маленькие мечтыПривет, это потому, что знак BUY, показанный на графике, является лишь сигналом для показателей в статье, а за ним - уравнительная линия. `` //Плота "Купить и продать" 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)) `` plotshape ((longCondition, title = "Buy Signal", text ="BUY При отображении рисунка выполняются только условия longCondition. В этом разделе приведены следующие условия: `` Если купитьCondition 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 sellСостояние и стратегия.позиция_размер == 0 Strategy.entry (("short", strategy.short, amount) - введение, введение, введение, введение) Strategy.exit (("exit_short", "short", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset) (недоступная ссылка) ``

Легкие облака.Неудивительно, понятно, спасибо.

Маленькие мечтыline Этот объект временно не поддерживается на FMZ, поэтому некоторые линии могут быть не изменены. Некоторые стратегии используют этот объект для участия в вычислениях.

Маленькие мечтыПо словам эксперта, это может быть связано с слишком длительным временем отслеживания и большим количеством данных.

Маленькие мечтыВ учебниках по языку Pine есть разделы с описаниями, которые вы можете посмотреть: 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

Легкие облака.Ну, я настроила на год или 10 месяцев, и в основном это сделано, и через год у меня будет этот совет или куча других.

Маленькие мечтыНе ограничивается, что эта ошибка должна быть слишком большой.

Легкие облака.Хорошо, спасибо, а также, пожалуйста, есть ли ограничения на промежуток времени для повторного просмотра PINE? 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), :192xx:1408) at stackTrace (eval at self.onmessage (https://www.fmz.com/scripts/worker_detours.393054f7.js:147), :196345) at abort (eval at self.onmessage (https://www.fmz.fmz.com Но если не изменить промежуток времени, то будет нормально......

Маленькие мечтыPine должен быть в состоянии спроектировать более сложные блокировки, которые встроены в код JS.

Маленькие мечтыЕсли вы хотите узнать, что произошло, отправьте скриншоты, чтобы увидеть конкретные сообщения об ошибках.

Маленькие мечтыО, извините, я ошибся в адресной политике, она была изменена.