|Alpari| 172 Share Posted August 29, 2008 Надо разработать советник, который будет корректировать объем открытых позиций при поступлении на счет балансовых операций. Нужно это в связи со скорым запуском ПАММов.Параметры: Признак, что разрешено увеличение позиций при вводе средств. Признак, что разрешено уменьшение позиций при выводе средств. Режим уменьшения однотипных позиций по одной валюте: пропорционально все позиции более убыточные в первую очередь более прибыльные в первую очередь с наименьшим объемом в первую очередь с более поздним открытием в первую очередь Алгоритм:При поступлении балансовой операции вычисляется отношение поступивших средств к эквити.D = баланс / эквити.Если D > 0 и Признак1, то приступаем к увеличению позиций.Если D < 0 и Признак2, то приступаем к уменьшению позиций.Все.Алгоритм увеличения.Бежим по открытым позициям и определяем нетто позицию по каждому инструменту: V = Суммарный объем Лонг - Суммарный объем Шорт.По каждому инструменту, где V <> 0 нужно открыть позицию объемом V * D, с учетом знака V и отсечением объемов ниже минимальных.Алгоритм уменьшения.Аналогично определяем нетто позицию V.Определяем по каждому инструменту объем, который надо закрыть C.Далее, согласно установленному режиму параметром3 нужно: Пропорционально V сократить все позиции. Начать сокращение с наиболее убыточных, переходя к более прибыльным пока не будет закрыт весь требуемый объем. Считаем комиссию, своп и торговую прибыль для сравнения позиций. Аналогично 2, но начиная с наиболее прибыльных идти к убыточным. Аналогично 2, но с наименьшего объема к наибольшему. Аналогично 2, но от более поздних позиций к более ранним. Перед выполнием коррекции нужно создать массив тикетов позиций, что бы отличать корректируемые позиции от появляющихся в результате коррекции.Вроде все, наверняка что-то еще всплывет при разработке. Quote С уважением, Дмитрий Орлов. Link to post Share on other sites
Igonter 404 Share Posted August 29, 2008 D = баланс / эквити.??? И что это будет, не понял. Баланс же и ДО поступления/вывода новых денег не был равен эквити - позы-то открыты. Quote Link to post Share on other sites
|Alpari| 172 Author Share Posted August 29, 2008 ??? И что это будет, не понял. Баланс же и ДО поступления/вывода новых денег не был равен эквити - позы-то открыты. Я имел в виду "сумма балансовой операции". И если быть более точным, то надо брать такую формулу D = баланс_оп / (эквити - баланс_оп) Quote С уважением, Дмитрий Орлов. Link to post Share on other sites
Igonter 404 Share Posted August 29, 2008 Выделить балансовые операции из истории можно так: total=OrdersHistoryTotal(); for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY); if (OrderType()==6) Balance_Change += OrderProfit(); } Quote Link to post Share on other sites
RickD 11 Share Posted August 29, 2008 Если нет блок-схемы, разумно было бы начать с примеров. Quote MQL4: идея * опыт + творческий подход Link to post Share on other sites
Programmer 33 Share Posted September 6, 2008 Вот наконец-то я добрался и до этого советника. Начнём с того, что такое PAMM-счета. Английская аббревиатура PAMM расшифровывается как Percentage Allocation Management Module, что по-русски означает Модуль Управления Процентным Распределением (МУПР). Устроены PAMM так: несколько счетов объединяются под упроавлением одного мастер-счёта. Торговля происходит из мастер-счёта от лица всех участников PAMM. Когда ордер закрывается, прибыль или убыток распеределяется между участниками пропорционально их доли в equity PAMM'а. Quote Link to post Share on other sites
Programmer 33 Share Posted September 6, 2008 Советник работает по описанию. Входные параметры: AllowIncrease - разрешено увеличение позиций при вводе средств. AllowDecrease - разрешено уменьшение позиций при выводе средств. Mode - режим уменьшения однотипных позиций по одной валюте: Пропорционально V сократить все позиции. Начать сокращение с наиболее убыточных, переходя к более прибыльным пока не будет закрыт весь требуемый объем. Считаем комиссию, своп и торговую прибыль для сравнения позиций. Аналогично 2, но начиная с наиболее прибыльных идти к убыточным. Аналогично 2, но с наименьшего объема к наибольшему. Аналогично 2, но от более поздних позиций к более ранним. StopLoss - значение StopLoss в пунктах для добавляемых позиций. 0 означает без StopLoss. TakeProfit - значение TakeProfit в пунктах для добавляемых позиций. 0 означает без TakeProfit. Советник получился достаточно большой. Я протестировал, как мог, но ошибки ещё могут быть и скорее всего они есть. Так что надо тестировать и смотреть - будем исправлять. С уважением, Кирилл. Volume Correction v1.5.mq4 Quote Link to post Share on other sites
|Alpari| 172 Author Share Posted September 7, 2008 Советник работает по описанию Большое спасибо! В понедельник начнем тесты. Quote С уважением, Дмитрий Орлов. Link to post Share on other sites
Programmer 33 Share Posted September 7, 2008 Ни я, ни компания Alpari не несут ответственности за любые убытки, вызванные использованием предлогаемых программ. Quote Link to post Share on other sites
IVAN_IV 0 Share Posted September 11, 2008 Потестил ,объем не менял, что не так? Рабочий ли советник? Quote Клиентский отдел Компания «Альпари» Link to post Share on other sites
Programmer 33 Share Posted September 12, 2008 Да, советник рабочий. Я тестировал. Что он Вам выдаёт, какое сообщение? Quote Link to post Share on other sites
IVAN_IV 0 Share Posted September 15, 2008 Да, советник рабочий. Я тестировал. Что он Вам выдаёт, какое сообщение? Тишина, без сообщений, накинули на EURUSD меняли депозит, тишина, без изменений. Quote Клиентский отдел Компания «Альпари» Link to post Share on other sites
Scelestus 0 Share Posted April 9, 2009 здрасьте, а советник актуальный? товарищ иван в итоге заработало? Quote При выпуске из детского сада мне дали рекомендацию в школу: «Общительный, хорошо кушает».Вы знаете, за несколько десятилетий ничего не изменилось Первый ПАММ-счет Link to post Share on other sites
Igonter 404 Share Posted July 17, 2009 Понадобилась и мне эта штука недавно... Попробовал - не работает. Стал разбираться с кодом, нашел 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 раз больше, чем открыто Quote Link to post Share on other sites
|Alpari| 172 Author Share Posted July 24, 2009 Жаль, что не удалось услышать Начальника Транспортного Цеха... 1 Quote С уважением, Дмитрий Орлов. Link to post Share on other sites
Programmer 33 Share Posted July 25, 2009 Я за него! Так, посмотрим... 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 в опред. момент истории. После его закрытия, например в плюс, советник обрабатывает его, как положительную балансовую операцию. При этом, если есть ещё открытые ордера, то советник их увеличивает согласно описанному алгоритму - всё работает. Почему не работает на реале - я уже голову сломал. Не понимаю. Единственное, что осталось на уме - это, что для балансовых операций (OrderType() == 6) надо рассматривать не вкумя открытия (OrderOpenTime()), а время закрытия (OrderCloseTime()). Я написал две версии: v2.0 и v2.1 - c OrderOpenTime() и OrderCloseTime() соответственно. Igonter, предлагаю довести этот инструмент до рабочего состояния. Проверьте обе эти версии на своём счёте - будут результаты, будем думать, что дальше делать. Volume Correction v2.0.mq4 Volume Correction v2.1.mq4 Quote Link to post Share on other sites
Igonter 404 Share Posted July 28, 2009 б) Про IsTradeAllowed() - совсем не понял, о чём Вы. Если торговля разрешена - будет работать, если - нет, значит и не надо. ***** Хотя замечание 3 и является существенным, я думаю, что не оно не позволяет советнику работать. ***** Почему не работает на реале - я уже голову сломал. Не понимаю. Я ж написал наиболее вероятную причину, на мой взгляд. Это как раз пункт (б). Статус "торговля разрешена" или "запрещена" может меняться несколько раз в минуту Выставляем ордер - пока он в очереди, торговля запрещена. Как только заявка обработана - торговля снова разрешена. Видимо, в момент выполнения балансовой операции, на какой-то момент появляется статус "торговля запрещена". И в этот самый момент срабатывает советник, ничего не делает и выходит.Выход из положения №1 (оптимальный, имхо): поставить перед каждой попыткой открытия ордера бесконечный (или почти бесконечный ) цикл ожидания смены статуса IsTradeAllowed() Выход №2: Запоминать матрицу необходимых ордеров в файл, на каждом тике проверять статус запрета, и если торговля разрешена - совершить ровно одну операцию (больше все равно не даст, статус запрета тут же поменяется). Результат операции занести в тот же файл в виде коррекции и выйти. На следующем тике повторить. И так, пока файл очереди не станет пуст. Quote Link to post Share on other sites
Igonter 404 Share Posted July 28, 2009 ЗЫ. Для контроля статуса сегодня поставлю на счет советник, который будет писать в файл лога состояние запрета. Вот и посмотрим точно тогда Quote Link to post Share on other sites
Igonter 404 Share Posted July 29, 2009 ЗЫ. Для контроля статуса сегодня поставлю на счет советник, который будет писать в файл лога состояние запрета. Вот и посмотрим точно тогда Ну что, глянул логи... Все так, как я и думал. В 00-00 проходит ролловер, тут же все советники наперебой бросаются редактировать свои ордера. Кто первый получил тик - тот и занял торговый поток, остальные получают IsTradeAllowed()=0. Как первый получил подтверждение о завершении операции, торговый поток освобождается и на следующем тике все повторяется, только очередь ожидающих советников уменьшается на единицу. Опять кто первый встал, того и тапки Quote Link to post Share on other sites
Sergey Kovalyov 173 Share Posted July 29, 2009 Один робот -- один терминал. А дилер уже пусть разгребается. =) Quote Link to post Share on other sites
Igonter 404 Share Posted July 30, 2009 Один робот -- один терминал. А дилер уже пусть разгребается. =)Не, так не попрет. Советник же должен быть стандартным, т.е. рекомендованным к употреблению А это подразумевает, что работать он должен в любом случае. И вообще, вариант не очень... Если у меня на счету одновременно 15 советников, и счетов этих не один, не два и даже не пять... Будет лагать зверски все... Quote Link to post Share on other sites
Programmer 33 Share Posted July 30, 2009 Проверил - время открытия и закрытия у ордеров балансовых операций совпадают. ...Выход из положения №1 (оптимальный, имхо): поставить перед каждой попыткой открытия ордера бесконечный (или почти бесконечный ) цикл ожидания смены статуса IsTradeAllowed() ... Хорошо. Так и сделаем. Пробуйте. Volume Correction v3.0.mq4 Quote Link to post Share on other sites
Sergey Kovalyov 173 Share Posted July 30, 2009 Не, так не попрет. Советник же должен быть стандартным, т.е. рекомендованным к употреблению А это подразумевает, что работать он должен в любом случае. И вообще, вариант не очень... Если у меня на счету одновременно 15 советников, и счетов этих не один, не два и даже не пять... Будет лагать зверски все... Боюсь, что "стандартный" и "на счету 15 роботов" -- несовместимо. "Стандартный" должен помочь в первую очередь всем "ручникам". Возможно, поможет тем, у кого робот (хотя, те, у кого робот, сами себе могут помочь). И уж вряд ли поможет тем, у кого 15 роботов на счету. Где-то так. Quote Link to post Share on other sites
Igonter 404 Share Posted August 6, 2009 Подправил чуть-чуть советника. 1) Что-то слишком сложно накручено с подсчетом первоначальной эквити. Непонятно, зачем мы подсчитываем закрытые сделки с момента LastBalOp до первой балансовой операции. Так мы эквити не получим, поскольку эти сделки скорее всего были открыты задолго до момента LastBalOp. А значит, большая часть их результата уже учтена в предыдущем снятом эквити. В общем, я откатил на предыдущий вариант подсчета D и просто добавил условие, если D<-1, ничего не делать. 2) Добавил в цикл проверки на IsTradeAllowed вызов функции RefreshRate, без этого просто не будет работать. (ошибка 135) 3) Добавил туда же проверку на IsStopped, а то его не остановишь потом Теперь ТЕОРЕТИЧЕСКИ должно работать на реале у тех, кто "ручками" торгует. А вот у себя поставить по-прежнему не могу, я МТС-ник и мне надо, чтобы у ордеров сохранялся MagicNumber. Такой функции нету Не хватает еще одного способа открытия позиций - так же как и с закрытием, пропорционально, чтоб на каждый ордер открывался дополнительный с тем же MagicNumber... Volume Correction v3.5.mq4 Quote Link to post Share on other sites
Igonter 404 Share Posted August 10, 2009 Еще со слипажем косячек нашел. Он совсем не равен 3 Теперь слиппаж равен спреду для этого инструмента. Однако ж, попробовать все равно не могу, для МТС-ников нужен совсем другой советник, где бы пропорционально домножались на коэффициент все подряд ордера, с сохранением соответствующих MagicNumber... Volume Correction v3.6.mq4 Quote Link to post Share on other sites
Recommended Posts
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.