Автор |
Сообщение |
cyber2003
Зарегистрирован: 10.04.2012
Сообщения: 52
|
Безубыток.
Пишу так:
buy=...
sell=...
short=...
cover=...
// начальная величина стоп-лосса
SL = 1000;
// для длинной позиции хочу перенести стоп-лосс в 0, или почти в 0 - на 10 пунктов цены покупки, если цена отходит от цены входа более чем на 2000 пунктов
SL = IIf(SL > 100 AND (H-ValueWhen(Buy, BuyPrice)) > 2000, 10, SL);
// для короткой позиции хочу перенести стоп-лосс в 0, или почти в 0 - на 10 пунктов цены продажи, если цена отходит от цены входа более чем на 2000 пунктов
SL = IIf(SL > 100 AND (ValueWhen(Short, ShortPrice) - L ) > 2000, 10, SL);
ApplyStop(stopTypeLoss, stopModePoint, SL, ExitAtStop = 1);
Перенос в 0 не работает, срабатывает только первоначальный стоп в размере 1000п. В чем ошибка и как ее исправить?
Далее, хочу после прибыльной сделки исполнить только следующие 4 сигнала, а потом пропустить еще 5 сигналов. Сделки совершаются 1 раз в день.
Пишу:
Eq = Equity();
BeginDay = Day() != Ref(Day(), -1);
Cond1 = ValueWhen(BeginDay, Eq, 1) > ValueWhen(BeginDay, Eq, 2);
Cond2 = ValueWhen(BeginDay, Eq, 2) > ValueWhen(BeginDay, Eq, 3);
Cond3 = ValueWhen(BeginDay, Eq, 3) > ValueWhen(BeginDay, Eq, 4);
Cond4 = ValueWhen(BeginDay, Eq, 4) > ValueWhen(BeginDay, Eq, 5);
//Buy = Buy AND (Cond1 OR Cond2 OR Cond3 OR Cond4);
//Short = Short AND (Cond1 OR Cond2 OR Cond3 OR Cond4);
Condition = (Cond1 OR Cond2 OR Cond3 OR Cond4);
Buy=ExRem(Buy,Condition );
Short=ExRem(Short,Condition );
Тоже не работает...
После прибыльной сделки сигналы не пропускаются. А как написать последующее исполнение 5 сигналов - вообще не представляю... Помогите, если можно... |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
У функции ApplyStop есть 5ый параметр (volatile = False). Именно он разрешает или запрещает двигать стоп. По умолчанию стоп двигать запрещено. Вероятно поэтому в безубыток и не переносится. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
cyber2003
Зарегистрирован: 10.04.2012
Сообщения: 52
|
000 писал(а): |
У функции ApplyStop есть 5ый параметр (volatile = False). Именно он разрешает или запрещает двигать стоп. По умолчанию стоп двигать запрещено. Вероятно поэтому в безубыток и не переносится. |
да, так кажется работает, спасибо.
а по второй части что-нибудь посоветуете? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
По второй части не посоветую. Это надо какой то замороченный цикл писать. Плюс много неясностей.
Исполнять 4 сигнала после прибыльного, а если среди этих сигналов тоже будут прибыльные? и по идее от них тоже надо 4 исполнять. А с другой стороны на эти следующие 4 наедут 5 неисполняемых.... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Enhema
Зарегистрирован: 25.12.2014
Сообщения: 36
|
И снова прошу помощи =)
Я так понял ApplyStop и циклы нельзя совмещать?
Как быть с переносом стопа в безубыток. Хочу двинуть первоначальный стоп в безубыток если цена прошла в мою сторону, допустим, пол пути.
Понимаю, что это делается в цикле, но мне так же важен параметр из ApplyStop который даёт задержку в n-баров после срабатывания стопа.
Вот кусок кода:
Код: |
BuyPrice = O;
SellPrice = O;
ShortPrice = O;
CoverPrice = O;
if(Name() == "SPFB.RTS")
{
SetPositionSize(2,spsShares);
BuySignal = S_Buy;
SellSignal = S_Sell;
ShortSignal = S_Short;
CoverSignal = S_Cover;
position = 0;
Stop = 0.304;
for(i = 1; i < BarCount; i++)
{
if(position == 0)
{
if(BuySignal[i]) // проверка условия для лонга
{
Buy[i] = 1; // покупка
position = 1; // длинная позиция
PriceBuy = BuyPrice[i]; // цена покупки
}
else if(ShortSignal[i]) // проверка условия для шорта
{
Short[i] = 1; // продажа
position = -1; // короткая позиция
PriceShort = ShortPrice[i]; // цена шорта
}
}
else if(position == 1) // в противном случае, если лонг
{
if(SellSignal[i]) // условия закрытия лонга
{
Sell[i] = 1; // закрытие лонга
position = 0; // система не в позиции
}
if(H[i] >= PriceBuy*1.005) // проверка достижения уровня безубытка
{
Stop = 0.0001;// перенос стопа в безубыток
}
}
else if(position == -1) // в противном случае если шорт
{
if(CoverSignal[i]) // условия закрытия шорта
{
Cover[i] = 1; // закрытие шорта
position = 0; // система не в позиции
}
if(L[i] <= PriceShort*-1.005) // проверка достижения уровня безубытка
{
Stop = 0.0001;// перенос стопа в безубыток
}
}
}
ApplyStop(stopTypeLoss, stopModePercent, Stop, 1, True,15);
} |
[/code] |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Подробно не смотрел, но, кажется, ошибка в следующем. У тебя в разных местах графика Stop разный. Сначала он 0.304 потом переносится в безубыток и == 0.0001. После закрытия опять 0.304 и т.д.
Т.е. Stop это массив. Так и пиши в цикле Stop[i] и при этом не забывай переносить значение на следующий бар Stop[i] = Stop[i-1] |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
SPR
Зарегистрирован: 10.11.2008
Сообщения: 45
|
Немного другой вопрос...Тоже пытаюсь тестировать перенос в безубыток в цикле и набросал такой код:
Код: |
Buy = ...
BuyPrice = ...
s1 = ... (начальный стоп для лонга)
Sell = 0;
Short = ...
ShortPrice = ...
s2 = ...(начальный стоп для шорта)
Cover = 0;
pos = 0;
for( i = 1; i < BarCount; i++)
{
if( pos == 0)
{
if( Buy[i]) // покупаем
{
pos = 1;
Pricebuy = BuyPrice[i];
stop = s1[i];
}
if( Short[i]) // продаем
{
pos = -1;
Priceshort = ShortPrice[i];
stop = s2[i];
}
}
else if( pos == 1)
{
if( L[i] <= Pricebuy - stop) // закрываем, если дошло до первоначального стопа
{
Sell[i] = 1;
SellPrice[i] = Pricebuy - stop;
pos = 0;
}
if( H[i] >= Pricebuy*1.005) // переносим стоп в безубыток, если цена прошла в мою сторону на 0,5%
{
stop = Pricebuy;
}
if( L[i] <= stop) // продаем если падает ниже безубытка
{
Sell[i] = 1;
SellPrice[i] = stop;
pos = 0;
}
if( H[i] >= Pricebuy*1.01) // тейк-профит 1%
{
Sell[i] = 1;
SellPrice[i] = Pricebuy*1.01;
pos = 0;
}
}
else if( pos == -1) // все то же самое, но для шорта
{
if( H[i] >= Priceshort + stop)
{
Cover[i] = 1;
CoverPrice[i] = Priceshort + stop;
pos = 0;
}
if( L[i] <= Priceshort*0.995)
{
stop = Priceshort;
}
if( H[i] >= stop)
{
Cover[i] = 1;
CoverPrice[i] = stop;
pos = 0;
}
if( L[i] <= Priceshort*0.99)
{
Cover[i] = 1;
CoverPrice[i] = Priceshort*0.99;
pos = 0;
}
}
}
|
Проблема в том, что для длинных позиций данный код работает идеально, а вот для коротких нифига. Шорт почему то закрывается на следующей свече после той, на которой было открытие позиции. Причем во всех сделках. Я уже голову сломал...не могу найти где ошибка. Помогите плз... |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Думаю, что дело в расчете
Код: |
s2 = ...(начальный стоп для шорта) |
может он отрицательный у тебя получается?
Кроме того есть еще косяк.рассмотрим выход из шорта
Код: |
else if( pos == -1) // все то же самое, но для шорта
{
if( H[i] >= Priceshort + stop)
{
Cover[i] = 1;
CoverPrice[i] = Priceshort + stop;
pos = 0;
} // если хай больше стопа то выходим по лосю
if( L[i] <= Priceshort*0.995)
{
stop = Priceshort;
} // проверяем условия переноса в безубыток. А если мы уже вышли по лосю?
if( H[i] >= stop)
{
Cover[i] = 1;
CoverPrice[i] = stop;
pos = 0;
}
if( L[i] <= Priceshort*0.99)
{
Cover[i] = 1;
CoverPrice[i] = Priceshort*0.99;
pos = 0;
} // проверяем выход по профиту. А вдруг мы уже вышли по лосю? Т.е. если есть условия и для лося и для профита, то мы выйдем по профиту. Правильным считается выходить по худшему сценарию.
}
|
Короче надо после первой проверки if поменять на else if |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
SPR
Зарегистрирован: 10.11.2008
Сообщения: 45
|
1. Значение стопа точно положительное. А поскольку из-за ошибки выход из шорта во всех сделках происходит на следующей свече после входа, то, думаю, это подтверждаем, что параметр s2 не причем.
2. Изменил как ты советовал - не помогло.
Меня смущает вот что: для лонгов такой код работает без ошибок, а для шортов нет. Вот это странно... |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ща некогда. Вечером еще посмотрю. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
SPR
Зарегистрирован: 10.11.2008
Сообщения: 45
|
000 писал(а): |
Ща некогда. Вечером еще посмотрю. |
Спасибо, буду ждать
Для интереса попробовал вообще исключить часть кода, отвечающее за перенос в б/у и оставил только блок выхода по стопу или по тейк-профиту. Работает. Выходит, что ошибка именно в коде безубытка. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Короче.
У тебя 2 разные по логике переменные названы одинаково.
Вот тут stop
Код: |
if( Short[i]) // продаем
{
pos = -1;
Priceshort = ShortPrice[i];
stop = s2[i];
}
|
Далее stop используется в соответствии с логикой системы
и далее вдруг
Код: |
if( H[i] >= Pricebuy*1.005) // переносим стоп в безубыток, если цена прошла в мою сторону на 0,5%
{
stop = Pricebuy;
}
|
Опять stop. Но по логике это совсем другая переменная. Замени название уровня стопа после переноса в безубыток. Лонга это тоже касается. Просто повезло, что лонг работает нормально. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
SPR
Зарегистрирован: 10.11.2008
Сообщения: 45
|
Если я правильно понял, то ты имеешь в виду что-то такое для лонга:
Код: |
else if( pos == 1)
{
if( L[i] <= Pricebuy - stop)
{
Sell[i] = 1;
SellPrice[i] = Pricebuy - stop;
pos = 0;
}
if( H[i] >= Pricebuy*1.005)
{
stop = Pricebuy;
stop1 = stop;
}
if( L[i] <= stop1)
{
Sell[i] = 1;
SellPrice[i] = stop1;
pos = 0;
}
|
И для шорта:
Код: |
else if( pos == -1)
{
if( H[i] >= Priceshort + stop)
{
Cover[i] = 1;
CoverPrice[i] = Priceshort + stop;
pos = 0;
}
if( L[i] <= Priceshort*0.995)
{
stop = Priceshort;
stop1 = stop;
}
if( H[i] >= stop1)
{
Cover[i] = 1;
CoverPrice[i] = stop1;
pos = 0;
}
|
Попробовал, криво работает. Несколько сделок правильно закрыто, остальные без изменения... |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Не совсем.
Зачем вот это?
stop = Priceshort;
У тебя ранее в цикле
if( H[i] >= Priceshort + stop)
И что это получается?
if( H[i] >= Priceshort + Priceshort) ???
Я сделал так
Код: |
Buy = DayOfWeek() == 2 AND Ref(DayOfWeek(), -1) == 1;
BuyPrice = C;
s1 = 1; // (начальный стоп для лонга)
Sell = 0;
Short = DayOfWeek() == 5 AND Ref(DayOfWeek(), -1) == 4;
ShortPrice = C;
s2 = 1; //(начальный стоп для шорта)
Cover = 0;
pos = 0;
for( i = 1; i < BarCount; i++)
{
if( pos == 0)
{
if(Buy[i]) // покупаем
{
pos = 1;
Pricebuy = BuyPrice[i];
stop = s1[i];
}
else if( Short[i]) // продаем
{
pos = -1;
Priceshort = ShortPrice[i];
stop = s2[i];
}
}
else if( pos == 1)
{
if( L[i] <= (Pricebuy - stop)) // закрываем, если дошло до первоначального стопа
{
Sell[i] = 2;
SellPrice[i] = Pricebuy - stop;
pos = 0;
}
else if( H[i] >= Pricebuy*1.005) // переносим стоп в безубыток, если цена прошла в мою сторону на 0,5%
{
stopL = Pricebuy;
}
else if( L[i] <= stopL) // продаем если падает ниже безубытка
{
Sell[i] = 2;
SellPrice[i] = stopL;
pos = 0;
}
else if( H[i] >= Pricebuy*1.01) // тейк-профит 1%
{
Sell[i] = 3;
SellPrice[i] = Pricebuy*1.01;
pos = 0;
}
}
else if( pos == -1) // все то же самое, но для шорта
{
if( H[i] >= (Priceshort + stop))
{
Cover[i] = 2;
CoverPrice[i] = Priceshort + stop;
pos = 0;
}
else if( L[i] <= (Priceshort*0.995))
{
stopL = Priceshort;
}
else if( H[i] >= stopL)
{
Cover[i] = 2;
CoverPrice[i] = stopL;
pos = 0;
}
else if( L[i] <= Priceshort*0.99)
{
Cover[i] = 3;
CoverPrice[i] = Priceshort*0.99;
pos = 0;
}
}
}
|
Вроде все ОК.
Sell[i] = 2; Sell[i] = 3; и т.п. это вот по какому принципу.
Цитата: |
Depending on kind of the stop various values
are written back to sell/cover array to enable you
to distinguish if given signal was generated by regular
rule or by stop.
1 - regular exit
2 - max. loss
3 - profit target
4 - trailing
5 - n-bar stop
6 - ruin stop
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
SPR
Зарегистрирован: 10.11.2008
Сообщения: 45
|
Вставил твой код в полном объеме вместо своего, чтобы протестировать...не работает=( |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|