Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 "Классический" Мартингейл Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
RomaNicke



Зарегистрирован: 27.12.2016
Сообщения: 7

СообщениеДобавлено: Ср Дек 28, 2016 11:49 am Ответить с цитатой Вернуться к началу

Добрый день всем знатокам 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

СообщениеДобавлено: Ср Дек 28, 2016 10:04 pm Ответить с цитатой Вернуться к началу

Вот в таком ключе
Код:

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

СообщениеДобавлено: Чт Дек 29, 2016 2:58 pm Ответить с цитатой Вернуться к началу

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

СообщениеДобавлено: Чт Дек 29, 2016 3:22 pm Ответить с цитатой Вернуться к началу

Реализовать можно почти все.
В моем коде не увеличиваешь сразу ps после любой убыточной а считаешь убыточные сдеки. Ну типа как у тебя losess++

и далее проверку на значение losess и присваиваешь ps[i] нужное значение.
Завтра могу сделать. Только надо уточнить, после 5 лосей лот 1 и все по новому?

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
RomaNicke



Зарегистрирован: 27.12.2016
Сообщения: 7

СообщениеДобавлено: Пт Дек 30, 2016 9:19 am Ответить с цитатой Вернуться к началу

000 писал(а):
Реализовать можно почти все.
В моем коде не увеличиваешь сразу ps после любой убыточной а считаешь убыточные сдеки. Ну типа как у тебя losess++
и далее проверку на значение losess и присваиваешь ps[i] нужное значение.
Завтра могу сделать. Только надо уточнить, после 5 лосей лот 1 и все по новому?

Пробывал сделать как подсказал, пока не получается. Это 2-а цикла делать надо?
После 5 лосей идёт всё время 1 лотом до 1-ой прибыльной сделки, далее уже торгует как обычно, расчитывает величину позиции в зависимости от Risk фактора.
Если не сложно, как это можно реализовать?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пт Дек 30, 2016 9:55 am Ответить с цитатой Вернуться к началу

Код:

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

СообщениеДобавлено: Сб Дек 31, 2016 12:08 pm Ответить с цитатой Вернуться к началу

Спасибо большое за помощь! С наступающим вас новым годом, удачи и больше профитов в новом году!

Единственное, будет ли данный код работать не только в бэктестере, но и в авто торговле?
Он по циклу идёт с нулевого бара и рачитывает размер "позы", в торговле ему просто в моменте надо проверить предыдущие сделки на результат от текущего бара.
Вообщем я ещё не совсем понимаю "true" AFL
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Сб Дек 31, 2016 12:23 pm Ответить с цитатой Вернуться к началу

Привет. И тебя с наступающим.
Именно этот код будет работать, только надо выключить квик АФЛ. StBarsRequired(sbrAll, sbrAll)

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
RomaNicke



Зарегистрирован: 27.12.2016
Сообщения: 7

СообщениеДобавлено: Вт Янв 03, 2017 8:02 pm Ответить с цитатой Вернуться к началу

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

СообщениеДобавлено: Ср Янв 04, 2017 8:27 am Ответить с цитатой Вернуться к началу

Ну да, Забыл сделать обнуление в случае положительной сделки.
Код:

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

СообщениеДобавлено: Чт Янв 05, 2017 11:03 am Ответить с цитатой Вернуться к началу

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

СообщениеДобавлено: Чт Янв 05, 2017 2:37 pm Ответить с цитатой Вернуться к началу

Наверное потому, что так не правильно днлать. Мне ща лень расписывать почему именно так работать не будет. Вообще то если надо задавать размер сделки в зависимости от доступных средств, то просто надо использовать другую опцию функции 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

СообщениеДобавлено: Чт Янв 05, 2017 8:05 pm Ответить с цитатой Вернуться к началу

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 Very Happy, хотя мне как раз логика происходящего интересна в AFL, к сожалению про логику работы AFL почти нет инфы.
Посмотреть профиль Отправить личное сообщение
Orange2000



Зарегистрирован: 15.10.2009
Сообщения: 185

СообщениеДобавлено: Ср Апр 24, 2019 2:53 pm Ответить с цитатой Вернуться к началу

Олег, а если в системе и шорты есть и не нужно уменьшать после 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

СообщениеДобавлено: Ср Апр 24, 2019 5:24 pm Ответить с цитатой Вернуться к началу

Надо сначала сделать и проверить только для лонга, а уже потом добавлять шорт....

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen