تتناول هذه المقالة وظائف Oracle Database و PL / SQL و SQL و MATCH_RECOGNIZE و MODEL وجمعها ووظائف خطوط الأنابيب.
تم استخدام التحليل الفني (TA) للأسواق كمجال وظيفي. أولاً ، ملاحظة تمهيدية صغيرة سطحية حول التداول في الأسواق ، ثم الحسابات.
التحليل الفني - مجموعة من الأدوات للتنبؤ بتغيرات الأسعار المحتملة استنادًا إلى أنماط تغيرات الأسعار السابقة. من الناحية النظرية ، ينطبق التحليل الفني في أي سوق. لكن التحليل الفني الأكثر انتشارًا كان في الأسواق الحرة شديدة السيولة ، على سبيل المثال ، في البورصات.
تم تطوير العديد من عبارات SQL والإجراءات والرسوم البيانية. جزء - أدناه ، رمز كامل - على جيثب على الرابط في أسفل المقال.
مؤشرات السوق الفنية (TIR) - رسوم بيانية إضافية لمخططات الأسعار ، التي تم
تشكيلها على أساس تحويل القيم الموجودة في مخطط السعر الأساسي . عادة ما تكون هذه هي أنواع مختلفة من المتوسط (يتم احتساب النقطة التالية من المخطط على أنها متوسط قيمة عدد معين من قيم السعر السابقة ، على سبيل المثال ، متوسط متحرك) ، والعلاقات (النقطة التالية هي نتيجة مقارنة عدد معين من الأسعار السابقة - فرقها ، مشتق من تغيير خلال فترة) ، أو متخلفة ( التأخير). تظهر المؤشرات بوضوح بعض المعلومات غير الواضحة الواردة في إحصائيات تغيرات الأسعار ، ويمكن أن تشكل توصيات بشأن أوامر التجارة - شراء / بيع. تحتوي المؤشرات على متغير متغير واحد على الأقل ، حيث سيتم تغيير النتيجة.
لفتح معاملات حقيقية ، عادةً ما يتم استخدام العديد من المؤشرات مجتمعة ، بالإضافة إلى معلومات إضافية ، حسب تقدير التاجر.أحد مبادئ التحليل الفني هو "التاريخ يعيد نفسه": يتصرف المشاركون في السوق في ظروف مماثلة بنفس الطريقة تقريبًا ، ويشكلون ديناميات مماثلة لتغيرات الأسعار. ومن الطبيعي أن نفترض أن سلوك السوق في المستقبل سيكرر بشكل رئيسي الأنماط التي ظهرت في الماضي. بعد هذا البيان ، يمكن للمستثمر الاختيار من بين معلمات TIR المحتملة تلك التي أثبتت أنها أفضل في الفترات الماضية.
تبني هذه المقالة رسمًا بيانيًا عن أداء التجارة عند استخدام كل مؤشر على قيمة المعلمة TIR ، وهذا في تمثيل ثنائي الأبعاد. لكن في الواقع ، سأبني تمثيلًا ثلاثي الأبعاد من أجل تقييم تأثير التأخير في تنفيذ الأمر على النتيجة ، لذلك ستكون المعلمة هي المحور X (الإحداثيات السكانية) ، وسيكون التأخير هو المحور Y (الإحداثي) ، والنتيجة ستكون المحور Z (التطبيق). هذه بعض المحاولات لتقييم تأثير "الانزلاق" ، والذي يحدث ، للأسف ، دائمًا. بدلاً من "الانزلاق" الحقيقي على طول المحور ص ، أؤجل تنفيذ أمر الشراء / البيع لفترة من 1 إلى 5 فترات.
إذا تم تسليط الضوء على الحد الأقصى العام على هذا الرسم البياني ويبدو أن الرسم البياني نفسه يشبه القبعة (بشكل عام ، يطلق عليه "التوزيع الطبيعي" ، لكنه يفترض وجود تماثل صارم حول المحور العمودي) ، فإن المخروط ، الهرم ، مناسب أيضًا - وهذا يعني أنه يمكنك تحديد قيمة معلمة معينة لهذا ، والتي ستظهر أعلى نتيجة ، ويمكنك باستخدام هذا المؤشر محاولة التداول. إذا كان مخطط الأداء ، بناءً على المعلمة ، يشبه "stockade" ، فمن المستحيل اختيار قيمة المعلمة المثلى وليس هناك فائدة من استخدام
TIR هذا في التجارة.
يمكننا أن نقول أنني في هذه المقالة أحسب فقط "نسبة النجاح" للمؤشرات. المشكلة ، لتقييم مقدار ما يمكن أن "تكسب" ، لم أجرؤ.يعد الإكمال الناجح للاختبار الموصوف أحد العوامل الضرورية ، ولكنها ليست كافية للتداول الفعال.للحصول على معلومات ... على عكس التحليل الفني ، يعد التحليل الأساسي (FA) مصطلحًا لتعيين طرق للتنبؤ بقيمة السوق (التبادل) للأدوات بناءً على تحليل مؤشرات الأداء المالي والإنتاجي.
لا تتطابق "القيمة الجوهرية" للاتحاد في معظم الحالات مع سعر سهم الشركة ، والذي يتحدد بنسبة العرض والطلب في سوق الأسهم. يهتم المستثمرون الذين يستخدمون
اتحاد كرة القدم في أنشطتهم بشكل أساسي في الحالات التي تتجاوز فيها "القيمة الجوهرية" لأسهم الشركة سعر الأسهم في البورصة. تعتبر هذه الأسهم مقومة بأقل من قيمتها ، مما يعني أن سعرها سيرتفع ، وهي أهداف استثمارية محتملة.
يعد وارن بافيت أحد أفضل المستثمرين المعروفين الذين يستخدمون التحليل الأساسي.
تحقق من المقطورة:
https://www.youtube.com/watch؟v=SqE8fnvmV1Yوبالتالي ، لدينا نهجين متناقضين تمامًا -
TA و
FA .
عادة ما يهتم
اتحاد كرة القدم بالمستثمرين على المدى الطويل ، TA - على المدى القصير والمتوسط ويستخدم في المعاملات ذات الطبيعة المضاربة ، عندما يكون موضوع تداول المتداول غير مهتم.
وأهداف هذا المقال هما ...
بالإضافة إلى المناقشات حول
TA و
FA الموصوفة أعلاه ،
أردت استكشاف وإظهار قدرات Oracle Database في إجراء حسابات لمؤشرات السوق الفنية .
أقدم هذه الفرص لحكم القراء.
إذا قررت تكرار حساباتي - قم بتنزيل الكود من جيثب على الرابط في أسفل المقال. تم التحقق من الكود في الإصدار 12.2.0.1.
قم أولاً بإنشاء كائنات مشتركة. الأول هو الجداول وطريقة العرض. في نفس الملف أدناه ، توجد حزمة نمذجة للمعاملات.
الخطوة الثانية هي إنشاء الوظائف التي تؤدي حساب
TIR .
الخطوة الثالثة هي الحسابات.
ستُرجع جميع وظائف حساب جميع
TIRs مؤشرًا يحتوي على الحقول التالية: STOCK_NAME ، ADATE ، ACLOSE (سعر إغلاق اليوم) ، AACTION (أمر بيع / شراء)
تحتوي الحزمة على ثلاث وظائف لنمذجة جدولية تأخذ مؤشر إدخال من وظائف حساب
TIR الموضحة أعلاه ، والإزاحة (التأخير في تنفيذ الطلب ، والتأخر) ، ورأس المال الأولي ، افتراضيًا هو 1000 دولار أمريكي. تسمى وظائف الحزمة مثل هذا:
select * from HABR_TRADEMODELLING_P.TRADE_LOG (cursor (select STOCK_NAME, ADATE, ACLOSE, AACTION from table (HABR_MARKETINDEXES_XXXXXXXX_F_CALC (10))), p_lag => 1) order by 1, 2; select * from HABR_TRADEMODELLING_P.CALC_ACTIONS (cursor (select STOCK_NAME, ADATE, ACLOSE, AACTION from table (HABR_MARKETINDEXES_XXXXXXXX_F_CALC (10))), p_lag => 1); select * from HABR_TRADEMODELLING_P.CALC_ACTIONS_TOTALS (cursor (select STOCK_NAME, ADATE, ACLOSE, AACTION from table (HABR_MARKETINDEXES_XXXXXXXX_F_CALC (10))), p_lag => 1);
حيث XXXXXXXX هو اسم
TIR .
جميع الوظائف تحسب نتيجة التداول الخاضع لإعادة استثمار الأرباح بالكامل ، باستثناء تكاليف المعاملات والضرائب ، باستثناء التضخم والخصم.الوظيفة الأولى
TRADE_LOG
تشكل سجل معاملات تاجر مبسط. تتيح لك الوظيفة تتبع سلسلة المعاملات بالكامل. إذا كان المستثمر في نهاية الفترة "في الأوراق المالية" ، لحساب الرصيد بالعملة (النتيجة المالية) ، تحاكي الدالة بيع جميع الأوراق المالية عند سعر الإغلاق الأخير وتشكل العلامة المقابلة في حقل IN_STOCK.
تقوم الدالة الثانية
CALC_ACTIONS
بإرجاع نفس الأعمدة مثل مؤشر حساب
TIR المسمى ، بالإضافة إلى إضافة الأعمدة التالية:
AACTION_LAG
(ترتيب مع الإزاحة) ،
BALANCE_CURRENCY
(رصيد حساب المتداول نقدًا) ،
BALANCE_STOCK
(عدد الأدوات في المراكز المفتوحة). بناءً على قيمة الحقل
AACTION_LAG
، تتم محاكاة عملية الشراء أو البيع بسعر الإغلاق ، وبالتالي يتم تغيير الرصيد بالعملة وكمية المراكز المفتوحة.
في السطر الأخير من كل أداة ، يمكنك رؤية نتيجة التداول لكل أداة ، وكذلك في الوظيفة السابقة ، إذا كان المستثمر "في أوراق مالية" ، يتم محاكاة عملية البيع لحساب الرصيد بالعملة الأجنبية
الوظيفة الثالثة
CALC_ACTIONS_TOTALS
تفعل نفس الشيء مع الثانية ، ولكنها ترجع فقط الصف الأخير - نتيجة التداول لكل أداة. سيتم استخدامه في النمذجة.
تحميل البيانات
يتم تقديم الحسابات لمثل هذه الأسواق والمؤشرات: S & P500 ، NYSE ، Brent ، BTCUSD ، EURUSD.
تم تنزيل أول 4 من Yahoo المالية ، وآخر من مصدر آخر. قد تختلف نتائج حساب الدورات التدريبية من مصادر أخرى.
يرجى ملاحظة أن فترات دورات كل أداة مختلفة ، وهي:
- ستاندرد آند بورز 500 - 03/01/1950 ... 29/01/2019 ، 69 عامًا ؛
- NYSE - 31/12/1965 ... 22/03/2019 ، 54 سنة ؛
- برنت - 17/05/1991 ... 06/02/2019 ، 28 عامًا ؛
- BTCUSD - 16/07/2010 ... 29/01/2019 ، 9 سنوات ؛
- EURUSD - 16/02/2001 ... 27/05/2019 ، 18 عامًا.
لذلك ، من المستحيل مقارنة ربحية الأدوات المحققة مع بعضها البعض ، لكن من الممكن مقارنة ربحية كل أداة باستخدام مؤشرات مختلفة.
يمكن أيضًا تنزيل ملف التنزيل (SQL * Loader) من GitHub على الرابط في أسفل المقالة.
المتوسطات المتحركة
هناك ثلاثة أنواع رئيسية على الأقل من المتوسطات المتحركة:
- خطي (المتوسط المتحرك البسيط ، SMA) ،
- المتوسط المتحرك الأسي (EMA) و
- مرجح خطيًا (المتوسط المتحرك المرجح ، WMA).
إنها تختلف في أوزان الأجزاء المكونة لها. بالنسبة إلى المتوسط المتحرك الخطي ، الأوزان متساوية ، بالنسبة للأوزان الأسية والموزونة خطيًا ، فإنها تنخفض كلما تحرك المكون بعيدًا عن الحافة اليمنى من النافذة - أسيًا أو خطيًا.
المتوسط المتحرك الخطي هو أسهل حساب. في Oracle ، يكون هذا هو
avg (VALUE) over (partition by STOCK_NAME order by ADATE rows between 9 preceding and current row)
الوظيفة
avg (VALUE) over (partition by STOCK_NAME order by ADATE rows between 9 preceding and current row)
- متوسط متحرك مع متوسط نافذة من 10 قيم.
المتوسط المتحرك الخطي له عيوب. أولاً ، تستجيب هذه المتوسطات ببطء إلى انعكاسات السوق. نظرًا لأن متوسط القيم يتم إعطاء كل واحدة منها وزناً متساوياً ، فغالبًا ما يحدث متوسط الاستجابة لعدة أطر زمنية بعد عكس سعر الأصل.
أيضًا ، فإن المتوسط المتحرك الخطي ليس فعالًا للغاية ، لأنه يستجيب للإشارة مرتين: عندما يدخل المؤشر في النافذة المنزلقة ويتركها. لا يتفاعل الباقي إلا مع إدخال المؤشر وإزالته بسلاسة من الحساب أثناء انتقالك من الحافة اليمنى من النافذة إلى اليسار.
عند حساب
TIR ، يتم استخدام جميع الأنواع الثلاثة للمتوسطات المتحركة. من أجل الأسي والمرجحة خطيًا في هذه المقالة ، يتم تطوير الدالتين التجميعيتين
EMA
و
WMA
، والتي يتم استخدامها في شكل تحليلي. بالإضافة إلى ذلك ، يمكن حساب هذه المتوسطات المتحركة عن طريق التكرار أو النموذج (عبارة
MODEL
).
حساب EMA و WMA ، دون تكرار أو modelka ، فقط عن طريق التحليلات ، في Oracle Database ، على ما يبدو ، أمر مستحيل.
ولكن لا تزال تحفظات بشأن المتوسطات المتحركة:
- كلما كانت فترة حساب المتوسط أقصر وأكثر تفاعلًا مع الحساسية تجاه المنعطفات ، كلما أعطت إشارات خاطئة ؛
- كلما كانت فترة حساب المتوسط أقصر ، كلما تم إنشاء المزيد من الإشارات ، زاد مقدار الحمل في المعاملة ، مما قد يصبح مهمًا للغاية.
مؤشرات السوق الفنية
لكل مؤشر تقريبًا ، سيتم إعطاء عدة طرق حسابية: CALC - حساب باستخدام كود PL / SQL أو SIMP - حساب بواسطة عامل واحد أو RECU - حساب بالتكرار ، AGRF - حساب باستخدام دالة التجميع ، MODE - حساب حسب النموذج.
هناك أسباب لتطوير عدة طرق. أولاً ، من خلال حساب
TIR باستخدام عدة طرق ومقارنة المؤشرات ، إذا كانت المؤشرات متماثلة ، فيمكنك التأكد من إجراء العمليات الحسابية بشكل صحيح (مع الأخذ في الاعتبار الطرق المختلفة لتقريب ومعالجة القيم NULL و "0"). سأقارن في هذه المقالة بتجزئة عينات من الطرق المختلفة ، لذا فإن التطابق مع البتات والتجهيز نفسه لجميع الخوارزميات مضمون.
أعتقد أن Oracle بحاجة إلى البدء في تطوير
TIR باستخدام طريقة SIMP - حساب من قبل مشغل واحد. عندما يتم ذلك ، فإن أوراكلويد لديه خطة وخوارزمية حساب في رأسه ، ويمكن نقلها بسهولة إلى PL / SQL أو إلى لغة إجرائية أخرى.
ألاحظ أن طريقة حساب CALC لـ PL / SQL هنا أسرع من طريقة SIMP (مع عامل تشغيل واحد) إذا كان يمكن إجراء الحساب بالكامل في مسار واحد على طول المؤشر. ولكن إذا كان عليك إنشاء جداول أو مجموعات مؤقتة لحسابك ، أو أكثر من تمرير واحد على المؤشر - أعتقد أن طريقة "المشغل الواحد" ستصبح أسرع وأقل كثافة في استخدام الموارد.
بالنسبة لجميع الطرق ، بما في ذلك طريقة SIMP ("مشغل واحد") ، سأضع المشغلين في وظائف بحيث يمكن استدعاء الحساب باستخدام معلمة لتحديد القيمة المثلى.
يتم إعطاء الحسابات لسبعة
TIRs : تقاطع المتوسط المتحرك (EMASIMPLE) ، تقاطعات Golden and Death (CROSSES) ، حجم الرصيد (OBV) ، قناة Keltner (KELTNER) ، اتجاه السعر والحجم (PVT) ، مؤشر سهولة حركة الذراعين (EMV) ) ، مؤشر قناة السلع (CCI).
بالنسبة للمؤشرات السبعة لهاتين المادتين ، سيكون هناك معلمة واحدة "متوسط حجم النافذة" ، والمعلمة الثانية - تحول (تأخر). يشير التحول إلى عدد الأعمدة التي تحتاج إلى تأجيل تنفيذ أمر الشراء / البيع - كم عدد الأشرطة لتحريك سعر الإغلاق (يتم إجراء جميع الطلبات بسعر إغلاق الشريط). هذا يشبه "الانزلاق" ، لكنه ليس بالضبط "الانزلاق". عادةً لا يكون Slippage في صالح العميل ، وقد يتضح أن تأخرنا ليس لصالح العميل أو لصالحه. ومع ذلك ، فإن استخدام النمذجة مع تأخر 1 إلى 5 أشرطة لبعض المؤشرات يدل على أن الانزلاق له تأثير كبير على النتيجة. وبالنسبة لبعض المؤشرات ، التأخر والانزلاق ليسا في غاية الأهمية.
تستخدم طرق SIMP ("المشغل الفردي") و RECU ("العودية") بنشاط العبارة
MATCH_RECOGNIZE
لإنشاء إشارة تداول BUY / SELL استنادًا إلى دخول / خروج
TIR المحسوب في النطاق المحدد أو سلوكه بالنسبة إلى متوسطه المتحرك.
يمكن العثور على وصف تفصيلي لجميع TIRs على ويكيبيديا أو في كتاب روبرت كولبي ، موسوعة مؤشرات السوق الفنية.تقاطع المتوسط المتحرك الأسي
طريقة تقاطع المتوسطات المتحركة الأسية هي أبسط طرق
النقل البري الدولي .
تتضمن الطريقة: شراء (فتح مركز شراء طويل) إذا تجاوزت قيمة السعر المتوسط المتحرك الأسي من أسفل إلى أعلى (ESA) ؛ البيع (إغلاق مركز طويل) إذا تجاوز السعر ESS الخاص به من أعلى إلى أسفل.
لا يتم النظر في صفقات البيع ، وكذلك تداول الهامش بشكل عام ، في هذه المقالة.
في المستقبل ، يمكن استخدام هذا المؤشر كمعيار للمقارنة مع الآخرين. تعد المقارنة مع
TIR أفضل من المقارنة مع استراتيجية الشراء والاستحواذ ، لأن هذه الإستراتيجية ليست مربحة في الأسواق المتراجعة.
المعلمة
TIR الوحيدة هي طول المتوسط المتحرك.
حساب باستخدام PL / SQL
create or replace function HABR_MARKETINDEXES_EMASIMPLE_F_CALC (p_averaging_window_width integer) return HABR_MARKETINDEXES_RESULT_LIST_T pipelined is l_result HABR_MARKETINDEXES_RESULT_LIST_T; EMA number; prev_EMA number; prev_TYPICAL_PRICE number; retval HABR_MARKETINDEXES_RESULT_T := HABR_MARKETINDEXES_RESULT_T (null, null, null, null, null, null, null, null, null); prev_STOCK_NAME varchar2(256); l_alpha number; begin l_alpha := 2 / (p_averaging_window_width + 1); for c1 in (select STOCK_NAME, ADATE, TYPICAL_PRICE, ACLOSE from LOAD_YAHOO_V order by 1, 2) loop retval.ADATE := c1.ADATE; retval.ACLOSE := c1.ACLOSE; if prev_STOCK_NAME is null or prev_STOCK_NAME <> c1.STOCK_NAME then retval.STOCK_NAME := c1.STOCK_NAME; EMA := c1.TYPICAL_PRICE; prev_EMA := null; else EMA := round (c1.TYPICAL_PRICE * l_alpha + EMA * (1 - l_alpha), 20); end if; if prev_TYPICAL_PRICE < prev_EMA and c1.TYPICAL_PRICE > EMA then retval.AACTION := 'BUY'; elsif prev_TYPICAL_PRICE > prev_EMA and c1.TYPICAL_PRICE < EMA then retval.AACTION := 'SELL'; else retval.AACTION := null; end if; retval.IND_VALUE := EMA; pipe row (retval); prev_STOCK_NAME := c1.STOCK_NAME; prev_EMA := EMA; prev_TYPICAL_PRICE := c1.TYPICAL_PRICE; end loop; end;
حساب من قبل مشغل العودية واحد
create or replace function HABR_MARKETINDEXES_EMASIMPLE_F_RECU (p_averaging_window_width integer) return HABR_MARKETINDEXES_RESULT_LIST_T is l_result HABR_MARKETINDEXES_RESULT_LIST_T; begin with T1 (STOCK_NAME, ADATE, TYPICAL_PRICE, EMA, ACLOSE, RN) as (select STOCK_NAME, ADATE, TYPICAL_PRICE, round (TYPICAL_PRICE, 20), ACLOSE, RN from LOAD_YAHOO_V where RN = 1 union all select b.STOCK_NAME , b.ADATE , b.TYPICAL_PRICE , round (b.TYPICAL_PRICE * 2 / (p_averaging_window_width + 1) + a.EMA * (1 - 2 / (p_averaging_window_width + 1)), 20) , b.ACLOSE , b.RN from T1 a, LOAD_YAHOO_V b where b.RN = a.RN + 1 and b.STOCK_NAME = a.STOCK_NAME) select HABR_MARKETINDEXES_RESULT_T (STOCK_NAME, ADATE, ACLOSE, EMA, null, null, null, null, AACTION) bulk collect into l_result from T1 match_recognize (partition by STOCK_NAME order by ADATE measures classifier() as AACTION all rows per match with unmatched rows pattern (BUY+ | SELL+) define BUY as (prev (TYPICAL_PRICE) < prev (EMA) and TYPICAL_PRICE > EMA) , SELL as (prev (TYPICAL_PRICE) > prev (EMA) and TYPICAL_PRICE < EMA) ) MR; return l_result; end;
حساب باستخدام عبارة MODEL
وظيفة النص HABR_MARKETINDEXES_EMASIMPLE_F_MODE create or replace function HABR_MARKETINDEXES_EMASIMPLE_F_MODE (p_averaging_window_width integer) return HABR_MARKETINDEXES_RESULT_LIST_T is l_result HABR_MARKETINDEXES_RESULT_LIST_T; begin with T1 as (select * from LOAD_YAHOO_V model dimension by (STOCK_NAME, RN) measures (ADATE, TYPICAL_PRICE, ACLOSE, to_number(null) as EMA) rules (EMA[any, any] = round (TYPICAL_PRICE [cv(), cv()] * 2 / (p_averaging_window_width + 1) + nvl(EMA [cv(), cv() - 1], TYPICAL_PRICE [cv(), cv()]) * (1 - 2 / (p_averaging_window_width + 1)), 20))) , T2 as (select STOCK_NAME, ADATE, ACLOSE , TYPICAL_PRICE, LAG (TYPICAL_PRICE) over (partition by STOCK_NAME order by ADATE) as PREV_TYPICAL_PRICE , EMA, lag (EMA) over (partition by STOCK_NAME order by ADATE) as PREV_EMA from T1) select HABR_MARKETINDEXES_RESULT_T (STOCK_NAME, ADATE, ACLOSE, EMA, null, null, null, null , case when prev_TYPICAL_PRICE < prev_EMA and TYPICAL_PRICE > EMA then 'BUY' when prev_TYPICAL_PRICE > prev_EMA and TYPICAL_PRICE < EMA then 'SELL' end) bulk collect into l_result from T2 order by STOCK_NAME, ADATE; return l_result; end;
حساب باستخدام وظيفة الكلي
نص الدالة التجميعية EMA والدالة HABR_MARKETINDEXES_EMASIMPLE_F_AGRF create or replace type EMA_DATA_T as object (AVALUE number, AVERAGING_WINDOW integer); create or replace type EMA_IMPL_T as object ( l_window_width integer, l_ema number, static function ODCIAggregateInitialize (sctx in out EMA_IMPL_T) return number, member function ODCIAggregateIterate (self in out EMA_IMPL_T, value in EMA_DATA_T) return number, member function ODCIAggregateMerge (self in out EMA_IMPL_T, ctx2 in EMA_IMPL_T) return number, member function ODCIAggregateTerminate (self in EMA_IMPL_T, returnValue out number, flags in number) return number ); create or replace type body EMA_IMPL_T is static function ODCIAggregateInitialize (sctx in out EMA_IMPL_T) return number is begin sctx := EMA_IMPL_T (null, null); return ODCIConst.Success; end; member function ODCIAggregateIterate (self in out EMA_IMPL_T, value in EMA_DATA_T) return number is begin if value.AVALUE is not null then if l_window_width is null then l_window_width := value.AVERAGING_WINDOW; self.l_ema := value.AVALUE; else self.l_ema := round (value.AVALUE * 2 / (l_window_width + 1) + self.l_ema * (1 - 2 / (l_window_width + 1)), 20); end if; end if; return ODCIConst.Success; end; member function ODCIAggregateMerge(self in out EMA_IMPL_T, ctx2 in EMA_IMPL_T) return number is begin return ODCIConst.Error; end; member function ODCIAggregateTerminate(self in EMA_IMPL_T, returnValue out number, flags in number) return number is begin returnValue := self.l_ema; return ODCIConst.Success; end; end; create or replace function EMA (input EMA_DATA_T) return number aggregate using EMA_IMPL_T; create or replace function HABR_MARKETINDEXES_EMASIMPLE_F_AGRF (p_averaging_window_width integer) return HABR_MARKETINDEXES_RESULT_LIST_T is l_result HABR_MARKETINDEXES_RESULT_LIST_T; begin with T1 as (select STOCK_NAME, ADATE, TYPICAL_PRICE, ACLOSE , round (EMA (EMA_DATA_T (TYPICAL_PRICE, p_averaging_window_width)) over (partition by STOCK_NAME order by ADATE), 20) as EMA from LOAD_YAHOO_V) select HABR_MARKETINDEXES_RESULT_T (STOCK_NAME, ADATE, ACLOSE, EMA, null, null, null, null, AACTION) bulk collect into l_result from T1 match_recognize (partition by STOCK_NAME order by ADATE measures classifier() as AACTION all rows per match with unmatched rows pattern (BUY+ | SELL+) define BUY as (prev (TYPICAL_PRICE) < prev (EMA) and TYPICAL_PRICE > EMA) , SELL as (prev (TYPICAL_PRICE) > prev (EMA) and TYPICAL_PRICE < EMA) ) MR; return l_result; end;
مقارنة نتائج الحساب مع معلمة واحدة:
select COLUMN_VALUE as ALG, dbms_sqlhash.gethash (COLUMN_VALUE, 2) as RECORDSET_HASH from table (sys.odcivarchar2list ('select * from table (HABR_MARKETINDEXES_EMASIMPLE_F_CALC (15)) order by 1, 2' , 'select * from table (HABR_MARKETINDEXES_EMASIMPLE_F_RECU (15)) order by 1, 2' , 'select * from table (HABR_MARKETINDEXES_EMASIMPLE_F_MODE (15)) order by 1, 2' , 'select * from table (HABR_MARKETINDEXES_EMASIMPLE_F_AGRF (15)) order by 1, 2'));
يجب أن تتطابق جميع التجزئة لكل الطرق الأربعة.
إذا لم تتطابق التجزئة ، فيمكنك معرفة بالضبط أين تشكل التباين ، باستخدام عامل التشغيل هذا (استبدل أسماء الوظائف التي تريد مقارنتها):
select coalesce (a.STOCK_NAME, b.STOCK_NAME) as STOCK_NAME, coalesce (a.ADATE, b.ADATE) as ADATE , a.ACLOSE as CALC_ACLOSE, b.ACLOSE as AGRF_CLOSE , a.IND_VALUE as CALC_EMA, b.IND_VALUE as AGRF_EMA , a.AACTION as CALC_AACTION, b.AACTION as AGRF_AACTION from table (HABR_MARKETINDEXES_EMASIMPLE_F_CALC (15)) a full outer join table (HABR_MARKETINDEXES_EMASIMPLE_F_AGRF (15)) b on a.STOCK_NAME = b.STOCK_NAME and a.ADATE = b.ADATE
اختيار المعلماتيستخدم
TIR نفسه معلمة واحدة ، ولهذا ولكل
TIRs الأخرى
أغيرها في النطاق من 1 إلى 200 ، ولكن لحساب صورة ثلاثية الأبعاد للاعتماد عليها وعلى التأخر أيضًا ، سنقدم معلمة ثانية تختلف من 1 إلى 5.
يفتح المشغل 200 * 5 = 1000
مؤشر ، لذلك قد يلزم تغيير Oracle
OPEN_CURSORSينفّذ الاستعلام الموجود أدناه المنتج الديكارتية لجدول بأرقام من 1 إلى 200 ، مع جدول به أرقام من 1 إلى 5 ،
HABR_TRADEMODELLING_P.CALC_ACTIONS_TOTALS
الديكارتية كل هذا من خلال استدعاء دالة الجدول
HABR_TRADEMODELLING_P.CALC_ACTIONS_TOTALS
.
بعد بعض المعالجات الإضافية في MATLAB ، سوف نحصل على مصفوفة 200 * 5 ، حيث سيكون في خلايا المصفوفة قيمة رأس المال الإجمالية لكل قيمة لكل من المعلمتين. بعد ذلك في MATLAB ، نبني صورة ثلاثية الأبعاد.
rollback; delete HABR_MARKETINDEXES_PARMSEL_RESULTS where INDICATOR_NAME = 'HABR_MARKETINDEXES_EMASIMPLE_F_CALC'; commit; insert into HABR_MARKETINDEXES_PARMSEL_RESULTS (INDICATOR_NAME, PARM1, PARM2, STOCK_NAME, ADATE_MIN, ADATE_MAX, DEALS_COUNT, BALANCE_RESULT, DEALS_PROFIT_AMOUNT, DEALS_LOSS_AMOUNT, DEALS_PROFIT_COUNT, DEALS_LOSS_COUNT, IN_STOCK) with TP1 as (select rownum as PARM1 from dual connect by level <= &&AVERAGING_INTERVAL) , TP2 as (select rownum as PARM2 from dual connect by level <= &&LAG_MODELLING_DEPTH) select
PARM2، STOCK_NAME، ADATE_MIN، ADATE_MAX، DEALS_COUNT، BALANCE_RESULT، DEALS_PROFIT_AMOUNT، DEALS_LOSS_AMOUNT، DEALS_PROFIT_COUNT، DEALS_LOSS_COUNT، IN_STOCK) rollback; delete HABR_MARKETINDEXES_PARMSEL_RESULTS where INDICATOR_NAME = 'HABR_MARKETINDEXES_EMASIMPLE_F_CALC'; commit; insert into HABR_MARKETINDEXES_PARMSEL_RESULTS (INDICATOR_NAME, PARM1, PARM2, STOCK_NAME, ADATE_MIN, ADATE_MAX, DEALS_COUNT, BALANCE_RESULT, DEALS_PROFIT_AMOUNT, DEALS_LOSS_AMOUNT, DEALS_PROFIT_COUNT, DEALS_LOSS_COUNT, IN_STOCK) with TP1 as (select rownum as PARM1 from dual connect by level <= &&AVERAGING_INTERVAL) , TP2 as (select rownum as PARM2 from dual connect by level <= &&LAG_MODELLING_DEPTH) select
STOCK_NAME، ADATE_MIN، ADATE_MAX، DEALS_COUNT، BALANCE_RESULT، DEALS_PROFIT_AMOUNT، DEALS_LOSS_AMOUNT، DEALS_PROFIT_COUNT، DEALS_LOSS_COUNT، IN_STOCK rollback; delete HABR_MARKETINDEXES_PARMSEL_RESULTS where INDICATOR_NAME = 'HABR_MARKETINDEXES_EMASIMPLE_F_CALC'; commit; insert into HABR_MARKETINDEXES_PARMSEL_RESULTS (INDICATOR_NAME, PARM1, PARM2, STOCK_NAME, ADATE_MIN, ADATE_MAX, DEALS_COUNT, BALANCE_RESULT, DEALS_PROFIT_AMOUNT, DEALS_LOSS_AMOUNT, DEALS_PROFIT_COUNT, DEALS_LOSS_COUNT, IN_STOCK) with TP1 as (select rownum as PARM1 from dual connect by level <= &&AVERAGING_INTERVAL) , TP2 as (select rownum as PARM2 from dual connect by level <= &&LAG_MODELLING_DEPTH) select
يتم تنفيذ جميع العمليات الحسابية في هذه المقالة ببطء ، وتصل إلى 20 دقيقة ، ويرجع ذلك إلى فتح عدد كبير من المؤشرات.
لقد قمت أيضًا بتطوير طريقة محاكاة أسرع باستخدام مؤشر واحد ، دون فتح 1000 مؤشر ، إلا أنها ضخمة جدًا بحيث يستغرق الأمر نصف المقالة. لذلك ، لن أحضره هنا.
نتيجة نمذجة تقاطع المتوسط المتحرك (جميع الرسوم البيانية قابلة للنقر):

