EMA フィルター 戦略 と モジュール 論理

作者: リン・ハーンチャオチャン開催日:2023年12月13日 15:55:07
タグ:

img

概要

この戦略は,モジュール算術演算と指数移動平均を組み合わせて,ポジション方向を決定するための強力なランダム性フィルタを作成する.まず,価格の残りをセット数で割って計算し,残りは0である場合,取引シグナルが生成される.このシグナルがEMA線以下であれば,ショートに行く;以上であれば,ロングに行く.この戦略は,数学的演算のランダム性と技術指標の判断傾向を統合し,異なるサイクルの指標間のクロス検証を使用して,市場のノイズの一部を効果的にフィルタリングする.

戦略の論理

  1. 価格入力値 a を閉じるように設定し,変更できます. 分母 b を 4 に設定し,変更できます.
  2. 余剰モジュロを b で割った値で計算し,モジュロが 0 に等しいかを判定します.
  3. 中長期傾向のメトリックとして標準でEMA (MALen) の長さを70期に設定する.
  4. モジュールが0に等しいとき,取引信号の偶数が生成される. EMA関係と組み合わせると方向を決定する.価格が EMA を越えると,BUY 信号が生成され,価格が EMA を越えると,SELL 信号が生成される.
  5. トレーディングエントリは,シグナル方向に基づいて長または短開かれます.戦略は,取引数を制御するために逆開ポジションを制限することができます.
  6. ストップ損失条件は3つのオプションに基づいて設定されます.固定ストップ損失,ATRストップ損失,価格スウィングストップ損失.利益を得る条件はストップ損失の逆です.
  7. トレイリングストップは,デフォルトで無効で,より多くの利益をロックするために有効にすることができます.

利点分析

  1. モジュール算数のランダム性は価格変動の影響を避け,移動平均値のトレンド判断と組み合わせて,無効な信号を効果的にフィルタリングすることができます.
  2. EMAは,短期モジュール信号と組み合わせた中長期トレンドの指標として,多層検証を実現し,偽信号を回避します.
  3. 非常に柔軟なカスタマイズ可能なパラメータは,最適なパラメータ組み合わせを見つけるために異なる市場のために調整できます.
  4. リスクを制御するために複数のストップ・ロスの方法を統合します. 利益をロックするために利益条件も設定します.
  5. 方向をシームレスに切り替えるためのポジションの直接の逆開口をサポートします.取引数を減らすために無効化することもできます.

リスク分析

  1. パラメータの設定が正しくない場合,取引シグナルが過剰になり,取引頻度やスライプコストが増加する可能性があります.
  2. EMAが唯一のトレンド判断メトリックとして遅れ,価格逆転の瞬間が欠落する可能性があります.
  3. 固定ストップロスの方法は,あまりにも機械的であり,市場の変動に調整できない可能性があります.
  4. 直接の逆開口は,ポジション調整の頻度を増やし,コストとリスクを増加させる.

オプティマイゼーションの方向性

  1. EMAの代わりに異なる移動平均値をテストするか,EMAを他のMAsと組み合わせて,収益率を改善できるかどうかを調べる.
  2. モジュールフィルタをボリンジャーバンドやキャンドルスタイクパターンなどの他の戦略と組み合わせることで より安定したフィルターを作成してみてください
  3. ストップ距離を調整するために,市場の変動レベルに基づいて適応的なストップ損失方法を研究する.
  4. 直接リバース オープンの頻度を制限するために,取引数や利益/損失の限界を設定する.

結論

この戦略は,異なる市場環境に対応した柔軟なパラメータ調整を通じて,モジュールオペレーションのランダム性と移動平均のトレンド判断を効果的に組み合わせ,信頼性の高い取引シグナルを生み出します.また,リスクを制御するためのさまざまなストップメカニズムを統合し,利益をロックするために利益とトラッキングストップを取ります.全体的な論理は明確であり,理解し,修正するのが簡単です.さらなるテストと最適化に値する膨大な実用的な可能性があります.


