جزاك الله خير من أكثر المواضيع إفادة
جزاك الله خير من أكثر المواضيع إفادة
كيفية تفعيل الأزواج:
1) اما يدوي من خلال المنصة وسيتم توضيحه بصورة--نريد تفعيل زوج GBPJPY -- على المنصة الآن زوجان مفعلان والثالث سيكون GBPJPY
الملف المرفق 520947
2) أو برمجياً من خلال الدالة الخاصة بتفعيل زوج أو أكثر مثل وهي: setSubscribedInstruments
وهي دالة من نوع void يعني لاتعيد قيمة فقط تغير وضع الزوج الى مفعل.
وهي أيضا مثل getConsole التي تحدثنا عنها--يعني احد الدوال تحت الانترفيس IContext
يعني يتم استدعاءها من خلال context ثم نقطة "." ثم اسم هذه الدالة وبين قوسيها الأزواج التي نريد تفعيلها وسيتم شرحها بمثال.
انت الآن اصبحت تعرف دالتين مهمتين تحت IContext Interface
واصبحت تعرف متى تحدث الدوال الست الرئيسية في IStrategy Interface
واصبحت تعرف كيف تحرر برنامجا بسيطا وكيف تشغله في المنصة
للمذاكرة ابحث وادرس السؤالين التاليين:
1 - ادرس foreach في الجافا (تكتب for' فقط) --- ماذا تفرق عن for العادية؟
2 - ادرس من خلال البحث الـ Set Interface و HashSet Class
في الجافا - ماهي أهميتها ومتى تتذكر استخدامها؟
عن\ البحث والدراسة ابعد عن هذنك مفهوم الفوركس والمنصة--ادرسها بشكل مجرد كلغة جافا.
ثم بعد ذلك ولكن رجاء دون تعمق حتى هذه اللحظة ا قرأ بشكل عام هنا: --يعني قراءة سطحية عابرة في هذه المرحلة
getSubscribedInstruments
https://www.dukascopy.com/client/javadoc3/com/dukascopy/api/IContext.html#setSubscribedFinancialInstruments-java.util.Set-boolean-
جافا بحتة:
Set Interface
الصورة أسفل قد دققتها عدة مرات وهي دقيقة جدا وأصح صورة عن Set عن أي صورة أخرى قد تجدها في أي موقع--اعتقد صور كثيرة جدا
المربع الذي خلفيته بيضاء يعني Interface بينما اي لون اخر يعني class
ونعلم ان الـ class implements interface ----- يعني الكلاس تنفذ دوال الانترفيس.
الملف المرفق 520952الملف المرفق 520952
وعن foreach ارجو ان تقرأ هنا شرح بشيط بمثال بسيط.
https://www.w3schools.com/java/java_for_loop.asp
في السي شارب C# تكتب foreach ومع الجافا تفهم من السياق انها هكذا ولكن تكتب for
يسمونها for المطورة. وهي مطورة فعلا, ولكن مخصصة للمصفوفات 1) معلومة العناصر سلفاً, 2) ويبدأ الاندكس الخاص بها من 0 ----3) ومقدار الزيادة 1
السطرين أسفل زي بعض 100% لمصفوفة من خمسة عناصر
int[] ar={1,2,3,4,5}
كود:for( int i=0 ; i<5 ; i++ ) print(arr[i]) ;
مزية الأخيرة انه الأشياء المعلومة سلفا لايستخدمهاكود:for( int j : arr ) print(j) ;
ويوجد في الجاقا فصل كبير عن ما يسمى Collection Framework
وتحته interface Collection و Interface Map
وتحت Collection Interface يوجد ث انترفيسات فرعية شهيرة وهي:
List
Set
Queue
هذه كلها تستخدم في بناء المعلومات المجدولة data structure
نحن هنا نريد تفعيل زوج أو أكثر, لذا هل نختار Set أم List أم Queue ؟؟
الإنسان الذكي الفاهم يختار ايش؟؟
اذا فهمت ايش تعني كل واحدة, حتماً ستختار Set لسببين:
1) عدم التكرار -- - Set تلغي العناصر المكررة بينما List تقبل التكرار (هل منصتك يوجد فيها زوجين بنفس الاسم؟؟؟ )
2) لايهم الترتيب
هذه ابرز خاصيتين تميز Set عن النوعين الاخرين--والتطبيق هو الذي يحدد الخيار الأذكى (عدم التكرار --- عدم اهمية الترتيب سواء ابجديا او غير ذلك)
اضف الى ذلك انهم في دوكاسكوبي مشوا مع الخيار الأذكى وحددوا Set في عملية تفعيل تفعيل الازواج "subscribtion"
يعني نحن نريد تفعيل عدة أزواج, ونعلم ان الازواج unique--يعني لاتوجد زوجين بنفس الاسم في المنصة, والترتيب هنا لايهمنا--ممكن انا حاب افعل المجنون والاوسي مثلا!-- الحديث عن ترتيبها ابجديا عبث وترف ولايجب اساسا ان يخطر على البال
نحن نحوم حول كيف برمجيا نفعل زوج أو أكثر بعد ان عرفنا ومن خلال امثلة مصورة كيلفية التفعيل اليديوي من خلال ادوات المنصة.
وهنا نفترض انكم كمبرمج جافا أو C++ الخ أنك ملم باساسيات ال data structure ويهمنا هنا ابسط هذه الاساسيات, وهو كيفية انشاء كائن لتفعيل مجموعة من الأزواج
وكلمة مجموعة هي نفسها كلمة Set
يتبع . . .
نريد تفعيل المجنون والاوسي////// GBP.JPY-----AUDUSDاقتباس:
وهنا نفترض انكم كمبرمج جافا أو C++ الخ أنك ملم باساسيات ال data structure ويهمنا هنا ابسط هذه الاساسيات, وهو كيفية انشاء كائن لتفعيل مجموعة من الأزواج
وكلمة مجموعة هي نفسها كلمة Set
لابد أولا نعرف متغير وليكن باسم symbols ويجب ان يكون من نوع Set -- وSet هنا مجموعة بيانات--نوع هذه البيانات حسب حاجتنا هو Instrument وهو نوع صنعته دوكاسكوبي لتعريف الأزواج.
ولأن Set يعتبر Interface فإنه لايمكن جافويا خلق او انشاء كائنات من خلاله--بل لابد ان يتم الامر من خلال احد الكلاسات المنفذة له مثل HashSet
لأن HashSet عبارة عن class اذن تستخدم لانشاء الكائنات واخترنا اسم الكائن هنا symbols --راجع مبادئ الجافا.
وتستخدم كلمة new دائما في الجافا لانشاء الكائن متبوعة بكونتستركتور الكلاس - يعني اسم الكلاس بقوسين وهو هنا HasSet()
كل هذا نعبر عنه بالسطر التالي:
الآن اصبح لدينا كائن اسمه symbols وتم تعريفه بـ أداة التعريف Set ثم تم انشائه من خلال HashSet Constructorكود:Set<Instrument> symbols = new HashSet<Instrument>();
ولكن لم نمنح قيم.
دائما ردد الثلاث كلمات: 1) تعريف الكائن "المتغير بمفاهيم OOP" ---- ثم 2) انشائه ثم 3) منحه قيم initializtion
السطر السابق خلق مجموعة ولكن فارغة "فاي" -- مجموعة دون عناصر ونريد الإضافة لها:
يوجد مايسمونه algorithms وهي دوال خاصة من نوع static وعند المتخصصين جدا لايستخدمونها كمرادف لكلمة method
ومنها مع Set دالة add ووظيفتها إضافة العناصر للمجموعة --
من خلال اسم الكائن "المتغير symbols" يتم المرور لهذه الدالة الخاصة ومن خلال أداة المرور نقطة "."
نضيف أولا المجنون gbpjpy--لابد ان تكون الكتابة صحيحة مثل ماهو موجود في المنصة:
يتم الأمر على النحو التالي:
الآن اصبح لدينا مصفوفة او مجموعة فيها عنصرين وهما GBPJPY و AUDUSDكود:symbols.add(Instrument.GBPJPY);
symbols.add(Instrument.AUDUSD);
هل تم تفعيلها؟؟؟ ج: لا---حتى الان نحن خارج Jforex ونتحدث جافا عامة.
لتفعيلها نستخدم الدالة المصصممة لهذا الغرض وهي setSubscribedInstruments وتتكون من متغيرين:
الأول المجموعة وهي هنا symbols
والثاني من نوع boolean ونختاره true للتفعيل و false لالغاء التفعيل وحذذفها من القائمة المرئية في المنصة.
يتم الامر على النحو التالي:
لاحظ تم العبور الى setSubscribedInstruments من خلال متغير من نوع IContext --- لماذا؟كود:context.setSubscribedInstruments(symbols
, true);
ج: راجع الردود السابقة فقد تم شرحها بالتفصيل الممل.
قبل تطبيق الخبير اسفل--اولا الخ تفعيل كل العملات او اترك واحدا على الاقل: ثم طبق الخبير--هل تلاحظ ظهور هذين الزوجين اذا لم يكونا موجودين؟؟
جوابك يجب ان يكون نعم.
س: اين يجب ان نضع الاكواد اعلاه.
ج: الافضل تحت دالة OnStart لأن التفعيل يتم مرة واحدة ويصبح من البلاهة وضعها تحت OnTick او غيرها--تفعيل المفعل؟؟؟ !! واثقال البرنامج!!
انسخ الكود اعلاه ثم حفظ ثم كمبلة ثم تطبيق مع مراقبة ---لاتنسى رؤية الازواج في المنصة قبل التطبيق لتلاحظ الفرق وترى اضافة هذين الزوجين للقائمة اذا كانت اساسا غي.
انظر للصورة--اضاف الزوجين--اصبحت مفعلة-- واضاف ايضا usdjpy؟؟؟ هل تعلم لماذا؟؟كود:package jforex;
import java.util.*;
import com.dukascopy.api.*;
public class SalmanExpert_03 implements IStrategy
{
private IContext context;
public void onStart(IContext context) throws JFException
{
Set<Instrument> symbols= new HashSet<Instrument>();
symbols.add(Instrument.AUDUSD);
symbols.add(Instrument.GBPJPY);
context.setSubscribedInstruments(symbols, true);
}
public void onAccount(IAccount account) throws JFException {}
public void onMessage(IMessage message) throws JFException {}
public void onStop() throws JFException {}
public void onTick(Instrument instrument, ITick tick) throws JFException {}
public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {}
}
الملف المرفق 520954
والخبير شغال--اضغط رايت كلك على نافذة العملات المفعلة--نافذة instruments
ثم اختر remove all --- هل سيزيلها كلها؟؟
اوقف الخبير
هل سيلغي كل شيء؟
سيلغي كل شيء الا الازواج الاجبارية وهي الازواج التي يوجد عليها 1) صفقات مفتوحة او 2) انتظار او 3) لديها تشارت مفتوح.
واذا حاولت unsubscribe من أي زوج قام الخبير بتفعيله والخبير شغال لن ينجح الامر معك - وستظهر لك الرسالة التالية:
الملف المرفق 520955
ذكرنا انك لو وضعت false سيلغي التفعيل
تصحيح:
لايتم الالغاء الا من خلال دالة أخرى معاكسة اسمها unsubscribeInstruments(java.util.Set<Instrument> symbols) وتوجد تحت IConsole أيضا
وكما تلاحظ المتغيرات داخل اقواسها من نوع Set أيضا.
ضع هذا السطر مكان السطر المعاكس له في البرنامج-
context.unsubscribeInstruments(symbols);
-وسيلغي برمجيا تفعيل الأزواج التي حددتها في الكود, احرص على اختيار ازواج مفعلة أساسا لترى الإلغاء مع التنبيه ان 1) أي زوج عليه صفقة او 2) له تشارت مفتوح او 3) تحت سيطرة خبير اخر يفرض تفعيله لن يلغى حتى زوال هذه الأمور مثل اغلاق التشارت واغلاق الصفقات و تعطيل الخبير الاخر.
الان أصبحت تعرف 3 دوال من دوال IConsole -- وهو أداة الربط أو المرور مع سستم المنصة.
تصحيح IContextاقتباس:
الان أصبحت تعرف 3 دوال من دوال IConsole -- وهو أداة الربط أو المرور مع سستم المنصة.
الآن لدينا أزواج مفعلة في المنصة -- هل يوجد دالة تكشتف الأزواج المفعلة برمجياً؟
بالعين المجردة نحن نعرفها ولكن الخبير يريد ان يبني صفقاته على الأزواج المفعلة ولتكن ال 28 زوج؟
كيف للخبير ان يعرفها؟؟
ج: من خلال دالة: getSubscribedInstruments
اضف السطر التالي اخر دالة OnStart
سيطبعها في كونسول المنصة على شكل Set -- يعني بين قوسين على هذا النحو ويفصل بينهم فواصل--كما هو الأمر في الجافا العادية.كود:context.getConsole().getOut().println(this.context.getSubscribedInstruments());
الملف المرفق 520956
انظر للصورة, وراجع دروس الجاف الخاصة ب Set وتبيعاتها مثل HashSet او HashLinkedSet لتعرف كيف تحدد عنصر معين حسب مكانها في المصفوفة او تحذف الخ دوالها
وبمناسبة الحديث عن انواع ال Collections---لو جربت List وتبيعتها ArrayList مكان Set وتبيعتها HashSet---هل سيقبلها البرنامج؟
؟
لن يقبلها لان بارامترز setSubscribedInstruments أو getSubscribedInstruments أو unsubscribeInstruments يتم انشائها من خلال HashSet (الكلاس المنفذ لدوال Set) فقطعت علينا دوكاسكوبي طريق الاجتهاد وأصبحت الأمور صارمة ومحددة وواضحة وليس لها الا جواب واحد ولاتقبل التخبط
.
الملف المرفق 520973
اريدك ان تتصور الأوامر Orders -- هل تتوقع نستخدم Set او List ؟؟؟
الأوامر بعض قيم أعمدة جداولها قد تتكرر--مثلا انت قد يكون لديك 100 صفقة على eurusd------ يعني هذا الزوج تكرر 100 مرة!!!
وأيضا سعر الدخول قد يتكرر وقد لايتكرر---مجرد وجود احتمال التكرار يجعلك تختار List
وإاياكم اخي أسامة و بالتأكيد اعتز بمعرفتك واعتز بشهادتك
تصحيح: IContextاقتباس:
لايتم الالغاء الا من خلال دالة أخرى معاكسة اسمها unsubscribeInstruments(java.util.Set<Instrument> symbols) وتوجد تحت IConsole أيضا
مجهود تشكر عليه , شكلها ستكون دورة قوية، هل من بعد هذة الدورة ممكن صنع اي مؤشر او اكسبيرت وهل تغني عن ال mql ؟
اؤمن بالأمثلة المكثفة واؤمن أكثر بالتكرار الملل في بدايات اي علم
مثال على OnBar
كود:public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar)
البارامترز التي تراها period و askBar و bidBar و instrument
للأهمية اريدك ان تطبعها في الكونسول وتراقب لمدة خمس دقائق-يعني تطبع أولا أي واحد من الثلاثة مع instrument -- واحرص ان لايكون عدد الأزواج المععلة اكثر من 2 او ثلاثة. اثنين يكفي
حفظ ثم كمبلة ثم تشغيل من المنصة--وارجو ان تراقب حتى تتشرب هذه المفاهيم وتصبح فيلسوفها-دائما عند التعلم تصبر وابتعد عن العجلة والمناقز.كود:package jforex;
import java.util.*;
import com.dukascopy.api.*;
public class SalmanExpert_04 implements IStrategy
{
private IContext context;
public void onStart(IContext context) throws JFException
{
this.context=context;
}
public void onAccount(IAccount account) throws JFException {}
public void onMessage(IMessage message) throws JFException
{
}
public void onStop() throws JFException {}
public void onTick(Instrument instrument, ITick tick) throws JFException {}
public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException
{
context.getConsole().getOut().println("OnBar: "+instrument+" "+period);
}
}
الكود أعلاه يطبع مسمى الدالة كلمة OnBar ثم الزوج اسم الزوج الذي صار عليه تغير تسبب بإاثرة أو عمل OnBar ثم الفريم الذي حدث--يعني اللي صار عليه شمعة جديدة او بار جديد---لاتنسى مسمى الدالة OnBar
الناتج مصور:: ليش يوجد زوجين اخرين على فريم الدقيقة باسم SAN.FR/EUR و IMT.GB/GBX
الملف المرفق 520974
الآن وهو الأهم ننتقل للمتغير الأخر bidBar نفس الكود السابق ولكن نضع المتغير birBar مكان الفريم period
هل لاحظت بعد التشغيل؟؟ لهذه المتغير الوحيد طبع عدة قيم, وبالتالي هذا متغير كائني(له عدة قيم بنوع أو أوكثر) وليس متغير بسيط (له قيمة واحدة من نوع واحد مثل int)كود:context.getConsole().getOut().println("OnBar: "+instrument+" "+bidBar);
فهذا المثال مدخل لما سنتحدث عنه اليوم, استدعاء احد قيم الكائن مع الرجوع المتكرر لـ API دوكاسكوبي.
انظر للصورة أي متغير من نوع IBar عبارة عن كبسولة لست متغيرات او قيم. (تم كبسلتها تحت bidBar وهو متغير انت اخترت اسمه هكذا وممكن تغيره)
ترى:
1-وقت البارة --- بالملي سكند منذ سنة 1970--يعني مثل الميتا تريدر
2-الافتتاح O
3- الاغلاق C
4-الهاي H
5-اللو L
6-الفوليوم V
وهي بيانات الشمع المنتهية --يعني اخر شمعة انتهت--يعني الشمعة رقم 1
الملف المرفق 520976
وهذه الاسعار مبنية على Bid ولكن اذا تريدها مبنية على Ask اختر طباعة askBar بدلا من bidBar
كيف تستخلص قيمة واحدة من هذه القيم ذات العلاقة بالمتغيرين من نوع IBar؟
عم عدد المتغيرات او الدوال تحت IBar مع دوكاسكوبي؟
استخلاص قيمة واحدة مر علينا كثيرا ويحدت باستخدم النقطة "." --- النقطة تسمى access modifier
مثلا جملة الطباعة فيها 3 نقاط وجملة استدعاء تفعيل الازواج نرى هذه النقطة وهدفها استخلاص دالة او قيمة من الكلاس ذي العلاقة.
IContext مثلا تحتها عشرات الدوال--ولكن اذا اردنا احد هذه العشرات نستخدم النقطة ونحدد هذه الدالة بالاسم ولاعلاقة لنا بالبقية.
في البرنامج ضع نقطة "." بعد bidBar في الصورة--ستلاحظ الاعضاء ذات العلاقة بهذا المتغير من نوع IBar --
1) بعضها مباشر -- يعني ترى اخر السطر IBar بالرمادي
2) بعضها موروث inherited غير مباشر لاباء IBar مثل Object و ITimeData
الملف المرفق 520977
ارجع لموقع دوكاسكوبي API:
الملف المرفق 520978
ستجد 5 دوال مباشرة وهي الهاي واللو والاوبن والاغلاق و الفوليوم
ودالة غير مباشرة وهي الوقت getTime للبارة -- موروثة من أعلى
نريد الان ان تطبع فقط قيمة واحدة (فيما بعد سنقول اختيار قيمة واحدة حكمت استارتيجيتك باستخدامها)
دعنا نختار الاغلاق getClose()
كود:context.getConsole().getOut().println("OnBar: "+instrument+" "+bidBar.getClose());
الملف المرفق 520979
من غير النقطة طبع الكل
بالنقطة طبع عنصر واحد من الكل
جافا: Fields+Methods = Members