Jump to content
dao

Советник - Коррекция Объема

Recommended Posts

dao

Надо разработать советник, который будет корректировать объем открытых позиций при поступлении на счет балансовых операций. Нужно это в связи со скорым запуском ПАММов.

Параметры:

  • Признак, что разрешено увеличение позиций при вводе средств.
  • Признак, что разрешено уменьшение позиций при выводе средств.
  • Режим уменьшения однотипных позиций по одной валюте:
  • пропорционально все позиции
  • более убыточные в первую очередь
  • более прибыльные в первую очередь
  • с наименьшим объемом в первую очередь
  • с более поздним открытием в первую очередь

Алгоритм:
При поступлении балансовой операции вычисляется отношение поступивших средств к эквити.
D = баланс / эквити.
Если D > 0 и Признак1, то приступаем к увеличению позиций.
Если D < 0 и Признак2, то приступаем к уменьшению позиций.
Все.

Алгоритм увеличения.
Бежим по открытым позициям и определяем нетто позицию по каждому инструменту: V = Суммарный объем Лонг - Суммарный объем Шорт.
По каждому инструменту, где V <> 0 нужно открыть позицию объемом V * D, с учетом знака V и отсечением объемов ниже минимальных.

Алгоритм уменьшения.
Аналогично определяем нетто позицию V.
Определяем по каждому инструменту объем, который надо закрыть C.

Далее, согласно установленному режиму параметром3 нужно:

  • Пропорционально V сократить все позиции.
  • Начать сокращение с наиболее убыточных, переходя к более прибыльным пока не будет закрыт весь требуемый объем. Считаем комиссию, своп и торговую прибыль для сравнения позиций.
  • Аналогично 2, но начиная с наиболее прибыльных идти к убыточным.
  • Аналогично 2, но с наименьшего объема к наибольшему.
  • Аналогично 2, но от более поздних позиций к более ранним.

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


С уважением, Дмитрий Орлов.

Share this post


Link to post
Share on other sites
Igonter

D = баланс / эквити.

??? И что это будет, не понял. Баланс же и ДО поступления/вывода новых денег не был равен эквити - позы-то открыты.

Share this post


Link to post
Share on other sites
dao
??? И что это будет, не понял. Баланс же и ДО поступления/вывода новых денег не был равен эквити - позы-то открыты.

Я имел в виду "сумма балансовой операции".

И если быть более точным, то надо брать такую формулу D = баланс_оп / (эквити - баланс_оп)


С уважением, Дмитрий Орлов.

Share this post


Link to post
Share on other sites
Igonter

Выделить балансовые операции из истории можно так:

total=OrdersHistoryTotal();
for(cnt=0;cnt<total;cnt++)      
{
 OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY);
 if (OrderType()==6)  Balance_Change += OrderProfit();
}

Share this post


Link to post
Share on other sites
RickD

Если нет блок-схемы, разумно было бы начать с примеров.


MQL4: идея * опыт + творческий подход

:agree:

Share this post


Link to post
Share on other sites
Programmer

Вот наконец-то я добрался и до этого советника.

Начнём с того, что такое PAMM-счета.

 

Английская аббревиатура PAMM расшифровывается как Percentage Allocation Management Module, что по-русски означает Модуль Управления Процентным Распределением (МУПР).

Устроены PAMM так: несколько счетов объединяются под упроавлением одного мастер-счёта. Торговля происходит из мастер-счёта от лица всех участников PAMM. Когда ордер закрывается, прибыль или убыток распеределяется между участниками пропорционально их доли в equity PAMM'а.

Share this post


Link to post
Share on other sites
Programmer

Советник работает по описанию.

Входные параметры:

 

AllowIncrease - разрешено увеличение позиций при вводе средств.

AllowDecrease - разрешено уменьшение позиций при выводе средств.

Mode - режим уменьшения однотипных позиций по одной валюте:

  1. Пропорционально V сократить все позиции.
  2. Начать сокращение с наиболее убыточных, переходя к более прибыльным пока не будет закрыт весь требуемый объем. Считаем комиссию, своп и торговую прибыль для сравнения позиций.
  3. Аналогично 2, но начиная с наиболее прибыльных идти к убыточным.
  4. Аналогично 2, но с наименьшего объема к наибольшему.
  5. Аналогично 2, но от более поздних позиций к более ранним.

StopLoss - значение StopLoss в пунктах для добавляемых позиций. 0 означает без StopLoss.

TakeProfit - значение TakeProfit в пунктах для добавляемых позиций. 0 означает без TakeProfit.

 

Советник получился достаточно большой. Я протестировал, как мог, но ошибки ещё могут быть и скорее всего они есть. Так что надо тестировать и смотреть - будем исправлять.

 

:sdelano:

 

С уважением,

Кирилл.

Volume Correction v1.5.mq4

Share this post


Link to post
Share on other sites
dao
Советник работает по описанию

Большое спасибо!

В понедельник начнем тесты.


С уважением, Дмитрий Орлов.

Share this post


Link to post
Share on other sites
Programmer

Ни я, ни компания Alpari не несут ответственности за любые убытки, вызванные использованием предлогаемых программ.

Share this post


Link to post
Share on other sites
IVAN_IV

Потестил ,объем не менял, что не так?

Рабочий ли советник?


Клиентский отдел

Компания «Альпари»

Share this post


Link to post
Share on other sites
Programmer

Да, советник рабочий. Я тестировал. Что он Вам выдаёт, какое сообщение?

Share this post


Link to post
Share on other sites
IVAN_IV
Да, советник рабочий. Я тестировал. Что он Вам выдаёт, какое сообщение?

 

 

Тишина, без сообщений, накинули на EURUSD меняли депозит, тишина, без изменений.


Клиентский отдел

Компания «Альпари»

Share this post


Link to post
Share on other sites
Scelestus

здрасьте, а советник актуальный? товарищ иван в итоге заработало?


При выпуске из детского сада мне дали рекомендацию в школу: «Общительный, хорошо кушает».Вы знаете, за несколько десятилетий ничего не изменилось :casha:

Первый ПАММ-счет

Share this post


Link to post
Share on other sites
Igonter

Понадобилась и мне эта штука недавно... Попробовал - не работает. Стал разбираться с кодом, нашел 3 ошибки в алгоритме, надо бы поправить...

а) в процедуре CreateSymbolArray пропущена строка

OrderSelect(i, SELECT_BY_POS);

б) нет обработки статуса IsTradeAllowed(). Из-за этого при первом запуске советник ничего сделать не может, а на последующих уже и не пытается ;)

в) нет обработки ситуации, когда D<=-1

Например: было на счету 100, висела открытая сделка с плечом 1:500. внесли 30000 и тут же слили 500. После этого запустился советник (допустим, тики не приходили какое-то время, а ордер был открыт и ушел в минус). Эквити стал = 100+30000-500=29600

Balance_Change / (Equity - Balance_Change) = 30000/(29600-30000)=-75

Советник попытается закрыть в 75 раз больше, чем открыто :)

Share this post


Link to post
Share on other sites
dao

Жаль, что не удалось услышать Начальника Транспортного Цеха...

  • Thanks 1

С уважением, Дмитрий Орлов.

Share this post


Link to post
Share on other sites
Programmer

Я за него!

 

Так, посмотрим...

Igonter,

а) Спасибо, исправил.

б) Про IsTradeAllowed() - совсем не понял, о чём Вы. Если торговля разрешена - будет работать, если - нет, значит и не надо.

в) Тонкое замечание. Исправил. Теперь работает так:

при проверке на новые балансовые операции сохраняет (в конце проверки) значение Equity (переменная Last_Equity) и тек. время (переменная Last_Equity_Check).

если появляются новые балансовые операции, то среди них вычисляется самая ранняя (время запоминается в переменную time_min)

далее, считается сумма всех бал. операций

далее, считается Equity, которое присутствовало перед самой ранней балансовой операцией - делается это следующим образом: к значению Last_Equity прибавляются результаты всех завершённых торговых операций, времена завершения которых лежат между Last_Equity_Check и time_min.

 

Хотя замечание 3 и является существенным, я думаю, что не оно не позволяет советнику работать.

Основная проблема с данным советником заключается в том, что его нельзя в окончательном варианте прогнать на тестере, чтобы выявить ошибки, т.к. нет возможности совершать балансовые операции.

Я проверяю его так - заменяю OrderType() == 6, например на OrderType() == 0 (операция на покупку), и ставлю какой-нибудь OP_BUY в опред. момент истории. После его закрытия, например в плюс, советник обрабатывает его, как положительную балансовую операцию. При этом, если есть ещё открытые ордера, то советник их увеличивает согласно описанному алгоритму - всё работает.

Почему не работает на реале - я уже голову сломал. Не понимаю. :search:

Единственное, что осталось на уме - это, что для балансовых операций (OrderType() == 6) надо рассматривать не вкумя открытия (OrderOpenTime()), а время закрытия (OrderCloseTime()).

 

Я написал две версии: v2.0 и v2.1 - c OrderOpenTime() и OrderCloseTime() соответственно.

 

Igonter, предлагаю довести этот инструмент до рабочего состояния.

Проверьте обе эти версии на своём счёте - будут результаты, будем думать, что дальше делать.

Volume Correction v2.0.mq4

Volume Correction v2.1.mq4

Share this post


Link to post
Share on other sites
Igonter

б) Про IsTradeAllowed() - совсем не понял, о чём Вы. Если торговля разрешена - будет работать, если - нет, значит и не надо.

*****