/*backtest
start: 2023-11-12 00:00:00
end: 2023-12-12 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/
// © tweakerID

// To understand this strategy first we need to look into the Modulo (%) operator. The modulo returns the remainder numerator 
// of a division's quotient (the result). If we do 5 / 3, we get 1 and 2/3 as a result, where the remainder is 2 (two thirds, in this case). This can be
// used for many things, for example to determine when a number divides evenly into another number. If we divide 3/3, our result is 1,
// with no remainder numerator, hence our modulo result is 0. In this strategy, we compare a given number (divisor, user defined) with the
// the closing price of every candle (dividend, modifiable from the inputs panel) to determine if the result between their division is an even number. 
// If the answer is true, we have an entry signal. If this signal occurs below the EMA (length is defined by the user) we go short and
// viceversa for longs. This logic can be reversed. In this case, the modulo works as a random-like filter for a moving average strategy
// that usually struggles when the market is ranging.

//@version=4

//@version=4
strategy("Modulo Logic + EMA Strat", 
     overlay=true, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, 
     initial_capital=10000, 
     commission_value=0.04, 
     calc_on_every_tick=false, 
     slippage=0)

direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

/////////////////////// STRATEGY INPUTS ////////////////////////////////////////
title1=input(true, "-----------------Strategy Inputs-------------------")  

a=input(close, title="Dividend")
b=input(4, title="Divisor")
usemod=input(true, title="Use Modulo Logic")
MALen=input(70, title="EMA Length")

/////////////////////// BACKTESTER /////////////////////////////////////////////
title2=input(true, "-----------------General Inputs-------------------")  

// Backtester General Inputs
i_SL=input(true, title="Use Stop Loss and Take Profit")
i_SLType=input(defval="ATR Stop", title="Type Of Stop", options=["Strategy Stop", "Swing Lo/Hi", "ATR Stop"])
i_SPL=input(defval=10, title="Swing Point Lookback")
i_PercIncrement=input(defval=3, step=.1, title="Swing Point SL Perc Increment")*0.01
i_ATR = input(14, title="ATR Length")
i_ATRMult = input(4, step=.1, title="ATR Multiple")
i_TPRRR = input(1, step=.1, title="Take Profit Risk Reward Ratio")
TS=input(false, title="Trailing Stop")

// Bought and Sold Boolean Signal
bought = strategy.position_size > strategy.position_size[1] 
 or strategy.position_size < strategy.position_size[1]

// Price Action Stop and Take Profit
LL=(lowest(i_SPL))*(1-i_PercIncrement)
HH=(highest(i_SPL))*(1+i_PercIncrement)
LL_price = valuewhen(bought, LL, 0)
HH_price = valuewhen(bought, HH, 0)
entry_LL_price = strategy.position_size > 0 ? LL_price : na 
entry_HH_price = strategy.position_size < 0 ? HH_price : na 
tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR
stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR

// ATR Stop
ATR=atr(i_ATR)*i_ATRMult
ATRLong = ohlc4 - ATR
ATRShort = ohlc4 + ATR
ATRLongStop = valuewhen(bought, ATRLong, 0)
ATRShortStop = valuewhen(bought, ATRShort, 0)
LongSL_ATR_price = strategy.position_size > 0 ? ATRLongStop : na 
ShortSL_ATR_price = strategy.position_size < 0 ? ATRShortStop : na 
ATRtp=strategy.position_avg_price + (strategy.position_avg_price - LongSL_ATR_price)*i_TPRRR
ATRstp=strategy.position_avg_price - (ShortSL_ATR_price - strategy.position_avg_price)*i_TPRRR


// Strategy Stop

float LongStop = na
float ShortStop = na
float StratTP = na
float StratSTP = na

/////////////////////// STRATEGY LOGIC /////////////////////////////////////////

modulo=a%b
evennumber=modulo==0
MA=ema(close, MALen)
plot(MA)

BUY=usemod ? evennumber and close > MA : close > MA
SELL=usemod ? evennumber and close < MA : close < MA

//Trading Inputs
DPR=input(true, "Allow Direct Position Reverse")
reverse=input(false, "Reverse Trades")

// Entries
if reverse
    if not DPR
        strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0)
    else     
        strategy.entry("long", strategy.long, when=SELL)
        strategy.entry("short", strategy.short, when=BUY)
else
    if not DPR 
        strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0)
    else
        strategy.entry("long", strategy.long, when=BUY)
        strategy.entry("short", strategy.short, when=SELL)


SL= i_SLType == "Swing Lo/Hi" ? entry_LL_price : i_SLType == "ATR Stop" ? LongSL_ATR_price : LongStop
SSL= i_SLType == "Swing Lo/Hi" ? entry_HH_price : i_SLType == "ATR Stop" ? ShortSL_ATR_price : ShortStop
TP= i_SLType == "Swing Lo/Hi" ? tp : i_SLType == "ATR Stop" ? ATRtp : StratTP
STP= i_SLType == "Swing Lo/Hi" ? stp : i_SLType == "ATR Stop" ? ATRstp : StratSTP

//TrailingStop
dif=(valuewhen(strategy.position_size>0 and strategy.position_size[1]<=0, high,0))
 -strategy.position_avg_price
trailOffset     = strategy.position_avg_price - SL
var tstop = float(na)
if strategy.position_size > 0
    tstop := high- trailOffset - dif
    if tstop<tstop[1]
        tstop:=tstop[1]
else
    tstop := na
StrailOffset     = SSL - strategy.position_avg_price
var Ststop = float(na)
Sdif=strategy.position_avg_price-(valuewhen(strategy.position_size<0 
 and strategy.position_size[1]>=0, low,0))
if strategy.position_size < 0
    Ststop := low+ StrailOffset + Sdif
    if Ststop>Ststop[1]
        Ststop:=Ststop[1]
else
    Ststop := na

strategy.exit("TP & SL", "long", limit=TP, stop=TS? tstop : SL, when=i_SL)
strategy.exit("TP & SL", "short", limit=STP, stop=TS? Ststop : SSL, when=i_SL)

/////////////////////// PLOTS //////////////////////////////////////////////////

plot(i_SL and strategy.position_size > 0 and not TS ? SL : i_SL and strategy.position_size > 0 and TS ? tstop : na , title='SL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size < 0 and not TS ? SSL : i_SL and strategy.position_size < 0 and TS ? Ststop : na , title='SSL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green)
plot(i_SL and strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green)
// Draw price action setup arrows
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, 
 color=color.green, title="Bullish Setup", size=size.auto)
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, 
 color=color.red, title="Bearish Setup", size=size.auto)
 




もっと