Робот спал, а мы работали
Как выяснилось, робот весь месяц не мог совершать торговые операции. Это случилось в результате достаточно банальной ошибки: в настройках терминала было запрещено совершать торговые операции эксперту. А я для чистоты эксперимента даже не заглядывал на сервер и не смотрел, что там происходит. И это сыграло злую шутку.
Однако это не мешает внести некоторые дополнения в код эксперта. На этот раз обратим внимание на риски.
Дополнение №1
Я являюсь сторонником весьма консервативных торговых систем, когда сделки держатся открытыми долгие месяцы, а риски по ним строго контролируются. В случае же с данным роботом, мы имеем совершенно иную картину. Торговый эксперт совершает сделки, которые достаточно быстро закрываются. Риски практически никак не контролируются. Важным и полезным дополнением станет ограничение на суммарный риск, который робот может понести в течение одного месяца.
Иными словами, мы скажем роботу: «Если ты потеряешь в этом месяце X процентов от депозита, то ты плохой мальчик, и мы ставим тебя в угол. До следующего месяца». А со следующего месяца все начнем заново: депозит на начало месяца возьмем за 100% и опять будем следить, чтобы робот не потерял слишком много.
Конечный модуль (функция) имеет следующий код:
//+——————————————————————————————————-+
//| Определение факта, что робот достиг уровня допустимой просадки |
bool is_mn_max_los(double percent_of_max_los) {
double start_depo_mn=0.0, tmp_value=0.0;
int i = 0; // счётчик для цикла
for (i=OrdersHistoryTotal()-1; i>=0; i—) {
if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
//если ордер не выбран — переходим к следующему шагу цикла
if(OrderCloseTime()>iTime(NULL,PERIOD_MN1,0))
tmp_value+=OrderProfit()+OrderCommission()+OrderSwap();
}
for (i=OrdersTotal()-1; i>=0; i—) {
if (!OrderSelect(i,SELECT_BY_POS,MODE_OPEN)) continue;
//если ордер не выбран — переходим к следующему шагу цикла
tmp_value+=OrderProfit()+OrderCommission()+OrderSwap();
}
start_depo_mn=AccountEquity()-tmp_value;
GlobalVariableSet(«ForTrader_5min»,iTime(NULL,PERIOD_M5,0));
if((-1)*tmp_value>(start_depo_mn/100)*percent_of_max_los)
return(true); //если мы потеряли больше, чем позволено, — возвращаем true
return(false);
}
//| Определение факта, что робот достиг уровня допустимой просадки |
//+——————————————————————————————————-+
Дополнение №2
Поскольку при достижении допустимого уровня просадки решено закрывать все открытые роботом сделки, то потребуется функция, которая это обеспечит. Я возьму готовую функцию из своего набора, которая позволяет закрывать все ордера данного типа с данным магическим номером:
//+——————————————————————————————————-+
//| Операция закрытия сделок |
bool cbm(int magic, int slipage, int type) {
/*
close by magic (закрытие всех ордеров данного типа с данным MagicNumber)
Учитывается максимально допустимое проскальзывание (slipage)
Используется функция close_by_ticket.
*/
int n = 0;
for (int i2=OrdersTotal()-1; i2>=0; i2—) {
if (!OrderSelect(i2,SELECT_BY_POS,MODE_TRADES)) break;
if ((OrderType()==type) && (OrderMagicNumber()==magic)) { //если сделка данного типа и ее магический номер подходит
close_by_ticket(OrderTicket(), slipage); // закрываем сделку
n++; //наращиваем счетчик закрытых сделок (на самом деле — попыток закрытия)
} //end if (((OrderType()==OP_BUY) || (OrderType()==OP_SELL)) && (OrderMagicNumber()==magic))
} //end for (int i2=OrdersTotal()-1; i2>=0; i2—)
if(n>0) //если попыток закрытия было больше 0, то функция возвращает true
return(true);
return(false);
} //end bool cbm(int magic, int slipage, int type)
//| Операция закрытия сделок |
//+——————————————————————————————————-+
Таким образом, взаимодействие этих функций в роботе будет выглядеть так:
if(is_mn_max_los(Percent_Of_Max_Los)) {
cbm(Magic_Number, Slipage, OP_BUY);
cbm(Magic_Number, Slipage, OP_SELL);
Comment(«Внутри текущего месяца достигнут лимит потерь в «,Percent_Of_Max_Los,»% от депозита на начало месяца!»);
return(0);
}
Код всего торгового робота принял следующий вид: Скачать эксперта
Заключение
К сожалению, статья оказалась меньше, чем я планировал. Виной тому моя ошибка при запуске робота в прошлый раз. Но теперь, когда эксперт, наконец, работает, будет достаточно материала для оценки его эффективности, анализа ошибок (в случае их появления) и модернизации сердца торгового эксперта – алгоритма поиска сигналов. Кроме того, планируется привнести некоторые дополнения в расчет рабочих лотов и слежение за рисками (помимо предпринятых дополнений).