Делюсь своим рисковиком для MT5
Код к вашим услугам, используйте «из коробки» или с собственными доработками на ваше усмотрение.
Он позволяет мгновенно открывать множество позиций с заданными параметрами и контролем рисков,
а также плавно переводить SL открытых с его помощью позиций в безубыток, если необходимо.
SL перемещается как через ползунок ручками, так и через поле ввода. Направление сделки определяется
в зависимости от положения цены относительно текущей цены. Только для входов по рынку, без отложенных ордеров.
Открыть позиции можно по кнопке или горячей клавише.


Две недели с ним торгую, вроде как все критичные баги пофиксил, все нужные мне штуки запилил, пора на открытое тестирование

Буду обновлять код по мере внесения каких-то важных доработок, если такие будут.
1000 строк кода в одно сообщение не помещается, будь то со спойлером или без, поэтому закинул в облако майл.ру.
Тут txt файл с кодом, файл с открытым кодом mq5 и готовый советник ex5:
https://cloud.mail.ru/public/7TKU/MZ4WkCwyEОписание работы советника:
1. Управление рисками
· Расчет риска: Можно задать суммарный риск открываемых позиций в % от депозита, как фиксированную сумму,
либо выбрать фиксированный размер лота для всех открываемых позиций
· Режим автоматического расчета лота: размер позиции рассчитывается на основе расстояния до стоп-лосса;
округление идет в меньшую сторону, чтобы не превышать риски, поэтому для точного риск-менеджмента
важно иметь достаточный деп, если дробите сделку на большое количество позиций
2. Мультипозиционная стратегия
· Открывает от 1 до 20 позиций одновременно (настраивается)
· Для каждой позиции можно задать индивидуальное соотношение риск/прибыль (RR)
· Возможность неравномерного распределения объема между позициями через весовые коэффициенты
3. Интерфейс
· Визуальный ползунок для установки стоп-лосса
· Поле для точного ввода цены SL
· Информационные метки с текущими параметрами
· Горячие клавиши (Shift+E для быстрого открытия позиций)
4. Трейлинг-стоп в безубыток
· Автоматический перевод стоп-лосса в безубыток
· Настраиваемые уровни активации трейлинга (в единицах RR)
· Плавное перемещение SL между точками R1 и R2 бумажной прибыли
5. Сохранение данных для правильной работы
· Сохранение начальных SL в глобальные переменные терминала
· Восстановление параметров при перезапуске терминала, советника или смене ТФ
· В комментариях к позициям указываются их RR для правильной последующей корректировки
уровней TP на случай проскальзывания
6. Как пользоваться
Разрешите алготрейтинг для счета, затем настройте параметры при подключении советника:
· Выберите количество позиций (1-20);
· Задайте уровень риска (% от депозита, фикс сумма в валюте счета, либо фикс объем на 1 позицию),
если нужен фикс объем на каждую позицию, установите false для переменной
Автоматический расчет размера лота;
· Установите RR для каждой позиции;
· При необходимости настройте весовые коэффициенты объема для каждой позиции;
· Выберите уровни начала и окончания трейлинга стопа в безубыток в RR. По мере обновления максимумов;
бумажной прибыли в этом диапазоне, SL позиций, открытых этим советником на этом активе, будут пропорционально
перемещаться от изначального положения -1R в безубыток;
если Трейлинг SL до безубытка не нужен, установите для этой переменной значение false
Установите стоп-лосс:
· Перетащите красную линию на графике
· Или введите цену вручную и нажмите «Set SL»
Откройте позиции:
· Нажмите кнопку «Open Positions»
· Или используйте горячие клавиши Shift+E
Важные особенности или моменты, требующие дальнейшей доработки:
1) Комбинация Shift + E «намертво» прописана в коде, у меня пока не получилось реализовать ввод горячих клавиш через параметры
2) Не удалось корректно настроить изменение визуального состояния кнопок (нажата/отжата), поэтому отключил это (п****)
3) При перемещении ползунка SL новое значение стопа будет присвоено после отжатия ЛКМ
4) Импорт из винды какой-то там библиотеки:
#import «user32.dll»
int GetAsyncKeyState(int vKey);
нужен только для работы горячих клавиш открытия позиции.
Если вам не нужны горячие клавиши или вас беспокоит предупреждение
«Разрешить импорт dll (потенциально опасно, включать только для проверенных приложений)»
— удалите или закомментируйте эти участки кода:
#import «user32.dll»
int GetAsyncKeyState(int vKey);
#import
#define VK_SHIFT 16
#define VK_LSHIFT 160
#define VK_RSHIFT 161
#define VK_E 69
bool KeyState(int vKey)
{
return((GetAsyncKeyState(vKey) & 0x8000) != 0);
}
...
// Обработка нажатия горячих клавиш
if(id == CHARTEVENT_KEYDOWN)
{
// Проверяем, что нажат Shift + E (код Shift — 16, код E — 69)
if(lparam == 69 && (KeyState(VK_SHIFT) || KeyState(VK_LSHIFT) || KeyState(VK_RSHIFT)))
{
OpenCalculatedPositions();
Print(«Позиции открыты по горячей клавише Shift+E»);
}
}
...
// Тень для метки горячих клавиш
ObjectCreate(0, «RISK_lblHotkey_shadow», OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, «RISK_lblHotkey_shadow», OBJPROP_XDISTANCE, 121); // Смещение на 1 пиксель
ObjectSetInteger(0, «RISK_lblHotkey_shadow», OBJPROP_YDISTANCE, baseY + 33); // Смещение на 1 пиксель
ObjectSetString(0, «RISK_lblHotkey_shadow», OBJPROP_TEXT, «(Shift + E)»);
ObjectSetInteger(0, «RISK_lblHotkey_shadow», OBJPROP_COLOR, clrBlack);
ObjectSetInteger(0, «RISK_lblHotkey_shadow», OBJPROP_BACK, false);
ObjectSetInteger(0, «RISK_lblHotkey_shadow», OBJPROP_FONTSIZE, 10);
// Метка горячих клавиш
ObjectCreate(0, «RISK_lblHotkey», OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, «RISK_lblHotkey», OBJPROP_XDISTANCE, 120);
ObjectSetInteger(0, «RISK_lblHotkey», OBJPROP_YDISTANCE, baseY + 32);
ObjectSetString(0, «RISK_lblHotkey», OBJPROP_TEXT, «(Shift + E)»);
ObjectSetInteger(0, «RISK_lblHotkey», OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, «RISK_lblHotkey», OBJPROP_BACK, false);
ObjectSetInteger(0, «RISK_lblHotkey», OBJPROP_FONTSIZE, 10);
5) Не удалось доработать кнопки Set SL, Open Positions и Remove Expert так, чтобы они срабатывали только при полном клике
(то есть чтобы не срабатывали, если ЛКМ зажимается за пределами кнопки и отпускается в её пределах).
Будьте осторожны при перемещении графика. Не отжимайте клик на кнопках, это приведет к их нажатию!
6) Имеет смысл добавить прямоугольник-«ручку» к линии-ползунку SL, чтобы её было проще перетаскивать. Пока что не получилось.
7) Отправка ордеров на открытие позиций реализована через функцию OrderSendAsync(request, result), а не через обычную SendAsync. Особенность OrderSendAsync в том, что ордера на открытие нескольких позиций отправляются практически мгновенно, не дожидаясь ответа торгового сервера между отправкой предыдущего ордера и следующего. Поэтому отслеживание исполнения ордеров через MqlTradeResult не работает. Через OnTradeTransaction() тоже пока не получилось, забил хрен. Обрабатываю новые позиции в OnTrade(), указываю при отправке ордеров на открытие позиций в комментарии к ним заданный RR для правильной корректировки на случай проскальзывания. Вроде ок, все баботает, деду нраица.
8) Сбор данных о максимальном Bid и минимальном Ask я реализовал через MqlRates rates[]. Поэтому трейлинг-стоп начинается только при наступлении следующего минутного бара после открытия позиции. В первую минуту он пока не работает. Возможно, нужно как то сделать, чтобы для текущего, ещё не закрытого сразу после открытия позиции бара, данные собирались с тиковой истории, а остальные через MqlRates rates[], чтобы не засрать память тиками за кучу времени. Мб подумаю потом над этой проблемой, но поскольку мне это сейчас вообще не важно, ибо не торгую на минутках, а с первого раза я пока более правильную реализацию не осилил, ничего не обещаю.
Стандартное предупреждение:
Перед использованием на реальном счете — изучить код, протестить советника на демо-счете, включая нестандартные ситуации.
Ваши убытки — ваши проблемы, ю ноу
Буду рад вашим доработкам и сообщениям об ошибках

доделывать я, конечно, ничего не буду