
यह रणनीति दो अलग-अलग चक्रों की सरल चलती औसत के क्रॉसिंग का उपयोग करती है ताकि रुझान की दिशा का पता लगाया जा सके और जब रुझान होता है तो व्यापार किया जा सके। साथ ही, इस रणनीति में एक अपेक्षित मूल्य पैनल भी पेश किया गया है, जिसका उपयोग विभिन्न समय के पैमाने पर रणनीति के अपेक्षित लाभ की गणना और प्रदर्शित करने के लिए किया जाता है, ताकि उपयोगकर्ता रणनीति के प्रदर्शन का बेहतर मूल्यांकन कर सकें। इस अपेक्षित मूल्य पैनल में रणनीतियों की ऐतिहासिक अवधि के दौरान जीत, औसत लाभ और औसत हानि जैसे प्रमुख संकेतकों को ध्यान में रखा गया है, जो एक दृश्य तरीके से दिखाता है कि रणनीति विभिन्न बाजार स्थितियों में कैसे काम करती है।
इस रणनीति का मूल यह है कि दो अलग-अलग चक्रों (इस मामले में 14 और 28 दिन) के सरल चलती औसत का उपयोग करके बाजार के रुझान का आकलन किया जाए। जब अल्पकालिक औसत नीचे से ऊपर की ओर लंबी अवधि की औसत रेखा को पार करता है, तो बाजार को एक ऊपरी प्रवृत्ति में माना जाता है, और रणनीति अधिक स्थिति खोलती है; इसके विपरीत, जब अल्पकालिक औसत रेखा ऊपर से नीचे की ओर लंबी अवधि की औसत रेखा को पार करती है, तो बाजार को एक गिरावट की प्रवृत्ति में माना जाता है, और रणनीति खाली होती है। इस तरह से, रणनीति विभिन्न बाजार के रुझानों के अनुकूल हो सकती है, और प्रवृत्ति के समय में स्थिति बनाने के लिए समय पर स्थिति का लाभ उठाने के लिए।
बुनियादी रुझान निर्णय और व्यापारिक तर्क के अलावा, रणनीति में एक अपेक्षित मूल्य पैनल की शुरुआत की गई है, जिसका उपयोग विभिन्न समय के पैमाने (मासिक और वार्षिक) पर रणनीति के अपेक्षित लाभ की गणना और प्रदर्शित करने के लिए किया जाता है। अपेक्षित मूल्य की गणना रणनीति के ऐतिहासिक समय के दौरान महत्वपूर्ण सांख्यिकीय संकेतकों पर आधारित है, जिसमें शामिल हैंः
इन संकेतकों का उपयोग करके, हम उस समय अवधि के लिए रणनीति के अपेक्षित मूल्य की गणना कर सकते हैंः अपेक्षित मूल्य = जीत की दर × औसत लाभ - (1 - जीत की दर) × औसत हानि
चार्ट पर विभिन्न समय अवधि के लिए अपेक्षित मानों को एक हीट ग्राफ के रूप में प्रदर्शित करके, उपयोगकर्ता एक नज़र में देख सकते हैं कि रणनीति विभिन्न बाजार स्थितियों में कैसे प्रदर्शन करेगी, जिससे रणनीति की उपयुक्तता और जोखिमों को बेहतर ढंग से समझा जा सके।
प्रवृत्ति के अनुकूलः प्रवृत्ति का आकलन करने के लिए चलती औसत रेखा का उपयोग करके, यह रणनीति विभिन्न बाजार रुझानों के तहत स्थिति को समय पर समायोजित करने में सक्षम है, ताकि बाजार में बदलाव हो सके। इससे रणनीति को प्रवृत्ति वाले बाजार में बेहतर रिटर्न प्राप्त करने में सक्षम बनाया गया है।
अंतर्निहित प्रदर्शन मूल्यांकनः एक अंतर्निहित अपेक्षित मूल्य पैनल एक हीट ग्राफ के रूप में रणनीति के विभिन्न समय अवधि के लिए अपेक्षित रिटर्न को प्रदर्शित करता है, जिससे उपयोगकर्ता को विभिन्न बाजार स्थितियों में रणनीति के प्रदर्शन का आकलन करने में सक्षम बनाता है। इस प्रकार का दृश्य प्रदर्शन उपयोगकर्ता को निर्णय लेने के लिए अधिक संदर्भ प्रदान करता है।
प्रमुख सांख्यिकीय मापदंडों को ध्यान में रखते हुएः अपेक्षित मूल्य की गणना न केवल रणनीति की जीत की संभावना को ध्यान में रखती है, बल्कि औसत लाभ और औसत हानि के प्रभाव को भी शामिल करती है। इस तरह की गणना रणनीति के वास्तविक प्रदर्शन को अधिक व्यापक और अधिक सटीक रूप से दर्शाती है, जिससे उपयोगकर्ताओं को अधिक विश्वसनीय संदर्भ प्रदान किया जा सकता है।
लचीला पैरामीटर सेटिंग्सः उपयोगकर्ता की जरूरत के अनुसार लचीलापन सेट कर सकते हैं वांछित मान पैनल का प्रदर्शन या नहीं, और पैनल की पारदर्शिता। यह उपयोगकर्ता को अपनी पसंद के अनुसार चार्ट के प्रदर्शन को समायोजित करने की अनुमति देता है, जो उपयोग के अनुभव को बढ़ाता है।
अस्थिर बाजारों में खराब प्रदर्शनः चूंकि रणनीति मुख्य रूप से रुझानों पर निर्भर करती है, इसलिए अस्थिर बाजारों या अनिश्चित बाजार वातावरण में, बार-बार व्यापार करने से बड़ी स्लाइड और व्यापारिक लागत हो सकती है, जिससे रणनीति का समग्र प्रदर्शन प्रभावित हो सकता है।
उम्मीद के मूल्य की गणना की सीमाएं: हालांकि उम्मीद के मूल्य पैनल एक अंतर्दृष्टि प्रदान करता है रणनीति के प्रदर्शन का आकलन करने के लिए, यह अभी भी ऐतिहासिक डेटा के आधार पर गणना की जाती है। जब बाजार में महत्वपूर्ण परिवर्तन होते हैं या चरम स्थिति होती है, तो ऐतिहासिक डेटा रणनीति के वास्तविक प्रदर्शन को अच्छी तरह से प्रतिबिंबित नहीं कर सकता है, और उम्मीद के मूल्य का संदर्भ महत्व कम हो सकता है।
पैरामीटर का चयन प्रभावशाली है: इस रणनीति का प्रदर्शन काफी हद तक चलती औसत के चक्र चयन पर निर्भर करता है। विभिन्न चक्र संयोजनों से पूरी तरह से अलग व्यापार परिणाम हो सकते हैं। यदि चयनित पैरामीटर बाजार की विशेषताओं के लिए अच्छी तरह से अनुकूल नहीं हैं, तो रणनीति का वास्तविक प्रदर्शन उम्मीदों से अधिक विचलित हो सकता है।
अधिक तकनीकी संकेतकों को शामिल करेंः मौजूदा चलती औसत के आधार पर, अन्य तकनीकी संकेतकों को शामिल करने पर विचार किया जा सकता है, जैसे कि एमएसीडी, आरएसआई, आदि, प्रवृत्ति की ताकत और स्थिरता का बेहतर आकलन करने के लिए, जिससे रणनीति में प्रवेश और बाहर निकलने का समय बढ़ जाए।
स्थिति प्रबंधन का अनुकूलन करेंः वर्तमान रणनीति में ट्रेडिंग सिग्नल आने पर स्थिति को स्थिर करने का अभ्यास किया जाता है। जोखिम को बेहतर ढंग से नियंत्रित करने और रिटर्न बढ़ाने के लिए बाजार की अस्थिरता, प्रवृत्ति की ताकत आदि के आधार पर स्थिति को गतिशील रूप से समायोजित करने पर विचार किया जा सकता है।
स्टॉप लॉस मैकेनिज्म को शामिल करनाः रणनीति में उचित स्टॉप लॉस मैकेनिज्म को शामिल करने से रणनीति को पहले से मौजूद लाभ को समय पर लॉक करने में मदद मिलती है, जबकि संभावित नुकसान को सीमित किया जाता है। यह रणनीति के जोखिम-लाभ अनुपात को बढ़ाने में मदद करता है, जिससे यह विभिन्न बाजार स्थितियों में अपेक्षाकृत मजबूत प्रदर्शन कर सकता है।
अपेक्षित मूल्य की गणना को अनुकूलित करेंः अपेक्षित मूल्य की गणना के तरीके को और अनुकूलित किया जा सकता है, जैसे कि लेनदेन की लागत को ध्यान में रखना, मोबाइल विंडो की शुरुआत करना, आदि, ताकि अपेक्षित मूल्य संकेतक की प्रभावशीलता और उपयोगिता को बढ़ाया जा सके। इसके अलावा, अन्य रणनीतिक प्रदर्शन मूल्यांकन संकेतक की खोज की जा सकती है, जिससे उपयोगकर्ताओं को अधिक व्यापक संदर्भ प्रदान किया जा सके।
इस रणनीति का उपयोग कर बाजार के रुझानों का आकलन करने के लिए एक चलती औसत का उपयोग करने के लिए और एक प्रवृत्ति के रूप में समय पर स्थिति बनाने के लिए प्रवृत्ति से लाए गए लाभों को प्राप्त करने के लिए। साथ ही, रणनीति में एक सहज ज्ञान युक्त उम्मीद मूल्य पैनल भी पेश किया गया है, जो उपयोगकर्ताओं को निर्णय लेने के लिए अधिक संदर्भ प्रदान करने के लिए विभिन्न समय के पैमाने पर रणनीति के अपेक्षित लाभों को प्रदर्शित करता है। हालांकि यह रणनीति उतार-चढ़ाव वाले बाजारों में खराब प्रदर्शन कर सकती है, और उम्मीद के मूल्य की गणना में कुछ सीमाएं हैं, लेकिन अधिक तकनीकी संकेतकों को पेश करके, स्थिति प्रबंधन को अनुकूलित करने और स्टॉप-लॉस उपायों को शामिल करने से रणनीति के जोखिम-लाभ अनुपात को और बढ़ाया जा सकता है, जिससे यह कई बाजारों के परिवर्तन के लिए बेहतर रूप से अनुकूल हो सके।
/*backtest
start: 2023-06-11 00:00:00
end: 2024-06-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ir0nantc2
//@version=5
strategy("Expected Value Panel", overlay=true)
// ロングエントリー条件 / Long entry condition
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (longCondition)
strategy.entry("My Long Entry Id", strategy.long)
// ショートエントリー条件 / Short entry condition
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (shortCondition)
strategy.entry("My Short Entry Id", strategy.short)
// ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
// Please copy the code below and paste it into the strategy where you want to display the expected value.
// 以下のコードをコピーして期待値を表示させたいストラテジーに貼り付けて下さい。
// ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
// 表示選択 / Display selection
show_performance = input.bool(true, '期待値ON/OFF (Show Expected Value)', group='Expected Value / ©ir0nantc2')
transparency = input.int(50, '透過度 (Transparency)', minval=0, maxval=100, group='Expected Value / ©ir0nantc2')
prec = 2
// 背景色 / Background color
bg_color(value) =>
na(value) ? color.new(color.gray, transparency) : value > 0.0 ? color.new(color.green, transparency) :
value < 0.0 ? color.new(color.red, transparency) :color.new(color.gray, transparency)
// 利益と損失の追跡 / Track profits and losses
var float total_monthly_profit = 0.0
var float total_yearly_profit = 0.0
if show_performance
new_month = month(time) != month(time[1])
new_year = year(time) != year(time[1])
cur_month_pnl = 0.0, cur_year_pnl = 0.0
eq = strategy.equity
bar_pnl = eq / eq[1] - 1
// 月次・年次 期待値 / Monthly & Yearly Expected Value
cur_month_pnl := new_month ? 0.0 : (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1
cur_year_pnl := new_year ? 0.0 : (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1
// 年次および月次期待値を格納 / Store monthly and yearly expected values
var month_pnl = array.new_float(), var month_time = array.new_int()
var year_pnl = array.new_float(), var year_time = array.new_int()
// 期待値計算の変数 / Variables for expected value calculation
var month_wins = array.new_int(), var month_losses = array.new_int()
var month_avg_win = array.new_float(), var month_avg_loss = array.new_float()
var year_wins = array.new_int(), var year_losses = array.new_int()
var year_avg_win = array.new_float(), var year_avg_loss = array.new_float()
// 月次および年次期待値の配列更新 / Update arrays for monthly and yearly expected values
bool last_computed = false
if (not na(cur_month_pnl[1]) and (new_month or barstate.islastconfirmedhistory))
if (last_computed and array.size(month_pnl) > 0)
array.pop(month_pnl), array.pop(month_time)
array.pop(month_wins), array.pop(month_losses)
array.pop(month_avg_win), array.pop(month_avg_loss)
array.push(month_pnl, cur_month_pnl[1]), array.push(month_time, time[1])
array.push(month_wins, 0), array.push(month_losses, 0)
array.push(month_avg_win, 0.0), array.push(month_avg_loss, 0.0)
if (not na(cur_year_pnl[1]) and (new_year or barstate.islastconfirmedhistory))
if (last_computed and array.size(year_pnl) > 0)
array.pop(year_pnl), array.pop(year_time)
array.pop(year_wins), array.pop(year_losses)
array.pop(year_avg_win), array.pop(year_avg_loss)
array.push(year_pnl, cur_year_pnl[1]), array.push(year_time, time[1])
array.push(year_wins, 0), array.push(year_losses, 0)
array.push(year_avg_win, 0.0), array.push(year_avg_loss, 0.0)
last_computed := barstate.islastconfirmedhistory ? true : last_computed
// 勝ち取引と負け取引を追跡 / Track winning and losing trades
if (strategy.closedtrades > 0 and na(strategy.closedtrades[1]) == false)
closed_profit = strategy.netprofit - strategy.netprofit[1]
if closed_profit > 0
if array.size(month_wins) > 0
wins = array.get(month_wins, array.size(month_wins) - 1) + 1
avg_win = (array.get(month_avg_win, array.size(month_avg_win) - 1) * (wins - 1) + closed_profit) / wins
array.set(month_wins, array.size(month_wins) - 1, wins)
array.set(month_avg_win, array.size(month_avg_win) - 1, avg_win)
if array.size(year_wins) > 0
wins = array.get(year_wins, array.size(year_wins) - 1) + 1
avg_win = (array.get(year_avg_win, array.size(year_avg_win) - 1) * (wins - 1) + closed_profit) / wins
array.set(year_wins, array.size(year_wins) - 1, wins)
array.set(year_avg_win, array.size(year_avg_win) - 1, avg_win)
else
if array.size(month_losses) > 0
losses = array.get(month_losses, array.size(month_losses) - 1) + 1
avg_loss = (array.get(month_avg_loss, array.size(month_avg_loss) - 1) * (losses - 1) + closed_profit) / losses
array.set(month_losses, array.size(month_losses) - 1, losses)
array.set(month_avg_loss, array.size(month_avg_loss) - 1, avg_loss)
if array.size(year_losses) > 0
losses = array.get(year_losses, array.size(year_losses) - 1) + 1
avg_loss = (array.get(year_avg_loss, array.size(year_avg_loss) - 1) * (losses - 1) + closed_profit) / losses
array.set(year_losses, array.size(year_losses) - 1, losses)
array.set(year_avg_loss, array.size(year_avg_loss) - 1, avg_loss)
// 月次テーブル / Monthly table
var monthly_table = table(na)
if (barstate.islastconfirmedhistory)
monthly_table := table.new(position.bottom_right, columns = 14, rows = array.size(year_time) + 1, border_width = 1)
table.cell(monthly_table, 0, 0, "", bgcolor = #bbbbbb00)
table.cell(monthly_table, 1, 0, "Jan", bgcolor = #bbbbbb)
table.cell(monthly_table, 2, 0, "Feb", bgcolor = #bbbbbb)
table.cell(monthly_table, 3, 0, "Mar", bgcolor = #bbbbbb)
table.cell(monthly_table, 4, 0, "Apr", bgcolor = #bbbbbb)
table.cell(monthly_table, 5, 0, "May", bgcolor = #bbbbbb)
table.cell(monthly_table, 6, 0, "Jun", bgcolor = #bbbbbb)
table.cell(monthly_table, 7, 0, "Jul", bgcolor = #bbbbbb)
table.cell(monthly_table, 8, 0, "Aug", bgcolor = #bbbbbb)
table.cell(monthly_table, 9, 0, "Sep", bgcolor = #bbbbbb)
table.cell(monthly_table, 10, 0, "Oct", bgcolor = #bbbbbb)
table.cell(monthly_table, 11, 0, "Nov", bgcolor = #bbbbbb)
table.cell(monthly_table, 12, 0, "Dec", bgcolor = #bbbbbb)
table.cell(monthly_table, 13, 0, "Year", bgcolor = #bbbbbb)
// 年次データの集計 / Collecting yearly data
var year_total_pnl = array.new_float()
var year_exp_val = array.new_float()
for yt = 0 to array.size(year_time) - 1
total_year_wins = 0, total_year_losses = 0
total_year_avg_win = 0.0, total_year_avg_loss = 0.0
total_year_pnl = 0.0
for mt = 1 to 12
idx = -1
for j = 0 to array.size(month_time) - 1
if year(array.get(month_time, j)) == year(array.get(year_time, yt)) and month(array.get(month_time, j)) == mt
idx := j
break
if idx != -1
total_year_pnl := total_year_pnl + array.get(month_pnl, idx)
total_year_wins := total_year_wins + array.get(month_wins, idx)
total_year_losses := total_year_losses + array.get(month_losses, idx)
total_year_avg_win := total_year_avg_win + (array.get(month_avg_win, idx) * array.get(month_wins, idx))
total_year_avg_loss := total_year_avg_loss + (array.get(month_avg_loss, idx) * array.get(month_losses, idx))
total_year_avg_win := total_year_wins > 0 ? total_year_avg_win / total_year_wins : 0.0
total_year_avg_loss := total_year_losses > 0 ? total_year_avg_loss / total_year_losses : 0.0
win_rate = total_year_wins + total_year_losses > 0 ? total_year_wins / (total_year_wins + total_year_losses) : na
exp_val = win_rate ? (win_rate * total_year_avg_win) - ((1 - win_rate) * math.abs(total_year_avg_loss)) : na
array.push(year_total_pnl, total_year_pnl)
array.push(year_exp_val, exp_val)
for yt = 0 to array.size(year_time) - 1
table.cell(monthly_table, 0, yt + 1, str.tostring(year(array.get(year_time, yt))), bgcolor = #bbbbbb)
y_color = bg_color(array.get(year_exp_val, yt))
value_to_display = na(array.get(year_exp_val, yt)) ? "" : str.tostring(math.round(array.get(year_exp_val, yt) * 100, prec))
table.cell(monthly_table, 13, yt + 1, value_to_display, bgcolor = y_color, text_color=color.new(color.white, 0))
for mt = 0 to array.size(month_time) - 1
m_row = year(array.get(month_time, mt)) - year(array.get(year_time, 0)) + 1
m_col = month(array.get(month_time, mt))
if array.size(month_wins) > mt and array.size(month_losses) > mt and array.size(month_avg_win) > mt and array.size(month_avg_loss) > mt
win_rate = array.get(month_wins, mt) / (array.get(month_wins, mt) + array.get(month_losses, mt))
exp_val = (win_rate * array.get(month_avg_win, mt)) - ((1 - win_rate) * math.abs(array.get(month_avg_loss, mt)))
m_color = bg_color(exp_val)
value_to_display = na(exp_val) ? "" : str.tostring(math.round(exp_val * 100, prec))
table.cell(monthly_table, m_col, m_row, value_to_display, bgcolor = m_color, text_color=color.new(color.white, 0))
else
table.cell(monthly_table, m_col, m_row, "", bgcolor = color.new(color.gray, transparency), text_color=color.new(color.white, 0))
// [EOF]