النتائج 1 إلى 15 من 378
- 02-03-2020, 05:22 AM #1
جافا - تصميم الاكسبيرتات بلغة الجافا لمنصة jforex مع دوكاسكوبي
بسم الله الرحمن الرحيم
تعتمد منصة دوكاسكوبي على لغة الجافا بشكل كامل وتام اذا اردت تصميم طريقتك او مؤشرتك
فقط هي تضيف على الجافا بعض الأشياء الخاصة بها, مثل وضع الأوامر وماشابه.
هنا محاولة متوىاضعة مني لتقريب الأمر على من يرغب بتعلم JForex كلغة تحرير استراتيجيات ومؤشرات
عندما نقول Jforex فنحن نختصر عبارة "Java Forex" مع دوكاسكوبي.
ورغم أننا نفترض ان المهتم بهذا الشأن لابد أن يكون أولا خبيرا بلغة الجافا ولكن سنتحدث عن أهم مقومات هذه اللغة, بالقدر الكافي لفهمها لكي تفهم كيف تعمل دوال "دوكاسكوبي" بعد ذلك.
ولتبسيط الأمر على الدراس الكريم, سنتبع أسلوب المقارنة أو المقابلة مع لغة mql المستخدمة حصرا لمنصات الميتا تريدر.
مثلا عند الحديث عن SubmitOrder مع دوكاسكوبي سنذكر OrderSend مع الميتا تريدر
وهكذا,
لغات البرمجة الموجة نحو التداول الآلي ذات عدد, وحسب المنصة
مثلا لغة easyLnaguage لمنصات TradeStation وهي كلغة مأخوذة من الفيجوال بيسك VB
وهناك لغة cAlgo لمنصات cTrader وهي عينها لغة C# --- سي شارب (تعتبر الأبسط) بين كل اللغات التي نعرفها
وهناك لغة NinjaScript لمنصات الـ NinjaTraders وهي نفسها لغة C++
وغني عن القول أن منصات الميتا على الأرجح هي C# مع شوية أمور خاصة بـ MQL --- والدليل اكتب كلمة as في محرر الميت ستظهر لك باللون الأزرق وكلمة as تعتبر reserved word مع C#
وهناك لغات تفهمها المنصات التي تعتمد على API مثل منصة TWS مع انتراكتيف بروكرز, مثل لغة C++ ولغة الجافا ولغة C# ولغة البايثون والاكسل و IDE ActiveX
وهناك لغة REST رأيت بعض الوسطاء يستخدمونها--وأيضا ال MATLAB-Siumlik رأيت بعضهم يستخدمها, ولغة R تستخدم في بعض التطبيقات,
وهناك منصات لا اعلم يستخدمون أي لغة مثل ساكسو بانك او مثل نوع منصات فوركس-يارد القديمة ولكن لا أعتقد تخرج عن اللغات الرئيسية الثلاث الجافا والسي بلس بلس و السي شارب.
عموماً نرجو المتابعة
والله الموفق والمسدد
- 03-03-2020, 09:35 AM #2
Java في سطرين عبارة عن class نعطيها اسم وهذا الاسم يستخدم كأداة تعريف متغيرات وهي على غرار التعاريف البسيطة مثل int و double الخ
ولكل class هناك constructor يحمل نفس الاسم ولكن مع قوسين -- قد تكون فارغة وقد يكون بداخلها متغيرات
وكل class تحتوي على متغيرات variables وعلى دوال methods
ولابد يكون هناك مفتاح لبدء البرنامج--يعني البرنامج يبدأ من اي سطر في الكود؟؟ وهذا المفتاح هو دالة main من نوع public static void
واي مبتدئ من اجل التعلم والتطبيق لابد يفهم اولا دالة الطباعة System.out.printl() f
تأمل الصورة التالية: وهو class فارغ الا من دالة main
class يعني لايوجد فيه متغيرات ولادوال على مستوى الـ class
لماذا طبع أولا 0 ثم 3 ثم 1 ثم 3 ثم 2 ؟؟؟
لاحقاً
ولكن main هنا تعتبر نقطة بدء البرنامج فهي الـ event-handlers
مع دوكاسكوبي لديهم event-handlers حسب الحاجة وهي تأتي مكان main هنا.
أبرزها:
OnStart وهي تماثل OnInit مع الميتا تريدر
OnTick وهي تماثل OnTick مع الميتا تريدر
OnBar لامماثل لها في الميتا بشكل مباشر
OnMessage لامماثل لها في الميتاتريدر بشكل مباشر
OnStop وهي تكافئ Denit في الميتا
OnAccount ولامماثل لها في الميتا
- 03-03-2020, 09:56 AM #3
- 03-03-2020, 06:42 PM #4
انا عندي خبرة بسيطة بلغة الجافا وعندي طلب بسيط
اذا كان هناك بعض المصادر التعليمية الجيدة لتعلم الاكسبيرتات بلغة الجافا لمنصة jforex اذا كانت فيديو اوكتب سواء عربي او انجليزي ارجو ان تزودني بها لاني مهتم لتعلم هذه اللغة
شرحك سهل وبسيط
متابع معك
- 03-03-2020, 09:46 PM #5
للأسف المراجع شبه معدومة ولايوجد الا تطبيقات مباشرة--بعض البرامج الحاهزة
ولكن كلما ازددت قوة في الجافا كلمها اتقنت jforex--اعتبرها احد عناوين الجافا
مثلا لو اردت انت تصميم تطبيق (وهو في الأخيرة عبارة classes + interfaces) حينها jforex كهذه التطبيقات, لأنها أيضا (classes+interfaces)
وتجدها في API- Ducascopy
https://www.dukascopy.com/client/jav...w-summary.html
هنا
---
في موقعهم تطبيقات وشروح بسيطة تفترض المامك الكبير بالجافا
بعد استعراض اكثرها, لابد يكون مر عليك في الجافا مفاهيم كثيرة, مثل ال inheritance+ abstraction-encapsulation-polymorphism
ناهيك عن ال inner classes_inner interfaces ولاحظت كثرة استخدامهم لها
وجميع شروط الجافا لابد تتنفذ بحرفية--مثلا أي method مرتبط بـ ال Inteface لابد كلها تكون implemented--مثلا ستلاحظ هناك تطبيقات يكفيك فيها دالة OnStart ولكن لغة الجافا تجبرك على وجود الدوال الخمس الأخرى Ontick-OnStop الخ--تجدههم يكتبونها ب ببدي body فارغ
أيضا لاحظت في بعض اتطبيقات استخدام مفهوم ال multithreading-- او multitasking --يعني ممكن خبيرك ينفذ على زوجين او 100 في نفس اللحظة من الزمن
أيضا مفاهيم GUI بسكل عام تستخدم بكثرة مثل صنع جدول او وضع widget على التشارت الخ وكلها تفاعلية--يعني مثلا ايقونة ترسمها برمجيا على التشارت--وتضغط عليها فيضع امر ماركت
نرجع لردك ان عندك خبرة بسيطة بالجافا---عمق هذه الخبرة اخي--الجافا لغة صارمة
- 03-03-2020, 09:48 PM #6
في موقع دوكاسكوبي تحت هذا الرابط تجد مايشبه تعليم بعذ التطبيقات اكثر من كونه تعليمي على أسس مرتبة
https://www.dukascopy.com/wiki/en/development
قد يسهل الامر عليك مع شوية اجتهاد وحرص وتفرغ
- 04-03-2020, 03:38 AM #7
أين تفتح محرر البرامج jforex
كيف تسوي لبرنامجك compile ؟؟
كيف تشغله على المنصة بحيث يعمل كخبير او مؤشر؟ هل هو مثل الميتا ومثل cTrader نطبقه على التشارت؟ أم ان الامر مختلف.
بعمما تفتح المنصة تتأكد انها في وضعية Standard
وللتأكد من ذلك تذهب الى File اعلى اليسار المنصة ثم الى WorkSpace ثم Restore Default ثم تختار Standard
- 04-03-2020, 05:31 AM #8
لفتح المحرر
Navigator
right-click Strategies
New Strategy
موضحة على الصورة
سيظهر المحرر على هذا النحو مع الديفولت(الأشياء الموجودة في أي استراتيجية) وهي عبارة عن ست دوال اجباري تكون موجودة لأن IStrategt عبارة عن Interface وقاعدة الجافا تقول لابد من وجود كل الـ Abstract methods تحت ذلك الـ Interface -- لابد تكون موجودة حتى لو ماتحتاج بعضها-- بدي فارغ.
اسم البرنامج لابد يكون نفسه اسم الكلاس
يستحسن تغير الاسم في الصورة اسفل من Strategy الى مايلزم--مثلا Macd_expert
- 04-03-2020, 05:52 AM #9
عندما يظهر لك البرنامج جرب ان تلغي سطر //import com.dukascopy.api.*;
لاتحذفه ولكن استخدم علامات التعليق -- دبل سلاش \\
ستكون اغلب المتغيرات بخط احمر تحتها--يعني لم يدكرها البرنامج وبالتالي نفهم أهمية هذا السطر,
الكود أسفل عبارة عن متغيرات ودوال
المتغيرات variables من الان ولاحقاً لها أربعة أسماء:
اذا كان متغير على مستوى الكلاس--خارج الدوال نسميه Field
اذا كان متغير داخل الدوال نسميه Local variable
اذا كانت المتغيرات توجد في تعريف الدالة method signature نسميه Parameter
اذا كانت متغيرات في دالة تستدعي هذه الدوال نسميه arguments هروبا من كلمة variable لأنك أحيانا تستدعي بقيم صريحة وليس بمتغيرات.
فلابد أن تميز هذه المعاني بشكل دقيق والشرح هنا يغنيك عن كل المراجع.
انظر للصورة:
- 04-03-2020, 06:12 AM #10
باستخدام الجافا العادية نستخدم System.out.println()
ولابد في البدء مع jforex نعرف المقابل لها او كيف يتم هذا الأمر:
اذا تلاحظ الصورة السابقة تجد فيها:كود:private IEngine engine; private IConsole console; private IHistory history; private IContext context; private IIndicators indicators; private IUserInterface userInterface;
private IContext context
انظر لها الان على انها المتغير الذي يربطك بهذه المنصة تحديدا ونعني منصة dukascopy
IContext عبارة عن Interface أيضا وتحتها دوال كثيرة جدا اطلع عليها هنا:
https://www.dukascopy.com/client/jav.../IContext.html
في وثائق دوكاسكوبي تقرأ:
public interface IContext
Gives access to the various parts of the system
يعني هي قناة العبور للمنصة.
أحد هذه الدوال اسمها getConsole()
وهي دالة الـ return الذي يخصها من نوع IConsole
يعني دالة موجودة تحت الـ IContext Interface ولكنها من نوع IConsole
وبالتاللي عندما نذهب لهذا النوع IConsoles سنجد ايضا تحته الدوال التي تخصه
ورابطه هنا:
https://www.dukascopy.com/client/jav.../IConsole.html
ومنها دالة getOut()
وهنا نخرج من دوال jforex الى الجافا بشكل عام -- حيث نجد انها تحت او من نوع: java.io.PrintStream
وتحت هذا الـ java.io.PrintStream نجد دالة println كما هو معلوم لأي مبتدئ جافا
اذا لكي نطبع اي شيء في المنصة -- نلخص كل ماسبق:
IContext context
وقلنا أن الكائن context تحته getColsole()
تصبح:
context.getConsole()
وقلنا أن getConsole تحتها getOut
context.getConsole().getOut()
و getOut تحتها println()
تصبح:
context.getConsole().getOut.println()
والتالي مثال تطبيقي---تم حذف جميع المتغيرات التي لن نستخدمها في البدء مع بقاء الدوال لأنه اجباري تكون موجودة.
- 04-03-2020, 12:16 PM #11
الخبير أسفل بسيط جدا--لكي تعرف 1) الكمبلة 2) وكيفية تشغيله في المنصة 3) وكيف تفتح log تنبيهات هذا الخبير تحديداً--
هدفه طباعة كلمة "السلام عليكم" في صفحة الرسائل لهذا الخبير.
ونريده مرة واحدة فقط, وبالتالي نضعه تحت OnStartلأن البرنامج يمر عليها مرة احدة فقط وهي لحظة تشغيل الخبير.\
يعني داخل جسد OnStart نضع السطر التالي بناء على الرد السابق:
كود:context.getConsole().getOut.println("السلام عليكم")
كود:package jforex; import java.util.*; import com.dukascopy.api.*; public class SalmanExpert_01 implements IStrategy { private IContext context; public void onStart(IContext context) throws JFException { this.context = context; this.context.getConsole().getOut().println("السلام عليكم"); } 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 {} }
تترك المحرر وتذهب للمنصة وتشيك منطقة جدول الرسائل: اذا كان الخبير ناجح ودون أخطاء كمبلية تستطيع استخدامه--يعني لابد تقرأ كلمة successful (سِكْسَااسْفُلْ)
انظر للصورة:
الان كله تمام--تبقى فقط تشغيله لنرى نتيجة الخبير وهي طباعة السلام عليكم في ال "كونسول" -- يعني جدول الرسائل ولكن الخاص بهذا الخبير:
كيف نشغله؟
رايت-كلك على الخبير تحت custom كما في الصورة الاخيرة اعلاه, ثم اختر local run----الان شغال.
كل شيء موضح على الصورة التالية:
- 04-03-2020, 12:48 PM #12
والآن اريدك ان تنقل سطر الطباعة الى دالة OnTick ثم دالة OnBar وهكذا
كود:context.getConsole().getOut.println("السلام عليكم")
مع OnTick نتوقع يعيد طباعتها مع كل تكة
- 04-03-2020, 12:52 PM #13
- 04-03-2020, 03:48 PM #14
OnBar
هنا التحديث لهذه الدالة يتم مع نشوء شمعة جديدة لكل الأزواج المفعلة "subscribed instruments" التي قلنا كرروها كثيرا في البداية.
شمعة أي فريم؟
ج: شمعة فريمات المنصة القياسية بداء من فريم 10 ثواني وانتهاء بفريم الشهري.
يعني كل 10 ثواني تحدث, ثم كل دقيقة تحديث(فريم الدقيقة) ثم كل 5 دقائق تحديد (فريم الخمس دقائق)
وبالتالي اول خمس دقائق--نتوقع OnBar تتحدث, 30+5+1 = 36 مرة
10 ثواني: 30 مرة (الخمس دقائق يوجد فيها 30 مرة 10 ثواني)
1 دقيقة: 5 مرات (الخمس دقائق فيها عدد دقائق يساوي 5)
و 1 لفريم الخمس دقائق نفسه.
انت بنفسك الان استخدم الطباعة تحت OnBar وراقب
كود:public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException { this.context.getConsole().getOut().println("onBar"); }
- 04-03-2020, 04:06 PM #15
انظر للصورة أسفل على رأس الدقيقة 55 نعلم انه سينشأ شمعة جديدة فريم خمس دقائق (وبناء عليه شمعة جديدة فريم دقيقة ثم من باب أولى شمعة جديدة فريم 10 ثانية)
10 ثانية لاتوجد في منصات الميتا تريدر.
تلاحظ انها تكررت 3 مرات عند الدقيقة 55 (الوقت في الصورة 12:55:00)
لماذا تكررت ثلاث مرات؟
ج: لأننا أنا فعلت 3 أزواج
انظر للصورة: