دوہری EMA کراس اوور حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2023-12-06 18:22:16
ٹیگز:

img

جائزہ

ڈبل ای ایم اے کراس اوور حکمت عملی ایک عام طور پر استعمال ہونے والی رجحان کی پیروی کرنے والی حکمت عملی ہے۔ اس میں مختلف ادوار کے ساتھ دو ای ایم اے لائنیں استعمال کی جاتی ہیں اور جب مختصر مدت کی ای ایم اے طویل مدت کی ای ایم اے کو عبور کرتی ہے تو خریدنے کے سگنل پیدا ہوتے ہیں اور جب رجحان کی تبدیلی ہوتی ہے تو سگنل فروخت کرتے ہیں۔

حکمت عملی منطق

اس حکمت عملی کا بنیادی منطق ای ایم اے لائنوں کے گولڈن کراس اور ڈیتھ کراس اصولوں پر مبنی ہے۔ ای ایم اے قیمت کے اعداد و شمار کو مؤثر طریقے سے ہموار کرسکتا ہے اور رجحان کی سمت کی نشاندہی کرسکتا ہے۔ مختصر مدت ای ایم اے قیمت کی تبدیلیوں کا تیزی سے جواب دیتا ہے جبکہ طویل مدت ای ایم اے شور کے لئے کم حساس ہے اور طویل مدتی رجحان کی عکاسی کرتا ہے۔ جب مختصر مدت ای ایم اے طویل مدت ای ایم اے کو عبور کرتا ہے تو ، اسے اس اشارے کے طور پر دیکھا جاتا ہے کہ اوپر کی رفتار مضبوط ہورہی ہے۔ جب اس کے برعکس ہوتا ہے تو ، یہ نیچے کی رفتار کو تیز کرنے کا اشارہ کرتا ہے۔ حکمت عملی اس استدلال کی بنیاد پر تجارتی سگنل تیار کرتی ہے۔

خاص طور پر ، یہ حکمت عملی دو ای ایم اے لائنوں کے ادوار کی ترتیب کے لئے لمبائی 1 اور لمبائی 2 پیرامیٹرز کا استعمال کرتی ہے۔ demaVal1 لمبائی 1 مدت ای ایم اے ہے اور demaVal2 لمبائی 2 مدت ای ایم اے ہے۔ وہ اس طرح شمار ہوتے ہیں:

demaVal1 = EMA(close, length1)
demaVal2 = EMA(close, length2)  

