ملٹی موونگ ایوریج کراس اوور ٹرینڈ ٹریکنگ اور اتار چڑھاؤ کو فلٹر کرنے کی حکمت عملی

MA EMA SMA WMA VWMA SMMA RMA
تخلیق کی تاریخ: 2024-07-29 13:37:09 آخر میں ترمیم کریں: 2024-07-29 13:37:09
کاپی: 0 کلکس کی تعداد: 636
1
پر توجہ دیں
1617
پیروکار

ملٹی موونگ ایوریج کراس اوور ٹرینڈ ٹریکنگ اور اتار چڑھاؤ کو فلٹر کرنے کی حکمت عملی

جائزہ

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

حکمت عملی کا اصول

  1. حرکت پذیری اوسط انتخاب: حکمت عملی رجحانات کا فیصلہ کرنے کے لئے تین اہم حرکت پذیری اوسط (قلیل ، درمیانی اور طویل مدتی) کا استعمال کرتی ہے۔ صارف چھ پیش وضاحتی حرکت پذیری اوسطوں میں سے انتخاب کرسکتا ہے ، ہر قسم کی حرکت پذیری اوسط انفرادی طور پر پیرامیٹرز کو تشکیل دے سکتی ہے ، بشمول حساب کتاب کا دورانیہ ، اعداد و شمار کا ماخذ اور قسم (جیسے SMA ، EMA وغیرہ) ۔

  2. رجحانات کا جائزہ:

    • کثیر سر رجحان: جب قلیل مدتی اوسط طویل مدتی اوسط سے زیادہ ہو اور درمیانی مدت کی اوسط طویل مدتی اوسط سے اوپر کی طرف بڑھ جائے۔
    • بالائی رجحان: جب قلیل مدتی اوسط طویل مدتی اوسط سے کم ہو اور درمیانی مدت کی اوسط طویل مدتی اوسط سے نیچے کی طرف گزر جائے۔
  3. بیل اور ریچھ کی مارکیٹ کا فیصلہ: چوتھی حرکت پذیر اوسط کو بیل اور ریچھ کی مارکیٹ کی حدود کے طور پر استعمال کرنے کا انتخاب کریں۔ جب قیمت اس لائن کے اوپر ہوتی ہے تو صرف زیادہ کرنے کی اجازت ہوتی ہے۔ اس کے برعکس صرف خالی کرنے کی اجازت ہے۔

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

  5. ان پٹ منطق:

    • کثیر سر داخلہ: کثیر سر رجحان کی تصدیق ، اتار چڑھاؤ کی شرائط کو پورا کرنے اور طویل مدتی اوسط سے زیادہ قیمت پر زیادہ پوزیشن کھولنے کے لئے۔
    • خالی سر داخلہ: خالی سر رجحان کی تصدیق ، اتار چڑھاؤ کی شرائط کو پورا کرنے اور طویل مدتی اوسط سے نیچے کی قیمت پر پوزیشن کھولنے پر خالی کریں۔
  6. باہر نکلنے کی منطق:

    • جزوی صفائی: جب رجحان الٹ جاتا ہے ((میڈیم میڈین لائن اور طویل مدتی میڈین لائن ایک بار پھر سے کراس) ، پوزیشن کا ایک خاص تناسب صاف کریں۔
    • تمام فلیٹ پوزیشنیں: جب قیمت بیل اور ریچھ کی مارکیٹ کی حدود کو پار کرتی ہے تو ، تمام مخالف سمت کی پوزیشنوں کو صاف کریں۔
  7. سٹاپ نقصان: ایک مقررہ فیصد سٹاپ نقصان کا استعمال کرتے ہوئے، صارف اپنی مرضی کے مطابق سٹاپ نقصان تناسب کر سکتے ہیں.

  8. پوزیشن مینجمنٹ: ہر پوزیشن کھولنے پر اکاؤنٹ کے حقوق اور مفادات کا ایک مقررہ فیصد ، صارف اپنی مرضی کے مطابق کرسکتا ہے۔

اسٹریٹجک فوائد

  1. کثیر جہتی رجحانات کا تجزیہ: ایک سے زیادہ منتقل اوسط کا استعمال کرتے ہوئے ، حکمت عملی مارکیٹ کے رجحانات کو زیادہ جامع طور پر پکڑ سکتی ہے اور جھوٹے اشاروں کو کم کرسکتی ہے۔

  2. لچکدار پیرامیٹرز کی ترتیب: صارف مختلف مارکیٹوں اور تجارت کی اقسام کی خصوصیات کے مطابق مختلف پیرامیٹرز کو لچکدار طریقے سے ایڈجسٹ کرسکتا ہے ، بشمول اوسط لائن کی قسم ، دورانیہ اور اعداد و شمار کے ذرائع وغیرہ۔

  3. اتار چڑھاؤ کی شرح فلٹرنگ: اتار چڑھاؤ کی شرح کے اشارے کو متعارف کرانے کے ذریعے ، حکمت عملی کم اتار چڑھاؤ کے ماحول میں تجارت سے بچنے اور سگنل کے معیار کو بہتر بنانے میں مدد دیتی ہے۔

  4. بیل اور ریچھ کی منڈی میں موافقت: ایک منتخب بیل اور ریچھ کی منڈی میں فیصلہ کرنے کا طریقہ کار حکمت عملی کو مختلف مارکیٹ کے حالات کے مطابق بہتر طور پر اپنانے کے قابل بناتا ہے ، جس سے منفی تجارت میں کمی واقع ہوتی ہے۔

  5. متحرک پوزیشن مینجمنٹ: اکاؤنٹ کے حقوق اور مفادات پر مبنی پوزیشن مینجمنٹ کا طریقہ ، جو اکاؤنٹ کے سائز میں تبدیلی کے ساتھ خود بخود تجارت کے سائز کو ایڈجسٹ کرسکتا ہے۔

  6. کثیر سطحی خطرے کا کنٹرول: متعدد خطرے کے کنٹرول کا طریقہ کار ، بشمول اتار چڑھاؤ کی شرح فلٹرنگ ، رجحان کی تصدیق ، جزوی صفائی اور فکسڈ اسٹاپ نقصانات۔

  7. دو طرفہ تجارت: مختلف مارکیٹ کے حالات میں تجارت کے مواقع تلاش کرنے کے لئے زیادہ اور کم کرنے کی حمایت کرتا ہے۔

  8. بصری معاونت: حکمت عملی نے چارٹ پر چلتی اوسط اور ٹریڈنگ سگنل ٹیگس کا نقشہ تیار کیا ہے تاکہ بصری تجزیہ اور ردعمل کی سہولت فراہم کی جاسکے۔

اسٹریٹجک رسک

  1. تاخیر: حرکت پذیر اوسط بنیادی طور پر ایک تاخیر کا اشارے ہے ، جس کی وجہ سے داخلے اور باہر نکلنے کے وقت میں معمولی تاخیر ہوسکتی ہے ، جس سے منافع بخش صلاحیت متاثر ہوتی ہے۔

  2. زلزلے کی منڈیوں کی کارکردگی خراب ہے: زلزلے کی منڈیوں میں ، حکمت عملی اکثر غلط سگنل پیدا کرسکتی ہے ، جس سے زیادہ تجارت اور نقصان ہوتا ہے۔

  3. پیرامیٹرز کی حساسیت: حکمت عملی کی کارکردگی پیرامیٹرز کی ترتیب پر بہت زیادہ انحصار کرتی ہے۔ مختلف مارکیٹوں اور ٹائم فریموں میں پیرامیٹرز کے مختلف مجموعوں کی ضرورت پڑسکتی ہے۔

  4. واپسی کا خطرہ: جب رجحان الٹ جاتا ہے تو ، حکمت عملی پوری طرح سے وقت پر نہیں آسکتی ہے ، جس سے بڑی واپسی کا سبب بنتا ہے۔

  5. تکنیکی اشارے پر بہت زیادہ انحصار: حکمت عملی مکمل طور پر تکنیکی اشارے پر مبنی ہے ، بنیادی عوامل کو نظرانداز کرتی ہے ، اور اہم خبروں یا واقعات کی صورت میں خراب کارکردگی کا مظاہرہ کرسکتی ہے۔

  6. فنڈ مینجمنٹ کا خطرہ: فکسڈ تناسب پوزیشن مینجمنٹ کا طریقہ کار مسلسل نقصانات میں زیادہ خطرہ کا باعث بن سکتا ہے۔

  7. اسٹاپ نقصان کی ترتیب: مقررہ فیصد اسٹاپ نقصان تمام مارکیٹ کے حالات پر لاگو نہیں ہوسکتا ہے ، اور اعلی اتار چڑھاؤ کے اوقات میں ابتدائی اسٹاپ نقصان کا سبب بن سکتا ہے۔

حکمت عملی کی اصلاح کی سمت

  1. موافقت پذیر پیرامیٹرز: مارکیٹ کی صورتحال کے مطابق متحرک اوسط پیرامیٹرز اور اتار چڑھاؤ کی حد کو ایڈجسٹ کرنے کے لئے موافقت پذیر میکانزم متعارف کرایا گیا ہے۔

  2. ملٹی ٹائم فریم تجزیہ: طویل اور مختصر ٹائم فریم کی معلومات کے ساتھ مل کر ، رجحانات کی درستگی کو بہتر بنائیں۔

  3. اتار چڑھاؤ کے اشارے کی اصلاح: مارکیٹ کی صورتحال کا زیادہ درست اندازہ لگانے کے لئے اے ٹی آر یا بولنگر بینڈوتھ جیسے زیادہ پیچیدہ اتار چڑھاؤ کے اشارے استعمال کرنے پر غور کریں۔

  4. متحرک اشارے متعارف کروانا: متحرک اشارے جیسے آر ایس آئی یا ایم اے سی ڈی کے ساتھ مل کر ، داخلہ اور باہر نکلنے کے وقت کو بہتر بنائیں۔

  5. نقصانات کو روکنے کے طریقہ کار کو بہتر بنانا: مارکیٹ میں اتار چڑھاو کو بہتر بنانے کے لئے ٹریکنگ اسٹاپس یا اے ٹی آر پر مبنی متحرک اسٹاپس کو لاگو کرنا

  6. مارکیٹ کے جذبات کے اشارے کو مربوط کرنا: مارکیٹ کے جذبات کے اشارے جیسے VIX متعارف کروائیں ، مختلف مارکیٹ کے حالات میں کارکردگی کو بہتر بنانے کی حکمت عملی۔

  7. پوزیشن مینجمنٹ کو بہتر بنائیں: متحرک پوزیشن مینجمنٹ کو لاگو کریں جو اتار چڑھاؤ کی شرح یا موجودہ منافع پر مبنی ہے ، تاکہ خطرے کو بہتر طور پر کنٹرول کیا جاسکے۔

  8. بنیادی فلٹر شامل کریں: اہم اقتصادی اعداد و شمار کی اشاعت یا کمپنی کی آمدنی جیسے بنیادی عوامل پر غور کریں اور اعلی خطرے کے دوران تجارت سے گریز کریں۔

  9. مشین لرننگ کی اصلاح: مشین لرننگ الگورتھم کا استعمال کرتے ہوئے پیرامیٹرز کے مجموعے اور فیصلہ سازی کے قواعد کو بہتر بنانا ، حکمت عملی کی موافقت کو بہتر بنانا۔

  10. بیک اپ اور فارورڈ ٹیسٹنگ: حکمت عملی کی استحکام کی توثیق کرنے کے لئے زیادہ جامع بیک اپ اور مختلف مارکیٹوں اور وقت کے دوران فارورڈ ٹیسٹنگ۔

خلاصہ کریں۔

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

حکمت عملی کا ماخذ کوڈ
/*backtest
start: 2023-07-23 00:00:00
end: 2024-07-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="WODIsMA Strategy", shorttitle="WMA_Strategy", overlay=true, overlay=true, pyramiding=2, default_qty_value=6, default_qty_type=strategy.fixed, initial_capital=1000, currency=currency.USD)

// 用户输入参数
capital_pct = input.float(20, title="每笔订单使用的资金百分比(%)", minval=0.1, maxval=100, group="Position") / 100
close_pct = input.float(20, title="每次平仓使用的百分比(%)", minval=0, maxval=100, group="Position") / 100
stop_loss_user = input.float(10, title="止损百分比(%)", minval=0, maxval=100, group="Position") / 100
allow_long = input.bool(true, title="是否做多", group="Position")
allow_short = input.bool(true, title="是否做空", group="Position")

// 用户选择的移动平均线
short_term_ma = input.string("MA 0", title="短期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
mid_term_ma = input.string("MA 1", title="中期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
long_term_ma = input.string("MA 2", title="长期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
bull_bear_ma = input.string("MA 3", title="牛熊趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
enable_bull_bear = input.bool(false, title="是否启用牛熊趋势线", group="TrendIdentify")
// 波动率指标参数
volatility_k = input.int(60, title="波动率数值K线数" , group="volatility")
volatility_threshold = input.float(1, minval=0, title="波动率值 0则不使用(%)", group="volatility")

// 定义不同类型的移动平均线函数
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

// 定义每根均线的输入参数和颜色
length0 = input.int(16, minval=1, title="Length 0", group="MA 0")
source0 = input.source(hl2, title="Source 0", group="MA 0")
type0 = input.string("SMA", title="Type 0", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 0")
timeframe0 = input.timeframe("", title="Timeframe 0", group="MA 0")
color0 = input.color(color.gray, title="Color 0", group="MA 0")
show0 = input.bool(true, title="Show MA 0", group="MA 0")

length1 = input.int(48, minval=1, title="Length 1", group="MA 1")
source1 = input.source(hl2, title="Source 1", group="MA 1")
type1 = input.string("SMA", title="Type 1", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 1")
timeframe1 = input.timeframe("", title="Timeframe 1", group="MA 1")
color1 = input.color(color.aqua, title="Color 1", group="MA 1")
show1 = input.bool(true, title="Show MA 1", group="MA 1")

length2 = input.int(144, minval=1, title="Length 2", group="MA 2")
source2 = input.source(hl2, title="Source 2", group="MA 2")
type2 = input.string("SMA", title="Type 2", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 2")
timeframe2 = input.timeframe("", title="Timeframe 2", group="MA 2")
color2 = input.color(color.orange, title="Color 2", group="MA 2")
show2 = input.bool(true, title="Show MA 2", group="MA 2")

length3 = input.int(432, minval=1, title="Length 3", group="MA 3")
source3 = input.source(hl2, title="Source 3", group="MA 3")
type3 = input.string("SMA", title="Type 3", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 3")
timeframe3 = input.timeframe("", title="Timeframe 3", group="MA 3")
color3 = input.color(color.green, title="Color 3", group="MA 3")
show3 = input.bool(true, title="Show MA 3", group="MA 3")

length4 = input.int(91, minval=1, title="Length 4", group="MA 4")
source4 = input.source(hl2, title="Source 4", group="MA 4")
type4 = input.string("SMA", title="Type 4", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 4")
timeframe4 = input.timeframe("D", title="Timeframe 4", group="MA 4")
color4 = input.color(color.rgb(159, 110, 208), title="Color 4", group="MA 4") // 浅紫色
style4 = input.string("step", title="Style 4", options=["line", "step"], group="MA 4")
show4 = input.bool(false, title="Show MA 4", group="MA 4")

length5 = input.int(182, minval=1, title="Length 5", group="MA 5")
source5 = input.source(hl2, title="Source 5", group="MA 5")
type5 = input.string("SMA", title="Type 5", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 5")
timeframe5 = input.timeframe("D", title="Timeframe 5", group="MA 5")
color5 = input.color(color.red, title="Color 5", group="MA 5")
style5 = input.string("step", title="Style 5", options=["line", "step"], group="MA 5")
show5 = input.bool(true, title="Show MA 5", group="MA 5")

// 计算每根均线的值
value0 = request.security(syminfo.tickerid, timeframe0, ma(source0, length0, type0))
value1 = request.security(syminfo.tickerid, timeframe1, ma(source1, length1, type1))
value2 = request.security(syminfo.tickerid, timeframe2, ma(source2, length2, type2))
value3 = request.security(syminfo.tickerid, timeframe3, ma(source3, length3, type3))
value4 = request.security(syminfo.tickerid, timeframe4, ma(source4, length4, type4))
value5 = request.security(syminfo.tickerid, timeframe5, ma(source5, length5, type5))

// 绘制每根均线
plot(show0 ? value0 : na, title="MA 0", color=color0)
plot(show1 ? value1 : na, title="MA 1", color=color1)
plot(show2 ? value2 : na, title="MA 2", color=color2)
plot(show3 ? value3 : na, title="MA 3", color=color3)
plot(show4 ? value4 : na, title="MA 4", color=color4, style=style4 == "step" ? plot.style_stepline : plot.style_line, linewidth=2)
plot(show5 ? value5 : na, title="MA 5", color=color5, style=style5 == "step" ? plot.style_stepline : plot.style_line, linewidth=2)

// 添加策略部分

// 选择均线值
get_ma_value(ma_name) =>
    if (ma_name == "MA 0")
        value0
    else if (ma_name == "MA 1")
        value1
    else if (ma_name == "MA 2")
        value2
    else if (ma_name == "MA 3")
        value3
    else if (ma_name == "MA 4")
        value4
    else
        value5

short_ma_value = get_ma_value(short_term_ma)
mid_ma_value = get_ma_value(mid_term_ma)
long_ma_value = get_ma_value(long_term_ma)
bull_bear_ma_value = get_ma_value(bull_bear_ma)

// 计算波动率
high_close = ta.highest(high, volatility_k)
low_close = ta.lowest(low, volatility_k)
volatility = 100 * (high_close - low_close) / low_close

// 波动率条件背景色
volatilityCondition = (volatility > volatility_threshold)
volatilityConditionBG = (volatility > volatility_threshold) and volatility_threshold != 0

bgcolor(volatilityConditionBG ? color.new(color.green, 90) : na, title="Volatility Background")

// 策略信号
long_condition = (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value))
short_condition = (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value))

var float stop_level_long = na
var float stop_level_short = na

// 执行策略
if (volatilityCondition and allow_long and (not enable_bull_bear or close > bull_bear_ma_value)) 
    if (long_condition and close > long_ma_value)  // 判断是否立即触发止损
        strategy.entry("Long", strategy.long, qty=capital_pct * strategy.equity / close)
        label.new(bar_index, low*0.996, text="BUY", color=color.green, textcolor=color.white, style=label.style_label_up, size=size.small)

if (volatilityCondition and allow_short and (not enable_bull_bear or close < bull_bear_ma_value)) 
    if (short_condition and close < long_ma_value)  // 判断是否立即触发止损
        strategy.entry("Short", strategy.short, qty=capital_pct * strategy.equity / close)
        label.new(bar_index, high*1.004, text="SELL", color=color.red, textcolor=color.white, style=label.style_label_down, size=size.small)

// 部分平仓逻辑
if (enable_bull_bear)
    // 当当前价格处在牛熊趋势均线之下时
    if (close < bull_bear_ma_value)
        // 平所有多仓
        if (strategy.position_size > 0)
            strategy.close("Long", comment="平所有多仓")
            label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)
        // 当短期均线在长期均线之上时,中期均线向上穿过长期均线,平空
        if (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value) and volatilityCondition)
            if (strategy.position_size < 0)
                strategy.close("Short", qty=close_pct * strategy.position_size, comment="部分平空")
                label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)

    // 当当前价格处在牛熊趋势均线之上时
    if (close > bull_bear_ma_value)
        // 平所有空仓
        if (strategy.position_size < 0)
            strategy.close("Short", comment="平所有空仓")
            label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)
        // 当短期均线在长期均线之下时,中期均线向下穿过长期均线,平多
        if (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value) and volatilityCondition)
            if (strategy.position_size > 0)
                strategy.close("Long", qty=close_pct * strategy.position_size, comment="部分平多")
                label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)
else if (not enable_bull_bear and not (allow_long and allow_short))
    // 当短期均线在长期均线之上时,中期均线向上穿过长期均线,平空
    if (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value) and volatilityCondition)
        if (strategy.position_size < 0)
            strategy.close("Short", qty=close_pct * strategy.position_size, comment="部分平空")
            label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)

    // 当短期均线在长期均线之下时,中期均线向下穿过长期均线,平多
    if (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value) and volatilityCondition)
        if (strategy.position_size > 0)
            strategy.close("Long", qty=close_pct * strategy.position_size, comment="部分平多")
            label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)

// 止损处理
if (strategy.position_size > 0)
    stop_level_long_user = strategy.position_avg_price * (1 - stop_loss_user)
    strategy.exit("Stop Loss", from_entry="Long", stop=stop_level_long_user)
else if (strategy.position_size < 0)
    stop_level_short_user = strategy.position_avg_price * (1 + stop_loss_user)
    strategy.exit("Stop Loss", from_entry="Short", stop=stop_level_short_user)