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



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

СообщениеДобавлено: Ср Дек 19, 2012 1:26 am Ответить с цитатой Вернуться к началу

Есть такое код:

Код:

// ЗАПОМНИТЬ ЦЕНЫ ВХОДА В ПОЗИЦИЮ
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

СообщениеДобавлено: Ср Дек 19, 2012 8:54 am Ответить с цитатой Вернуться к началу

Вот тут ошибка
Код:

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

СообщениеДобавлено: Ср Дек 19, 2012 5:30 pm Ответить с цитатой Вернуться к началу

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

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

Покажи как вставил ExRem

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



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

СообщениеДобавлено: Пн Дек 24, 2012 1:45 am Ответить с цитатой Вернуться к началу

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

СообщениеДобавлено: Пн Дек 24, 2012 10:37 am Ответить с цитатой Вернуться к началу

Хм.
Вот смотри.
Ты пишешь
Код:
xx = Flip(Buy, Sell);
yy = Flip(Short, Cover);

Но у тебя Sell и Cover ранее не определяются. Т.е. получается у тебя xx и yy всегда 1.... Sad Sad Sad

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



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

СообщениеДобавлено: Пн Дек 24, 2012 4:06 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Хм.
Вот смотри.
Ты пишешь
Код:
xx = Flip(Buy, Sell);
yy = Flip(Short, Cover);

Но у тебя Sell и Cover ранее не определяются. Т.е. получается у тебя xx и yy всегда 1.... Sad Sad Sad


Прошу прощения, я это не написал.
На самом деле вот так:
Код:

Sell = Short;
Cover = Buy;
SellPrice = ShortPrice;
CoverPrice = BuyPrice;


Для примера сделал картинку где inPos == -1 и maxShortProfit убывает
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Пн Дек 24, 2012 4:26 pm Ответить с цитатой Вернуться к началу

cyber2003 писал(а):

Прошу прощения, я это не написал.
На самом деле вот так:
Код:

Sell = Short;
Cover = Buy;
SellPrice = ShortPrice;
CoverPrice = BuyPrice;


Это в каком месте в коде?

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



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

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

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

СообщениеДобавлено: Вт Дек 25, 2012 12:20 am Ответить с цитатой Вернуться к началу

Отлично.
Вот теперь видно весь код и твоя ошибка как на ладони.
Раз я тебя столько мучил отвечу максимально подробно.
твоя ошибка в не правильном понимании работы 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

СообщениеДобавлено: Вт Дек 25, 2012 2:41 pm Ответить с цитатой Вернуться к началу

Олег, спасибо огромное! Буду пробовать и проверять.
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen