Автор |
Сообщение |
AmiTrt
Зарегистрирован: 01.06.2011
Сообщения: 90
|
Подскажите, как организовать такую конструкцию:
Есть сигнал на покупку Buy=BuyCond1;
В момент покупки запоминается дополнительное условие ExtCond1 (true/false), на сам сигнал покупки не влияет.
Но вот для закрытия позиции нужно учесть, какое условие было при открытии позиции, т.е. (схематично)
if было ExtCond1=true then
Sell = SellCond1
else
Sell = SellCond2
Т.е. как сохранить(или "дотянуть") условие до момента продажи?
Вот так правильно будет ? :
Код: |
Buy = BuyCond1;
Sell = IIf( ValueWhen(Buy,ExtCond1), SellCond1, SellCond2);
|
Или есть какие-то подводные камни? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Mechanic
Зарегистрирован: 10.06.2008
Сообщения: 359
|
Не совсем правильно. В течение жизни позиции могут появляться новые сигналы на покупку, при которых дополнительное условие будет меняться. Фильтр функцией ExRem тут не поможет, чтобы было совсем правильно - только цикл писать. |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
AmiTrt
Зарегистрирован: 01.06.2011
Сообщения: 90
|
Mechanic писал(а): |
Не совсем правильно. В течение жизни позиции могут появляться новые сигналы на покупку, при которых дополнительное условие будет меняться. Фильтр функцией ExRem тут не поможет, чтобы было совсем правильно - только цикл писать. |
Спасибо за пояснение.
Понял - до последнего прохода тестера сигналы на Buy не всегда будут означать реальную покупку, и поэтому ValueWhen(Buy,...) будет давать условие не на момент совершенной покупки, а на момент последнего виртуального сигнала.
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
Mechanic
Зарегистрирован: 10.06.2008
Сообщения: 359
|
А что смайлик-то убитый горем? На уровне массивов эту задачу не решить, но через цикл всё легко реализуется. Или не умеете?
Код: |
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
|
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
|
Кстати, можно и без цикла обойтись, если разбить эту систему на две независимых. Дополнительное условие объединить с основным (в одной системе покупка, когда ExtCond == True, в другой - когда False), ну и условия выхода в каждой системе свои. Потом создаёте клон инструмента и прогоняете тест портфеля из этих двух систем, выставив в опциях тестера максимальное количество открытых позиций 1.
Но через цикл гораздо проще, конечно. |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
|