TP، SL، اور کلاؤڈ تصدیق کے ساتھ Ichimoku Backtester

مصنف:چاؤ ژانگ، تاریخ: 2023-11-24 17:32:47
ٹیگز:

img

جائزہ

یہ ایک Ichimoku بیک ٹسٹنگ حکمت عملی ہے جس میں منافع ، اسٹاپ نقصان اور کلاؤڈ کی تصدیق ہے۔ اس کا مقصد Ichimoku اشارے کا استعمال کرتے ہوئے رجحانات کو درست طریقے سے پکڑ کر منافع میں اضافہ کرنا ہے۔

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

اس حکمت عملی کا بنیادی حصہ صارف ان پٹ پیرامیٹرز - ٹینکن سین ، کیجون سین ، سینکو اسپین اے اینڈ بی اور چیکو اسپین پر مبنی ایچیموکو اجزاء کی تعمیر ہے۔ جب قیمت ان توازن لائنوں کو عبور کرتی ہے تو اس میں تیزی (طویل) اور کمی (مختصر) سگنل کی نشاندہی ہوتی ہے۔

اس کے علاوہ ، یہ رسک اینڈ انعام کو سنبھالنے کے لئے انٹری قیمت کی بنیاد پر اسٹاپ نقصان اور منافع حاصل کرتا ہے۔ کلاؤڈ کی تصدیق کا انتظار کرنے کا بھی ایک آپشن ہے ، یعنی لانگ کے لئے سینکو اسپین A > B اور شارٹس کے لئے سینکو اسپین A < B۔ اس سے غلط بریک آؤٹ سے بچنے میں مدد ملتی ہے۔

فوائد

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

  1. Ichimoku رجحانات اور رفتار کی نشاندہی کرنے میں اچھا ہے۔ توازن کی لائنیں ٹھوس حمایت اور مزاحمت کے علاقوں کو فراہم کرتی ہیں۔

  2. اسٹاپ نقصان اور منافع حاصل کرنے کی خصوصیات خطرہ کو کم سے کم کرتے ہوئے منافع کو زیادہ سے زیادہ کرتی ہیں۔ اس سے خطرہ واپسی کا پروفائل بہتر ہوتا ہے۔

  3. کلاؤڈ کی توثیق غلط سگنل کو فلٹر کرتی ہے، اعلی امکان اندراجات کو یقینی بناتی ہے۔ اس سے منافع میں اضافہ ہوتا ہے۔

خطرات

تاہم، کچھ اہم خطرات پر بھی غور کرنا ضروری ہے:

  1. Ichimoku کوئی واضح رجحان کے ساتھ رینج محدود بازاروں کے دوران whipsaws کے لئے موزوں ہے. بہت سے رک جاتا ہے مارا جا سکتا ہے.

  2. بادل ایک پسماندہ اشارے ہے۔ جب تک بادل کی تصدیق ہوتی ہے، اس کی زیادہ تر نقل و حرکت پہلے ہی ہو چکی ہو گی۔

  3. اسٹاپ نقصان اور منافع کی سطح کو بہتر بنانا مشکل اور حساس ہے۔ سب سے کم پیرامیٹرز کے نتیجے میں زیادہ نقصانات ہوسکتے ہیں۔

بہتری

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

  1. اضافی تصدیق اور ابتدائی اندراج کے لئے آر ایس آئی جیسے اہم اشارے کے ساتھ Ichimoku کو یکجا کریں.

  2. مقررہ فی صد کے بجائے اتار چڑھاؤ کی بنیاد پر سٹاپ نقصان کو ایڈجسٹ کریں اور منافع لیں.

  3. حکمت عملی کے لئے بہترین سیٹ اپ کی نشاندہی کرنے کے لئے مختلف اثاثوں اور ٹائم فریموں میں زیادہ سے زیادہ پیرامیٹرز کی جانچ کریں۔

  4. مشین لرننگ کو شامل کریں تاکہ اپ ڈیٹ شدہ ڈیٹا کی بنیاد پر پیرامیٹرز اور حکمت عملی کے قوانین کو مستقل طور پر بہتر بنایا جاسکے۔

نتیجہ

یہ ایک ٹھوس Ichimoku نظام ہے جس میں اچھے رجحان کی گرفتاری اور رسک مینجمنٹ کی خصوصیات ہیں۔ کچھ بہتری کے ساتھ ، یہ مجموعی تجارتی نقطہ نظر میں ایک بہترین اضافہ ہوسکتا ہے۔ یہ فاریکس ، اجناس اور کریپٹوکرنسی مارکیٹوں میں اچھی طرح کام کرتا ہے۔


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

strategy("Ichimoku Backtester with TP and SL", overlay=true, 
     currency = currency.USD, default_qty_type = strategy.percent_of_equity, 
     default_qty_value = 95)
//@version=4

