Автор |
Сообщение |
cyber2003
Зарегистрирован: 10.04.2012
Сообщения: 52
|
Есть такое код:
Код: |
// ЗАПОМНИТЬ ЦЕНЫ ВХОДА В ПОЗИЦИЮ
BuyPrice0 = BuyPrice;
ShortPrice0 = ShortPrice;
// запомнить состояние системы - в позиции или нет
xx = Flip(Buy, Sell);
yy = Flip(Short, Cover);
inPos = IIf(xx, 1, IIf(yy, -1, 0)); // 1 = long, -1 = short, 0 = none
// считаем текущую прибыль по позиции
CurrentProfit = IIf (inPos==1 , (C - BuyPrice0), IIf(inPos == -1, (ShortPrice0 - C), 0) );
// максимальная прибыль по позиции за время жизни позиции
MaxLongProfit = 0;
MaxShortProfit = 0;
MaxLongProfit = IIf ( inPos == 1 AND CurrentProfit > 0, Max( Ref(MaxLongProfit, -1), CurrentProfit), 0 );
MaxShortProfit = IIf( inPos == -1 AND CurrentProfit > 0, Max( Ref(MaxShortProfit, -1), CurrentProfit), 0 );
|
Как я понимаю, если выполняется условие
( inPos == 1 AND CurrentProfit > 0 ) == true
то MaxLongProfit должно принять значение, равное максимальному значению из двух - MaxLongProfit на прошлом баре или текущая прибыль.
Далее вывод в Explorer:
Код: |
Filter = ( inPos != 0 );
AddColumn(inPos , "inPos", 1.0);
AddColumn(BuyPrice0 , "BuyPrice0", 1.0);
AddColumn(ShortPrice0 , "ShortPrice0 ", 1.0);
AddColumn(MaxLongProfit , "MaxLongProfit ", 1.0);
AddColumn(Ref(MaxLongProfit, -1) , "Ref(MaxLongProfit, -1)", 1.0);
AddColumn(Ref(CurrentProfit, 0) , "Ref(CurrentProfit,0)", 1.0);
|
Вроде все прозрачно, но Explorer выдает совсем другое:
предыдущее значение Ref(MaxLongProfit, -1) = 2845, текущее значение прибыли Ref(CurrentProfit, 0) = 2765. Т.е. значение MaxLongProfit должно быть 2845 - максимум из 2845 и 2765. Но Explorer показывает 2765!!!
В чем тут проблема??? Никак не пойму... |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вот тут ошибка
Код: |
BuyPrice0 = BuyPrice;
ShortPrice0 = ShortPrice;
|
Ты считаешь, что так запоминаешь цену входа.
Это не верно. BuyPrice и ShortPrice это массивы которые имеют значение на каждом баре.
Например. Если вход в позицию по цене закрытия, то BuyPrice == Close;
Для того, чтобы реально запомнить цену входа надо
1. Удалить лишние (которые не исполняются) сигналы на сделку. Когда система уже в позиции сигналы на покупку не исполняются, надо удалить такие сигналы. Например при помощи функции ExRem()
Код: |
Buy = ExRem(Buy, Sell);
|
Аналогично для Sell
и потом надо запомнить цену покупки именно в момент входа
Код: |
BuyPrice0 = ValueWhen(Buy, BuyPrice);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
cyber2003
Зарегистрирован: 10.04.2012
Сообщения: 52
|
000 писал(а): |
Вот тут ошибка
Код: |
BuyPrice0 = BuyPrice;
ShortPrice0 = ShortPrice;
|
Ты считаешь, что так запоминаешь цену входа.
Это не верно. BuyPrice и ShortPrice это массивы которые имеют значение на каждом баре.
Например. Если вход в позицию по цене закрытия, то BuyPrice == Close;
Для того, чтобы реально запомнить цену входа надо
1. Удалить лишние (которые не исполняются) сигналы на сделку. Когда система уже в позиции сигналы на покупку не исполняются, надо удалить такие сигналы. Например при помощи функции ExRem()
Код: |
Buy = ExRem(Buy, Sell);
|
Аналогично для Sell
и потом надо запомнить цену покупки именно в момент входа
Код: |
BuyPrice0 = ValueWhen(Buy, BuyPrice);
|
|
Спасибо, Олег.
Вставил Exrem, но к сожалению ничего не изменилось: MaxProfit по-прежнему может уменьшаться. Что еще можно сделать? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Покажи как вставил ExRem |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
cyber2003
Зарегистрирован: 10.04.2012
Сообщения: 52
|
000 писал(а): |
Покажи как вставил ExRem |
Код: |
buy = ...
short = ...
Buy = ExRem(Buy, Sell);
Short = ExRem(Short, Cover);
ApplyStop(stopTypeLoss, stopModePoint, SL, 1, Volatile = True);
// ЗАПОМНИТЬ ЦЕНЫ ВХОДА В ПОЗИЦИЮ
BuyPrice0 = ValueWhen(Buy, BuyPrice);
ShortPrice0 = ValueWhen(Short, ShortPrice);
// запомнить состояние системы - в позиции или нет
xx = Flip(Buy, Sell);
yy = Flip(Short, Cover);
inPos = IIf(xx, 1, IIf(yy, -1, 0)); // 1 = long, -1 = short, 0 = none
// текущая прибыль по позиции
CurrentProfit = IIf (inPos==1 , (C - BuyPrice0), IIf(inPos == -1, (ShortPrice0 - C), 0) );
// ПЕРЕНОС В безубыток при достижении мин прибыли
ProfitMinLevel = 1000;
StopLoss = 500;
StopLoss = IIf (inPos !=0 AND CurrentProfit > ProfitMinLevel , 5 ,StopLoss);
ApplyStop(stopTypeLoss, stopModePoint, StopLoss, 1, Volatile = True);
// МАКСИМАЛЬНАЯ ПРИБЫЛЬ ПО ПОЗИЦИИ
MaxLongProfit = 0;
MaxShortProfit = 0;
MaxLongProfit = IIf ( inPos == 1 AND CurrentProfit > 0, Max( Ref(MaxLongProfit, -1), CurrentProfit), 0 );
MaxShortProfit = IIf( inPos == -1 AND CurrentProfit > 0, Max( Ref(MaxShortProfit, -1), CurrentProfit), 0 );
Filter = ( inPos != 0 );
AddColumn(inPos , "inPos", 1.0);
AddColumn(BuyPrice0 , "BuyPrice0", 1.0);
AddColumn(ShortPrice0 , "ShortPrice0 ", 1.0);
AddColumn(MaxLongProfit , "MaxLongProfit ", 1.0);
AddColumn(Ref(MaxLongProfit, -1) , "Ref(MaxLongProfit, -1)", 1.0);
AddColumn(Ref(CurrentProfit, 0) , "Ref(CurrentProfit,0)", 1.0);
AddColumn(C , "CurrentPrice ", 1.0);
|
макс прибыль все равно может уменьшаться - см картинку |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Хм.
Вот смотри.
Ты пишешь
Код: |
xx = Flip(Buy, Sell);
yy = Flip(Short, Cover); |
Но у тебя Sell и Cover ранее не определяются. Т.е. получается у тебя xx и yy всегда 1.... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
cyber2003
Зарегистрирован: 10.04.2012
Сообщения: 52
|
000 писал(а): |
Хм.
Вот смотри.
Ты пишешь
Код: |
xx = Flip(Buy, Sell);
yy = Flip(Short, Cover); |
Но у тебя Sell и Cover ранее не определяются. Т.е. получается у тебя xx и yy всегда 1.... |
Прошу прощения, я это не написал.
На самом деле вот так:
Код: |
Sell = Short;
Cover = Buy;
SellPrice = ShortPrice;
CoverPrice = BuyPrice;
|
Для примера сделал картинку где inPos == -1 и maxShortProfit убывает |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
cyber2003 писал(а): |
Прошу прощения, я это не написал.
На самом деле вот так:
Код: |
Sell = Short;
Cover = Buy;
SellPrice = ShortPrice;
CoverPrice = BuyPrice;
|
|
Это в каком месте в коде? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
cyber2003
Зарегистрирован: 10.04.2012
Сообщения: 52
|
000 писал(а): |
cyber2003 писал(а): |
Прошу прощения, я это не написал.
На самом деле вот так:
Код: |
Sell = Short;
Cover = Buy;
SellPrice = ShortPrice;
CoverPrice = BuyPrice;
|
|
Это в каком месте в коде? |
Привожу код полностью:
Код: |
Buy =
BuyPrice =
Short =
ShortPrice =
// ограничение по количеству сделок в день
iBeginDay = Day() != Ref( Day(), -1 );
Buy = (Buy AND Flip( iBeginDay, Ref( Buy, -1 ) OR Ref( Short, -1 ))) OR ( Buy AND iBeginDay) ;
Short = (Short AND Flip( iBeginDay, Ref( Buy, -1 ) OR Ref( Short, -1 ))) OR ( Short AND iBeginDay);
Sell = Short;
Cover = Buy;
SellPrice = ShortPrice;
CoverPrice = BuyPrice;
Buy = ExRem(Buy, Sell);
Short = ExRem(Short, Cover);
ApplyStop(stopTypeLoss, stopModePoint, SL, 1, Volatile = True);
// ЗАПОМНИТЬ ЦЕНЫ ВХОДА В ПОЗИЦИЮ
BuyPrice0 = ValueWhen(Buy, BuyPrice);
ShortPrice0 = ValueWhen(Short, ShortPrice);
// запомнить состояние системы - в позиции или нет
xx = Flip(Buy, Sell);
yy = Flip(Short, Cover);
inPos = IIf(xx, 1, IIf(yy, -1, 0)); // 1 = long, -1 = short, 0 = none
// ПЕРЕНОС В БУ
CurrentProfit = IIf (inPos==1 , (C - BuyPrice0), IIf(inPos == -1, (ShortPrice0 - C), 0) );
// ПЕРЕНОС В безубыток при достижении мин прибыли
ProfitMinLevel = 1000;
StopLoss = 500;
SL = IIf (inPos !=0 AND CurrentProfit > ProfitMinLevel , 5 ,SL);
ApplyStop(stopTypeLoss, stopModePoint, SL, 1, Volatile = True);
// max прибыль
MaxLongProfit = 0;
MaxShortProfit = 0;
MaxLongProfit = IIf ( inPos == 1 AND CurrentProfit > 0, Max( Ref(MaxLongProfit, -1), CurrentProfit), 0 );
MaxShortProfit = IIf( inPos == -1 AND CurrentProfit > 0, Max( Ref(MaxShortProfit, -1), CurrentProfit), 0 );
Filter = ( inPos != 0 );
AddColumn(inPos , "inPos", 1.0);
AddColumn(BuyPrice0 , "BuyPrice0", 1.0);
AddColumn(ShortPrice0 , "ShortPrice0 ", 1.0);
AddColumn(MaxLongProfit , "MaxLongProfit ", 1.0);
AddColumn(Ref(MaxLongProfit, -1) , "Ref(MaxLongProfit, -1)", 1.0);
AddColumn(MaxShortProfit , "MaxShortProfit ", 1.0);
AddColumn(Ref(CurrentProfit, 0) , "Ref(CurrentProfit,0)", 1.0);
AddColumn(C , "CurrentPrice ", 1.0);
|
Sell и Cover - после "ограничение по количеству сделок в день" |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Отлично.
Вот теперь видно весь код и твоя ошибка как на ладони.
Раз я тебя столько мучил отвечу максимально подробно.
твоя ошибка в не правильном понимании работы AFL.
Конкретно во тут
Код: |
MaxLongProfit = IIf ( inPos == 1 AND CurrentProfit > 0, Max( Ref(MaxLongProfit, -1), CurrentProfit), 0 );
MaxShortProfit = IIf( inPos == -1 AND CurrentProfit > 0, Max( Ref(MaxShortProfit, -1), CurrentProfit), 0 ); |
Ты думаешь, что ами обрабатывает данные последовательно с лева на право. И запись Ref(MaxLongProfit, -1) является аналогом метасоковской функции PREV. Однако это не так. Ами обрабатывает сразу весь массив целиком и запись Ref(MaxLongProfit, -1) это безусловно значение массива MaxLongProfit на один бар правее, но только из предыдущей строки сверху. У тебя сверху этих строк написано MaxLongProfit = 0; вот отсюда и буде взято предыдущее значение. Т.е. запись Ref(MaxLongProfit, -1) в твоем случае всегда рана 0.
Как правильно?
Вот так
Код: |
MaxLongProfit = HighestSince( Buy, CurrentProfit, Nth = 1); |
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
cyber2003
Зарегистрирован: 10.04.2012
Сообщения: 52
|
Олег, спасибо огромное! Буду пробовать и проверять. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|