Стратегия, разработанная LuxAlgo, сочетает в себе сигналы покупания и продажи обоих индикаторов TMO и AMA, чтобы поймать начало тренда в шокирующем сворачивании. Она делает дополнительный дисконт после удовлетворения нескольких условий, таких как сигнал покупания и продажи TMO, пик покупания и продажи AMA, постепенное увеличение величины объекта K-линии.
Индекс TMO отражает движение цены. Он относится к типу шоковых индикаторов, которые посылают торговые сигналы при отклонении цены. Индекс AMA является гладким индикатором скользящих средних значений.
Основная логика стратегии заключается в том, что TMO-индикатор отражает отклонение от ценовой тенденции и дает торговый сигнал, а AMA-индикатор показывает зоны, где цена может измениться, в сочетании с увеличением величины K-линии, чтобы подтвердить начало тенденции. Таким образом, их комбинация может повысить уровень успешной торговли. В частности, стратегия открывает позиции в следующих случаях:
Таким образом, он решает проблему ложных сигналов, вызванных одним показателем. Стоп-страх выбирает самую высокую или самую низкую цену в пределах последней N-корневой K-линии, что позволяет лучше контролировать риск.
Эта стратегия имеет следующие преимущества:
Сочетание показателей повышает точность сигнала. Указатели TMO и AMA проверяют друг друга, что позволяет уменьшить ложный сигнал и повысить точность сигнала.
Несколько сочетаний условий, чтобы захватить начало тренда. Установленные стратегией условия, такие как сигнал индикатора TMO, предельные значения индикатора AMA и увеличение величины объекта K-линии, могут эффективно захватить начало тренда, что является целью стратегии скальпинга.
К-линейный метод сдерживания риска. Используя последнюю самую высокую цену в K-линии как метод сдерживания, можно лучше контролировать риск каждой партии. При этом не обращается и риск отставания, вызванный пересчетом показателя.
Простая и эффективная логика торговли. Эта стратегия использует только два показателя, чтобы реализовать более полную стратегию скальпинга, не является сложной, логика проста и понятна. И, судя по результатам примеров, стратегия обеспечивает хорошую прибыль.
Основные риски этой стратегии:
Частый риск выхода на рынок. В качестве стратегии скальпинга, его срок хранения недолгий, если торговые расходы высоки, это может повлиять на прибыль.
K-линия стоп слишком радикальный риск. Использование наименьшей цены последней высокой цены в качестве стоп-метода может быть более радикальным, не в состоянии полностью отфильтровать рыночный шум, увеличивая вероятность того, что стоп-удар будет вызван.
Риск сложности оптимизации параметров. Стратегия включает в себя несколько параметров, и найти оптимальную комбинацию параметров может быть сложнее.
Эта стратегия также может быть оптимизирована в следующих направлениях:
Добавление дополнительных показателей фильтрации, таких как объем торгов, может отфильтровать некоторые ложные сигналы и еще больше улучшить качество сигналов.
Попытайтесь добавить фильтрационные условия к методу остановки, чтобы избежать слишком радикального остановки. Например, ждите подтверждения нескольких коренных K-линий, прежде чем запускать остановку, а затем остановитесь.
Проводить параметрическую оптимизацию, чтобы найти оптимальное сочетание параметров индикатора. Это может отфильтровать больше шума и повысить стратегическую выигрышность. Основная оптимизация параметров, таких как длина индикатора TMO, длина индикатора AMA и кратность.
Попробуйте провести обратный и фиксированный отсчет в разных разновидностях и периодах времени, чтобы найти торговые разновидности и периоды, которые наиболее соответствуют логике стратегии.
Эта стратегия использует торговые сигналы, объединенные с показателями TMO и AMA, для поиска времени начала тренда в шокирующей ситуации. Она обладает высокой точностью сигнала, ранним улавливанием тренда и управлением риском. После дальнейшей оптимизации параметров и правил эта стратегия может стать стратегией внутридневного скальпинга с очень сильной боевой ценностью.
/*backtest
start: 2023-11-23 00:00:00
end: 2023-11-30 00:00:00
period: 10m
basePeriod: 1m
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/
// © Kaspricci
//@version=5
strategy("TradeIQ - Crazy Scalping Trading Strategy [Kaspricci]", overlay=true, initial_capital = 1000, currency = currency.USD)
headlineTMO = "TMO Settings"
tmoLength = input.int(7, "TMO Length", minval = 1, group = headlineTMO)
tmoSource = input.source(close, "TMO Source", group = headlineTMO)
// calculate values
osc = ta.mom(ta.sma(ta.sma(tmoSource, tmoLength), tmoLength), tmoLength)
// determine color of historgram
oscColor = osc > osc[1] and osc > 0 ? #00c42b : osc < osc[1] and osc > 0 ? #4ee567 : osc < osc[1] and osc < 0 ? #ff441f : osc > osc[1] and osc < 0 ? #c03920 : na
// plot histogram
//plot(osc, "OSC", oscColor, linewidth = 3, style = plot.style_histogram)
// conditon to find highs and lows
up = ta.highest(tmoSource, tmoLength)
dn = ta.lowest(tmoSource, tmoLength)
// define conditions to be used for finding divergence
phosc = ta.crossunder(ta.change(osc), 0)
plosc = ta.crossover (ta.change(osc), 0)
// test for divergence
bear = osc > 0 and phosc and ta.valuewhen(phosc,osc,0) < ta.valuewhen(phosc,osc,1) and ta.valuewhen(phosc,up,0) > ta.valuewhen(phosc,up,1) ? 1 : 0
bull = osc < 0 and plosc and ta.valuewhen(plosc,osc,0) > ta.valuewhen(plosc,osc,1) and ta.valuewhen(plosc,dn,0) < ta.valuewhen(plosc,dn,1) ? 1 : 0
// -------------------------------------------------------------------------------------------------------------
headlineAMA = "AMA Settings"
amaSource = input.source(defval = close, title = "AMA Source", group = headlineAMA)
amaLength = input.int(defval = 50, title = "AMA Length", minval = 2, group = headlineAMA)
amaMulti = input.float(defval = 2.0, title = "Factor", minval = 1)
amaShowCd = input(defval = true , title = "As Smoothed Candles")
amaShowEx = input(defval = true, title = "Show Alternating Extremities")
amaAlpha = input.float(1.0, "Lag", minval=0, step=.1, tooltip='Control the lag of the moving average (higher = more lag)', group= 'AMA Kernel Parameters')
amaBeta = input.float(0.5, "Overshoot", minval=0, step=.1, tooltip='Control the overshoot amplitude of the moving average (higher = overshoots with an higher amplitude)', group='AMA Kernel Parameters')
// -------------------------------------------------------------------------------------------------------------
headlineSL = "Stop Loss Settings"
slLength = input.int(defval = 10, title = "SL Period", minval = 1, group = headlineSL, tooltip = "Number of bars for swing high / low")
// -------------------------------------------------------------------------------------------------------------
var b = array.new_float(0)
var float x = na
if barstate.isfirst
for i = 0 to amaLength - 1
x := i / (amaLength - 1)
w = math.sin(2 * 3.14159 * math.pow(x, amaAlpha)) * (1 - math.pow(x, amaBeta))
array.push(b, w)
// local function to filter the source
filter(series float x) =>
sum = 0.
for i = 0 to amaLength - 1
sum := sum + x[i] * array.get(b,i)
sum / array.sum(b)
// apply filter function on source series
srcFiltered = filter(amaSource)
deviation = ta.sma(math.abs(amaSource - srcFiltered), amaLength) * amaMulti
upper = srcFiltered + deviation
lower = srcFiltered - deviation
//----
crossHigh = ta.cross(high, upper)
crossLow = ta.cross(low, lower)
var os = 0
os := crossHigh ? 1 : crossLow ? 0 : os[1]
ext = os * upper + (1 - os) * lower
//----
os_css = ta.rsi(srcFiltered, amaLength) / 100
extColor = os == 1 ? #30FF85 : #ff1100
plot(srcFiltered, "MA", amaShowCd ? na : color.black, 2, editable = false)
plot(amaShowEx ? ext : na, "Extremities", ta.change(os) ? na : extColor, 2, editable=false)
// handle smoothed candles
var float h = na
var float l = na
var float c = na
var float body = na
if amaShowCd
h := filter(high)
l := filter(low)
c := filter(amaSource)
body := math.abs(math.avg(c[1], c[2]) - c)
ohlc_os = ta.rsi(c, amaLength) / 100
plotcandle(math.avg(c[1], c[2]), h, l, c, "Smooth Candles", #434651, bordercolor = na, editable = false, display = amaShowCd ? display.all : display.none)
// -------------------------------------------------------------------------------------------------------------
plotshape(bull ? ext : na, "Bullish Circle", shape.circle, location.absolute, color = #00c42b, size=size.tiny)
plotshape(bear ? ext : na, "Bearish Circle", shape.circle, location.absolute, color = #ff441f, size=size.tiny)
plotshape(bull ? ext : na, "Bullish Label", shape.labeldown, location.absolute, color = #00c42b, text="Buy", textcolor=color.white, size=size.tiny)
plotshape(bear ? ext : na, "Bearish Label", shape.labelup, location.absolute, color = #ff441f, text="Sell", textcolor=color.white, size=size.tiny)
// -------------------------------------------------------------------------------------------------------------
candleSizeIncreasing = body[2] < body[1] and body[1] < body[0]
longEntryCond = os == 1 and bull
shortEntryCond = os == 0 and bear
longEntry = strategy.opentrades == 0 and candleSizeIncreasing and not candleSizeIncreasing[1] and ta.barssince(longEntryCond) < ta.barssince(os == 0) and ta.barssince(longEntryCond) < ta.barssince(bear)
shortEntry = strategy.opentrades == 0 and candleSizeIncreasing and not candleSizeIncreasing[1] and ta.barssince(shortEntryCond) < ta.barssince(os == 1) and ta.barssince(shortEntryCond) < ta.barssince(bull)
longExit = strategy.opentrades > 0 and strategy.position_size > 0 and (bear or os == 0)
shortExit = strategy.opentrades > 0 and strategy.position_size < 0 and (bull or os == 1)
recentSwingHigh = ta.highest(high, slLength) // highest high of last candles
recentSwingLow = ta.lowest(low, slLength) // lowest low of recent candles
bgcolor(longEntry ? color.rgb(76, 175, 79, 90) : na)
bgcolor(shortEntry ? color.rgb(255, 82, 82, 90) : na)
slLong = (close - recentSwingLow) / syminfo.mintick // stop loss in ticks
slShort = (recentSwingHigh - close) / syminfo.mintick // stop loss in ticks
newOrderID = str.tostring(strategy.closedtrades + strategy.opentrades + 1)
curOrderID = str.tostring(strategy.closedtrades + strategy.opentrades)
alertMessageForEntry = "Trade {0} - New {1} Entry at price: {2} with stop loss at: {3}"
if (longEntry)
alertMessage = str.format(alertMessageForEntry, newOrderID, "Long", close, recentSwingLow)
strategy.entry(newOrderID, strategy.long, alert_message = alertMessage)
strategy.exit("Stop Loss Long", newOrderID, loss = slLong, alert_message = "Stop Loss for Trade " + newOrderID)
if(longExit)
strategy.close(curOrderID, alert_message = "Close Trade " + curOrderID)
if (shortEntry)
alertMessage = str.format(alertMessageForEntry, newOrderID, "Short", close, recentSwingLow)
strategy.entry(newOrderID, strategy.short, alert_message = alertMessage)
strategy.exit("Stop Loss Short", newOrderID, loss = slShort, alert_message = "Stop Loss for Trade " + newOrderID)
if(shortExit)
strategy.close(curOrderID, alert_message = "Close Trade " + curOrderID)