دو طرفہ رجحان ٹریکنگ چلتی اوسط کراس اوور حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2023-11-23 15:26:25
ٹیگز:

img

جائزہ

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

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

  1. اثاثہ کی قیمت کے دو طرفہ ہموار چلنے والے اوسطوں کا حساب لگائیں ، بشمول کھلی قیمت کا چلتا ہوا اوسط اور بند قیمت کا چلتا ہوا اوسط۔
  2. قیمت کے رجحان کے اشارے کا حساب لگانے کے لئے correlation coefficient اور ATR اشارے کا استعمال کریں۔
  3. مجموعی رجحان کا فیصلہ حاصل کرنے کے لئے قیمت رجحان اشارے کو دو طرفہ چلتی اوسط کے ساتھ جوڑیں۔
  4. جب کھلی قیمت چلتی اوسط قریب قیمت چلتی اوسط سے اوپر گزرتی ہے تو طویل عرصے تک جانا؛ جب نیچے گزرتا ہے تو بند پوزیشن.
  5. صرف اس صورت میں لمبا سفر کریں جب رجحان اشارے میں بھی اوپر کا رجحان ظاہر ہو؛ صرف اس صورت میں مختصر سفر کریں جب رجحان اشارے میں نیچے کا رجحان ظاہر ہو۔

فوائد

  1. دو طرفہ حرکت پذیر اوسط زیادہ ہموار اور مسلسل رجحانات کو ٹریک کرتے ہیں.
  2. رجحان اشارے سے رجحان کی سمت کو بہتر طور پر طے کرنے اور غلط تجارت سے بچنے میں مدد ملتی ہے۔
  3. کراس اوورز واضح تجارتی سگنل فراہم کرتے ہیں۔
  4. زیادہ سے زیادہ مارکیٹ کے ماحول کے مطابق پیرامیٹر ٹوننگ کے ذریعے مرضی کے مطابق ہموار.
  5. اشارے کے درمیان متعدد کراس توثیق غلط سگنل سے بچنے میں مدد کرتی ہے۔

خطرات

  1. رجحان کے موڑ کے مقامات پر واپسی کا خطرہ۔ متحرک اوسط ادوار کو ایڈجسٹ کرکے کم کیا جاسکتا ہے۔
  2. خود حرکت پذیر اوسطوں میں تاخیر ہوتی ہے۔ رجحان اشارے سے توثیق کی ضرورت ہے۔
  3. غلط حرکت پذیر اوسط ادوار سے زیادہ تجارت یا اچھی اندراجات کی کمی واقع ہوسکتی ہے۔
  4. مختلف ٹائم فریموں اور مارکیٹوں کے مطابق ڈھالنے کے لئے پیرامیٹرز کی وسیع اصلاح کی ضرورت ہے۔

بہتری

  1. زیادہ قسم کے چلتے ہوئے اوسط کی جانچ کریں.
  2. دیگر قسم کے رجحان اشارے آزمائیں۔
  3. چلتی اوسط اور رجحان اشارے کے پیرامیٹرز کو بہتر بنائیں.
  4. دیگر اشارے جیسے اتار چڑھاؤ شامل کریں.
  5. سٹاپ نقصان کی حکمت عملی شامل کریں.

نتیجہ

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


