
この戦略は,DEMAとEMAの短期クロスとATRの波動率の組み合わせという戦略である.この戦略は,DEMAとEMAのクロス信号を計算し,ATRの波動率の指標と組み合わせることで,効率的なショートラインの取引戦略を実現する.DEMAの下を通過し,ATRの波動率が上昇すると空白;DEMAが再びEMAを越えたときに,平仓.
DEMA指標の計算 DEMAは,二重EMAの移動平均であり,一定の周期内の二重EMAを計算することによって,短期市場のノイズを効果的にフィルターし,信号の正確性を向上させることができる.
EMA指標の計算. EMAは指数移動平均であり,価格の変化により迅速に反応することができる.
ATRの波動率を計算する.ATRは,市場の波動性とリスクレベルを反映する実際の波動幅の指標である.ATRが上昇すると,市場の波動が増加し,ショートラインの調整が容易になる.
DEMAがEMAを下回り,ATRの変動率が設定されたパラメータより大きい場合,株価が下がり始め,市場が risk off になり,空白となる.
DEMAが再びEMAを履くと,価格がサポートを形成し,上昇に反発し始め,平仓する.
双EMAとEMAを組み合わせると,信号の正確性を効率的に向上させることができる.
ATR波動率指標は低リスクのウィップソー信号を除外する.
短期操作で,短線追跡に適し,長期のセーフジングを回避できる.
取引の論理はシンプルでわかりやすく,理解しやすく,実行できます.
ATRパラメータの設定を間違えた場合,取引機会が逃される可能性があります.
複数の信号に注意を向ける必要があり,操作が困難である.
ffected by short-term market volatility.
解決方法:パラメータ最適化テスト,パラメータの調整;取引論理の簡素化,一方的な信号のみに焦点を当てること;適切な止損範囲の緩和.
DEMAとEMAのパラメータを最適化し,最適なパラメータ組み合わせを探します.
ATRの周期パラメータを最適化して,市場波動性を測定する最適な指標を決定する.
BOLLチャネルなどの他の補助指標を追加し,信号の正確性を向上させる.
ストップ・ローズとストップ・ストップのルールを追加し,より安定した収益を固定する.
この戦略は,DEMA,EMAクロス,ATR変動率指標を用いて,シンプルで効率的な短期取引戦略を構成する.戦略取引の論理は明確で,操作が簡単で,高周波ショートライン取引に適応できる.次のステップは,パラメータ最適化とルール最適化により,より安定した余剰収益を期待できる.
/*backtest
start: 2023-12-08 00:00:00
end: 2024-01-07 00:00:00
period: 1h
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/
// © Qorbanjf
//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Qorbanjf
//@version=4
strategy("Qorban: DEMA/EMA & VOL Short ONLY", shorttitle="DEMA/EMA & VOL SHORT", overlay=true)
// DEMA
length = input(10, minval=1, title="DEMA LENGTH")
src = input(close, title="Source")
e1 = ema(src, length)
e2 = ema(e1, length)
dema1 = 2 * e1 - e2
plot(dema1, "DEMA", color=color.yellow)
//EMA
len = input(25, minval=1, title="EMA Length")
srb = input(close, title="Source")
offset = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
ema1 = ema(srb, len)
plot(ema1, title="EMA", color=color.blue, offset=offset)
// get ATR VALUE
atr = atr(14)
//ATRP (Average True Price in precentage)
// Inputs
atrTimeFrame = input("D", title="ATR Timeframe", type=input.resolution)
atrLookback = input(defval=14,title="ATR Lookback Period",type=input.integer)
useMA = input(title = "Show Moving Average?", type = input.bool, defval = true)
maType = input(defval="EMA", options=["EMA", "SMA"], title = "Moving Average Type")
maLength = input(defval = 20, title = "Moving Average Period", minval = 1)
slType = input(title="Stop Loss ATR / %", type=input.float, defval=5.0, step=0.1)
slMulti = input(title="SL Multiplier", type=input.float, defval=1.0, step=0.1)
minimumProfitPercent = input(title="Minimum profit %", type=input.float, defval=20.00)
// ATR Logic
// atrValue = atr(atrLookback)
// atrp = (atrValue/close)*100
// plot(atrp, color=color.white, linewidth=2, transp = 30)
atrValue = security(syminfo.tickerid, atrTimeFrame, atr(atrLookback))
atrp = (atrValue/close)*100
// Moving Average Logic
ma(maType, src, length) =>
maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = security(syminfo.tickerid, atrTimeFrame, ma(maType, atrp, maLength))
// Determine percentage of open profit
var entry = 0.0
distanceProfit = low - entry
distanceProfitPercent = distanceProfit / entry
//Determin if we have a long entry signal OR a sell position signal
profitSignal = minimumProfitPercent == 0.0 or distanceProfitPercent >= minimumProfitPercent
shortSignal = crossunder(dema1, ema1) and atrp > maFilter and strategy.position_size == 0 and not na(atr)
exitSignal = profitSignal and strategy.position_size !=0 and crossover(dema1, ema1)
// === INPUT BACKTEST RANGE ===
//FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
//FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
//FromYear = input(defval = 2017, title = "From Year", minval = 2000)
//ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
//ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
//ToYear = input(defval = 9999, title = "To Year", minval = 2017)
//Invert trade direction & flipping
//tradInvert = input(defval = false, title = "invert trade direction")
//MOM_MR = input(defval=1, title = "MOM = 1 / MR = -1", minval=-1, maxval=1)
//plots=input(false, title="Show plots?")
// Get stop loss (in pips AND percentage distance)
shortStop = highest(high, 4) - (atr * slMulti)
shortStopPercent = close - (close * slMulti)
// Save long stop & target prices (used for drawing data to the chart & deetermining profit)
var shortStopSaved = 0.0
var shortTargetSaved = 0.0
enterShort = false
if shortSignal
shortStopSaved := slType ? shortStop : shortStopPercent
enterShort:= true
entry := close
// long conditions
//enterLong = crossover(dema1, ema1) and atrp < maFilter
//exitSignal => crossunder(dema1, ema1)
//Enter trades when conditions are met
strategy.entry("short", strategy.short, when=enterShort, comment="SHORT")
//place exit orders (only executed after trades are active)
strategy.exit(id="Short exit",
from_entry="short",
limit=exitSignal ? close : na,
stop=shortStopSaved,
when=strategy.position_size > 0,
comment="end short")
//short strategy
//goShort() => crossunder(dema1, ema1) and atrp > maFilter
//KillShort() => crossover(dema1, ema1)
//strategy.entry("SHORT", strategy.short, when = goShort())
//strategy.close("COVER", when = KillShort())