السطر الثاني من المخططات هو نفس السطر الأول ، لكن المخططات تدور قليلاً ، حيث يتم ترتيب المخططات ذات التأخر المختلفة واحدة تلو الأخرى. هذا يتيح لك تقييم تأثير التأخر على النتيجة.
بشكل عام ، المؤشر ليس حساسًا جدًا للتخلف. بالنسبة لأسواق S & P500 و NYSE ، يجب تحديد معلمة
TIR أكثر ، كلما كان ذلك أفضل. بالنسبة لسوق برنت ، فهو يقع في حوالي 25. في السوقين الأخريين ، لا يوجد أي ارتباط بين الربحية والمعلمة.
الصلبان القاتلة والذهبية
في التنفيذ على Oracle ، يشبه هذا المؤشر إلى حد كبير المؤشر السابق ، حيث يتم هنا فقط استخدام متوسطين متحركين وليس واحدًا. لذلك ، سأقدم خيار حساب واحد فقط.
تصف ويكي مؤشر Ichimoku. هذا مؤشر معقد. "الصلبان" هي واحدة من الأجزاء المكونة. لكن المؤشر غير موصوف بشكل سيئ على الويكي ، على وجه الخصوص ، لاحظ أن خطوط Tenkan و Kijun موصوفة بعبارات مختلفة تمامًا ، رغم أنها في الواقع نفس الشيء ، لكن مع فترات مختلفة.
في كتاب روبرت كولبي ، لم يتم وصف هذا المؤشر أيضًا.
يطلق المحللون اليابانيون تقاطع المتوسطات ، عندما يعبر المتوسط قصير الأجل المدى الطويل من الأسفل إلى الأعلى ، والصليب الذهبي (الصليب الذهبي) ، والوضع المعاكس ، عندما يعبر المتوسط المتحرك قصير المدى المدى الطويل من الأسفل إلى الأسفل ، يكون الصليب الميت.
لاحظ المؤلف أن هذا المؤشر موصوف في مقالة
"العقود المستقبلية للنفط الأمريكي شكلت" تقاطعًا قاتلًا "" وبدأت في google وصفها واستخدامها.
يعتبر هذا المؤشر خطيرًا في سوق الأوراق المالية ، ويعزى ذلك جزئيًا إلى أنه نادرًا ما يعطي إشارات.
الأكثر شيوعا هي المتوسطات المتحركة 50 و 200 الفترة.
عند نمذجة الأداء أدناه ، سوف نأخذ فترة المتوسط المتحرك الطويل مساويًا للفترة الرباعية لمتوسط الحركة القصيرة ، ونحاكي طول القصير من 1 إلى 200 يوم (سينتهي من 4 إلى 800 يوم لفترة طويلة).
رمز لحساب على جيثب.

