ईएमए की वापसी रणनीति

लेखक:चाओझांग, दिनांकः 2023-12-21 11:48:54
टैगः

img

अवलोकन

ईएमए पुलबैक रणनीति ईएमए संकेतक पर आधारित एक मात्रात्मक ट्रेडिंग रणनीति है। यह विभिन्न अवधियों के साथ तीन ईएमए वक्रों का उपयोग करके ट्रेडिंग सिग्नल का निर्माण करती है और ट्रेडिंग को स्वचालित करने के लिए मूल्य पुलबैक के आधार पर स्टॉप लॉस और ले लाभ सेट करती है।

रणनीतिक सिद्धांत

रणनीति में तीन ईएमए वक्रों का उपयोग किया गया हैः

  • ईएमए1: अपेक्षाकृत छोटी अवधि के साथ मूल्य पॉलबैक समर्थन/प्रतिरोध स्तर का आकलन करने के लिए, 33 अवधि तक डिफ़ॉल्ट।
  • ईएमए2: कुछ उलट संकेतों को फ़िल्टर करने के लिए, ईएमए1 के 5 गुना की अवधि के साथ, 165 अवधि के लिए डिफ़ॉल्ट।
  • EMA3: समग्र प्रवृत्ति दिशा निर्धारित करने के लिए, EMA1 के 11 गुना की अवधि के साथ, 365 अवधि के लिए डिफ़ॉल्ट।

ट्रेडिंग सिग्नल निम्न तर्क के अनुसार उत्पन्न होते हैं:

लंबा संकेतः कीमत ईएमए1 से ऊपर पार करती है, ईएमए1 से नीचे खींचती है, उच्च निचले स्तरों का निर्माण करती है, जिसमें ईएमए2 तक नहीं पहुंचती है। जब कीमत ईएमए1 से ऊपर वापस पार करती है तो लंबा प्रवेश करें।

शॉर्ट सिग्नलः कीमत ईएमए1 से नीचे पार करती है, ईएमए1 से ऊपर खींचती है और निचले उच्च स्तरों का गठन करती है, जिसमें ईएमए2 तक नहीं पहुंचती है।

स्टॉप लॉस को लॉन्ग/शॉर्ट के लिए सबसे कम/उच्चतम पलकबैक मूल्य पर सेट किया जाता है। लाभ लेने को स्टॉप लॉस के 2 गुना पर सेट किया जाता है।

रणनीतिक लाभ

इस रणनीति के निम्नलिखित फायदे हैंः

  1. विश्वसनीय ईएमए संकेतक का उपयोग करके निर्मित ट्रेडिंग संकेत।
  2. मूल्य में गिरावट से प्रभावी ढंग से फंसने से बचा जाता है।
  3. स्टॉप लॉस को पिछले उच्च/निम्न नियंत्रणों पर प्रभावी ढंग से सेट करें।
  4. लाभ लेना जोखिम-लाभ अनुपात को संतुष्ट करता है।
  5. ईएमए मापदंडों को विभिन्न चक्रों के लिए समायोजित किया जा सकता है।

रणनीतिक जोखिम

इस रणनीति में कुछ जोखिम भी हैं:

  1. ईएमए का प्रभाव कम होता है, यह रुझान के उलट बिंदुओं को याद कर सकता है।
  2. ईएमए2 से अधिक पॉलबैक रेंज गलत संकेत उत्पन्न कर सकती है।
  3. रुझान वाले बाजारों में स्टॉप लॉस टूट सकता है।
  4. गलत पैरामीटर सेटिंग्स से ओवर-ट्रेडिंग या खोए हुए अवसर होते हैं।

ईएमए अवधि, पॉलबैक सीमा आदि को समायोजित करके जोखिम को कम किया जा सकता है। फिल्टर संकेतों में अन्य संकेतक भी जोड़े जा सकते हैं।

अनुकूलन दिशाएँ

इस रणनीति को निम्नलिखित पहलुओं में भी अनुकूलित किया जा सकता हैः

  1. विपरीत प्रवृत्ति व्यापार से बचने के लिए प्रवृत्ति संकेतक जोड़ें, उदाहरण के लिए एमएसीडी।
  2. झूठे ब्रेकआउट से बचने के लिए ट्रेडिंग वॉल्यूम सूचक जोड़ें, उदाहरण के लिए OBV।
  3. ईएमए अवधि को अनुकूलित करें या अनुकूलन ईएमए का उपयोग करें।
  4. गतिशील रूप से मापदंडों को अनुकूलित करें मशीन सीखने के मॉडल का उपयोग करके जैसे कि शब्द के बैग।
  5. अनुकूल स्टॉप लॉस और ले लाभ के लिए मॉडल भविष्यवाणी जोड़ें।

निष्कर्ष

ईएमए पुलबैक रणनीति तीन ईएमए का उपयोग करके एक ट्रेडिंग प्रणाली का निर्माण करती है और ट्रेडिंग को स्वचालित करने के लिए मूल्य पुलबैक के आधार पर स्टॉप लॉस और ले लाभ सेट करती है। यह प्रभावी रूप से ट्रेडिंग जोखिमों को नियंत्रित करता है और बाजार की स्थिति के आधार पर मापदंडों को समायोजित करके अनुकूलित किया जा सकता है। कुल मिलाकर रणनीति में ध्वनि तर्क है और इसे वास्तविक ट्रेडिंग में लागू किया जा सकता है। भविष्य में रुझान निर्धारण, मापदंड अनुकूलन और जोखिम नियंत्रण जैसे पहलुओं में सुधार किया जा सकता है।


