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



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

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

Подскажите, как организовать такую конструкцию:
Есть сигнал на покупку Buy=BuyCond1;

В момент покупки запоминается дополнительное условие ExtCond1 (true/false), на сам сигнал покупки не влияет.

Но вот для закрытия позиции нужно учесть, какое условие было при открытии позиции, т.е. (схематично)
if было ExtCond1=true then
Sell = SellCond1
else
Sell = SellCond2

Т.е. как сохранить(или "дотянуть") условие до момента продажи?
Question

Вот так правильно будет ? :
Код:

Buy = BuyCond1;
Sell = IIf( ValueWhen(Buy,ExtCond1), SellCond1, SellCond2);

Или есть какие-то подводные камни?
Посмотреть профиль Отправить личное сообщение
Mechanic



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

СообщениеДобавлено: Ср Мар 14, 2012 3:42 pm Ответить с цитатой Вернуться к началу

Не совсем правильно. В течение жизни позиции могут появляться новые сигналы на покупку, при которых дополнительное условие будет меняться. Фильтр функцией ExRem тут не поможет, чтобы было совсем правильно - только цикл писать.
Посмотреть профиль Отправить личное сообщение ICQ Number
AmiTrt



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

СообщениеДобавлено: Чт Мар 15, 2012 7:58 am Ответить с цитатой Вернуться к началу

Mechanic писал(а):
Не совсем правильно. В течение жизни позиции могут появляться новые сигналы на покупку, при которых дополнительное условие будет меняться. Фильтр функцией ExRem тут не поможет, чтобы было совсем правильно - только цикл писать.

Спасибо за пояснение.
Понял - до последнего прохода тестера сигналы на Buy не всегда будут означать реальную покупку, и поэтому ValueWhen(Buy,...) будет давать условие не на момент совершенной покупки, а на момент последнего виртуального сигнала.
Sad
Посмотреть профиль Отправить личное сообщение
Mechanic



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

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

А что смайлик-то убитый горем? Smile На уровне массивов эту задачу не решить, но через цикл всё легко реализуется. Или не умеете?

Код:

BuyCond = ...;
ExtCond = ...;
SellCond1 = ...;
SellCond2 = ...;

inLong = False;        // флаг нахождения в лонге
ValidExtCond = False;  // переменная для хранения значения ExtCond на момент покупки

// инициализация
Buy = 0;
Sell = 0;

for(i = 0; i < BarCount; i++)
{
    // покупка и запоминание значения ExtCond на момент покупки
    if(BuyCond[i] == True AND inLong == False)
    {
        Buy[i] = 1;
        ValidExtCond = ExtCond[i];
        inLong = True;
    }

    // выход по SellCond1 (если ExtCond на момент покупки было True)
    if(inLong == True AND ValidExtCond == True AND SellCond1[i] == True)
    {
        Sell[i] = 1;
        inLong = False;
        continue;
    }

    // выход по SellCond2 (если ExtCond на момент покупки было False)
    if(inLong == True AND ValidExtCond == False AND SellCond2[i] == True)
    {
        Sell[i] = 1;
        inLong = False;
    }
}
Посмотреть профиль Отправить личное сообщение ICQ Number
AmiTrt



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

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

Mechanic писал(а):

Код:

BuyCond = ...;
ExtCond = ...;
SellCond1 = ...;
SellCond2 = ...;

inLong = False;        // флаг нахождения в лонге
ValidExtCond = False;  // переменная для хранения значения ExtCond на момент покупки

// инициализация
Buy = 0;
Sell = 0;

for(i = 0; i < BarCount; i++)
{
    // покупка и запоминание значения ExtCond на момент покупки
    if(BuyCond[i] == True AND inLong == False)
    {
        Buy[i] = 1;
        ValidExtCond = ExtCond[i];
        inLong = True;
    }

    // выход по SellCond1 (если ExtCond на момент покупки было True)
    if(inLong == True AND ValidExtCond == True AND SellCond1[i] == True)
    {
        Sell[i] = 1;
        inLong = False;
        continue;
    }

    // выход по SellCond2 (если ExtCond на момент покупки было False)
    if(inLong == True AND ValidExtCond == False AND SellCond2[i] == True)
    {
        Sell[i] = 1;
        inLong = False;
    }
}

Спасибо!
Никак не могу привыкнуть к концепции ami - одновременно можно по-простому и в то же время тут же можно через циклы. и как это все вместе уживается...
Посмотреть профиль Отправить личное сообщение
Mechanic



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

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

Кстати, можно и без цикла обойтись, если разбить эту систему на две независимых. Дополнительное условие объединить с основным (в одной системе покупка, когда ExtCond == True, в другой - когда False), ну и условия выхода в каждой системе свои. Потом создаёте клон инструмента и прогоняете тест портфеля из этих двух систем, выставив в опциях тестера максимальное количество открытых позиций 1.

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


 Перейти:   



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


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

File Attachment © by Meik Sievertsen