Автор |
Сообщение |
RomaNicke
Зарегистрирован: 27.12.2016
Сообщения: 7
|
Добрый день всем знатокам AFL. Ни как не получается реализовать классический мартингейл. Т.е. увеличение величины открываемой позиции после убыточной(ых) сделок. НЕ доливка, а вновь открыаемая позиция.
Код: |
losess = 0;
Risk = 2;
Buy = Cross( MACD(), Signal() );
Sell = Cross( Signal(), MACD() );
Short = False;
BuyPrice = Open;
Cover = False;
SellPrice = Open;
Buy = ExRem(Buy,Sell);Sell = ExRem(Sell,Buy);Short = ExRem(Short,Cover);Cover = ExRem(Cover,Short);
Balance=Equity(0);
lots = lastvalue(round(Balance/Close[BarCount-1]*Risk) );
for (i=BarCount-1; i >= 0; i--)
{ res = LastValue(ValueWhen(Ref(Sell,-i),SellPrice))-LastValue( ValueWhen(Ref(Buy,-i),BuyPrice) ) ; // Получение результата сделки
if ( res > 0 ) break;
if ( res < 0 ) losess++;
}
if (losess == 2) lots = lots*2;
SetPositionSize(lots,spsShares);
|
Ошибка явно в результате res, но никак не могу понять как обратится к цене открытия и закрытия позиции в формуле, чтоб посчитать результат сделки. Это точно можно сделать, только как правильно?
Или можно реализовать подсчёт убыточных сделок как-то по другому? Подскажите пожалуйста. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вот в таком ключе
Код: |
ps = 1;
Buy = Cross( MACD(), Signal() );
Sell = Cross( Signal(), MACD() );
Short = False;
BuyPrice = Open;
Cover = False;
SellPrice = Open;
Buy = ExRem(Buy,Sell);Sell = ExRem(Sell,Buy);Short = ExRem(Short,Cover);Cover = ExRem(Cover,Short);
res = ValueWhen(Sell, SellPrice) - ValueWhen(Buy, BuyPrice); // Получение результата сделки
for (i = 1; i < BarCount; i++)
{
if(Sell[i])
{
if ( res[i] < 0 )
ps[i] = ps[i-1]*2;
else
ps[i] = 1;
}
else
ps[i] = ps[i-1];
}
SetPositionSize(ps,spsShares);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
RomaNicke
Зарегистрирован: 27.12.2016
Сообщения: 7
|
000 писал(а): |
Вот в таком ключе
|
Большое спасибо!Выручили! Действительно получается "классический" мартингейл.
Единственное, что вы наверное заметили, по моему коду, увеличение позиции идёт после 2-х сделок в минус. Как это можно реализовать?
Конструкция
Код: |
for (i = 1; i < BarCount; i++){
if(Sell[i]) {
if ( res[i] < 0 ) ps[i] = ps[i-2]*2; else ps[i] = 1;
if ( res[i-2] < 0 ) ps[i] = ps[i-3]/DecreaseFactor; else ps[i] = 1;
}
else
ps[i] = ps[i-1]; |
Не отрабатывает как надо, берётся только последнее значение в цикле.
(после 4 убытков уменьшении позиции на DecreaseFactor=1.5)
Т.е. хочется реализовать такую идею
2-а убытка в подряд - увеличение в 2-а раза позиции
4-ре убытка в подряд - уменьшение позы на DecreaseFactor
5 убытков - лот = 1.
Можно ли такое реализовать? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Реализовать можно почти все.
В моем коде не увеличиваешь сразу ps после любой убыточной а считаешь убыточные сдеки. Ну типа как у тебя losess++
и далее проверку на значение losess и присваиваешь ps[i] нужное значение.
Завтра могу сделать. Только надо уточнить, после 5 лосей лот 1 и все по новому? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
RomaNicke
Зарегистрирован: 27.12.2016
Сообщения: 7
|
000 писал(а): |
Реализовать можно почти все.
В моем коде не увеличиваешь сразу ps после любой убыточной а считаешь убыточные сдеки. Ну типа как у тебя losess++
и далее проверку на значение losess и присваиваешь ps[i] нужное значение.
Завтра могу сделать. Только надо уточнить, после 5 лосей лот 1 и все по новому? |
Пробывал сделать как подсказал, пока не получается. Это 2-а цикла делать надо?
После 5 лосей идёт всё время 1 лотом до 1-ой прибыльной сделки, далее уже торгует как обычно, расчитывает величину позиции в зависимости от Risk фактора.
Если не сложно, как это можно реализовать? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Код: |
ps = 1;
DecreaseFactor = 2;
Buy = Cross( MACD(), Signal() );
Sell = Cross( Signal(), MACD() );
Short = False;
BuyPrice = Open;
Cover = False;
SellPrice = Open;
Buy = ExRem(Buy,Sell);Sell = ExRem(Sell,Buy);Short = ExRem(Short,Cover);Cover = ExRem(Cover,Short);
res = ValueWhen(Sell, SellPrice) - ValueWhen(Buy, BuyPrice); // Получение результата сделки
losess = 0;
for (i = 1; i < BarCount; i++)
{
if(Sell[i])
{
if ( res[i] < 0 )
losess++;
else
losess = 0;
if(losess == 2)
ps[i] = 2;
else if(losess == 4)
ps[i] = ps[i-1]/DecreaseFactor;
else if(losess >= 5)
ps[i] = 1;
else
ps[i] = ps[i-1];
}
else
ps[i] = ps[i-1];
}
SetPositionSize(ps,spsShares);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
RomaNicke
Зарегистрирован: 27.12.2016
Сообщения: 7
|
Спасибо большое за помощь! С наступающим вас новым годом, удачи и больше профитов в новом году!
Единственное, будет ли данный код работать не только в бэктестере, но и в авто торговле?
Он по циклу идёт с нулевого бара и рачитывает размер "позы", в торговле ему просто в моменте надо проверить предыдущие сделки на результат от текущего бара.
Вообщем я ещё не совсем понимаю "true" AFL |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Привет. И тебя с наступающим.
Именно этот код будет работать, только надо выключить квик АФЛ. StBarsRequired(sbrAll, sbrAll) |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
RomaNicke
Зарегистрирован: 27.12.2016
Сообщения: 7
|
000 писал(а): |
Код: |
for (i = 1; i < BarCount; i++)
{
if(Sell[i])
{
if ( res[i] < 0 )
losess++;
else
losess = 0;
if(losess == 2)
ps[i] = 2;
else if(losess == 4)
ps[i] = ps[i-1]/DecreaseFactor;
else if(losess >= 5)
ps[i] = 1;
else
ps[i] = ps[i-1];
}
else
ps[i] = ps[i-1];
}
SetPositionSize(ps,spsShares);
|
|
Только счас удалось проверить. Вообщем не работает так как надо.
После "Мартина" робот должен переходить на стандартный лот, а он не переходит, а берёт ps[i] = ps[i-1]; т.е. если была удвоенна поза, и был положительный результат он всё равно войдёт удвоенным лотом (ps[i-1]), лотом кот. был на предыдущей сделки, а должен размером ps = lastvalue(round(Balance/Close*Risk) );
Из- за этого ps[i] = ps[i-1], а может не из-за этого, получается вообще что-то странное с величиной позиций в бэктестре.
Подскажите как правильно реализовать? Правильно ли я понимаю логику происходящего? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ну да, Забыл сделать обнуление в случае положительной сделки.
Код: |
for (i = 1; i < BarCount; i++)
{
if(Sell[i])
{
if ( res[i] < 0 )
losess++;
else
losess = 0;
if(losess == 0)
ps[i] = 1;
else if(losess == 2)
ps[i] = 2;
else if(losess == 4)
ps[i] = ps[i-1]/DecreaseFactor;
else if(losess >= 5)
ps[i] = 1;
else
ps[i] = ps[i-1];
}
else
ps[i] = ps[i-1];
}
SetPositionSize(ps,spsShares);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
RomaNicke
Зарегистрирован: 27.12.2016
Сообщения: 7
|
Понял, спасибо.
Единственное теперь не получается такая конструкция, с расчётом "позы" в зависимости от Equity. Не отрабатывает как надо. В чём может быть дело? Почему не идёт "мартин" в данном случае?
Код: |
losess = 0;
Balance=Equity(1);
DecreaseFactor = 2;
Risk = 2;
res = ValueWhen(Sell, SellPrice) - ValueWhen(Buy, BuyPrice); // Получение результата сделки
for (i = 1; i < BarCount; i++)
{
if(Sell[i])
{
if ( res[i] < 0 )
losess++;
else
losess = 0;
if(losess == 0) ps[i]=round(Balance[i-1]/Close[i]*Risk) ;
else if(losess == 2) ps[i] = round(Balance[i-1]/Close[i]*Risk)*2;
else if(losess == 4) ps[i] = round(Balance[i-1]/Close[i]*Risk)/DecreaseFactor;
else if(losess >= 5) ps[i] = 1;
else ps[i] = round(Balance[i-1]/Close[i]*Risk);
}
else
ps[i] = round(Balance[i-1]/Close[i]*Risk);
}
SetPositionSize(int(ps),spsShares);
|
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Наверное потому, что так не правильно днлать. Мне ща лень расписывать почему именно так работать не будет. Вообще то если надо задавать размер сделки в зависимости от доступных средств, то просто надо использовать другую опцию функции SetPositionSize()
Цитата: |
spsPercentOfEquity (=2) - size expressed as percent of portfolio-level equity (size must be from ..100 (for regular accounts) or .1000 for margin accounts) |
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
RomaNicke
Зарегистрирован: 27.12.2016
Сообщения: 7
|
000 писал(а): |
Наверное потому, что так не правильно днлать. Мне ща лень расписывать почему именно так работать не будет. Вообще то если надо задавать размер сделки в зависимости от доступных средств, то просто надо использовать другую опцию функции SetPositionSize()
Цитата: |
spsPercentOfEquity (=2) - size expressed as percent of portfolio-level equity (size must be from ..100 (for regular accounts) or .1000 for margin accounts) |
|
Спасибо, буду разбираться с "true" AFL , хотя мне как раз логика происходящего интересна в AFL, к сожалению про логику работы AFL почти нет инфы. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Orange2000
Зарегистрирован: 15.10.2009
Сообщения: 185
|
Олег, а если в системе и шорты есть и не нужно уменьшать после 4ой. А просто
3 сделки в минус - 2 лота
4 сделки в минус - 3 лота
5 сделки в минус - опять 1 лот...
Код: |
res = ValueWhen(Sell, SellPrice) - ValueWhen(Buy, BuyPrice); // Получение результата сделки
res1 = ValueWhen(Short, ShortPrice) - ValueWhen(Cover, CoverPrice); // Получение результата сделки
losess = 0;
for (i = 1; i < BarCount; i++)
{
if(Sell[i])
{
if ( res[i] < 0 )
losess++;
else
losess = 0;
if(losess == 0)
ps[i] = 1;
else if(losess == 3)
ps[i] = 2;
else if(losess == 4)
ps[i] = 3;
else if(losess >= 5)
ps[i] = 1;
else
ps[i] = ps[i-1];
} else
if(Cover[i])
{
if ( res1[i] < 0 )
losess++;
else
losess = 0;
if(losess == 0)
ps[i] = 1;
else if(losess == 3)
ps[i] = 2;
else if(losess == 4)
ps[i] = 3;
else if(losess >= 5)
ps[i] = 1;
else
ps[i] = ps[i-1];
}
else
ps[i] = ps[i-1];
}
SetPositionSize(ps,spsShares);
|
по сделкам иногда правильно делает, иногда нет. Где-то я что -то не учел |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Надо сначала сделать и проверить только для лонга, а уже потом добавлять шорт.... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
|