تنتج الإستراتيجية نتائج جيدة بشكل غير واقعي من خلال النظر إلى المستقبل

أحد أهدافنا الرئيسية في تطوير لغة Pine هو تزويد المستخدمين بأكبر عدد ممكن من الأدوات المفيدة. قد يكون لهذه الأدوات مجموعة متنوعة من الاستخدامات المختلفة ، ومع بعض التلاعبات ، تسمح لك بعض المؤشرات وأنواع الرسوم البيانية باستخراج البيانات من الأعمدة أو الصفقات المستقبلية (بالنسبة للشريط الذي تتم معالجته حاليًا). نظرًا لأن المتداول لا يمكنه تلقي هذه البيانات في التداول الحقيقي ، فإن الاستراتيجيات المبنية حوله يمكن أن تؤدي إلى نتائج مربحة بشكل غير واقعي عند الاختبار العكسي ، بينما في التداول في الوقت الفعلي ، ستكون هذه التداولات عبارة عن خسائر. يُطلق على خطأ استخدام المعلومات من المستقبل في الاستراتيجيات أيضًا اسم التحيز في المستقبل.

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

إستراتيجيات استخدام الشموع اليابانية

السبب الشائع جدًا لهذا السلوك هو الاختبار الخلفي للإستراتيجية على الرسوم البيانية ذات التقنيات الفنية اليابانية (رينكو ، كاجي ، إلخ). تنشأ المشكلة من حقيقة أن مشغل الاختبار الخلفي Strategy Backtesting Engine يعتبر كل عمود بياني 4 معاملات ، مع أسعار الفتح وأعلى وأقل سعر والإغلاق (كما هو الحال مع مخطط الشموع العادي). وبسبب ذلك ، على مخطط رينكو ، يمكن لمحرك اختبار الإستراتيجية Backtesting Engine الدخول / الخروج من مركز بسعر لم يكن موجودًا في الواقع. بالإضافة إلى ذلك ، إذا قمت بتعيين قيمة المدى السعري Box Size لتكون أصغر من تيك السعر Mintick ، فمن الممكن التحقق مما إذا كان السعر التالي سيكون أعلى أو أقل من السعر الحالي والدخول / الخروج من المركز مقدمًا ، قبل أن يعالج Backtesting Engine السعر الحقيقي.


//@version=4
strategy("My Strategy", overlay=true) if close < close[1] strategy.entry("ShortEntryId", strategy.short) strategy.close("ShortEntryId", when = close > close[1])if close > close[1] strategy.entry("LongEntryId", strategy.long) strategy.close("LongEntryId", when = close < close[1])
JavaScript

كما ترى في لقطة الشاشة ، يمكن لهذه الإستراتيجية البسيطة أن تعقد صفقات بأسعار قريبة جدًا من الحد الأقصى / الأدنى للصفقات.

الاستراتيجيات التي تستخدم المعامل calc_on_order_fills = true

عندما يتم تحديد المعلمة calc_on_order_fills = true في وظيفة الإستراتيجية ، يقوم محرك الاختبار الخلفي بإجراء عملية حسابية إضافية داخل العمود البياني بعد تنفيذ الأمر (على عكس الموقف المعتاد عندما يتم حساب الإستراتيجية فقط عند إغلاق العمود البياني). في الوقت نفسه ، أثناء الحساب ، تحصل الإستراتيجية على إمكانية الوصول إلى العديد من معلمات الشريط الإضافية ، على سبيل المثال ، القيم العالية والمنخفضة. يتيح لك ذلك كتابة إستراتيجية تُظهر أداءً ممتازًا أثناء الاختبار الخلفي:

//@version=4
strategy("CalcOnOrderFillsStrategy", overlay=true, calc_on_order_fills=true)// a variable is used to prevent double entry on the same bar
var lastTimeEntry = 0
 longCondition = close > sma(close, 14)  and lastTimeEntry != time
if longCondition    strategy.entry("LongEntryId", strategy.long)
 strategy.exit("exitId", "LongEntryId", limit=high)
lastTimeEntry := time
JavaScript

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

المعلمة lookahead = barmerge.lookahead_on في الأصل المالي وأي أصل مالي قبل Pine v3

تتيح لك دالة الأصل المالي security في Pine طلب البيانات من الرموز و / أو الأطر الزمنية الأخرى. اعتمادًا على التنفيذ ، قد يسمح هذا للاستراتيجية بتلقي البيانات من المستقبل: إذا طلب أحدهم ، على سبيل المثال ، إغلاق أو ارتفاع العمود البياني يومي ، في حين أن الاختبار الخلفي للاستراتيجية يمكن أن يعرف هذه القيم مباشرة عند افتتاح اليوم.

قبل الإصدار 3 ، كانت دالة ترجع security القيمة من الإطار الزمني الأعلى حتى قبل أن يكون من الممكن الوصول إليها. في الإصدار 3 ، تم إصلاح هذا السلوك ، ولكن من أجل التوافق ، تمت إضافة معلمة lookahead إلى وظيفة الأمان. إنها خاطئة بشكل افتراضي (على سبيل المثال ، الرؤية المستقبلية متوقفة) ، ولكن يمكنك تمكينها عن طريق تعيين قيمة المعلمة lookahead إلى barmerge.lookahead_on).

مثال على استراتيجية مربحة تم إنشاؤها باستخدام هذه الميزة:


//@version=4
strategy("My Strategy", overlay=true) dayStart = security(syminfo.tickerid, "1D", time, lookahead=barmerge.lookahead_on) dayHigh = security(syminfo.tickerid, "1D", high, lookahead=barmerge.lookahead_on) dayLow = security(syminfo.tickerid, "1D", low, lookahead=barmerge.lookahead_on)// entry at first bar of a day if time == dayStart // distance to daily high is further, so we can earn moreif abs(open - dayHigh) > abs(open - dayLow) strategy.entry("LongEntryId", strategy.long) strategy.exit("exitLongId", "LongEntryId", limit=dayHigh)else strategy.entry("ShortEntryId", strategy.short) strategy.exit("exitShortId", "ShortEntryId", limit=dayLow)plot(dayHigh) plot(dayLow)
JavaScript

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

لاحظ أنه ليست كل الحالات التي يكون فيها security () يحتوي على وسيطة barmerge.lookahead_on تنظر إلى المستقبل: على سبيل المثال ، إذا أردنا تغيير الكود أعلاه عن طريق استبدال time / high / low inside security () بالوقت [1] / high [ 1] / منخفض [1] على التوالي ، سنتلقى قيمًا للأشرطة التي تم إغلاقها بالفعل. غالبًا ما يستخدم هذا من قبل المبرمجين ذوي الخبرة للحصول على البيانات من security () دون أي خطر من البحث.

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