جہاں ای ایم اے (() وہ فنکشن ہے جو ای ایم اے کی اقدار کا حساب لگاتا ہے۔ جب demaVal1 demaVal2 پر عبور کرتا ہے تو ، خرید کا سگنل demaCrossover تیار ہوتا ہے۔ جب الٹا ہوتا ہے تو ، فروخت کا سگنل demaCrossunder تیار ہوتا ہے۔ حکمت عملی ان دونوں سگنلز کی بنیاد پر تجارتی آرڈر بھیجتی ہے۔

فوائد

اس حکمت عملی کے فوائد میں شامل ہیں:

  1. سادہ منطق اور لاگو کرنے میں آسان.
  2. وسیع ایپلی کیشنز کے ساتھ EMA کراس اوور کے پختہ نظریات.
  3. لچکدار پیرامیٹر ایڈجسٹمنٹ مختلف مارکیٹ کے ماحول کو اپنانے کے قابل.
  4. حکمت عملی کی کارکردگی کو بہتر بنانے کے لئے مزید اصلاح ممکن ہے.

خطرات اور بہتری

اس حکمت عملی سے کچھ خطرات بھی وابستہ ہیں:

  1. جب مارکیٹ میں رجحان نہیں ہوتا ہے تو اکثر غلط سگنل سامنے آسکتے ہیں۔
  2. ڈیفالٹ پیرامیٹرز تمام آلات کے لئے موزوں نہیں ہوسکتے ہیں اور تاریخی اصلاح کی ضرورت ہوتی ہے۔

مندرجہ بالا خطرات کی بنیاد پر، مندرجہ ذیل پہلوؤں کو بہتر بنایا جا سکتا ہے:

  1. EMA مدت کے پیرامیٹرز کو مختلف سائیکلوں کے ساتھ مارکیٹ کے حالات کے مطابق کرنے کے لئے ایڈجسٹ کریں.
  2. غلط سگنل سے بچنے کے لئے فلٹر کے حالات شامل کریں، مثال کے طور پر فٹنس سکور، حجم کے اشارے.
  3. حکمت عملی کی کارکردگی کو بہتر بنانے کے لئے رجحانات، حمایت / مزاحمت کی سطح جیسے دیگر تکنیکوں کو شامل کریں.

نتیجہ

اختتام کے طور پر ، ڈبل ای ایم اے کراس اوور حکمت عملی ایک سادہ لیکن عملی رجحان کی پیروی کرنے والا نظام ہے۔ ای ایم اے تجزیہ کے پختہ نظریات کو وراثت میں لے کر اور مناسب پیرامیٹر ٹیوننگ اور فلٹر کی حالت میں بہتری کے ساتھ ، اسے مختلف آلات میں رجحان کی تجارت پر لاگو کیا جاسکتا ہے جس میں درخواست کے اچھے امکانات ہیں۔


/*backtest
start: 2022-11-29 00:00:00
end: 2023-12-05 00:00:00
period: 1d
basePeriod: 1h
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/
// © zeguela
//@version=4
strategy(title="ZEGUELA DEMABOT", commission_value=0.063, commission_type=strategy.commission.percent, initial_capital=100, default_qty_value=90, default_qty_type=strategy.percent_of_equity, overlay=true, process_orders_on_close=true)

// Step 1. Script settings

// Input options
srcData = input(title="Source Data", type=input.source, defval=close)

// Length settings
len1 = input(title="Length DEMA #1", type=input.integer, defval=8, minval=1)
len2 = input(title="Length DEMA #2", type=input.integer, defval=24, minval=0)
len3 = input(title="Length DEMA #3", type=input.integer, defval=0, minval=0)

// Step 2. Calculate indicator values
// Function that calculates the DEMA
DEMA(series, length) =>
    if (length > 0)
        emaValue = ema(series, length)
        2 * emaValue - ema(emaValue, length)
    else
        na

// Calculate the DEMA values
demaVal1 = DEMA(srcData, len1)
demaVal2 = DEMA(srcData, len2)
demaVal3 = DEMA(srcData, len3)

// Step 3. Determine indicator signals
// See if there's a DEMA crossover
demaCrossover = if (len2 > 0) and (len3 > 0)
    crossover(demaVal1, demaVal2) and (demaVal3 > demaVal3[1])
else
    if (len2 > 0) and (len3 == 0)
        crossover(demaVal1, demaVal2)
    else
        if (len3 > 0) and (len2 == 0)
            crossover(demaVal1, demaVal3)
        else
            crossover(close, demaVal1)

// Check if there's a DEMA crossunder
demaCrossunder = if (len2 > 0) and (len3 > 0)
    crossunder(demaVal1, demaVal2) and (demaVal3 < demaVal3[1])
else
    if (len2 > 0) and (len3 == 0)
        crossunder(demaVal1, demaVal2)
    else
        if (len3 > 0) and (len2 == 0)
            crossunder(demaVal1, demaVal3)
        else
            crossunder(close, demaVal1)

// Step 4. Output indicator data
// Plot DEMAs on the chart
plot(series=demaVal1, color=color.green, linewidth=2, title="DEMA #1")
plot(series=demaVal2, color=color.red, linewidth=2, title="DEMA #2")
plot(series=demaVal3, color=color.fuchsia, linewidth=2, title="DEMA #3")

//TRAILING STOP CODE
a = input(title="Usar Trailing Stop?", type=input.bool, defval=false)

stopPerlong = input(9.0, title='Stop Loss Long %', type=input.float, group="Stop Loss & Take Profit Settings") / 100
stopPershort = input(6.0, title='Stop Loss Short %', type=input.float, group="Stop Loss & Take Profit Settings") / 100
take1Perlong = input(25.0, title='Take Profit Long % 1', type=input.float, group="Stop Loss & Take Profit Settings") / 100
take1Pershort = input(6.0, title='Take Profit Short % 1', type=input.float, group="Stop Loss & Take Profit Settings") / 100

// Determine stop loss price
longStopPrice  = strategy.position_avg_price * (1 - stopPerlong)
shortStopPrice = strategy.position_avg_price * (1 + stopPershort)
longTake1Price = strategy.position_avg_price * (1 + take1Perlong)
shortTake1Price = strategy.position_avg_price * (1 - take1Pershort)

// Determine trail stop loss prices

longStopPriceTrail = 0.0

longStopPriceTrail := if (strategy.position_size > 0)
    stopValue = close * (1 - stopPerlong)
    max(stopValue, longStopPriceTrail[1])
else
    0

// Determine trailing short price
shortStopPriceTrail = 0.0

shortStopPriceTrail := if (strategy.position_size < 0)
    stopValue = close * (1 + stopPershort)
    min(stopValue, shortStopPriceTrail[1])
else
    999999

//calcular qual stop usar
longStop = a ? longStopPriceTrail : longStopPrice
shortStop = a ? shortStopPriceTrail : shortStopPrice


//calcula o valor do stop e TP pra lançar no alerta
longStopEntrada = close  * (1 - stopPerlong)
shortStopEntrada = close  * (1 + stopPershort) 
longTPEntrada = close * (1 + take1Perlong)
shortTPEntrada = close * (1 - take1Pershort)

//armazena o preço de entrada e valor do SL e TP

price_entryL = 0.0
price_entryL := na(price_entryL) ? na : price_entryL[1]
price_entryS = 0.0
price_entryS := na(price_entryS) ? na : price_entryS[1]
stopL = 0.0
stopL := na(stopL) ? na : stopL[1]
stopS = 0.0
stopS := na(stopS) ? na : stopS[1]
takeL = 0.0
takeL := na(takeL) ? na : takeL[1]
takeS = 0.0
takeS := na(takeS) ? na : takeS[1]

if (demaCrossover)
    price_entryL := close
    stopL := close  * (1 - stopPerlong)
    takeL := close * (1 + take1Perlong)
    
if (demaCrossunder)
    price_entryS := close
    stopS := close  * (1 + stopPershort)
    takeS := close * (1 - take1Pershort)

resultadoL = ((close - price_entryL)/price_entryL) * 100
resultadoLexit = "(SL = 1% e TP = 0,5%)"
resultadoS = ((price_entryS - close)/price_entryS) * 100
resultadoSexit = "(SL = 1% e TP = 0,5)%"
// Make input options that configure backtest date range
_startDate = input(title="Start Date", type=input.integer,
     defval=1, minval=1, maxval=31, group="BackTest Period")
_startMonth = input(title="Start Month", type=input.integer,
     defval=1, minval=1, maxval=12, group="BackTest Period")
_startYear = input(title="Start Year", type=input.integer,
     defval=2018, minval=1800, maxval=2100, group="BackTest Period")

_endDate = input(title="End Date", type=input.integer,
     defval=31, minval=1, maxval=31, group="BackTest Period")
_endMonth = input(title="End Month", type=input.integer,
     defval=12, minval=1, maxval=12, group="BackTest Period")
_endYear = input(title="End Year", type=input.integer,
     defval=2031, minval=1800, maxval=2100, group="BackTest Period")

// Look if the close time of the current bar
// falls inside the date range
_inDateRange = (time >= timestamp(syminfo.timezone, _startYear,
         _startMonth, _startDate, 0, 0)) and
     (time < timestamp(syminfo.timezone, _endYear, _endMonth, _endDate, 0, 0))
  
//Alert configuration     

_alertMessageOpenLong="OpenLong"
_alertMessageCloseLong="CloseLong"
_alertmessageExitLong="ExitLong - TP/SL"

_alertMessageOpenShort="OpenShort"
_alertMessageCloseShort="CloseShort"
_alertMessageExitShort="ExitShort - TP/SL"

if (_inDateRange)
    //ENTER SOME SETUP TRADES FOR TSL EXAMPLE
    if (demaCrossover)
        strategy.entry("LONG", strategy.long, comment = _alertMessageOpenLong)
    if (demaCrossunder)
        strategy.entry("SHORT", strategy.short, comment = _alertMessageOpenShort)
    //EXIT TRADE @ TSL
    if strategy.position_size > 0
        strategy.exit("TP/SL", "LONG", stop=longStop, limit=longTake1Price, comment=_alertmessageExitLong, alert_message=_alertmessageExitLong)
    if strategy.position_size < 0
        strategy.exit("TP/SL", "SHORT", stop=shortStop, limit=shortTake1Price, comment =_alertMessageExitShort, alert_message=_alertMessageExitShort)


//Look & Feel - Plot stop loss and take profit areas
p1=plot(strategy.position_avg_price, color=color.blue, style=plot.style_linebr, linewidth=1, title="Preço de entrada")
p2=plot(series=strategy.position_size > 0 ? longStop : na, color=color.red, style=plot.style_linebr, linewidth=1, title="Long Stop")
p3=plot(series=strategy.position_size > 0 ? longTake1Price : na, color=color.green, style=plot.style_linebr, linewidth=1, title="Long TP")
p4=plot(series=strategy.position_size < 0 ? shortStop : na, color=color.red, style=plot.style_linebr, linewidth=1, title="Short Stop")
p5=plot(series=strategy.position_size < 0 ? shortTake1Price : na, color=color.green, style=plot.style_linebr, linewidth=1, title="Short TP")
fill(p1, p2, color=color.red)
fill(p1, p3, color=color.green)
fill(p1, p4, color=color.red)
fill(p1, p5, color=color.green)

// Insert label with value
stopLossOnLong = "Stop Loss = " + tostring(longStop)
stopLossOnShort = "Stop Loss = " + tostring(shortStop)
takeprofitOnLong = "Take Profit = " + tostring(longTake1Price)
takeprofitOnShort = "Take Profit = " + tostring(shortTake1Price)
precoentrada = "Entrada = " + tostring(strategy.position_avg_price)

var label FinalLabelpriceL = na
var label FinalLabelpriceS = na
var label slFinalLabelL = na
var label slFinalLabelS = na
var label slFinalLabelTPL = na
var label slFinalLabelTPS = na


//Draw entry and stop loss lines and labels

if strategy.position_size > 0   
    
    //write the price above the end of the stoploss line
    slFinalLabelL := label.new(bar_index, longStop, stopLossOnLong, style=label.style_none, size=size.normal, textcolor=color.red)
    slFinalLabelTPL := label.new(bar_index, longTake1Price, takeprofitOnLong, style=label.style_none, size=size.normal, textcolor=color.green)
    FinalLabelpriceL := label.new(bar_index, strategy.position_avg_price, precoentrada, style=label.style_none, size=size.normal, textcolor=color.blue)
    
    // Delete previous label when there is a consecutive new high, as there's no line plot in that case.
    if strategy.position_size > 0[1]
        label.delete(slFinalLabelL[1])
        label.delete(slFinalLabelTPL[1])
        label.delete(FinalLabelpriceL[1])

if strategy.position_size < 0   
    
    //write the price above the end of the stoploss line
    slFinalLabelS := label.new(bar_index, shortStop, stopLossOnShort, style=label.style_none, size=size.normal, textcolor=color.red)
    slFinalLabelTPS := label.new(bar_index, shortTake1Price, takeprofitOnShort, style=label.style_none, size=size.normal, textcolor=color.green)
    FinalLabelpriceS := label.new(bar_index, strategy.position_avg_price, precoentrada, style=label.style_none, size=size.normal, textcolor=color.blue)
    
    // Delete previous label when there is a consecutive new high, as there's no line plot in that case.
    if strategy.position_size < 0[1]
        label.delete(slFinalLabelS[1])
        label.delete(slFinalLabelTPS[1]) 
        label.delete(FinalLabelpriceS[1])

    
// Exit open market position when date range ends
if (not _inDateRange)
    strategy.close_all()

مزید