Автор |
Сообщение |
jarikk
Зарегистрирован: 21.11.2008
Сообщения: 67
Откуда: Рязань
|
Олег, че то я запутался малость))
Тестирую стратегию
Условия на вход два: или одно, или второе
ставлю первоначальный стоп-лосс 1ATR от цены покупки
плюс потом начинаю вести трейлинг
и если сделка вылетела по первоначальному стопу, то
система повторно не заходит, пока не будет реализован трейлинг
ломал голову, как поправить код, но ничего не придумал
надеюсь на твою помощь
Код: |
pos = 0;
Buy=Cond1 OR Cond2;
Sell=0;
ApplyStop(0,2,ATR(15),1);
for(i = 1; i<BarCount; i++)// пробегаем все бары с 1 по текущий с шагом в 1 бар
{
if (Buy[i-1]) // если совершилась покупка на пред.баре
{
pos[i] = 1; // присваиваем массиву pos значение 1
}
else
{pos[i]=pos[i-1]; // иначе присваиваем массиву pos значение этого массива на пред.баре
}
// уровень стопа
if (pos[i] == 1) // если значение массива pos эквивалентно 1
{
Buy[i] = 0; // массиву buy присваиваем значение 0
stop[i] = L[i]; // массиву стоп присваиваем значение лоу текущего бара
if(stop[i] < stop[i-1]) // если значение массива стоп на тек.баре меньше значения стопа на пред.баре
{
stop[i]=stop[i-1]; // присваиваем предыдущее значение стопа
}
}
// активизация стопа
if(pos[i] == 1) // если значение массива pos эквивалентно 1
{
if(C[i] < stop[i]) // если клоуз текущего бара ниже значения стопа
{
Sell[i] = 1; // производим продажу
SellPrice[i]=C[i]; // цена продажи равна цене закрытия текущего бара
pos = 0; // в массив pos записываем значение 0
}
}
else
{
Sell[i]=0; // иначе , продажу не производим
}
}
|
|
_________________ per aspera ad astra... |
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
А потому, что в цикле ты совсем не учитываешь срабатывание ApplyStop(0,2,ATR(15),1); и блокируешь покупки пока по циклу система в позе
if (pos[i] == 1) // если значение массива pos эквивалентно 1
{
Buy[i] = 0; // массиву buy присваиваем значение 0
...
Проще всего после ApplyStop(0,2,ATR(15),1); поставить Equity(1); и в цикле сделать проверку срабатывания этого стопа. Когда он сработает в массив Sell запишется 2
Типа если Sell[i] == 2 то обнуляем pos[i].. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
commenced
Советник
Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"
|
Не надо так и ладно. |
_________________ Юра
Последний раз редактировалось: commenced (Сб Май 02, 2009 8:01 am), всего редактировалось 1 раз |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Чёта смотрел - смотрел и непонял. При чем тут этот код? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вот еще что. Для реализации трейлинга по прошлому лою цикл писать совсем не обязательно. Можно просто написать
Sell = L < Ref(L, -1);
и при этом
SellPrice = Ref(L, -1); |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
commenced
Советник
Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"
|
000 писал(а): |
Чёта смотрел - смотрел и непонял. При чем тут этот код? |
рабочая болванка. |
_________________ Юра |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
jarikk
Зарегистрирован: 21.11.2008
Сообщения: 67
Откуда: Рязань
|
000 писал(а): |
Вот еще что. Для реализации трейлинга по прошлому лою цикл писать совсем не обязательно. Можно просто написать
Sell = L < Ref(L, -1);
и при этом
SellPrice = Ref(L, -1); |
трейлинг не по прошлому лою
здесь смысл в том, что ведем лоу после покупки
если лоу выше, чем предыдущий, то уровень стопа передвигаем на это лоу
если лоу ниже, чем предыдущий лоу, то оставляем предыдущий уровень
а выход из лонга осуществляется при закрытии бара ниже уровня стопа
и цена продажи это клоуз свечи |
_________________ per aspera ad astra... |
|
Посмотреть профиль Отправить личное сообщение |
|
jarikk
Зарегистрирован: 21.11.2008
Сообщения: 67
Откуда: Рязань
|
вот, завел в код дополнительное условие
на первоначальный стоп
но ошибка в массивах и переменных
как поправить, я не знаю
я только начал изучать афл
Код: |
Buy=Cond1 OR Cond2;
Sell=0;
for(i = 1; i<BarCount; i++)// пробегаем все бары с 1 по текущий с шагом в 1 бар
{
if (Buy[i-1]) // если совершилась покупка на пред.баре
{
pos[i] = 1; // присваиваем массиву pos значение 1
stoplevel=BuyPrice-Ref(ATR(15),-1);
}
else
{pos[i]=pos[i-1]; // иначе присваиваем массиву pos значение этого массива на пред.баре
}
// уровень стопа
if (pos[i] == 1) // если значение массива pos эквивалентно 1
{
Buy[i] = 0; // массиву buy присваиваем значение 0
stop[i] = L[i]; // массиву стоп присваиваем значение лоу текущего бара
if(stop[i] < stop[i-1]) // если значение массива стоп на тек.баре меньше значения стопа на пред.баре
{
stop[i]=stop[i-1]; // присваиваем предыдущее значение стопа
}
}
// активизация стопа
if(pos[i] == 1) // если значение массива pos эквивалентно 1
{
if(C[i] < stop[i] ) // если клоуз текущего бара ниже значения стопа
{
Sell[i] = 1; // производим продажу
SellPrice[i]=C[i]; // цена продажи равна цене закрытия текущего бара
pos = 0; // в массив pos записываем значение 0
}
if(C[i]<stoplevel)
{
Sell[i] = 1;
SellPrice[i]=stoplevel;
pos = 0; // в массив pos записываем значение 0
stoplevel=0;
}
}
else
{
Sell[i]=0; // иначе , продажу не производим
}
}
|
[/code] |
_________________ per aspera ad astra... |
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Типа так
Код: |
Buy = Cross(C, MA(C, 20));
Sell = 0;
Pos[0] = 0;
st = ATR(15);
for(i = 1; i < BarCount; i++)// пробегаем все бары с 1 по текущий с шагом в 1 бар
{
if (Buy[i-1]) // если совершилась покупка на пред.баре
{
pos[i] = 1; // присваиваем массиву pos значение 1
stoplevel = BuyPrice[i] - st[i-1];
}
else
{
pos[i]=pos[i-1]; // иначе присваиваем массиву pos значение этого массива на пред.баре
}
// уровень стопа
if (pos[i] == 1) // если значение массива pos эквивалентно 1
{
Buy[i] = 0; // массиву buy присваиваем значение 0
stop[i] = L[i]; // массиву стоп присваиваем значение лоу текущего бара
if(stop[i] < stop[i-1]) // если значение массива стоп на тек.баре меньше значения стопа на пред.баре
{
stop[i]=stop[i-1]; // присваиваем предыдущее значение стопа
}
}
// активизация стопа
if(pos[i] == 1) // если значение массива pos эквивалентно 1
{
if(C[i] < stop[i] ) // если клоуз текущего бара ниже значения стопа
{
Sell[i] = 1; // производим продажу
SellPrice[i] = C[i]; // цена продажи равна цене закрытия текущего бара
pos = 0; // в массив pos записываем значение 0
}
if(C[i] < stoplevel)
{
Sell[i] = 1;
SellPrice[i] = stoplevel;
pos = 0; // в массив pos записываем значение 0
stoplevel = 0;
}
}
else
{
Sell[i] = 0; // иначе , продажу не производим
}
}
|
Ошибка была тут
stoplevel=BuyPrice-Ref(ATR(15),-1); |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Teema
Зарегистрирован: 01.04.2009
Сообщения: 184
|
Пробую применить стопы (см.файл).
В определенные моменты начинается
постоянная серия Short-Cover. Где-то не догоняю.
Как надо правильно сделать? Подскажите пожалуйста. |
|
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
commenced
Советник
Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"
|
Teema писал(а): |
Пробую применить стопы (см.файл).
В определенные моменты начинается
постоянная серия Short-Cover. Где-то не догоняю.
Как надо правильно сделать? Подскажите пожалуйста. |
Система торгует по заложенным правилам, просто стоп близок у тебя. поэтому выбивает, а так как условие Short = L <= ShortLevel; соблюдено ты опять в шорте. поэтому когда цена ниже ShortLeve у тебя череда Short-Cover, когда выше уровня лонга buy-sell или вопрос не о этом.
И еще ты не правильно расчитал цены buyprice shortprice. |
_________________ Юра |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
Teema
Зарегистрирован: 01.04.2009
Сообщения: 184
|
Поясню смысл проблемы.
Выше, Олег, предложил вариант трейлинг-стопа
для позиции лонг. Я попробовал его использовать и для
шорта. Оказалось, что для лонга всё работает, а для шорта
нет. Смысл трейлинга для шорта (как я думаю):
уровень стопа находится на минимальном Hi предыдущих баров
с момента открытия позиции ШОРТ и если этот Hi понижается
то за ним перемещается уровень стопа. Если Закрытие, на каком-либо
баре выше уровня стопа, уже например сдвинувшегося ниже, то выходим на этом закрытии.
В моем варианте лонг отрабатывает как задумал Олег.
А шорт, если для него соответствуют уровни, открывается, а на следующем баре закрываются, потом снова открывается, а на следующем баре закрывается. Стоп там не близко, а как задумывалось. Только работает не так. |
Последний раз редактировалось: Teema (Пт Июн 19, 2009 11:59 am), всего редактировалось 1 раз |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
commenced
Советник
Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"
|
Teema писал(а): |
Поясню смысл проблемы.
Выше, Олег, предложил вариант трейлинг-стопа
для позиции лонг. Я попробовал его использовать и для
шорта. |
Ну использовал ты его для шорта , а проблема то в чем. Кстати та часть стопа которая расчитывается не по h и l, зависит от atr в данном коде ни несет никакую нагрузку т.к. более чуствительная часть срабатывает раньше в 100% случаев. |
_________________ Юра |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
Teema
Зарегистрирован: 01.04.2009
Сообщения: 184
|
Проверил условия стопа. Заменил ATR. т.е. значение st[i] на 0.1% от уровня входа. Стало все понятнее. Заменил условия покупки-продажи.
Но шорт исправить не могу.
SOS! |
|
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
commenced
Советник
Зарегистрирован: 08.04.2008
Сообщения: 643
Откуда: от "Верблюда"
|
Teema писал(а): |
Проверил условия стопа. Заменил ATR. т.е. значение st[i] на 0.1% от уровня входа. Стало все понятнее. Заменил условия покупки-продажи.
Но шорт исправить не могу.
SOS! |
Это что такое?
Код: |
Buy = Ref(C,-1) >= BuyLevel;// покупка если максимум выше уровня покупки
BuyPrice = Max(O, BuyLevel);// по цене уровня покупки
Short = Ref(C,-1)<= ShortLevel;
ShortPrice = Min(O, ShortLevel); |
либо так
Buy = H >= BuyLevel;// покупка если максимум выше уровня покупки
BuyPrice = Max(O, BuyLevel);// по цене уровня покупки
Short = L<= ShortLevel;
ShortPrice = Min(O, ShortLevel);
либо так
Buy = Ref(C,-1) >= BuyLevel;// покупка если максимум выше уровня покупки
BuyPrice = O;// по цене уровня покупки
Short = Ref(C,-1)<= ShortLevel;
ShortPrice = O; |
_________________ Юра |
|
Посмотреть профиль Отправить личное сообщение Отправить e-mail |
|
|