Робот спал, а мы работали

Как выяснилось, робот весь месяц не мог совершать торговые операции. Это случилось в результате достаточно банальной ошибки: в настройках терминала было запрещено совершать торговые операции эксперту. А я для чистоты эксперимента даже не заглядывал на сервер и не смотрел, что там происходит. И это сыграло злую шутку.

Однако это не мешает внести некоторые дополнения в код эксперта. На этот раз обратим внимание на риски.

Дополнение №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);

}

Код всего торгового робота принял следующий вид: Скачать эксперта

Заключение

К сожалению, статья оказалась меньше, чем я планировал. Виной тому моя ошибка при запуске робота в прошлый раз. Но теперь, когда эксперт, наконец, работает, будет достаточно материала для оценки его эффективности, анализа ошибок (в случае их появления) и модернизации сердца торгового эксперта – алгоритма поиска сигналов. Кроме того, планируется привнести некоторые дополнения в расчет рабочих лотов и слежение за рисками (помимо предпринятых дополнений).

Добавить комментарий

Кнопка возврата к началу