Автор |
Сообщение |
ifrm
Зарегистрирован: 16.02.2008
Сообщения: 20
|
Всем привет! Помогите пожалуйста решить проблему с позишн сайзингом.
Итак, имеем основной ордер (Назовем его А), который, в случае своего исполнения, открывает позицию и "порождает" 2 if-done ордера (Назовем их B1 и B2) связанных по принципу One Cancel Other, которые потом эту позицию закрывают.
Например:
А1 = 1.5000 = Открытие
B1 = 1.5100 = Профит
B2 = 1.4900 = Лось
Очевидно, что "пробег" от Открытия до Профита и от Открытия до Лося одинаков и состовляет 0.0100 (100 пунктов). А вот теперь сообственно проблема: Как в эти 100 пунктов "пробега" вложить 2% риска от депо, то есть:
Цитата: |
Депозит 1000$, плавающее плечо, минимальный лот - 1$
По цене 1.5000 я купил X тугриков
По цене 1.5100 я продал тугрики и на выходе имею 1020$ или +2% от депо
или
По цене 1.4900 я продал тугрики и на выходе имею 980$ или -2% от депо
|
Всю эту фигню мне нужно пересчитывать открывая каждую новую позицию. Проблема в том что все это динамическое и "пробеги" между A1 и B1 или B2 меняются от сделки к сделке, основной ордер каждый раз по другой цене и так далее, риск тоже может быть динамическим и так далее. Пока что B1 и B2 находятся на симметричном расстоянии от A1.
Вообщем что бы через банальную пропорцию рассчитать сколько тугриков нужно купить/продать (и получить +2% или -2%), мне нужно знать сколько денег у меня осталось на депо. А как узнать я не знаю. Функция Equity(); работает как то криво, а как скормить формуле bo.Cash из CustomBacktesterObject я не знаю. Или, если можно как нибуть скормить массивы (в которые записаны значения ордеров) в тот же CustomBacktesterObject, то тут уже что то можно придумать.
Как мог - обьяснил. Кому не понятно, пожалуйста не пинайте, а "уточните все детали". Заранее благодарен за любую помощь, мысль, идею |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вопрос понятен.
Ответа я не знаю. Похоже в рунете ваще никто с CustomBacktester не работает. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
ID
Советник
Зарегистрирован: 07.01.2008
Сообщения: 370
|
ifrm писал(а): |
Всем привет! Помогите пожалуйста решить проблему с позишн сайзингом. |
Вроде понял, что ты хотел спросить.
Также я вроде понял, что тебя интересует ФОРЕКС.
Кастомный тестер тут не нужен.
Тут нужно знать формулу для вычисления лота.
для обратных котировок:
Код: |
лот = депо * процент риска / 100 / величина стопа в пипсах |
1. Настрой свои обратные тикеры так:
2. запузырь куда-нить в папку Custom файлик со спредами http://www.sharemania.ru/0116782
3. Скачай себе и смотри через ами как работает код http://www.sharemania.ru/0119954
В последнем файле есть строка для сайза:
Код: |
position_size = SetPositionSize( percent_risk / 100 / my_loss,spsPercentOfEquity);
|
в этой строке есть переменная my_loss. То есть Ами всегда будет выбирать такой лот, который позволит тебе вписаться в процентный риск с любым стопом.
Удачи |
|
|
Посмотреть профиль Отправить личное сообщение |
|
ID
Советник
Зарегистрирован: 07.01.2008
Сообщения: 370
|
Еще для форекса надо такие настройки АА:
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
ID
Советник
Зарегистрирован: 07.01.2008
Сообщения: 370
|
000 писал(а): |
Похоже в рунете ваще никто с CustomBacktester не работает. |
Я юзаю CustomBacktester, но единственно что мне от него надо - это Custom Metric . Как это забацать, даже я понял |
|
|
Посмотреть профиль Отправить личное сообщение |
|
ifrm
Зарегистрирован: 16.02.2008
Сообщения: 20
|
Премного благодарен ID за простое и понятное решение. Спасибо большое. Все заработало.
Я тоже использую CustomBacktester и тоже CustomMetrics для создания своих критериев оптимизации например. Тоесть оптимизирую не просто, скажем Net % Profit, а, например, CAR*RAR |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
О. А раз такие умные напишите мне такой код
Только бай. Пересечение двух мувингов. Выход - обратное пересечение.
Если предыдущая сделка убыточная, то сайз - 2 если прибыльная то 1.
Сделать через CustomBacktester. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
ID
Советник
Зарегистрирован: 07.01.2008
Сообщения: 370
|
000 писал(а): |
О. А раз такие умные напишите мне такой код
Только бай. Пересечение двух мувингов. Выход - обратное пересечение.
Если предыдущая сделка убыточная, то сайз - 2 если прибыльная то 1.
Сделать через CustomBacktester. |
Это я еще и не умею )))))
В CustomBacktester я умею только делать свою метрику, и то потому что это где юыло расписано.
А ты не пробовал сделать свою эквитю через цикл, и смотреть где был лосс и профит? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Через эквити я могу. Хочу через кустом тестер |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
pongo
Зарегистрирован: 01.09.2009
Сообщения: 19
|
000 писал(а): |
О. А раз такие умные напишите мне такой код
Только бай. Пересечение двух мувингов. Выход - обратное пересечение.
Если предыдущая сделка убыточная, то сайз - 2 если прибыльная то 1.
Сделать через CustomBacktester. |
Это просто любопытство? На мой взгляд, делая это через custombacktester, мы получим лишь сложный запутанный код, и никакого преимущества.
У объекта Trade мы не можем изменять свойства (или я не знаю как). Т.е. нельзя написать (надеюсь я правильно понял, что "-" в "сайз - 2" это тире, а не минус):
Код: |
SetOption("UseCustomBacktestProc", True );
if (Status("action") == actionPortfolio) {
bo = GetBacktesterObject();
bo.Backtest(1);
LastTradeProfit = 0;
for (trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade()) {
if (LastTradeProfit < 0 ) { size = 2; }
else { size = 1; }
trade.Shares = size;
LastTradeProfit = trade.GetProfit();
}
bo.ListTrades();
}
Buy = Cross(C, MA(C, 10));
Sell = Cross(MA(C, 10), C); |
Но можно написать при помощи проверки сигналов (код работает, но неправильно , не знаю уж в чем ошибка):
Код: |
SetOption("UseCustomBacktestProc", True );
if (Status("action") == actionPortfolio) {
bo = GetBacktesterObject();
bo.PreProcess();
LastTradeProfit = 0;
enterprice = 0;
for (bar = 0; bar < BarCount; bar++) {
for (sig = bo.GetFirstSignal(bar); sig; sig = bo.GetNextSignal(bar)) {
if (sig.IsEntry()) {
if (LastTradeProfit < 0 ) { size = 2; }
else { size = 1; }
go = round(sig.Price * 0.15);
sig.PosSize = size * go;
enterprice = sig.Price;
}
else if (sig.IsExit()) {
if (sig.Type == 2) { LastTradeProfit = sig.Price - enterprice; }
else if (sig.Type == 4) { LastTradeProfit = enterprice - sig.Price; }
}
}
bo.ProcessTradeSignals(bar);
}
bo.PostProcess();
}
Buy = Cross(C, MA(C, 10));
Sell = Cross(MA(C, 10), C); |
И оставшийся вариант, это тоже самое, но вместо bo.ProcessTradeSignals(bar); можно вручную добавлять сделки через EnterTrade и ExitTrade. И это, в общем-то, ничего не меняет. И, походу, других вариантов нет. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
хм. Странно. Я почему то был уверен, что свойства объекта Trade можно менять... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
|