//Inputs
ts_bars = input(9, minval=1, title="Tenkan-Sen Bars")
ks_bars = input(26, minval=1, title="Kijun-Sen Bars")
ssb_bars = input(52, minval=1, title="Senkou-Span B Bars")
cs_offset = input(26, minval=1, title="Chikou-Span Offset")
ss_offset = input(26, minval=1, title="Senkou-Span Offset")
long_entry = input(true, title="Long Entry")
short_entry = input(true, title="Short Entry")

wait_for_cloud = input(true, title="Wait for Cloud Confirmation")

use_short_stop_loss = input(true, title="Use Short Stop Loss")
short_stop_loss = input(title="Short Stop Loss (%)", type=input.float, minval=0.0, step=0.1, 
     defval=5) * 0.01
use_long_stop_loss = input(true, title="Use Long Stop Loss")
long_stop_loss = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.1, 
     defval=5) * 0.01
     
use_short_take_profit = input(true, title="Use Short Take Profit")
short_take_profit = input(title="Short Take Profit (%)", type=input.float, minval=0.0, step=0.1,
     defval = 20) * .01
use_long_take_profit = input(true, title="Use Long Take Profit")
long_take_profit = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1,
     defval = 20) * .01

// === INPUT SHOW PLOT ===
showDate  = input(defval = false, title = "Show Date Range", type = input.bool)

// === INPUT BACKTEST RANGE ===
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 2020, title = "From Year",       type = input.integer, minval = 1970)
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2112, title = "Thru Year",       type = input.integer, minval = 1970)



// === FUNCTION EXAMPLE ===
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false       // create function "within window of time"

middle(len) => avg(lowest(len), highest(len))

// Ichimoku Components
tenkan = middle(ts_bars)
kijun = middle(ks_bars)
senkouA = avg(tenkan, kijun)
senkouB = middle(ssb_bars)

bgcolor(color = showDate and window() ? color.gray : na, transp = 90)  // plot within time window

// Plot Ichimoku Kinko Hyo
plot(tenkan, color=#0496ff, title="Tenkan-Sen")
plot(kijun, color=#991515, title="Kijun-Sen")
plot(close, offset=-cs_offset+1, color=#459915, title="Chikou-Span")
sa=plot(senkouA, offset=ss_offset-1, color=color.green, title="Senkou-Span A")
sb=plot(senkouB, offset=ss_offset-1, color=color.red, title="Senkou-Span B")
fill(sa, sb, color = senkouA > senkouB ? color.green : color.red, title="Cloud color")

ss_high = max(senkouA[ss_offset-1], senkouB[ss_offset-1])
ss_low = min(senkouA[ss_offset-1], senkouB[ss_offset-1])

// Entry/Exit Signals
tk_cross_bull = tenkan > kijun
tk_cross_bear = tenkan < kijun
cs_cross_bull = mom(close, cs_offset-1) > 0
cs_cross_bear = mom(close, cs_offset-1) < 0
price_above_kumo = close > ss_high
price_below_kumo = close < ss_low
senkou_green = senkouA > senkouB ? true : false

bullish = tk_cross_bull and cs_cross_bull and price_above_kumo
bearish = tk_cross_bear and cs_cross_bear and price_below_kumo

if (wait_for_cloud)
    bullish := bullish and senkou_green
    bearish := bearish and not senkou_green

longStopPrice  = strategy.position_avg_price * (1 - long_stop_loss)
shortStopPrice = strategy.position_avg_price * (1 + short_stop_loss)
longLimitPrice = strategy.position_avg_price * (1 + long_take_profit)
shortLimitPrice = strategy.position_avg_price * (1 - short_take_profit)

in_long = false
in_long := in_long[1]


open_long = bullish and not in_long
open_short = bearish and in_long


if (open_long)
    in_long := true
if (open_short)
    in_long := false

strategy.entry("Long", strategy.long, when=open_long and long_entry and  (showDate ? window() : true))
strategy.entry("Short", strategy.short ,when=open_short and short_entry and (showDate ? window() : true))

if (strategy.position_size > 0.0)
    if (use_long_stop_loss and not use_long_take_profit)
        strategy.exit("Long", stop = longStopPrice)
    if (use_long_take_profit and not use_long_stop_loss)
        strategy.exit("Long", limit = longLimitPrice)
    if (use_long_take_profit and use_long_stop_loss)
        strategy.exit("Long", stop = longStopPrice, limit=longLimitPrice)
if (strategy.position_size < 0.0)
    if (use_short_stop_loss and not use_short_take_profit)
        strategy.exit("Short", stop = shortStopPrice)
    if (use_short_take_profit and not use_short_stop_loss)
        strategy.exit("Short", limit = shortLimitPrice)
    if (use_short_take_profit and use_short_stop_loss)
        strategy.exit("Short", stop = shortStopPrice, limit = shortLimitPrice)

strategy.close("Long", when=bearish and not short_entry and (showDate ? window() : true))
strategy.close("Short", when=bullish and not long_entry and (showDate ? window() : true))


مزید