Недавно я писал о методе увеличения прибыли с помощью введения зависимости лота от величины просадки.
Читать подробнее о методе
Идею (которую раньше проверял в Excel) удалось воплотить в код MQL4. В этой заметке выкладываю получившийся код.
Внимание! Функция предназначена для стратегий, по которым одновременно открыто не более одной сделки.
Используемые переменные (оптимальные параметры зависят от Вашей стратегии):
extern bool ddLot=true; //если вкл, используется увеличение лота при просадке ниже ddX и восстановление лота при просадке выше ddY
extern double ddX = 0.12; // при превышении данного уровня просадки лот будет увеличиваться в k раз (указывается в долях, т.е. ddX=0.10 означает 10% просадку)
extern double ddY = 0.06; // после достижения ddX лот будет оставаться повышенным, пока просадка не восстановится выше уровня ddY (указывается в долях)
extern double k = 2.00; // коэффициент изменения лота в зависимости от уровня просадки
double MaxEquity = 0; // переменная для хранения максимального эквити
bool k_use = false; // хранит информацию, использовался ли в последней сделке k (коэффициент изменения лота в зависимости от уровня просадки)
Код функции расчета лота в зависимости от величины просадки:
//+-------------------------------------------------------------------------------------------------------------------+
//| увеличение лота при просадке |
void ddLot(){
double DrawDawn = 0; // переменная для текущей просадки
// расчет текущей просадки
if (AccountEquity() > MaxEquity){
MaxEquity = AccountEquity();
}
DrawDawn=NormalizeDouble(((MaxEquity - AccountEquity())/MaxEquity),2);
//проверка на условие повышение лота при достижении порога просадки ddX
if (DrawDawn >= ddX) {
Lots = NormalizeDouble((Lots * k),2);
k_use = true;
}
// если просадка меньше ddX, то проверить, больше ли она ddY и не повышался ли лот от просадки в последней сделке
else {
// если да, то продолжаем торговать повышенным лотом
if (k_use == true && DrawDawn >= ddY){
Lots = NormalizeDouble((Lots * k),2);
}
// если нет, то k_use присваиваем false
else {
k_use = false;
}
}
}
Запуск функции осуществляется с помощью вставки в основную часть
if (ddLot==true){ddLot();}
Lots рассчитывается предварительно в другом блоке расчета зависимости лота от эквити (для реализации реинвестирования).
Комментарии (16)
0 iceburg Сообщений: 3
47 Kaur Автор Сообщений: 1327 - Руслан Каюмов
0 iceburg Сообщений: 3
47 Kaur Автор Сообщений: 1327 - Руслан Каюмов
0 iceburg Сообщений: 3
У меня весь расчет в виде блока mql, который вставляется в советник. А весь блок выше приведен. Т.е. отдельного индикатора под это нет. Его еще надо делать.
Думаю, что реально.
47 Kaur Автор Сообщений: 1327 - Руслан Каюмов
0 bhairava Сообщений: 5
0 guest111 Сообщений: 180
После прочтения, в том числе допов по ссылкам, станет понятно почему надо увеличить лот при просадке, чтобы выйти в плюс. Кратко: просадка была сделана лотом от еквити, а следующая ставка лотом от еквити минус убыток. В итоге наблюдаем нисходящую кривую. Всё просто.
И да, на тему удвоений лота и других на первый взгляд очевидных вещей там есть что покурить вдумчиво.
0 guest111 Сообщений: 180
Но мне нужно именно в зависимости от баланса, или даже не баланса, а от эквити при увеличении допустим эквити на каждые int n_profit раз, увеличивать лот на double k
Пока реализовал примерно так, но понимаю, что есть какой-то более динамичный способ, но еще только осваеваю mql, и понять пока не получается как это сделать иначе.
пробовал другой вариант, что-то типа этого:
double Lot_Size = 0.01;
double k = 0.01;
int n_profit = 100;
Первый вариант работает, а этот ни в какую не хочет.(
0 bhairava Сообщений: 5
0 guest111 Сообщений: 180
0 bhairava Сообщений: 5
А подскажите, пожалуйста, какие значения должны быть в переменных EquLot, LotExp, count_buy, count_sell, LotDec и MaxiLot.
count_buy и count_sell подсчитывает лоты в открытых позициях? А если у меня нет открытых, можно просто на 0 заменить?
0 bhairava Сообщений: 5
Если нет открытых, размер лота принимает значение переменной BaseLot — начальный лот серии. Он же, если явно не задан, берётся из размера минимального лота у брокера (переменная MinLot в коде инициализации init() совы):
Редактирован: 17 июня 2014, 20:19
0 guest111 Сообщений: 180
0 bhairava Сообщений: 5
0 guest111 Сообщений: 180
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий