Форум Бингуру 2.0

 Главная | Опросы | Регистрация | Поиск | Статистика | 1.0 | Сайт
Техническое Форум Бингуру 2.0 / Техническое /  
 

Кастомные советники для MetaTrader 5

 
Автор LegendaryNoname
 Квантонутый
#1 | Дата:  
Делюсь своим рисковиком для 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[], чтобы не засрать память тиками за кучу времени. Мб подумаю потом над этой проблемой, но поскольку мне это сейчас вообще не важно, ибо не торгую на минутках, а с первого раза я пока более правильную реализацию не осилил, ничего не обещаю.

Стандартное предупреждение:

Перед использованием на реальном счете — изучить код, протестить советника на демо-счете, включая нестандартные ситуации.
Ваши убытки — ваши проблемы, ю ноу

Буду рад вашим доработкам и сообщениям об ошибках

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

Автор Zack
 Гэпострел
#2 | Дата:  
О круто, затестим! Скажи, а он может устанавливать стоп -лосс автоматом при открытии позиции ? Допустим я всегда торгую со стопом 300 пипс и лотом 0.01, можно выставить такие настройки чтобы работали для каждого ордера? Ну просто напрягает всегда с.л вручную выставлять

Автор LegendaryNoname
 Квантонутый
#3 | Дата:  
Zack
Привет. Держать стоп на постоянном заданном расстоянии от рыночной цены пока не может, я не добавлял такое. Я как-нибудь потом добавлю эту функцию, раз нужна. Да и ты сам можешь, если хочешь побыстрее. Просто у рисковика с ютуба, которым я до этого пользовался, такая функция есть, зато не было статичного ценового уровня sl, что мне было нужно, вот я и реализовал так.

Автор Zack
 Гэпострел
#4 | Дата:  
Не-не, мне не надо его перемещать (как трейлинг). Нужна фича, которая ставит статичный сл по умолчанию автоматически при открытии позиции

Автор LegendaryNoname
 Квантонутый
#5 | Дата:  
Zack
ну тебе, как я понял, нужно открывать позицию с заданным расстоянием от цены входа до стопа. Пока что нет такой функции. Для этого нужно, чтобы советник до открытия позиции каждый тик учитывал новые данные и обновлял значения, чтобы расстояние от цены до ожидаемого стопа будущей позиции сохранялось неизменным. На данный момент уровень стопа до открытия позиции устанавливается на определенную цену и его значение не меняется. Потом сделаю как бы два отдельных режима — с фиксированным по цене стопом, и с фиксированным по расстоянию от рыночной цены.
То бишь до открытия позиции(позиций), на этапе ожидания сделки и выбора её параметров. Я не имел в виду трейлинг стопа в б/у после открытия позиций, это отдельная фича. Она отключается во входных параметрах, если не нужна

Автор Zack
 Гэпострел
#6 | Дата:  
LegendaryNoname:
Для этого нужно, чтобы советник до открытия позиции каждый тик учитывал новые данные и обновлял значения
Оригинал
Да нее, он же сам у тебя не торгует! Там очень простой код должен быть, а размер сл обычно указывается как цена открытия + заданный интервал
п с
Хотя забей, это чисто мои хотелки мне намного проще самому их под себя сделать чего это я к тебе пристал

Автор Zack
 Гэпострел
#7 | Дата:  
А зачем тебе открывать так много позиций? Не представляю, чтобы у меня когда нибудь было 20 позиций за раз открыто

Автор Risky
 Гэпострел
#8 | Дата:  
Zack
Я это объясняю желанием диверсифицировать свой РМ. То есть чтобы в итоге сгладить эквити. Я сам сейчас являюсь сторонником такой концепции. Недавно похожую тему обсуждал на форуме. Это равносильно закрытию профитной сделки лесенкой частями, так как никогда не знаешь как далеко зайдёт цена. Таким образом на дистанции имеем отработку всевозможных фаз рынка: с короткими RR и большими RR одновременно. Причём чем больше соотношение, тем меньше риск под него, чтобы суммарная позиция была сбалансированной. Могу даже показать как математически считать эти коэф-ты, чтобы балансировка была оптимальной. У автора этой ветки в настройках советника есть поля, где задаются эти коэф-ты, он их называет весами там...

Автор Zack
 Гэпострел
#9 | Дата:  
Risky:
эти коэф-ты, он их называет весами там...
Оригинал
Покажи, интересно. Это наверное называется пирамидинг, да?

Техническое Форум Бингуру 2.0 / Техническое /
 Кастомные советники для MetaTrader 5

Ваш ответ Нажмите эту иконку для возврата на цитируемое сообщение

 

  ?
Только зарегистрированные пользователи могут отправлять сообщения. Авторизуйтесь для отправки сообщений, или зарегистрируйтесь сейчас.

 

Онлайн: Гостей - 2
Пользователей - 1 [ MrHorse ]
Рекорд: 29 []
Гостей - 12 / Пользователей - 17
 


  ⇑