Хотя замечание 3 и является существенным, я думаю, что не оно не позволяет советнику работать.

*****

Почему не работает на реале - я уже голову сломал. Не понимаю. :search:

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

Выход из положения №1 (оптимальный, имхо): поставить перед каждой попыткой открытия ордера бесконечный (или почти бесконечный :) ) цикл ожидания смены статуса IsTradeAllowed()

Выход №2: Запоминать матрицу необходимых ордеров в файл, на каждом тике проверять статус запрета, и если торговля разрешена - совершить ровно одну операцию (больше все равно не даст, статус запрета тут же поменяется). Результат операции занести в тот же файл в виде коррекции и выйти. На следующем тике повторить. И так, пока файл очереди не станет пуст.

Share this post


Link to post
Share on other sites
Igonter

ЗЫ. Для контроля статуса сегодня поставлю на счет советник, который будет писать в файл лога состояние запрета. Вот и посмотрим точно тогда ;)

Share this post


Link to post
Share on other sites
Igonter
ЗЫ. Для контроля статуса сегодня поставлю на счет советник, который будет писать в файл лога состояние запрета. Вот и посмотрим точно тогда ;)

Ну что, глянул логи... Все так, как я и думал. В 00-00 проходит ролловер, тут же все советники наперебой бросаются редактировать свои ордера. Кто первый получил тик - тот и занял торговый поток, остальные получают IsTradeAllowed()=0. Как первый получил подтверждение о завершении операции, торговый поток освобождается и на следующем тике все повторяется, только очередь ожидающих советников уменьшается на единицу. Опять кто первый встал, того и тапки :)

Share this post


Link to post
Share on other sites
Igonter
Один робот -- один терминал. А дилер уже пусть разгребается. =)
Не, так не попрет. Советник же должен быть стандартным, т.е. рекомендованным к употреблению :) А это подразумевает, что работать он должен в любом случае. И вообще, вариант не очень... Если у меня на счету одновременно 15 советников, и счетов этих не один, не два и даже не пять... Будет лагать зверски все...

Share this post


Link to post
Share on other sites
Programmer

Проверил - время открытия и закрытия у ордеров балансовых операций совпадают.

 

...

Выход из положения №1 (оптимальный, имхо): поставить перед каждой попыткой открытия ордера бесконечный (или почти бесконечный :) ) цикл ожидания смены статуса IsTradeAllowed()

...

 

Хорошо. Так и сделаем.

Пробуйте.

Volume Correction v3.0.mq4

Share this post


Link to post
Share on other sites
Sergey Kovalyov
Не, так не попрет. Советник же должен быть стандартным, т.е. рекомендованным к употреблению :) А это подразумевает, что работать он должен в любом случае. И вообще, вариант не очень... Если у меня на счету одновременно 15 советников, и счетов этих не один, не два и даже не пять... Будет лагать зверски все...

 

Боюсь, что "стандартный" и "на счету 15 роботов" -- несовместимо.

 

"Стандартный" должен помочь в первую очередь всем "ручникам". Возможно, поможет тем, у кого робот (хотя, те, у кого робот, сами себе могут помочь). И уж вряд ли поможет тем, у кого 15 роботов на счету. Где-то так.

Share this post


Link to post
Share on other sites
Igonter

Подправил чуть-чуть советника.

1) Что-то слишком сложно накручено с подсчетом первоначальной эквити. Непонятно, зачем мы подсчитываем закрытые сделки с момента LastBalOp до первой балансовой операции. Так мы эквити не получим, поскольку эти сделки скорее всего были открыты задолго до момента LastBalOp. А значит, большая часть их результата уже учтена в предыдущем снятом эквити.

В общем, я откатил на предыдущий вариант подсчета D и просто добавил условие, если D<-1, ничего не делать.

2) Добавил в цикл проверки на IsTradeAllowed вызов функции RefreshRate, без этого просто не будет работать. (ошибка 135)

3) Добавил туда же проверку на IsStopped, а то его не остановишь потом :)

 

Теперь ТЕОРЕТИЧЕСКИ должно работать на реале у тех, кто "ручками" торгует. А вот у себя поставить по-прежнему не могу, я МТС-ник и мне надо, чтобы у ордеров сохранялся MagicNumber.

Такой функции нету :(

Не хватает еще одного способа открытия позиций - так же как и с закрытием, пропорционально, чтоб на каждый ордер открывался дополнительный с тем же MagicNumber...

Volume Correction v3.5.mq4

Share this post


Link to post
Share on other sites
Igonter

Еще со слипажем косячек нашел. Он совсем не равен 3 :) Теперь слиппаж равен спреду для этого инструмента. Однако ж, попробовать все равно не могу, для МТС-ников нужен совсем другой советник, где бы пропорционально домножались на коэффициент все подряд ордера, с сохранением соответствующих MagicNumber...

Volume Correction v3.6.mq4

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×