المؤشر ليس حساسًا جدًا للتخلف. بالنسبة إلى سوق S & P500 ، يوجد الحد الأقصى عند 48 (192 لمدة SS طويلة) و 98 يومًا (392 لمدة SS طويلة). لاحظ أن الحد الأقصى الأول قريب جدًا من الأرقام 50 × 200. يمكن افتراض أنه إذا اخترت هذه المعلمة 1 و 2 أقل من المشاركين الآخرين في السوق ، يمكنك محاولة التغلب عليها في هذا المؤشر وحده.
هناك 4 ارتفاعات في بورصة نيويورك. في أسواق برنت و BTCUSD ، لا يعمل المؤشر.
بالنسبة لسوق اليورو مقابل الدولار الأميركي ، أيضًا ، يجب اختيار المعلمة أقل بقليل من 50 لقيمة SS قصيرة. لكن المؤشر لا يعطي ربحا في هذا السوق. يمكن استخدامه فقط كمؤشر إضافي.
حجم الرصيد ، حجم التوازن ، حجم الرصيد (OBV)
مؤشر OBV هو متوسط حجم التداول التراكمي المتحرك المأخوذ بعلامة زائد في حالة السوق المتنامية مع علامة الطرح في حالة الهبوط.
هنا سوف نستخدم هذه الطريقة لتفسير قيمة المؤشرات: اشتري عندما يعبر OBV متوسطه المتحرك من الأسفل إلى الأعلى ، قم بالبيع عندما يعبر OBV متوسطه المتحرك من الأعلى إلى الأسفل.
المزيد عن
ويكي أو كولبي

في سوق S & P500 ، يكون المؤشر حساسًا جدًا للتأخير (التأخر) ، ولكن يمكنك محاولة اختيار معلمة على مبدأ "كلما كان ذلك أفضل" ، يتم تحقيق بعض الربحية. في بورصة نيويورك ، لا يمكن تحقيق الربحية. في سوق برنت ، يمكنك تحديد قيمة المعلمة من 20 إلى 100. في سوق BTCUSD ، لا توجد علاقة خطية واضحة ، ولكن اختيار قيمة معلمة أقل من 40 غير عملي. بالنسبة لسوق اليورو مقابل الدولار الأميركي ، يجب اختيار قيمة المعلمة "كلما كان ذلك أفضل" ، ولكن لا يمكن تحقيق الربحية.
, Keltner Channel
, . .
.
, .
: , , , .

S&P500 NYSE . Brent , . BTCUSD , , . EURUSD .
, , Price–Volume Trend, PVT
PVT .
: , PVT -, , PVT -.
. .

S&P500 « , », NYSE , Brent 50, BTCUSD , 1-2, , 50-, EURUSD .
, , Arms' Ease of Movement Value, EMV
EMV — , . , .
: , EMV , , EMV .
.

S&P, NYSE , Brent . BTCUSD EURUSD .
, ommodity channel index, CCI
CCI — , .
.
: , CCI 100, , CCI 100.
.

S&P500, NYSE, Brent . BTCUSD ( ), . EURUSD .
GitHub, , ( , Yahoo Finance), , , ( , 20 ).
: . . .
وبالإضافة إلى ذلك:
, . . , .
Oracle Database .