Перейти к содержимому


Фотография
* * * * * 1 Голосов

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


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 266

#3663486 AntFX

AntFX

    Трейдер-программист

  •  
  •  
  • 24 520 сообщений
  • 11 записей в блоге
  • Регистрация: 13 Июн 2008
  • ГородСанкт-Петербург

Отправлено 05 Август 2015 - 07:29

Сделайте по правилам округления до сотых. Например если 0.005, то округляем до 0.01, если 0.049, то 0.00. И для ввода и для вывода.

Заранее спасибо!

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

Прикрепленные файлы


Сообщение отредактировал AntFX: 05 Август 2015 - 07:31

  • 7

Всем, кто использует (или хочет использовать) автоматический корректировщик позиций на паммах, советую обратить внимание на новую версию.


#1 dao

dao

    Альпари

  •  
  •  
  • 5 792 сообщений
  • Регистрация: 16 Ноя 2004

Отправлено 29 Август 2008 - 21:44

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

Параметры:

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

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

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

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

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

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

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


  • 0

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


#2 Igonter

Igonter

    Весёлый системщик™

  •  
  •  
  • 24 324 сообщений
  • Регистрация: 31 Дек 2002

Отправлено 29 Август 2008 - 22:18

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

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

#3 dao

dao

    Альпари

  •  
  •  
  • 5 792 сообщений
  • Регистрация: 16 Ноя 2004

Отправлено 29 Август 2008 - 22:55

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

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

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


#4 Igonter

Igonter

    Весёлый системщик™

  •  
  •  
  • 24 324 сообщений
  • Регистрация: 31 Дек 2002

Отправлено 29 Август 2008 - 23:06

Выделить балансовые операции из истории можно так:
total=OrdersHistoryTotal();
for(cnt=0;cnt<total;cnt++)      
{
  OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY);
  if (OrderType()==6)  Balance_Change += OrderProfit();
}

  • 0

#5 RickD

RickD

Отправлено 29 Август 2008 - 23:21

Если нет блок-схемы, разумно было бы начать с примеров.
  • 0
MQL4: идея * опыт + творческий подход
:agree:

#6 Programmer

Programmer

    Я здесь свой

  •  
  •  
  • 3 281 сообщений
  • Регистрация: 04 Июл 2008

Отправлено 07 Сентябрь 2008 - 00:49

Вот наконец-то я добрался и до этого советника.
Начнём с того, что такое PAMM-счета.

Английская аббревиатура PAMM расшифровывается как Percentage Allocation Management Module, что по-русски означает Модуль Управления Процентным Распределением (МУПР).
Устроены PAMM так: несколько счетов объединяются под упроавлением одного мастер-счёта. Торговля происходит из мастер-счёта от лица всех участников PAMM. Когда ордер закрывается, прибыль или убыток распеределяется между участниками пропорционально их доли в equity PAMM'а.
  • 0

#7 Programmer

Programmer

    Я здесь свой

  •  
  •  
  • 3 281 сообщений
  • Регистрация: 04 Июл 2008

Отправлено 07 Сентябрь 2008 - 01:29

Советник работает по описанию.
Входные параметры:

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

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

:sdelano:

С уважением,
Кирилл.

Прикрепленные файлы


  • 0

#8 dao

dao

    Альпари

  •  
  •  
  • 5 792 сообщений
  • Регистрация: 16 Ноя 2004

Отправлено 07 Сентябрь 2008 - 11:02

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

Большое спасибо!
В понедельник начнем тесты.
  • 0

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


#9 Programmer

Programmer

    Я здесь свой

  •  
  •  
  • 3 281 сообщений
  • Регистрация: 04 Июл 2008

Отправлено 08 Сентябрь 2008 - 01:46

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

#10 IVAN_IV

IVAN_IV

    Альпари

  •  
  •  
  • 19 сообщений
  • Регистрация: 02 Авг 2007

Отправлено 11 Сентябрь 2008 - 12:55

Потестил ,объем не менял, что не так?
Рабочий ли советник?
  • 0
Клиентский отдел
Компания «Альпари»

#11 Programmer

Programmer

    Я здесь свой

  •  
  •  
  • 3 281 сообщений
  • Регистрация: 04 Июл 2008

Отправлено 13 Сентябрь 2008 - 00:33

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

#12 IVAN_IV

IVAN_IV

    Альпари

  •  
  •  
  • 19 сообщений
  • Регистрация: 02 Авг 2007

Отправлено 15 Сентябрь 2008 - 09:49

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



Тишина, без сообщений, накинули на EURUSD меняли депозит, тишина, без изменений.
  • 0
Клиентский отдел
Компания «Альпари»

#13 Scelestus

Scelestus

    Прописавшийся

  •  
  •  
  • 115 сообщений
  • Регистрация: 28 Окт 2008

Отправлено 09 Апрель 2009 - 08:52

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

#14 Igonter

Igonter

    Весёлый системщик™

  •  
  •  
  • 24 324 сообщений
  • Регистрация: 31 Дек 2002

Отправлено 17 Июль 2009 - 11:47

Понадобилась и мне эта штука недавно... Попробовал - не работает. Стал разбираться с кодом, нашел 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 раз больше, чем открыто :)
  • 0

#15 dao

dao

    Альпари

  •  
  •  
  • 5 792 сообщений
  • Регистрация: 16 Ноя 2004

Отправлено 24 Июль 2009 - 20:54

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

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


#16 Programmer

Programmer

    Я здесь свой

  •  
  •  
  • 3 281 сообщений
  • Регистрация: 04 Июл 2008

Отправлено 25 Июль 2009 - 21:45

Я за него!

Так, посмотрим...
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, предлагаю довести этот инструмент до рабочего состояния.
Проверьте обе эти версии на своём счёте - будут результаты, будем думать, что дальше делать.

Прикрепленные файлы


  • 0

#17 Igonter

Igonter

    Весёлый системщик™

  •  
  •  
  • 24 324 сообщений
  • Регистрация: 31 Дек 2002

Отправлено 28 Июль 2009 - 10:34

б) Про IsTradeAllowed() - совсем не понял, о чём Вы. Если торговля разрешена - будет работать, если - нет, значит и не надо.
*****
Хотя замечание 3 и является существенным, я думаю, что не оно не позволяет советнику работать.
*****
Почему не работает на реале - я уже голову сломал. Не понимаю. :search:

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

#18 Igonter

Igonter

    Весёлый системщик™

  •  
  •  
  • 24 324 сообщений
  • Регистрация: 31 Дек 2002

Отправлено 28 Июль 2009 - 10:49

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

#19 Igonter

Igonter

    Весёлый системщик™

  •  
  •  
  • 24 324 сообщений
  • Регистрация: 31 Дек 2002

Отправлено 29 Июль 2009 - 07:45

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

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

#20 Sergey Kovalyov

Sergey Kovalyov

    Я здесь свой

  •  
  •  
  • 6 704 сообщений
  • Регистрация: 30 Окт 2008

Отправлено 29 Июль 2009 - 10:22

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




Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных