ہیکن آشی اور سپر ٹرینڈ حکمت عملی ایک رجحان کی پیروی کرنے والی حکمت عملی ہے جو ہیکن آشی موم بتیوں اور سپر ٹرینڈ اشارے کو جوڑتی ہے۔ اس کا مقصد رجحان کی سمت کی نشاندہی کرنا ، رجحان کے ساتھ تجارت کرنا ، اور رجحان کے الٹ جانے پر تیزی سے باہر نکلنا ہے ، تاکہ غیر رجحان کی تجارت سے ہونے والے نقصانات کو کم سے کم کیا جاسکے۔
ہائکن آشی موم بتیاں ایک خاص قسم کی موم بتیاں ہیں جو موم بتیوں کے جسموں کو پلاٹ کرنے کے لئے کھلی ، بند ، اعلی اور کم قیمتوں کا اوسط استعمال کرتی ہیں ، مارکیٹ کے شور کو فلٹر کرتی ہیں اور پیٹرن کو واضح بناتی ہیں۔ سپر ٹرینڈ اشارے میں دو لائنیں ہوتی ہیں جو رجحان کی سمت کا تعین کرنے کے لئے متحرک معاونت اور مزاحمت تشکیل دیتی ہیں۔
حکمت عملی پہلے ہیکن آشی موم بتیوں کا حساب لگاتی ہے ، پھر ہیکن آشی موم بتیوں کی بنیاد پر سپر ٹرینڈ اشارے کا حساب لگاتی ہے۔ جب قیمت سپر ٹرینڈ لائنوں کو توڑتی ہے تو تجارتی سگنل تیار کیے جاتے ہیں۔ خاص طور پر ، حکمت عملی حقیقی رینج کا حساب لگانے کے لئے ہیکن آشی موم بتیوں کا استعمال کرتی ہے ، پھر رینج اور اوسط قیمت کا استعمال کرتے ہوئے سپر ٹرینڈ کے اوپری اور نچلے بینڈ اخذ کرتی ہے۔ جب قیمت نچلے بینڈ سے اوپر ٹوٹ جاتی ہے تو لمبے سگنل تیار کیے جاتے ہیں ، اور جب قیمت اوپری بینڈ سے نیچے ٹوٹ جاتی ہے تو مختصر سگنل تیار کیے جاتے ہیں۔
سپر ٹرینڈ پیرامیٹرز کو بھی بہترین نتائج کے ل optim بہتر بنایا گیا ہے ، جس سے اشارے کی حساسیت میں بہتری آتی ہے۔ اس کے علاوہ ، منافع کو مقفل کرتے ہوئے خطرات پر قابو پانے کے لئے اسٹاپ نقصان کا طریقہ کار نافذ کیا گیا ہے۔
ہیکن آشی اور سپر ٹرینڈ حکمت عملی ایک رجحان کی پیروی کرنے والی حکمت عملی ہے۔ یہ رجحان کی سمت کی نشاندہی کرتی ہے اور بڑے رجحان کے ساتھ تجارت کرتی ہے ، جبکہ تیزی سے الٹ جانے پر روکتی ہے۔ حکمت عملی میں ہیکن آشی کی شور فلٹرنگ اور سپر ٹرینڈ کی تیزی سے رجحان کی تبدیلی کا پتہ لگانے کو مربوط کیا گیا ہے۔ پیرامیٹر کی اصلاح اور اسٹاپ نقصان کا ڈیزائن خطرات کو کنٹرول کرتے ہوئے منافع کو زیادہ سے زیادہ کرنے کی اجازت دیتا ہے۔ مستقبل میں اصلاحات میں مزید پیرامیٹر ٹوننگ ، اضافی سگنل کی تصدیق ، توسیع شدہ بیک ٹیسٹنگ ڈیٹا وغیرہ شامل ہوسکتے ہیں تاکہ حکمت عملی کے استحکام اور وشوسنییتا کو بڑھا سکے۔
/*backtest start: 2022-10-26 00:00:00 end: 2023-11-01 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Heiken Ashi & Super Trend_ARM", overlay=true, pyramiding=1,initial_capital = 10000, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0.02) /////////////////////////////////////////////////// ////////////////////Function/////////////////////// /////////////////////////////////////////////////// heikinashi_open = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, open) heikinashi_high = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, high) heikinashi_low = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, low) heikinashi_close= request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close) heikinashi_color = heikinashi_open < heikinashi_close ? #53b987 : #eb4d5c // plotbar(heikinashi_open, heikinashi_high, heikinashi_low, heikinashi_close, color=heikinashi_color) x_sma(x, y) => sumx = 0.0 for i = 0 to y - 1 sumx := sumx + x[i] / y sumx x_rma(src, length) => alpha = 1/length sum = 0.0 sum := na(sum[1]) ? x_sma(src, length) : alpha * src + (1 - alpha) * nz(sum[1]) x_atr(length) => trueRange = na(heikinashi_high[1])? heikinashi_high-heikinashi_low : math.max(math.max(heikinashi_high - heikinashi_low, math.abs(heikinashi_high - heikinashi_close[1])), math.abs(heikinashi_low - heikinashi_close[1])) //true range can be also calculated with ta.tr(true) x_rma(trueRange, length) x_supertrend(factor, atrPeriod) => src = (heikinashi_high+heikinashi_low)/2 atr = x_atr(atrPeriod) upperBand = src + factor * atr lowerBand = src - factor * atr prevLowerBand = nz(lowerBand[1]) prevUpperBand = nz(upperBand[1]) lowerBand := lowerBand > prevLowerBand or heikinashi_close[1] < prevLowerBand ? lowerBand : prevLowerBand upperBand := upperBand < prevUpperBand or heikinashi_close[1] > prevUpperBand ? upperBand : prevUpperBand int direction = na float superTrend = na prevSuperTrend = superTrend[1] if na(atr[1]) direction := 1 else if prevSuperTrend == prevUpperBand direction := heikinashi_close > upperBand ? -1 : 1 else direction := heikinashi_close < lowerBand ? 1 : -1 superTrend := direction == -1 ? lowerBand : upperBand [superTrend, direction] /////////////////////////////////////////////////// ////////////////////Indicators///////////////////// /////////////////////////////////////////////////// factor = input.float(3.0, "Factor", step = 0.01) atrPeriod = input(10, "ATR Length") [supertrend, direction] = x_supertrend(factor, atrPeriod) bodyMiddle = plot((heikinashi_open + heikinashi_close) / 2, display=display.none) upTrend = plot(direction < 0 ? supertrend : na, "Up Trend", color = color.green, style=plot.style_linebr) downTrend = plot(direction < 0? na : supertrend, "Down Trend", color = color.red, style=plot.style_linebr) fill(bodyMiddle, upTrend, color.new(color.green, 90), fillgaps=false) fill(bodyMiddle, downTrend, color.new(color.red, 90), fillgaps=false) /////////////////////////////////////////////////// ////////////////////Strategy/////////////////////// /////////////////////////////////////////////////// var bool longCond = na, var bool shortCond = na, longCond := nz(longCond[1]), shortCond := nz(shortCond[1]) var int CondIni_long = 0, var int CondIni_short = 0, CondIni_long := nz(CondIni_long[1]), CondIni_short := nz(CondIni_short[1]) var float open_longCondition = na, var float open_shortCondition = na long = ta.change(direction) < 0 short = ta.change(direction) > 0 longCond := long shortCond := short CondIni_long := longCond[1] ? 1 : shortCond[1] ? -1 : nz(CondIni_long[1]) CondIni_short := longCond[1] ? 1 : shortCond[1] ? -1 : nz(CondIni_short[1]) longCondition = (longCond[1] and nz(CondIni_long[1]) == -1) shortCondition = (shortCond[1] and nz(CondIni_short[1]) == 1) open_longCondition := long ? close[1] : nz(open_longCondition[1]) open_shortCondition := short ? close[1] : nz(open_shortCondition[1]) //TP tp = input.float(1.1 , "TP [%]", step = 0.1) //BACKTESTING inputs -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- testStartYear = input.int(2000, title="start year", minval = 1997, maxval = 3000, group= "BACKTEST") testStartMonth = input.int(01, title="start month", minval = 1, maxval = 12, group= "BACKTEST") testStartDay = input.int(01, title="start day", minval = 1, maxval = 31, group= "BACKTEST") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testStopYear = input.int(3333, title="stop year", minval=1980, maxval = 3333, group= "BACKTEST") testStopMonth = input.int(12, title="stop month", minval=1, maxval=12, group= "BACKTEST") testStopDay = input.int(31, title="stop day", minval=1, maxval=31, group= "BACKTEST") testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0) testPeriod = time >= testPeriodStart and time <= testPeriodStop ? true : false // Backtest ================================================================================================================================================================================================================================================================================================================================== if longCond strategy.entry("L", strategy.long, when=testPeriod) if shortCond strategy.entry("S", strategy.short, when=testPeriod) strategy.exit("TP_L", "L", profit =((open_longCondition * (1+(tp/100))) - open_longCondition)/syminfo.mintick) strategy.exit("TP_S", "S", profit =((open_shortCondition * (1+(tp/100))) - open_shortCondition)/syminfo.mintick)