عند تقاطع MA 10 و MA 25 (يتم تحديد الفترات في الإعدادات) ، تفتح هذه الخوارزمية صفقة جديدة على BUY أو تغلق إذا كان هناك صفقة.
export class Main extends Algorithm { constructor() { super(); this.setProperty(Property.Digits, 2); this.addInput('period1', InputType.int, 10, { min: 2 }, { max: 500 }); this.addInput('period2', InputType.int, 25, { min: 2 }, { max: 500 }); this.addInput('averaging', InputType.Averaging, Averaging.Simple); this.addInput('appliedPrice', InputType.AppliedPrice, AppliedPrice.Close); this.addInput('priceType', InputType.PriceType, PriceType.Bid); } onInit() {} /** * طريقة البحث عن التجارة */ async getLastOpenOrder() { let orders = await Order.all(Order.Source.Trades); orders = orders.filter( (order) => order.Symbol === Current.Symbol && order.UserData === Current.ScriptId ).sort( (a, b) => b.OpenTime - a.OpenTime ); return orders.length ? orders[0] : null; } async onTick() { const { period1, period2, averaging, appliedPrice, priceType, } = this.getInputs(); // بيانات مؤشر MA الأول const list1 = await Indicators.MA( Current.Symbol, Current.TimeFrame, period1, 0, averaging, appliedPrice, priceType ); // بيانات المؤشر الثاني MA const list2 = await Indicators.MA( Current.Symbol, Current.TimeFrame, period2, 0, averaging, appliedPrice, priceType ); // إذا تقاطعت خطوط مؤشر MA if (list1[0].toFixed(Current.Digits) === list2[0].toFixed(Current.Digits)) { // ابحث عن آخر صفقة تم فتحها بواسطة هذا المؤشر const order = await this.getLastOpenOrder(); if (order) { // تأكد من فتح الصفقة في شريط آخر من الإطار الزمني الدقيق const sameBar = Bar.sameBar(order.OpenTime, Current.Time, TimeFrame.M1); if (!sameBar) { // إتمام الصفقة await order.close(); } } else { // نأخذ الحد الأدنى لمقدار الرمز const volume = Market.info(Market.Mode.VolumeMin, Current.Symbol); // قم بإبرام صفقة const newOrder = new Order(Current.Symbol, Order.TradeCmd.Buy, volume); // نضع بيانات المستخدم التي من خلالها سنبحث عن صفقة في المستقبل newOrder.setUserData(Current.ScriptId); // حفظ التغييرات (افتح صفقة) await newOrder.save(); } } } }