কৌশলটি বাজারের গতির পরিবর্তনকে সিমুলেটেড ইটগুলির গঠনের ভিত্তিতে এবং ইটগুলির দিকের উপর দীর্ঘ বা সংক্ষিপ্ত হিসাবে বিচার করে।
মূল যুক্তি হল ATR এবং বন্ধ মূল্য সম্পর্ক গণনা করে ইট গঠনের অনুকরণ করা। বিশেষত, দুটি ভেরিয়েবল Brick1 এবং Brick2 সংজ্ঞায়িত করা হয়।
Brick1 গণনা করা হয়ঃ যদি বন্ধ মূল্য Brick1 পূর্ববর্তী মান + ATR অতিক্রম করে, Brick1 = Brick1 পূর্ববর্তী মান + ATR; যদি বন্ধ মূল্য Brick1 পূর্ববর্তী - ATR এর নীচে হয়, Brick1 Brick1 পূর্ববর্তী - ATR মান; অন্যথায়, Brick1 Brick1 পূর্ববর্তী মান উত্তরাধিকার।
Brick2 দ্বারা গণনা করা হয়ঃ যদি Brick1 Brick1 পূর্ববর্তী মানের সমান না হয়, তাহলে Brick2 = Brick1 পূর্ববর্তী মান; অন্যথায়, Brick2 পূর্ববর্তী মান উত্তরাধিকার।
এটি ইট গঠনের অনুকরণ করে। যখন ইট 1 একটি ATR এর চেয়ে বেশি উঠে যায়, তখন একটি উপরের ইট গঠিত হয়; যখন ইট 1 একটি ATR এর চেয়ে বেশি পড়ে, তখন একটি নীচের ইট গঠিত হয়। ইট 2 কেবল পূর্ববর্তী ইটের অবস্থান রেকর্ড করে।
যখন Brick1 এবং Brick2 উপরে যায়, এর মানে হল যে ইটটি উপরে প্রসারিত হয়, দীর্ঘ হিসাবে বিচার করা হয়। যখন Brick1 এবং Brick2 নিচে যায়, এর মানে হল যে ইটটি নীচে সঙ্কুচিত হয়, ছোট হিসাবে বিচার করা হয়।
সমাধানগুলির মধ্যে রয়েছে সর্বোত্তম এটিআর চক্র খুঁজে পেতে প্যারামিটার অপ্টিমাইজেশন, অবৈধ সংকেত থেকে ক্ষতি হ্রাস করার জন্য স্টপ লাভ লস কৌশল সামঞ্জস্য করা, রিটার্নের উপর ব্যয় প্রভাব হ্রাস করার জন্য লেনদেনের বৈচিত্র্য যথাযথভাবে বৃদ্ধি করা।
কৌশলটি স্বতঃস্ফূর্ত ভিজ্যুয়ালাইজেশনের সাথে গতিশীলভাবে ইট ক্রসওভার সিমুলেশন করে বাজারে স্বল্পমেয়াদী প্রবণতা এবং গতি বিচার করে। স্থিতিশীলতা আরও বাড়ানোর জন্য পরামিতি টিউনিং এবং সংকেত ফিল্টারিংয়ের মাধ্যমে অপ্টিমাইজেশনের জন্য অনেক জায়গা রয়েছে।
/*backtest start: 2023-02-12 00:00:00 end: 2024-02-18 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 ///Component Code Start testStartYear = input(2017, "Backtest Start Year") testStartMonth = input(01, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0) testStopYear = input(2025, "Backtest Stop Year") testStopMonth = input(1, "Backtest Stop Month") testStopDay = input(1, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0) /// A switch to control background coloring of the test period testPeriodBackground = input(title="Color Background?", type=input.bool, defval=false) testPeriodBackgroundColor = testPeriodBackground and time >= testPeriodStart and time <= testPeriodStop ? #00FF00 : na bgcolor(testPeriodBackgroundColor, transp=97) testPeriod() => true /// Component Code Stop //Zack_the_Lego (original AUTHOR) made into strategy by mkonsap strategy("Flex Renko Emulator", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100) margin = input(true, title="Margin?") Margin = margin ? margin : false res = input(type=input.resolution, defval="D", title="Resolution of ATR") xATR = atr(14) //TF = x78tf ? "78" : "39" BrickSize = security(syminfo.tickerid, res, xATR) //Brick1 = close > nz(Brick1[1]) + BrickSize ? nz(Brick1[1]) + BrickSize : close < //nz(Brick1[1]) - BrickSize ? //nz(Brick1[1]) - BrickSize //: nz(Brick1[1])) Brick1() => s1 = 0.0 s1 := close > nz(s1[1]) + BrickSize ? nz(s1[1]) + BrickSize : close < nz(s1[1]) - BrickSize ? nz(s1[1]) - BrickSize : nz(s1[1]) s1 Brick2() => s2 = 0.0 Brick1_1 = Brick1() s2 := Brick1() != Brick1()[1] ? Brick1_1[1] : nz(s2[1]) s2 colorer = Brick1() > Brick2() ? color.green : color.red p1 = plot(Brick1(), color=colorer, linewidth=4, title="Renko") p2 = plot(Brick2(), color=colorer, linewidth=4, title="Renko") fill(p1, p2, color=color.purple, transp=50) mylong = crossover(Brick1(), Brick2()) myshort = crossunder(Brick1(), Brick2()) last_long = float(na) last_short = float(na) last_long := mylong ? time : nz(last_long[1]) last_short := myshort ? time : nz(last_short[1]) in_long = last_long > last_short ? 2 : 0 in_short = last_short > last_long ? 2 : 0 mylong2 = crossover(Brick1(), Brick2()) myshort2 = crossunder(Brick1(), Brick2()) last_long2 = float(na) last_short2 = float(na) last_long2 := mylong2 ? time : nz(last_long2[1]) last_short2 := myshort2 ? time : nz(last_short2[1]) in_long2 = last_long2 > last_short2 ? 0 : 0 in_short2 = last_short2 > last_long2 ? 0 : 0 condlongx = in_long + in_long2 condlong = crossover(condlongx, 1.9) condlongclose = crossunder(condlongx, 1.9) condshortx = in_short + in_short2 condshort = crossover(condshortx, 1.9) condshortclose = crossunder(condshortx, 1.9) // === STRATEGY - LONG POSITION EXECUTION WITH CLOSE ORDERS === //enterLong() => crossover(condlongx, 1.9) and testPeriod() and strategy.position_size <= 0 //exitLong() => crossunder(condlongx, 1.9) and testPeriod() and strategy.position_size > 0 //strategy.entry(id = "Long", long = true, when = enterLong()) //strategy.close(id = "Long", when = exitLong()) // === STRATEGY - SHORT POSITION EXECUTION WITH CLOSE ORDER=== //enterShort() => crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0 and Margin //exitShort() => crossunder(condshortx, 1.9) and testPeriod() and strategy.position_size < 0 //strategy.entry(id = "Short", long = false, when = enterShort()) //strategy.close(id = "Short", when = exitShort()) //END ///STRATEGY ONLY LONG AND SHORT///// if crossover(condlongx, 1.9) and testPeriod() and strategy.position_size <= 0 strategy.entry("Long", strategy.long, comment="Long") if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0 strategy.close("Long", when=not Margin) if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0 strategy.entry("Short", strategy.short, comment="Short", when=Margin) /////// END ////