Пример алгоритма

Данный алгоритм при пересечении МА 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();
            }
        }
    }
}