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