/*backtest
start: 2022-11-22 00:00:00
end: 2023-11-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//Author Josef Tainsh PhD 6Sept2020


//USE STUDY FOR ALERTS WITH AUTO TRADING BOT
//study(title = "Open Close Crossover for BOT Alerts", shorttitle = "OCC for BOT Alerts",overlay = true)
//USE STRATEGY TO FIT THE MOVING AVERAGE AND THE TREND FITS BY MINIMISING LOSS (OR MAXIMISING PROFITS)
//NOT THAT STRATEGIES RARELY SHOW A PROFIT ALSO THE STRATEGIES USE THE CROSS OVER ON THE MOVING AVERAGE TO ENTER A POSITION
strategy(title = "OCC Trend Combo 1 day BTC Moonflag", overlay = true, initial_capital=1000, commission_type=strategy.commission.percent, commission_value=0.2, default_qty_type = strategy.percent_of_equity, default_qty_value=100, pyramiding=0, calc_on_order_fills=false)
//CalcOnTick = true
//calc_on_every_tick = false

// Function for coders who want to offer their users a repainting/no-repainting version of the HTF data.
// It has the advantage of using only one `security()` call for both.
f_security(_symbol, _res, _src, _repaint) => security(_symbol, _res, _src[_repaint ? 0 : barstate.isrealtime ? 1 : 0])[_repaint ? 0 : barstate.isrealtime ? 0 : 1]


/////////////////////////////////////////////////////////////////////////////
// === BASE FUNCTIONS ===
/////////////////////////////////////////////////////////////////////////////
//This function returns true if execution is at the start of a new bar (so the last bar is previous close where alerts are determined)
is_newBar(stratRes) =>
    t = time(stratRes)
    not na(t) and (na(t[1]) or t > t[1])
///////////////////////////////////////////////////////////////////////////////////////////////////
// Returns MA input selection variant, default to SMA if blank or typo.
variant(type, src, len, offSig, offALMA) =>
    v1 = sma(src, len)                                                  // Simple
    v2 = ema(src, len)                                                  // Exponential
    v3 = 2 * v2 - ema(v2, len)                                          // Double Exponential
    v4 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)               // Triple Exponential
    v5 = wma(src, len)                                                  // Weighted
    v6 = vwma(src, len)                                                 // Volume Weighted
    v7 = na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len    // Smoothed
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))   // Hull
    v9 = linreg(src, len, offSig)                                       // Least Squares
    v10 = alma(src, len, offALMA, offSig)                               // Arnaud Legoux
    type=="EMA"?v2 : type=="DEMA"?v3 : type=="TEMA"?v4 : type=="WMA"?v5 : type=="VWMA"?v6 : type=="SMMA"?v7 : type=="HullMA"?v8 : type=="LSMA"?v9 : type=="ALMA"?v10 : v1
/////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////
//SAMPLE SETTINGS FOR THE TREND INDICATOR FUNCTION
//1MIN   31, 0.2 (+-12%)
//timeResForTrend_1min = 1, [bLongs_1min, oscLongs_1min] = functionTrend(timeResForTrend_1min,31, 0.2)
//plot(bLongs1_1min,"Trend Indicator", color=oscLongs_1min == 1 ? color.blue :#e65100,linewidth=3,transp=0)
//OTHER  20, 0.2  5min(LONG -5%, SHORT -4%), 10min(LONG -17%, SHORT -6%), 60min(long +16%, SHORT )
//timeResForTrend_Not1min = XXXX, [bLongs_Not1Min, oscLongs_Not1Min] = functionTrend(timeResForTrend_Not1min,20, 0.2)
//plot(bLongs5_Not1Min,"Trend Indicator", color=oscLongs_Not1Min == 1 ? color.blue :#e65100,linewidth=3,transp=0)
/////////////////////////////////////////////
functionTrend(trendRes_Function,length_Function,sc_Function)=>
    b_Function =0.
    ls_Function = 0.
    src_Function = sc_Function*security(syminfo.tickerid, trendRes_Function, close)+(1-sc_Function)*nz(ls_Function[1],security(syminfo.tickerid, trendRes_Function, close))
    if (is_newBar(trendRes_Function)==false)
        src_Function := src_Function[1]
    er_Function = 1 - abs(change(src_Function,length_Function))/sum(abs(change(src_Function)),length_Function)
    n_Function = cum(1)-1
    a_Function = cum(abs(src_Function - nz(b_Function[1],src_Function)))/n_Function*(1+er_Function)
    b_Function := src_Function > nz(b_Function[1],src_Function) + a_Function ? src_Function : src_Function < nz(b_Function[1],src_Function) - a_Function ? src_Function : nz(b_Function[1],src_Function)
    alpha_Function = fixnan(correlation(src_Function,b_Function,length_Function) * (stdev(src_Function,length_Function)/stdev(b_Function,length_Function)))
    beta_Function = sma(src_Function,length_Function) - alpha_Function*sma(b_Function,length_Function)
    ls_Function := alpha_Function*b_Function+beta_Function
    osc_Function = 0
    osc_Function := b_Function > b_Function[1] ? 1 : b_Function < b_Function[1] ? 0 : osc_Function[1] 
    if (is_newBar(trendRes_Function)==false)
        er_Function := er_Function[1]
        n_Function := n_Function[1]
        a_Function := a_Function[1]
        b_Function := b_Function[1]
        alpha_Function := alpha_Function[1]
        beta_Function := beta_Function[1]
        ls_Function := ls_Function[1]
        osc_Function := osc_Function[1]
    [b_Function, osc_Function]
/////////////////////////////////////////////////////////////////
pine_atr(length,stratRes_atr) =>
    trueRange = max(max(security(syminfo.tickerid, stratRes_atr, high) - security(syminfo.tickerid, stratRes_atr, low), abs(security(syminfo.tickerid, stratRes_atr, high) - security(syminfo.tickerid, stratRes_atr, close[1]))), abs(security(syminfo.tickerid, stratRes_atr, low) - security(syminfo.tickerid, stratRes_atr, close[1]))) 
    sum = 0.0
    sum := (trueRange + (length - 1) * nz(sum[1])) / length
    sum  
//////////////////////////////////////////////////////////////////////////////////////////////


//STOP LOSS AND TAKE PROFIT
//ALSO NEEDS TO BE ACTIVATED IN THE STRATEGY
//long_tp_inp = input(1000, title='Long Take Profit %', step=0.1)/100/// Long Take Profit
//long_sl_inp = input(5, title='Long Stop Loss %', step=0.1)/100/// Long Stop Loss 
//short_tp_inp = input(75, title='Short Take Profit %', step=0.1)/100/// Short Take Profit
//short_sl_inp = input(5, title='Short Stop Loss %', step=0.1)/100/// Short Stop Loss 
//long_take_level = strategy.position_avg_price * (1 + long_tp_inp)
//long_stop_level = strategy.position_avg_price * (1 - long_sl_inp)
//short_take_level = strategy.position_avg_price * (1 - short_tp_inp)
//short_stop_level = strategy.position_avg_price * (1 + short_sl_inp)
//plot(long_take_level, color=color.green)
//plot(long_stop_level, color=color.red)
//plot(short_take_level, color=color.green)
//plot(short_stop_level, color=color.red)
//////////////////////////////////////////


//oneMinChartTrend = input(title="One Min Chart, TrendRes[ATR(15), Corr(18)]",defval=false)
//fourHourChartTrendLongsOnly = input(title="Four Hour Chart, Longs, Choppy TrendRes[ATR(5), Corr{60)]",defval=false)
//oneHourChartTrendShortsOnly = input(title="One Hour Chart Trend, Shorts, TrendRes[ATR(15), Corr(10)]",defval=false)
//oneMDayChartTrend = input(title="One Day Chart Longs best, Shorts poor,  TrendRes[ATR(25), Corr(60)]",defval=false)

trendRes_ATR   = input(title="ATR Trend Resolution: (mins)", defval="60", options=["1","2","3","5", "7", "9", "10", "11", "12", "15", "20", "25", "30", "45", "60", "90", "120", "180", "240", "1D", "3D"], type = input.resolution)
Length = input(title="ATR Trend Length",defval=15, minval=1)
Multiplier = input(title="ATR Trend Multiplier",defval=6, minval=1)  //avgTR      = wma(atr(1), Length)

trendRes   = input(title="Correlation Trend Resolution: (mins)", defval="120", options=["1","2","3","5", "7", "9", "10", "11", "12", "15", "20", "25", "30", "45", "60", "90", "120", "180", "240", "1D", "3D"], type = input.resolution)
lengthTrend = input(24, "Correlation Trend Length (eg 28 for 1 hour)")
scTrend = input(.2, "Correlation Trend Tuner (0 to 1)", step=0.1)
trendCombination = input(.2, "Trend Combination Tuner (0 to 1): 0=all ATR, 1 = all Corr", step=0.1)




//with sl
//1day longs only (works also with shorts)
//20,10,20,10  ___   25,15,6,60, 24, 0.2, 0.4


//1min chart, long and short -70% but visible trend
//1.5, 1.5, 1.5, 1.5____15,7,2,10,12,0.5,0.4
//if (oneMinChartTrend)
//    trendRes_ATR     := "15"
//    trendRes         := "10"
//    Length           := 7
//    Multiplier       := 2
//    lengthTrend      := 12
//    scTrend          := 0.5
//    trendCombination := 0.4

//choppy region with chart on 4hour
//with sl long only - shorts at -2% could not get a positive result with shorts, only when ma crosses through after a run up
//longs on 4h 8%
//2.7, 2, 2,1,___5,15,6,60,21,0.2, 0.4
//if (fourHourChartTrendLongsOnly)
//    trendRes_ATR     := "5" 
//    trendRes         := "60"
//    Length           := 15
//    Multiplier       := 6
//    lengthTrend      := 21
//    scTrend          := 0.2
//    trendCombination := 0.4

//shorts on 1h -30% but only shorts to catch are when the MA after a long run with lots of green turns red when pops out of back of price action with a long drop
//in this case use the trend indicator to stop the run after a long while
//not sure about sl and tp but
//3.7,2, 3.7,2, _15,11,5,10,17,0.8, 0.3
//if (oneHourChartTrendShortsOnly)
//    trendRes_ATR     := "15"
//    trendRes         := "10"
//    Length           := 11
//    Multiplier       := 5
//    lengthTrend      := 17
//    scTrend          := 0.8
//    trendCombination := 0.3

//1day longs only 
//20,10,20,10 _25,15,6,60, 24, 0.2, 0.4
//if (oneMDayChartTrend)
//    trendRes_ATR     := "25" 
//    trendRes         := "60"
//    Length           := 15
//    Multiplier       := 6
//    lengthTrend      := 24
//    scTrend          := 0.2
//    trendCombination := 0.4
//This shows 111% since start of 2020, and 323% since the start of 2020


//1day longs only
//100,3,?,? _25,15,6,60, 24, 0.2, 0.5 (longs only) (300% back to 2019)
//?,?,60,0.3 _25,15,6,60, 24, 0.2, 0.5 (shorts only) (50% back to 2019)
//A take profit with the shorts worked, but the long had >100% in some runs
//The stop loss on the long did not really have any effect however, with the shorts a stop loss of 0.3% heloed
//However, the algo on the chart was the daily close and not sure if this works in the same way when calculating all the time on new ticks
//if (oneMDayChartTrend)
//    trendRes_ATR     := "25" 
//    trendRes         := "60"
//    Length           := 15
//    Multiplier       := 6
//    lengthTrend      := 24
//    scTrend          := 0.2
//    trendCombination := 0.4
//This shows 37% since the start of 2019, a few big wins with lots of small losses, much more trades than just with longs (46 compared to 2)









//[retA, posA] = trendATR(trendRes_ATR)
//plot(retA, color= color.blue , title="Second Trend Identifier")
//plot(retA, color= color.white , title="ATR Trend")

////////////////////////////////////////////////////////////////////////////////////////////
//THE TREND TRADER OVERLAY WHICH COLOURS THE BARS
avgTR      = wma(pine_atr(1, trendRes_ATR), Length)
highestC   = highest(Length)
lowestC    = lowest(Length)
hiLimit = highestC[1]-(avgTR[1] * Multiplier)
loLimit = lowestC[1]+(avgTR[1] * Multiplier)
closeA =security(syminfo.tickerid, trendRes_ATR, close)
ret=0.
ret := iff(closeA > hiLimit and closeA > loLimit, hiLimit, iff(closeA < loLimit and closeA < hiLimit, loLimit, nz(ret[1], 0)))
pos=0.
pos := iff(closeA > ret, 1, iff(closeA < ret, -1, nz(pos[1], 0))) 
//barcolor(pos == -1 ? color.red: pos == 1 ? color.green : color.blue )
//plot(ret, color= color.white , title="ATR Trend")
////////////////////////////////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////////////
// === END BASE FUNCTIONS ===
/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////
//SET THE RESOLUTION AND INPUT CHARAGERISTICS FOR THE TREND INDICATOR
/////////////////////////////////////////////////////////////////////////
[bTrend, oscTrend] = functionTrend(trendRes,lengthTrend, scTrend)
cssTrend = oscTrend == 1 ? color.blue :#e65100
//plot(bTrend,"Trend Indicator", color=cssTrend[1],linewidth=3,transp=0)//bgcolor(oscLongs < 0 ? color.green : color.red, transp=82)
//plot(bLongs,"Trend Indicator", color=cssLongs,linewidth=3,transp=0)//bgcolor(oscLongs < 0 ? color.green : color.red, transp=82)
//alertcondition(change(oscTrend)>0,title="New Up Trend",message="New Up Trend")
//alertcondition(change(oscTrend)<0,title="New Down Trend",message="New Down Trend")
////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////
//TREND COMBINATION
///////////////////////////////////////////////////////////////////////////////////////////////
trendCombinationVal = (ret - bTrend) * trendCombination + bTrend//ret := iff(closeA > hiLimit and closeA > loLimit, hiLimit, iff(closeA < loLimit and closeA < hiLimit, loLimit, nz(ret[1], 0)))
posTrendCombination=0.
posTrendCombination := iff(closeA >= trendCombinationVal, 1, iff(closeA < trendCombinationVal, -1, nz(posTrendCombination[1], 0))) 
//barcolor(posTrendCombination[1] == -1 ? color.red: posTrendCombination[1] == 1 ? color.green : color.blue )
posTrendCombinationColor = posTrendCombination == 1 ? color.blue :#e65100
plot(trendCombinationVal, color= posTrendCombinationColor[2] ,linewidth=3 , title="Trend Combo")
barcolor(posTrendCombinationColor[1])
//////////////////////////////////////////////////////////////////////////////////////////////


// === INPUTS ===
//DEFAULT SETTINGS BELOW ARE FOR 15MIN CHART TIMEFRAME, FOR THE DAYILY TIMEFRAME ON CHART AND ALGO USE SMA 29PERIOD
//MA RESOLUTION IS SET TO PREDEFINED VALUES THERE ARE A LOT MISSING WHICH MIGHT BE VERY IMPORTANT CONSIDER HAVING AN INTEGER FOR THE MINUTES
stratRes    = input(defval = "1D", title = "Set MA Resolution ( note run alerts on 1min chart )", type = input.resolution)
basisType   = input(title="MA Type: ", defval="ALMA", options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "HullMA", "LSMA", "ALMA"], type = input.string)
basisLen    = input(defval = 18, title = "MA Period", minval = 1)
offsetSigma = input(defval = 1, title = "Offset for LSMA / Sigma for ALMA (6 is large)", minval = 0)
offsetALMA  = input(defval = 0.88, title = "Alma Offset (between 0 and 1, 0.99 = resposive, 0.01 = smooth)", minval = 0, step = 0.01)
//ignoreSmallCrossOvers    = input(defval = 0, title = "Ignore Small Cross Over if $USD Less Than", minval = 0)
so = security(syminfo.tickerid, stratRes, open, lookahead=barmerge.lookahead_on)
sh = security(syminfo.tickerid, stratRes, high, lookahead=barmerge.lookahead_on)
sl1 = security(syminfo.tickerid, stratRes, low, lookahead=barmerge.lookahead_on)
sc = security(syminfo.tickerid, stratRes, close, lookahead=barmerge.lookahead_on)
br= so != so[1] and sc != sc[1] and sh != sh[1] and sl1 != sl1[1] 
col= so > sc ? color.red : color.green
a1=na(br) ? so : na
a2=na(br) ? sh : na
a3=na(br) ? sl1 : na
a4=na(br) ? sc : na
p1=plot(a1,"MTF Open", color.white, style = plot.style_linebr, transp = 100, editable = false)
p2=plot(a2,"MTF High", color.black, style=plot.style_linebr, transp = 100, editable = false)
p3=plot(a3,"MTF Low", color.black, style=plot.style_linebr, transp = 100, editable = false)
p4=plot(a4, "MTF Close", col, style=plot.style_linebr, transp = 100, editable = false)
fill(p1,p4,col, transp = 100, editable = false)
fill(p2,p3,color.silver, transp = 100, editable = false)
reso(exp, res) => security(syminfo.tickerid, res, exp, lookahead=barmerge.lookahead_on) 
closeSeries = reso(variant(basisType, close, basisLen, offsetSigma, offsetALMA), stratRes)
openSeries  = reso(variant(basisType, open, basisLen, offsetSigma, offsetALMA), stratRes) 


//6HOUR CHART 1 DAY TIMEFRAME BACK TO 2019
//SMA (19) , 360% 300%LONGS 60% SHORTS
//alma (38,,0.86) 560% (400% LONGS, 28%SHORTS)  20TRADES

//If there are any crossovers in a bar, how many are there
//Just one crossover might signify a change in trend for the given timeframe
//Lots of crossovers might signify a sidewards trend which this algo does not work well with
crossOverInBar = crossover(closeSeries, openSeries)
crossUnderInBar = crossunder(closeSeries, openSeries)
crossedOverOrUnderInBar = crossOverInBar or crossUnderInBar

trendState=false
trendState  := closeSeries > openSeries ? true : closeSeries < openSeries ? false : trendState[1]
//closePlot   = plot(closeSeries, title = "Close Line", color = #009900, linewidth = 2, style = plot.style_line, transp = 100, editable = false)
//openPlot    = plot(openSeries, title = "Open Line", color = #CC0000, linewidth = 2, style = plot.style_line, transp = 100, editable = false)
closePlot   = plot(closeSeries, title = "Close Line", color = #009900, linewidth = 2, style = plot.style_line)
openPlot    = plot(openSeries, title = "Open Line", color = #CC0000, linewidth = 2, style = plot.style_line)
closePlotU  = plot(trendState ? closeSeries : na, transp = 100, editable = false)
openPlotU   = plot(trendState ? openSeries : na, transp = 100, editable = false)
closePlotD  = plot(trendState ? na : closeSeries, transp = 100, editable = false)
openPlotD   = plot(trendState ? na : openSeries, transp = 100, editable = false)
fill(openPlotU, closePlotU, title = "MA Up Trend", color = #009900, transp = 0)
fill(openPlotD, closePlotD, title = "MA Down Trend", color = #CC0000, transp = 0)
// === /PLOTTING ===
coLor = closeSeries > openSeries ? color.green : color.red
hclose = plot(closeSeries, title="Close Series", color = coLor, linewidth = 1, transp = 100, editable = false)
hopen = plot(openSeries, title="Open Series", color = coLor, linewidth = 1, transp = 100, editable = false)

//longCond    = crossover(closeSeries, openSeries)
//shortCond   = crossunder(closeSeries, openSeries)


openLongCond = false
openShortCond = false
closeLongCond = false
closeShortCond = false

longCondLastBarClose = false
longCondLastBarClose := nz(longCondLastBarClose[1], false)
longCondThisBarClose = false
crossOver = false
if (is_newBar(stratRes))
    longCondThisBarClose := closeSeries[1] >= openSeries[1] //+ ignoreSmallCrossOvers
    if (longCondLastBarClose != longCondThisBarClose)
        crossOver := true
        longCondLastBarClose := longCondThisBarClose
longCondCrossOver = false
shortCondCrossOver = false
if (crossOver)
    longCondCrossOver := longCondThisBarClose
    shortCondCrossOver := not longCondThisBarClose
openLongCond := longCondCrossOver
openShortCond := shortCondCrossOver
closeLongCond := shortCondCrossOver
closeShortCond := longCondCrossOver

//ACTIVATE THIS TO STRATEGY TEST THE CORRELATION COMBINATION
//CORRELATION TREND
//longCondTrend=change(oscTrend)>0
//shortCondTrend=change(oscTrend)<0
//openLongCond := longCondTrend
//openShortCond := shortCondTrend
//closeLongCond := shortCondTrend
//closeShortCond := longCondTrend

////ACTIVATE THIS TO STRATEGY TEST THE ATR TREND
//longCondATRTrend = pos==1
//shortCondATRTrend = pos==-1
//openLongCond := longCondATRTrend
//openShortCond := shortCondATRTrend
//closeLongCond := shortCondATRTrend
//closeShortCond := longCondATRTrend

//ACTIVATE THIS TO STRATEGY TEST THE TREND COMBINATION
//TREND COMBINATION
//longCondTrendCombination = posTrendCombination==1
//shortCondTrendCombination = posTrendCombination==-1
//openLongCond := longCondTrendCombination
//openShortCond := shortCondTrendCombination
//closeLongCond := shortCondTrendCombination
//closeShortCond := longCondTrendCombination

//posTrendCombinationColor = posTrendCombination == 1 ? color.blue :#e65100


//Only get into a trade when both conditions are satisfied
//Get out of a trade when either conidition is satisfied




///////////////// LONG //////////////////
isEntry_Long = false
isEntry_Long := nz(isEntry_Long[1], false)
isExit_Long = false
isExit_Long := nz(isExit_Long[1], false)
entry_long = not isEntry_Long[1] and openLongCond
exit_long = not isExit_Long and closeLongCond
if (entry_long)
    isEntry_Long := true
    isExit_Long := false
if (exit_long)
    isEntry_Long := false
    isExit_Long := true
entry_long := entry_long 
exit_long := exit_long 
///////////// SHORT ///////////////////////////
isEntry_Short = false
isEntry_Short := nz(isEntry_Short[1], false)
isExit_Short = false
isExit_Short := nz(isExit_Short[1], false)
entry_short = not isEntry_Short[1] and openShortCond 
exit_short = not isExit_Short and closeShortCond 
if (entry_short)
    isEntry_Short := true
    isExit_Short := false
if (exit_short)
    isEntry_Short := false
    isExit_Short := true
entry_short := entry_short 
exit_short := exit_short 
//////////////////////////////////////////////////




//plotshape(series=entry_long, text="OpenLong", style=shape.triangleup, location=location.belowbar, color=color.white, size=size.small)
//plotshape(series=exit_long, text="ExitLong",style=shape.triangledown, location=location.belowbar, color=color.white, size=size.small)
//plotshape(series=entry_short, text="OpenShort", style=shape.triangledown, location=location.abovebar, color=color.white, size=size.small)
//plotshape(series=exit_short, text="ExitShort",style=shape.triangleup, location=location.abovebar, color=color.white, size=size.small)


//Alerts are for the study mode
alertcondition(entry_long, title="Enter Long")
alertcondition(entry_short, title="Enter Short")
alertcondition(exit_long, title="Exit Long")
alertcondition(exit_short, title="Exit Short")

/////////////////////////////////////////////////////////////
//TO TEST THE STRATEGY
///////////////////////////////////////////////////////////
/// PERIOD - This is for the strategy mode/// 
testStartYear = input(2019, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month") 
testStartDay = input(1, "Backtest Start Day") 
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) 
testStopYear = input(2020, "Backtest Stop Year") 
testStopMonth = input(12, "Backtest Stop Month") 
testStopDay = input(31, "Backtest Stop Day") 
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) 
testPeriod() =>  true

includeLongTrades=input(title="Include Long Trades", defval = true, type=input.bool)
includeShortTrades=input(title="Include Short Trades", defval = false, type=input.bool)
entry_long := entry_long and includeLongTrades
exit_long := exit_long and includeLongTrades
entry_short := entry_short and includeShortTrades
exit_short := exit_short and includeShortTrades
//if testPeriod() 
//    if (entry_long)
//        strategy.close("ENTRY_SHORT", comment="close short")
//        strategy.entry("ENTRY_LONG", strategy.long, oca_name="oca1",  comment="open long")
//    if (exit_long)
//        strategy.close("ENTRY_LONG", comment="close long")
//    if (entry_short)
//        strategy.close("ENTRY_LONG", comment="close long")
//        strategy.entry("ENTRY_SHORT", strategy.short, oca_name="oca1",  comment="open short")
//    if (exit_short)
//        strategy.close("ENTRY_SHORT", comment="close short")




if testPeriod() 
    if (entry_long)
        strategy.close("ENTRY_SHORT", comment="close short")
        strategy.entry("ENTRY_LONG", strategy.long, oca_name="oca1",  comment="open long")
    if (exit_long)
        strategy.close("ENTRY_LONG", comment="close long")
    if (entry_short)
        strategy.close("ENTRY_LONG", comment="close long")
        strategy.entry("ENTRY_SHORT", strategy.short, oca_name="oca1",  comment="open short")
    if (exit_short)
        strategy.close("ENTRY_SHORT", comment="close short")
//STOP LOSS AND TAKE PROFIT
//if (close  < long_stop_level or close  > long_take_level)
//    strategy.close("ENTRY_LONG", comment="close long SL/TP")
//if (close  > short_stop_level or close  < short_take_level)
//    strategy.close("ENTRY_SHORT", comment="close short SL/TP")


//closeNowA =0.
//closeNow = security(syminfo.tickerid, "1", close)
//closeNowA := closeNow
//if (is_newBar("1")==false)
//    closeNowA := closeNowA[1]
//plot (closeNowA)
////if (openLongCond)
//if (closeNowA  < long_stop_level or closeNowA  > long_take_level)
//    strategy.close("ENTRY_LONG", comment="close long SL/TP")
////if (openShortCond)
//if (closeNowA  > short_stop_level or closeNowA  < short_take_level)
//    strategy.close("ENTRY_SHORT", comment="close short SL/TP")




//if (strategy.position_avg_price)
//strategy.entry(id="Long", long=true, when=entry_long)
//strategy.exit("Take Profit/ Stop Loss","Long", stop=long_stop_level, limit=long_take_level)
//strategy.close(id="Long", when=exit_long, comment = "ExitLong TP/SL")
//strategy.entry(id="Short", short=true, when=entry_short)
//strategy.exit("Take Profit/ Stop Loss","Long", stop=short_stop_level, limit=short_take_level)
//strategy.close(id="Short", when=exit_short, comment = "ExitShort TP/SL")


//if testPeriod() 
//    if (entry_long)
//        strategy.close("ENTRY_SHORT", comment="josef.tainsh@gmail.com_EXIT-SHORT_BINANCE-FUTURES_BTC/USDT_josef.tainsh@gmail.com-BOT-NAME_3M")
//        strategy.entry("ENTRY_LONG", strategy.long, oca_name="oca1",  comment="josef.tainsh@gmail.com_ENTER-LONG_BINANCE-FUTURES_BTC/USDT_josef.tainsh@gmail.com-BOT-NAME_3M")
//    if (exit_long)
//        strategy.close("ENTRY_LONG", comment="josef.tainsh@gmail.com_EXIT-LONG_BINANCE-FUTURES_BTC/USDT_josef.tainsh@gmail.com-BOT-NAME_3M")
//    if (entry_short)
//        strategy.close("ENTRY_LONG", comment="josef.tainsh@gmail.com_EXIT-LONG_BINANCE-FUTURES_BTC/USDT_josef.tainsh@gmail.com-BOT-NAME_3M")
//        strategy.entry("ENTRY_SHORT", strategy.short, oca_name="oca1",  comment="josef.tainsh@gmail.com_ENTER-SHORT_BINANCE-FUTURES_BTC/USDT_josef.tainsh@gmail.com-BOT-NAME_3M")
//    if (exit_short)
//        strategy.close("ENTRY_SHORT", comment="josef.tainsh@gmail.com_EXIT-SHORT_BINANCE-FUTURES_BTC/USDT_josef.tainsh@gmail.com-BOT-NAME_3M")
//    if (close  < long_stop_level or close  > long_take_level)
//        strategy.close("ENTRY_LONG", comment="josef.tainsh@gmail.com_EXIT-LONG_BINANCE-FUTURES_BTC/USDT_josef.tainsh@gmail.com-BOT-NAME_3M")
//    if (close  > short_stop_level or close  < short_take_level)
//        strategy.close("ENTRY_SHORT", comment="josef.tainsh@gmail.com_EXIT-SHORT_BINANCE-FUTURES_BTC/USDT_josef.tainsh@gmail.com-BOT-NAME_3M")



//strategy.cancel(id="ENTRY_LONG")


مزید