Jump to content

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


Recommended Posts

|Alpari|

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

Параметры:

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

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

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

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

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

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

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


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

Link to post
Share on other sites
  • Replies 267
  • Created
  • Last Reply

Top Posters In This Topic

  • AntFX

    81

  • solandr

    33

  • Melady

    18

  • Igonter

    16

Top Posters In This Topic

Popular Posts

Пожалуйста: новый параметр Rounding отвечает за метод округления до минимального шага лота. 1 - до ближайшего меньшего, 2 - до ближайшего большего, 3 - до ближайшего "целого". По умолчанию установлен

А ещё Вы можете, solandr, создать собственный корректировщик и открыто выложить его для скачивания в этом разделе, изложив подробно принципы, заложенные в его основу. Вот это было бы конструктивно. Пр

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

Posted Images

Igonter

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

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

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

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


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

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();
}

Link to post
Share on other sites
RickD

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


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

Link to post
Share on other sites
  • 2 weeks later...
Programmer

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

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

 

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

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

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

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

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

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


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

Link to post
Share on other sites
Programmer

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

Link to post
Share on other sites
IVAN_IV

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

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


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

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

Link to post
Share on other sites
Programmer

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

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

 

 

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


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

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

Link to post
Share on other sites
  • 6 months later...
Scelestus

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


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

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

Link to post
Share on other sites
  • 3 months later...
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 раз больше, чем открыто :)

Link to post
Share on other sites
|Alpari|

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

  • Thanks 1

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

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

Link to post
Share on other sites
Igonter

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

*****

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

*****

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

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

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

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

Link to post
Share on other sites
Igonter

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

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

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

Link to post
Share on other sites
Sergey Kovalyov

Один робот -- один терминал. А дилер уже пусть разгребается. =)

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

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

 

...

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

...

 

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

Пробуйте.

Volume Correction v3.0.mq4

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

 

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

 

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

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

Link to post
Share on other sites
Igonter

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

Volume Correction v3.6.mq4

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.


×
×
  • Create New...