تخطَّ إلى المحتوى

نماذج ألفا

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

يستدعي AQE نماذج ألفا عبر دورة حياة مخصصة:

  • start()
  • init(asset)
  • generate_insights(symbol)
aq-engine/src/core/alpha/mod.rs
pub trait AlphaModel {
fn version(&self) -> &str;
fn start(&mut self, ctx: &mut dyn StrategyContext);
fn init(&mut self, ctx: &mut dyn StrategyContext, asset: &Asset);
fn generate_insights(&mut self, ctx: &mut dyn StrategyContext, symbol: &str) -> AlphaResult;
}

استخدم start() للإعداد على مستوى بيئة التشغيل:

  • تسجيل المؤشرات
  • تحديد شموع التهيئة
  • ضبط الحالة اللازمة قبل أي تهيئة خاصة برمز معين

استخدم init() للإعداد الخاص بكل أصل:

  • تهيئة المتغيرات الخاصة بالرمز
  • قراءة البيانات الوصفية للأصل
  • تجهيز حالة التشغيل الخاصة بكل رمز

استخدم generate_insights() من أجل:

  • قراءة أحدث البيانات التاريخية
  • فحص المؤشرات أو المتغيرات
  • التحقق من البيانات الوصفية للأصل
  • إنشاء Insight جديدة وإرجاعها

يمثّل EmaPriceCrossover نموذج ألفا فعليًا في AQE. وهو:

  • يسجّل ATR وEMA
  • يقرأ السجل
  • يتحقق من أحدث شمعة والشمعة السابقة
  • يستخدم البيانات الوصفية للأصل لتحديد ما إذا كانت إشارات البيع على المكشوف مسموحة
  • يعيد إشارة تداولية تتضمن إعدادات الدخول وجني الأرباح TP ووقف الخسارة SL ومدة الصلاحية TTL
aq-engine/src/core/alpha/ema_price_crossover.rs
fn generate_insights(&mut self, ctx: &mut dyn StrategyContext, symbol: &str) -> AlphaResult {
let Some(asset) = self.get_asset(ctx, symbol) else {
return AlphaResult::new(None, false, Some(format!("Asset {} not found", symbol)), self.name().to_string());
};
let history = match self.get_history(ctx, symbol) {
Some(history) if history.height() >= 2 => history,
_ => return AlphaResult::new(None, true, Some("Not enough history".to_string()), self.name().to_string()),
};
// derive signal, tp, sl, entry ...
let mut insight = Insight::new(
side,
symbol.to_string(),
StrategyType::Custom(self.name().to_string()),
ctx.timeframe().clone(),
confidence,
None,
);
insight
.set_limit_price(Some(entry))
.set_take_profit_levels(Some(vec![tp]))
.set_stop_loss(Some(sl))
.set_period_unfilled(Some(ttluf as u32))
.set_period_till_tp(Some(ttlf as u32));
AlphaResult::new(Some(insight), true, None, self.name().to_string())
}

يعرض TestEntry بنية أبسط لنموذج ألفا:

  • يقرأ حالة الأسعار الأخيرة
  • يحصي الإشارات التداولية النشطة لكل رمز
  • يصدر إشارة تداولية جديدة للشراء أو البيع عند تحقق الشروط

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

ما الذي ينبغي ألا تفعله نماذج ألفا

Section titled “ما الذي ينبغي ألا تفعله نماذج ألفا”

ينبغي ألا تتحول نماذج ألفا إلى أدوات لإدارة بيئة التشغيل بالكامل. تجنّب في معظم الحالات وضع هذه المهام داخل نموذج ألفا:

  • تحديد الكمية النهائية
  • إرسال الصفقات
  • منطق الإغلاق
  • فحوص تفعيل وقف الخسارة
  • التصفية بحسب النافذة الزمنية

الأفضل إسناد هذه المهام إلى مراحل معالجة الإشارات التداولية.

  • aq-engine/src/core/alpha/mod.rs
  • aq-engine/src/core/alpha/ema_price_crossover.rs
  • aq-engine/src/core/alpha/test_entry.rs