Данный алгоритм при пересечении МА 10 и МА 25 (периоды указываются в настройках) открывает новую сделку на BUY или закрывает при ее наличии.
export class Main extends TradingBot { 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(); // Данные первого индикатора МА const list1 = await Indicators.MA( Current.Symbol, Current.TimeFrame, period1, 0, averaging, appliedPrice, priceType ); // Данные второго индикатора МА const list2 = await Indicators.MA( Current.Symbol, Current.TimeFrame, period2, 0, averaging, appliedPrice, priceType ); // Если линии МА индикаторов пересекаются 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(); } } } }