/*backtest
start: 2023-11-20 00:00:00
end: 2023-12-20 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/
// created by Space Jellyfish
//@version=4

strategy("EMA pullback strategy", overlay = true, initial_capital=10000, commission_value = 0.075)

target_stop_ratio = input(title="Take Profit Stop Loss ratio", type=input.float, defval=2.06, minval=0.5, maxval=100)
riskLimit_low =  input(title="lowest risk per trade", type=input.float, defval=0.008, minval=0, maxval=100)
riskLimit_high =  input(title="highest risk per trade", type=input.float, defval=0.02, minval=0, maxval=100)
//give up the trade, if the risk is smaller than limit, adjust position size if risk is bigger than limit

ema_pullbackLevel_period = input(title="EMA1 for pullback level Period", type=input.integer, defval=33, minval=1, maxval=10000)
ema_pullbackLimiit_period = input(title="EMA2 for pullback limit Period", type=input.integer, defval=165, minval=1, maxval=10000)
ema_trend_period = input(title="EMA3 for trend Period", type=input.integer, defval=365, minval=1, maxval=10000)

startDate = input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer, defval=2018, minval=2008, maxval=2200)

inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0))

ema_pullbackLevel = ema(close, ema_pullbackLevel_period)
ema_pullbackLimit = ema(close, ema_pullbackLimiit_period)
ema_trendDirection = ema(close, ema_trend_period)

//ema pullback 
float pricePullAboveEMA_maxClose = na
float pricePullAboveEMA_maxHigh = na

float pricePullBelowEMA_minClose = na
float pricePullBelowMA_minLow = na

if(crossover(close, ema_pullbackLevel))
    pricePullAboveEMA_maxClose := close
    pricePullAboveEMA_maxHigh := high
else
    pricePullAboveEMA_maxClose := pricePullAboveEMA_maxClose[1]
    pricePullAboveEMA_maxHigh := pricePullAboveEMA_maxHigh[1]

if(close > pricePullAboveEMA_maxClose)
    pricePullAboveEMA_maxClose := close
if(high > pricePullAboveEMA_maxHigh)
    pricePullAboveEMA_maxHigh := high

if(crossunder(close, ema_pullbackLevel))
    pricePullBelowEMA_minClose := close
    pricePullBelowMA_minLow := low
else
    pricePullBelowEMA_minClose :=pricePullBelowEMA_minClose[1]
    pricePullBelowMA_minLow:=pricePullBelowMA_minLow[1]
    
if(close < pricePullBelowEMA_minClose)
    pricePullBelowEMA_minClose := close
if(low < pricePullBelowMA_minLow)
    pricePullBelowMA_minLow := low


long_strategy = crossover(close, ema_pullbackLevel) and pricePullBelowEMA_minClose < ema_pullbackLimit and ema_pullbackLevel>ema_trendDirection 
short_strategy = crossunder(close, ema_pullbackLevel) and pricePullAboveEMA_maxClose > ema_pullbackLimit and ema_pullbackLevel<ema_trendDirection


var open_long_or_short = 0// long = 10000, short = -10000, no open = 0

//check if position is closed
if(strategy.position_size == 0)
    open_long_or_short := 0
else
    open_long_or_short := open_long_or_short[1]

float risk_long = na
float risk_short = na
float stopLoss = na
float takeProfit = na
float entry_price = na

float entryContracts = 0



risk_long := risk_long[1]
risk_short := risk_short[1]
    
//open a position determine the position size
if (strategy.position_size == 0 and long_strategy and inDateRange)
    risk_long := (close - pricePullBelowMA_minLow) / close

    if(risk_long < riskLimit_high)
        entryContracts := strategy.equity / close
    else
        entryContracts := (strategy.equity * riskLimit_high / risk_long)/close
    
    if(risk_long > riskLimit_low)
        strategy.entry("long", strategy.long, qty = entryContracts, when = long_strategy)


    open_long_or_short := 10000
    
if (strategy.position_size == 0 and short_strategy and inDateRange)
    risk_short := (pricePullAboveEMA_maxHigh - close) / close
    if(risk_short < riskLimit_high)
        entryContracts := strategy.equity / close
    else
        entryContracts := (strategy.equity * riskLimit_high / risk_short)/close

    if(risk_short > riskLimit_low)
        strategy.entry("short", strategy.short, qty = entryContracts, when = short_strategy)

    
    open_long_or_short := -10000

//take profit / stop loss
if(open_long_or_short == 10000)

    stopLoss :=   strategy.position_avg_price*(1 - risk_long)
    takeProfit :=  strategy.position_avg_price*(1 + target_stop_ratio * risk_long)
    entry_price := strategy.position_avg_price
    strategy.exit("Long exit","long", limit = takeProfit , stop = stopLoss)
    
if(open_long_or_short == -10000)
    stopLoss :=  strategy.position_avg_price*(1 + risk_short)
    takeProfit :=  strategy.position_avg_price*(1 - target_stop_ratio * risk_short)
    entry_price := strategy.position_avg_price
    strategy.exit("Short exit","short", limit = takeProfit, stop = stopLoss)



plot(ema_pullbackLevel, color=color.aqua,  title="ema pullback level")
plot(ema_pullbackLimit, color=color.purple,  title="ema pullback limit")
plot(ema_trendDirection, color=color.white,  title="ema trend")

plot(entry_price, color = color.yellow, linewidth = 1, style = plot.style_linebr)
plot(stopLoss, color = color.red, linewidth = 1, style = plot.style_linebr)
plot(takeProfit, color = color.green, linewidth = 1, style = plot.style_linebr)





//

अधिक