أرى خطأ "لا يمكن إنشاء أمر بكمية سالبة"

يظهر هذا الخطأ إذا أصبح رصيد الإستراتيجية سالبًا وكان العدد الإجمالي للعقود المحسوبة لدوال strategy.entry() أو strategy.order() عبارة عن قيمة عدد صحيح سالب (الكمية<0). يمكن تجنبه عن طريق تعديل إعدادات الإستراتيجية من قائمة الخصائص أو عن طريق تغيير منطق الإستراتيجية مباشرة.

مصدر الخطأ 

دعنا نلقي نظرة على النص حيث يتم حساب كمية الأمر كنسبة مئوية من الأسهم ، إما من خلال إعداد حجم الأمر في إعدادات الإستراتيجية ، أو عبر ثابت strategy_percent_of_equity في مصدر Pine للإستراتيجية. في كل شمعة، يتم استدعاء دالة strategy.entry() للدخول إلى الصفقة:

//@version=5 
strategy("negative_qty", default_qty_type = strategy.percent_of_equity) 
strategy.entry("Short", strategy.short) plot(strategy.equity)

عند إضافة البرنامج النصي إلى NASDAQ: مخطط AAPL للإطار الزمني 1D ، يتعطل البرنامج النصي بسبب خطأ في وقت التشغيل:

Cannot create an order with negative quantity. Current qty_type is percent_of_equity and equity is less than 0

لفهم سبب هذا الخطأ ، يجب أن ترسم رأس المال باستخدام متغير strategy.equity  وإضافة قيد على الاستدعاء للدالة strategy.entry() باستخدام أي عامل تشغيل للشرط. بهذه الطريقة ، لن يتم استدعاء دالة إدخال مركز في كل شمعة (ولن تتسبب في إعادة حساب إضافية للمعلمات ، بما في ذلك قيمة الرصيد) وسيتم حساب البرنامج النصي بنجاح:

//@version=5 
strategy("negative_qty", default_qty_type = strategy.percent_of_equity) 

if strategy.equity > 0
     strategy.entry("Short", strategy.short) 

hline(0, "zero line", color = color.black, linestyle = hline.style_dashed) plot(strategy.equity, color = color.black, linewidth = 3) 

عند افتتاح الشمعة الثانية (bar_index = 1), ، تدخل الإستراتيجية في صفقة بيع. ولكن مع نمو قيمة AAPL ، فإن الربح (قيمة الإستراتيجية. متغير مفتوح الربح) من مركز البيع المفتوح ينخفض ، وفي النهاية رأس مال الإستراتيجية 

(strategy.equity = strategy.initial_capital + strategy.netprofit + strategy.openprofit) يصبح بالسالب

 يتم حساب عدد العقود المحسوبة بواسطة محرك الإستراتيجية على أنها الكمية = (حجم الأمر * الأسهم / 100) / الإغلاق.

 يمكن عرض المنطقة التي يتحول فيها رأس مال الإستراتيجية إلى قيم سالبة على النحو التالي:

//@version=5 
strategy("negative_qty", default_qty_type = 
strategy.percent_of_equity) 

if strategy.equity > 0
     strategy.entry("Short", strategy.short) 

hline(0, "zero line", color = color.black, linestyle = hline.style_dashed) plot(strategy.equity, color = color.black, linewidth = 3)  

equity_p = 1  // percents of equity  order size value (1% is default) qty = (equity_p * strategy.equity / 100) / close  

if qty <= -1
     var l1  = label.new(bar_index, strategy.equity, text = "Negative qty_value at \n bar index: " + str.tostring(bar_index) + ".\n" +  "Order size: " + str.tostring(math.round(qty)), color = color.white)
     var l2 = label.new(bar_index - 1, strategy.equity[1], text = "Order size : " + str.tostring(math.round(qty[1])), color = color.white)
    var l3 = label.new(bar_index - 2, strategy.equity[2], text = "Order size: " + str.tostring(math.round(qty[2])), color = color.white)    

bgcolor(qty > -1 ? color.green : color.red)

تُظهر لقطة الشاشة الملصق الموجود في قسم الأسهم السلبية ، حيث يكون عدد العقود الناتج - 2. عدد العقود في القسم الأخضر>=0:

إذا تم استدعاء strategy.entry() عند حساب الإستراتيجية على عمود ذي كمية سالبة (وكان عدد العقود سالبًا) ، فإن حساب الإستراتيجية يتوقف مع وجود خطأ.

كيف يمكن إصلاح الخطأ

كقاعدة عامة ، لا يظهر هذا الخطأ في إستراتيجية تم تنفيذها بشكل صحيح. لتجنب الأخطاء ، يجب أن تستخدم الإستراتيجية شروطًا للدخول والخروج من المركز والتوقفات والهامش. 

في حالة حدوث خطأ ، فإن الطرق الصحيحة لتصحيح أخطاء الاستراتيجية هي:

1. استخدام الرافعة المالية للهامش (الهامش لمراكز الشراء/ البيع في خصائص الإستراتيجية أو معلمات margin_long و margin_short في دالة strategy() (. إذا تم تحديد ذلك ، فسيتم تصفية جزء من المركز تلقائيًا إذا لم يكن لدى الإستراتيجية رصيد كافي للحفاظ عليها. 

 يمكنك معرفة المزيد حول هذه الدالة في المقالة الموجودة في دليل المستخدم الخاص بنا أو في منشور مدونة.

//@version=5 
strategy("", default_qty_type = strategy.percent_of_equity, default_qty_value = 10, margin_long = 100, margin_short = 100) 

longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28)) if (longCondition)    strategy.entry("Long", strategy.long) 

shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28)) if (shortCondition)    strategy.entry("Short", strategy.short)

2. التحقق من قيمة الرصيد لمعرفة ما إذا كانت أعلى من الصفر قبل استدعاء دوال Strategy.entry () أو Strategy.order () أو إعادة تحديد عدد عقود الدخول بالإضافة إلى ذلك.

//@version=5
strategy("", default_qty_type = strategy.percent_of_equity, default_qty_value = 10) 

if strategy.equity > 0     strategy.entry("Short", strategy.short)  // enter at 10 % of currently available equity 
else
     strategy.entry("Long", strategy.long, qty = 1) // Reverse position with fixed contract size

3. استخدام المتغيرات من فئة strategy.risk لإدارة المخاطر. يمكنك قراءة المزيد عن هذه في دليل المستخدم الخاص بنا.