Автор |
Сообщение |
pitero
Зарегистрирован: 09.06.2008
Сообщения: 65
Откуда: Екатеринбург
|
Пробую реализовать манимэнеджмент, скажем если предыдущая сделка закрылась по стопу - уменьшить позу в 2 раза.
я так понимаю для этого существует PositionSize.
пишу
SetOption("InitialEquity", 300000 );
RoundLotSize = 1;
PosMaxQty = 8;
SetOption("MaxOpenPositions", PosMaxQty );
initialPositionSize = -100/posmaxqty;
PositionSize=initialPositionSize;
торгует 1м лотом (газ, цена примерно 35000). если в коде хочу увеличить количество лотов - не выходит. делаю так
...
Equity(1);
IIf(Sell AND NOT (Sell==2), PositionSize = initialPositionSize*3, PositionSize = initialPositionSize*2);
IIf(Cover AND NOT (Cover==2), PositionSize = initialPositionSize*3, PositionSize = initialPositionSize*2);
т.е. если не закрылись по стопу - сделать positionSize = 3 если по стопу - то 2. А оно все шпарит по 2.
Пробую так
SetPositionSize( 2, spsShares );
SetPositionSize( 1, IIf(Sell AND (Sell==2),spsShares, spsNoChange ) );
SetPositionSize( 1, IIf(Cover AND (Cover==2),spsShares, spsNoChange ) );
срабатывает если стоп произошел на том же баре что и открытие следующей позы. а мне надо установить "дефолтное" значение размера для последующих сделок на всех остальных барах.
как это сделать? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Типа так.
Код: |
Buy = Ref(Cross(C, MA(C, 20)), -1);
Sell = 0;
ApplyStop(0, 1, 5, 1, 0);
ApplyStop(1, 1, 5, 1, 0);
Equity(1); // формируем массивы остановок
SetPositionSize(IIf(ValueWhen(Sell>0, Sell)==2, 1, 2), 4);
|
Проверил. Вроде работает. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
pitero
Зарегистрирован: 09.06.2008
Сообщения: 65
Откуда: Екатеринбург
|
000 писал(а): |
Типа так.
Код: |
Buy = Ref(Cross(C, MA(C, 20)), -1);
Sell = 0;
ApplyStop(0, 1, 5, 1, 0);
ApplyStop(1, 1, 5, 1, 0);
Equity(1); // формируем массивы остановок
SetPositionSize(IIf(ValueWhen(Sell>0, Sell)==2, 1, 2), 4);
|
Проверил. Вроде работает. |
что то все равно не так как надо.
вот код
StartSize=4;
RoundLotSize = 1;
SetPositionSize(startSize,spsShares);
Buy = Ref(Cross(C, MA(C, 20)), -1);
Short= Ref(Cross(MA(C, 20),C), -1);
Cover=Buy;
Sell=Short
sl = Optimize("stoploss", 70, 10, 350, 10);
ApplyStop(stopTypeLoss,stopModePoint,sl,1,0);
Equity(1);
Coeff=IIf((ValueWhen(Sell>0, Sell)==2 OR ValueWhen(Cover>0, Cover)==2), 2, 1);
SetPositionSize(StartSize/Coeff,spsShares);
вот результаты
Trade Shares
Long (max loss) 4
Short 2
Long (max loss) 2
Short 2
Long 2
Short 4
Long (max loss) 4
Long (max loss) 2
Short 2
Long (max loss) 2
Short 2
Long 2
Open Short 4
после первого срабатывания стопа кол-во лотов уменьшается, все ок.
а вот дальше оно держится 2 до непонятного мне места.
по идее должно быть так - первоначально 4 лота. после стопа - делим на 2 итого 2лота. опять стоп - делим еще на 2 - итого 1лот. еще стоп - делим на 2 получим 0.5, округляя получим 0 - сделки пропускаются до конца дня.
или так: 4 лота - стоп - стало 2 лота - стоп стало 1 лот, профит - стало 2 лота -профит стало 4 лота.
или на худой конец так: 4 лота - стоп - стало 2 лота - стоп стало 1 лот, профит - стало как было в начале - 4 лота.
ну понятно, что возможны вариации, но этой логики хватит чтоб реализовать что угодно. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Это надо цикл писать.
Однако совершенно точно известно, что изменение сайза в зависимостиот результата предыдущей сделки приносит пользу только на системах с выраженной серийностью.
А наличие серийности в системе говорит о том, что она не доделана, т.е. есть возможность добавить фильтр который улучшит систему и без применения такого ММ. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
commenced
Советник
Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"
|
000 писал(а): |
Это надо цикл писать.
Однако совершенно точно известно, что изменение сайза в зависимостиот результата предыдущей сделки приносит пользу только на системах с выраженной серийностью.
А наличие серийности в системе говорит о том, что она не доделана, т.е. есть возможность добавить фильтр который улучшит систему и без применения такого ММ. |
А как тогда максимальная просадка системы, она складывается из последоватьльности убыточных сделок, а раз есть последовательность значит есть и серийность. У меня как раз по этому поводу вопрос был, в качестве фильтра использовать экви, система должна вести расчет ну хотябы как тестер и если кривая уходит ниже своей средней то сделки пропускаются, правда как реализовать пока не знаю, фильтр не будет смешать цену или запаздывать с входом, так как он будет независим от цены. |
_________________ Юра |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
Сергей
Зарегистрирован: 16.03.2008
Сообщения: 168
|
commenced писал(а): |
000 писал(а): |
Это надо цикл писать.
Однако совершенно точно известно, что изменение сайза в зависимостиот результата предыдущей сделки приносит пользу только на системах с выраженной серийностью.
А наличие серийности в системе говорит о том, что она не доделана, т.е. есть возможность добавить фильтр который улучшит систему и без применения такого ММ. |
А как тогда максимальная просадка системы, она складывается из последоватьльности убыточных сделок, а раз есть последовательность значит есть и серийность. У меня как раз по этому поводу вопрос был, в качестве фильтра использовать экви, система должна вести расчет ну хотябы как тестер и если кривая уходит ниже своей средней то сделки пропускаются, правда как реализовать пока не знаю, фильтр не будет смешать цену или запаздывать с входом, так как он будет независим от цены. |
Вы учитываете комиссию если уходите в ночь в бумагах? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
commenced
Советник
Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"
|
Сергей писал(а): |
commenced писал(а): |
000 писал(а): |
Это надо цикл писать.
Однако совершенно точно известно, что изменение сайза в зависимостиот результата предыдущей сделки приносит пользу только на системах с выраженной серийностью.
А наличие серийности в системе говорит о том, что она не доделана, т.е. есть возможность добавить фильтр который улучшит систему и без применения такого ММ. |
А как тогда максимальная просадка системы, она складывается из последоватьльности убыточных сделок, а раз есть последовательность значит есть и серийность. У меня как раз по этому поводу вопрос был, в качестве фильтра использовать экви, система должна вести расчет ну хотябы как тестер и если кривая уходит ниже своей средней то сделки пропускаются, правда как реализовать пока не знаю, фильтр не будет смешать цену или запаздывать с входом, так как он будет независим от цены. |
Вы учитываете комиссию если уходите в ночь в бумагах? |
На фьючах нет комиссии. |
_________________ Юра |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Цитата: |
А как тогда максимальная просадка системы, она складывается из последоватьльности убыточных сделок, а раз есть последовательность значит есть и серийность. У меня как раз по этому поводу вопрос был, в качестве фильтра использовать экви, система должна вести расчет ну хотябы как тестер и если кривая уходит ниже своей средней то сделки пропускаются, правда как реализовать пока не знаю, фильтр не будет смешать цену или запаздывать с входом, так как он будет независим от цены.
|
Просадка получается на участке где выигали меньше чем проигнали и это совсем не обязательно последовательность только проигышных сделок. Серийность это четкая закономерность. Например если после выигрышной сделки с вероятностью больше 0,5 следует проигрышная, то это серийность.
Использовать анализ эквити очент просто.
Buy = ...
Sell = ...
Eq = Equity(1);
MEq = MA(Eq, 20);
Buy = Buy AND Eq > MEq; // исполняем только те сделки,
// когда предварительная эквити выше скользящей по ней.
Sell = Sell; |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
commenced
Советник
Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"
|
000 писал(а): |
Цитата: |
А как тогда максимальная просадка системы, она складывается из последоватьльности убыточных сделок, а раз есть последовательность значит есть и серийность. У меня как раз по этому поводу вопрос был, в качестве фильтра использовать экви, система должна вести расчет ну хотябы как тестер и если кривая уходит ниже своей средней то сделки пропускаются, правда как реализовать пока не знаю, фильтр не будет смешать цену или запаздывать с входом, так как он будет независим от цены.
|
Просадка получается на участке где выигали меньше чем проигнали и это совсем не обязательно последовательность только проигышных сделок. Серийность это четкая закономерность. Например если после выигрышной сделки с вероятностью больше 0,5 следует проигрышная, то это серийность.
Использовать анализ эквити очент просто.
Buy = ...
Sell = ...
Eq = Equity(1);
MEq = MA(Eq, 20);
Buy = Buy AND Eq > MEq; // исполняем только те сделки,
// когда предварительная эквити выше скользящей по ней.
Sell = Sell; |
Спасибо. |
_________________ Юра |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
ID
Советник
Зарегистрирован: 07.01.2008
Сообщения: 370
|
Здорова, всем
Есть такой вопрос:
Код (внизу) в АА работает корректно.
Но при выводе на экран (последняя строка) дает какую-то мурню.
В чем может быть трабла? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Привет. Ты бы сказал, что хотел и что не так рисует. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
ID
Советник
Зарегистрирован: 07.01.2008
Сообщения: 370
|
Думал, что ты с одного взгляда поймешь
Код прописывает сайз позиции.
В целях проверки кода я хотел его вывести на экран. В итоге: тестер работает корректно, но вот код дает мурню. На одной и той же сделке: тестер дает правильный сайз 57000, а код выводит на экран: 62500 |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
WriteVal() выводит либо последнее значение массива, либо значение на выбранном в данный момент баре. Т.е. Если ничего не выбрано и на последнем баре Buy, то выведет Stop_Size_Long, если бай на предпоследнем баре или ранбше, то Stop_Size_Short. В случае если бар выбран, то смотря в каком месте.
Надеюсь это объяснение поможет. Если нет, то напиши что надо. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
ID
Советник
Зарегистрирован: 07.01.2008
Сообщения: 370
|
Олег, какой еще stop_size_long?
WriteVal() должен вывести мне массив my_positionsize.
См. картинку...
В тестере лот корректный, а WriteVal() дает какую-то -2.
Я хочу увидеть корректный лот через WriteVal() |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Цитата: |
Олег, какой еще stop_size_long?
|
Ну это я так написал чтобы тебе было понятнее.
А вот теперь, после нормального объяснения и мне наконец пнятно в чем косяк. Правильно заданный вопрос - половина ответа
Первое. Незя присваивать массиву значение SetPositionSize()
т.е такая запись не корректна
qqq = SetPositionSize();
Второе. SetPositionSize() автоматически должна определть массив positionsize (в хелпере написано) и вот его то и надо выводить.
Точно не уверен, но возможно потребуется сперва написать Equity() потому, что сайз вычисляется только при работе тестера.
Третье. Если это сайз по портфелю (несколько тикеров), то вообще ничего не выйдет потому, что индикатор не станет обращаться к другим символам. Ну правдо у тебя вроде один тикер.
Четвертое. Проще всего будет определить другую переменную в которую записать сайз совсем без функции SetPositionSize и её вывести через WriteValue().
Еще попробую сказать по другому. Функция SetPositionSize() предназначена ТОЛЬКО для тестера и её использование в индикаторе неправильно.
Если надо в индикаторе, то пиши типа
Код: |
SetPositionSize(блабла); // надо чтобы эквити правильно считалось
Equity();
qqq = percent_of_risk/100/IIf(блабла);
GfxTextOutput(.....);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|