محرر الأكواد
يشرح هذا الدليل كيفية إنشاء الكود المصدري لاستراتيجية أو مؤشر أو إضافة (Plugin) وفتحه وتحريره باستخدام محرر الأكواد (Code Editor) المدمج في JForex4، وكيفية تجميع (Compile) التغييرات وحفظها.
تمت إعادة التسمية: كانت هذه الأداة تُعرف سابقًا باسم "Strategy Editor". أصبحت الآن تُسمى محرر الأكواد (Code Editor)، لأنها تُستخدم لتحرير الاستراتيجيات وكذلك المؤشرات والإضافات.
1. فتح المحرر
يمكنك الوصول إلى محرر الأكواد بطريقتين:
- إنشاء كود جديد: في لوحة Navigator (أسفل اليسار)، انقر بزر الفأرة الأيمن على العقدة المناسبة — Strategies أو Indicators أو Plugins (أو العقد الفرعية Custom الخاصة بها) — واختر New Strategy أو New Indicator أو New Plugin بحسب الحاجة. تقوم المنصة بإنشاء ملف
.javaجديد يحتوي على الهيكل الأساسي المناسب وتفتحه مباشرة في المحرر. - تحرير كود موجود: انقر بزر الفأرة الأيمن على استراتيجية أو مؤشر أو إضافة في Navigator أو في اللوحة المخصصة لها، ثم اختر Edit. يؤدي ذلك إلى فتح ملف الكود المصدري (
.java) الخاص بها في المحرر. إذا كان الملف المتاح هو ملف.jfxالمُجمَّع فقط (دون كود مصدري)، فلن يكون التحرير ممكنًا — إذ يلزم وجود ملف.javaالأصلي.
ملاحظة: يتم حفظ الملفات الجديدة افتراضيًا في JCloud. إذا قمت بحفظ الملف باسم مخصص، تذكّر أيضًا إعادة تسمية اسم الفئة (class name) في Java داخل الملف ليطابق اسم الملف — يجب أن يتطابق اسم الفئة مع اسم الملف حتى تنجح عملية التجميع.
2. فهم هيكل الكود الأساسي
يعتمد الهيكل الأساسي الذي يتم إنشاؤه على ما اخترت إنشاءه:
- New Strategy يُنشئ فئة (class) تُنفّذ الواجهة
IStrategy. - New Indicator يُنشئ فئة تُنفّذ الواجهة
IIndicator. - New Plugin يُنشئ فئة تُنفّذ الواجهة
IPlugin.
يركّز باقي هذا الدليل على تحرير الاستراتيجيات كمثال أساسي، لكن نفس سير عمل المحرر (فتح، تحرير، تجميع، حفظ) ينطبق أيضًا على المؤشرات والإضافات — ويختلف فقط أسلوب تشغيل كل منها لاحقًا (انظر القسم 6).
كل استراتيجية هي فئة Java تُنفّذ الواجهة IStrategy، وتحتوي على الحد الأدنى من الطرق (methods) المطلوبة للتجميع:
package jforex;
import com.dukascopy.api.*;
public class Strategy1 implements IStrategy {
public void onStart(IContext context) throws JFException {}
public void onAccount(IAccount account) throws JFException {}
public void onMessage(IMessage message) throws JFException {}
public void onStop() throws JFException {}
public void onTick(Instrument instr, ITick tick) throws JFException {}
public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {}
}
| الطريقة (Method) | الغرض |
|---|---|
onStart |
تُنفَّذ مرة واحدة عند تشغيل الاستراتيجية — تُستخدم للتهيئة، والاشتراك في الأدوات المالية، وتخزين IContext/IConsole. |
onTick |
تُنفَّذ مع كل تحديث سعر (tick) وارد للأدوات المالية المشترك بها. |
onBar |
تُنفَّذ عند إغلاق شمعة (bar) جديدة للأدوات المالية/الفترات الزمنية المشترك بها. |
onAccount |
تُنفَّذ عند تغيّر حالة الحساب (الرصيد، الأسهم، الهامش). |
onMessage |
تُنفَّذ عند وقوع أحداث دورة حياة الأوامر أو المراكز (التنفيذ، الرفض، إلخ). |
onStop |
تُنفَّذ مرة واحدة عند إيقاف الاستراتيجية — لتنفيذ عمليات التنظيف (cleanup). |
للمؤشرات والإضافات طرقها الخاصة المطلوبة من الواجهة (مثل
calculate()الخاصة بـIIndicator). يقوم محرر الأكواد بإنشاء الطرق الأساسية (stubs) الصحيحة تلقائيًا بناءً على خيار "New ..." الذي اخترته في الخطوة 1.
3. تحرير الكود
اعمل مباشرة في نافذة المحرر، مضيفًا منطقك الخاص داخل طرق دورة الحياة المناسبة. على سبيل المثال، لطباعة تحديثات الأسعار الواردة (ticks) في السجل ضمن استراتيجية ما:
package jforex;
import com.dukascopy.api.*;
public class Strategy1 implements IStrategy {
private IConsole con = null;
public void onStart(IContext context) throws JFException {
// store the console for printing to the Messages tab
this.con = context.getConsole();
}
public void onAccount(IAccount account) throws JFException {}
public void onMessage(IMessage message) throws JFException {}
public void onStop() throws JFException {}
public void onTick(Instrument instr, ITick tick) throws JFException {
con.getOut().println(instr + " " + tick.getAsk() + "/" + tick.getBid());
}
public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {}
}
من التعديلات الشائعة في هذه المرحلة:
- إضافة حقول (fields) عامة (public) بخاصية
@Configurableبحيث تظهر المعاملات (parameters) في نافذة Define Parameters عند تشغيل الاستراتيجية أو المؤشر أو الإضافة. - إضافة منطق الأوامر (أوامر السوق/الأوامر الشرطية، وقف الخسارة/جني الأرباح) داخل
onTickأوonBarأوonStart(بالنسبة للاستراتيجيات). - إضافة حسابات مخصصة للمؤشرات أو الإشارة إلى مؤشرات مدمجة.
نصيحة: يجب تعريف فئات المؤشرات المخصصة التي تستخدمها الاستراتيجية ضمن نفس الملف إذا كنت تنوي تشغيل الاستراتيجية عن بُعد (remotely) — إذ لا يمكن لبيئة التشغيل عن بُعد تحميل ملفات فئات محلية منفصلة. ينطبق هذا أيضًا على الفئات المساعدة المستخدمة من قبل المؤشرات أو الإضافات.
4. تجميع (Compile) التغييرات
بعد التحرير، قم بتجميع الملف باستخدام إحدى الطرق التالية:
- زر Compile في شريط أدوات محرر الأكواد، أو
- اختصار لوحة المفاتيح F5، أو
- النقر بزر الفأرة الأيمن على الاستراتيجية أو المؤشر أو الإضافة في قائمة Navigator المقابلة واختيار Compile.
يظهر ناتج عملية التجميع في تبويب Messages:
Compiling... OK— يعني أن الكود جُمِّع بنجاح، وتم حفظ ملف.jfxمطابق بجانب ملف الكود المصدري.java.- تفاصيل الأخطاء — في حال فشل التجميع، يعرض تبويب Messages الأخطاء المحددة (أرقام الأسطر، مشاكل الصياغة، إلخ) لتتمكن من تحديد موقعها وإصلاحها في المحرر.
5. حفظ عملك
- الحفظ العادي (Ctrl+S أو زر الحفظ في شريط الأدوات) يكتب تغييراتك في ملف الكود المصدري
.java. - إذا استخدمت Save As لحفظ الملف باسم جديد، افتح الملف بعد ذلك وأعد تسمية إعلان
public classليطابق اسم الملف الجديد — تتطلب لغة Java أن يكون اسم الفئة العامة مطابقًا لاسم الملف.
6. تشغيل الكود المُحرَّر
تعتمد طريقة تشغيل الكود المُحرَّر بعد تجميعه على نوع العنصر الذي حرّرته — فلكل من الاستراتيجية والمؤشر والإضافة آلية تشغيل مختلفة في JForex4:
-
يتم تشغيل الاستراتيجيات عبر Local run أو Remote run:
- انقر بزر الفأرة الأيسر على الاستراتيجية في Navigator، أو حدّدها في لوحة Strategies.
- اختر Local run أو Remote run (انظر الفروقات بين الوضعين أدناه).
- اضبط المعاملات في نافذة Define Parameters إذا طُلب منك ذلك، ثم انقر على Run.
الوضع ملاحظات حول الكود المُحرَّر Local run وصول كامل إلى الملفات المحلية، وفئات Java الأخرى، والرسوم البيانية (charts) — مناسب أثناء التصحيح النشط للأخطاء. Remote run يعمل على خادم Dukascopy. لا يوجد وصول إلى نظام الملفات، ولا وصول إلى الرسوم البيانية ( IContext.getChart()تُعيد القيمةnull)؛ يجب الاشتراك صراحةً في جميع الأدوات المالية ضمنonStart، ويجب أن تكون المؤشرات المخصصة مكتفية ذاتيًا ضمن ملف الاستراتيجية.تدعم الاستراتيجيات فقط وضع Remote run على خادم Dukascopy. لا تملك المؤشرات ولا الإضافات وضع تشغيل عن بُعد.
-
لا يتم "تشغيل" المؤشرات بالطريقة نفسها التي تُشغَّل بها الاستراتيجيات — بل تتم إضافتها إلى رسم بياني (chart). حدّد المؤشر المُجمَّع في Navigator أو في لوحة Indicators، وأضفه إلى رسم بياني مفتوح (مثلاً عبر السحب والإفلات، أو النقر المزدوج، أو قائمة المؤشرات الخاصة بالرسم البياني) لرؤيته وهو يقوم بالحساب والرسم استنادًا إلى بيانات الأسعار الحيّة أو التاريخية. يمكن ضبط معاملات
@Configurableالخاصة به من نافذة إعدادات المؤشر على الرسم البياني. -
يتم تشغيل الإضافات (Plugins) داخل المنصة نفسها، بدلًا من إرفاقها برسم بياني أو تشغيلها عن بُعد. حدّد الإضافة المُجمَّعة في Navigator أو في لوحة Plugins وشغّلها مباشرة؛ إذ تعمل ضمن تطبيق JForex4، وتتكامل مع واجهة المنصة أو مساحة العمل وفقًا لتصميمها.
أفضل الممارسات عند التحرير
- استخدم بيئة تطوير خارجية (IDE) للتطوير الجاد. محرر الأكواد المدمج في JForex4 مناسب للتعديلات السريعة، لكن بيئات التطوير مثل Eclipse أو IntelliJ IDEA أو NetBeans توفر فحصًا فوريًا للأخطاء، وإكمالًا تلقائيًا، وأدوات إعادة هيكلة (refactoring) تكتشف الأخطاء قبل أن تحاول حتى التجميع.
- أعد التجميع بعد كل تغيير جوهري وتحقق من تبويب Messages — لا تفترض أن الحفظ نجح دون إجراء عملية تجميع.
- اختبر أولًا على حساب تجريبي (demo). بعد تعديل منطق الاستراتيجية الذي يؤثر على تنفيذ الأوامر أو معايير المخاطرة، احرص دائمًا على إجراء اختبار تاريخي (عبر Historical Tester) واختبار تجريبي قبل التشغيل الفعلي (live).
- احتفظ بنسخة احتياطية من الإصدارات العاملة قبل إجراء تعديلات كبيرة، لأن المحرر يقوم بالكتابة فوق ملف
.javaمباشرة عند الحفظ. - تأكد من تطابق اسم الملف واسم الفئة في كل مرة تعيد فيها تسمية أو نسخ ملف استراتيجية أو مؤشر أو إضافة، لتجنّب أخطاء التجميع.