АвторСообщение



Не зарегистрирован
Зарегистрирован: 24.05.14
Репутация: 0
ссылка на сообщение  Отправлено: 24.05.14 08:24. Заголовок: код трейлиг стопа


Добрый день.
Помогите разобраться с кодом трейлинга.
1. Должно работать так: вычисляется Delta равная разнице между максимумом и минимумом цены на
предыдущем баре. Далее на примере BUY: открывается сделка, стоп-лосс которой равен вычисленному Delta. При движении
цены в "нашу" сторону передвигается стоп-лосс за ценой на расстоянии равном разнице максимальной цены минус Delta (H - Delta) -
это и будет новый уровень стопа. При открытии нового бара Delta принимает значение рассчитанное на предыдущем баре,
которое будет отличаться от прежнего значения. Закрытие произойдет при достижении цены уровня Delta.
Для Sell все наоборот - расчет будем производить от минимальной цены плюс Delta.
2. Нужно ли устанавливать "RefreshRates();" ?
//+-------------------------------------------------------------------------------------+
//| Вычисление цены Stop Loss по трейлингу |
//+-------------------------------------------------------------------------------------+
double GetStopLossByTS3()
{
// нужно ли производить расчет?
if (!i_useTS3)
return (0);

double H1 = iHigh(NULL, i_workTF, 1);
double L1 = iLow(NULL, i_workTF, 1);
double Delta = H1 - L1;

double H = iHigh(NULL, i_workTF, 0);
double L = iLow(NULL, i_workTF, 0);

// Проверка наличия критерия закрытия ордера
if ((IsValuesEquals(iOpen(NULL, i_workTF, 0), (H - Delta))) ||
(IsValuesEquals(iOpen(NULL, i_workTF, 0), (L + Delta))))
return (-1);

// Расчет нового значения SL для ордера Buy
double sl;
if (OrderType() == OP_BUY)
{
if ((L + Delta) > Bid)
return (0);
sl = NP((H - Delta) - i_slOffsetToPrice * Point);
}
else
{
// Расчет нового значения SL для ордера Sell
if ((H - Delta) < Bid)
return (0);

sl = NP((L + Delta) + i_slOffsetToPrice * Point + g_spread);
}

return (sl);
}
//+-------------------------------------------------------------------------------------+

3. Добавлена переменная "double sl3". Правильная ли запись newSL закомментированная //?
При правильности записи вышестоящая строка удаляется

//+-------------------------------------------------------------------------------------+
//| Выбор ближайшей цены Stop Loss и перемещение Stop Loss ордера при необходимости |
//+-------------------------------------------------------------------------------------+
void SetNewOrderParameters(double sl1, double sl2) // было
void SetNewOrderParameters(double sl1, double sl2, double sl3) // стало
{
double newSL;
if (OrderType() == OP_BUY)
{
newSL = MathMax(sl1, sl2);
// newSL = MathMax(sl1, sl2) || MathMax(sl1, sl3) || MathMax(sl2, sl3);
if (IsFirstEqualOrMoreThanSecond(g_stopLevel, Bid - newSL))
newSL = NP(Bid - g_stopLevel - g_tickSize);

if (IsFirstEqualOrMoreThanSecond(OrderStopLoss(), newSL))
return;
}
else
{
newSL = MathMin(sl1, sl2);
// newSL = MathMin(sl1, sl2) || MathMin(sl1, sl3) || MathMin(sl2, sl3);
if (newSL == 0)
newSL = MathMax(sl1, sl2);
// newSL = MathMax(sl1, sl2) || MathMax(sl1, sl3) || MathMax(sl2, sl3);

if (IsFirstEqualOrMoreThanSecond(g_stopLevel, newSL - Ask))
newSL = NP(Ask + g_stopLevel + g_tickSize);

if (IsFirstEqualOrMoreThanSecond(newSL, OrderStopLoss()))
return;
}

ModifyDeal(newSL);
}
Спасибо.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 5 [только новые]







Сообщение: 475
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 2
ссылка на сообщение  Отправлено: 27.05.14 11:43. Заголовок: Абитуриент пишет: 1..


Абитуриент пишет:

 цитата:
1. Должно работать так: вычисляется Delta равная разнице между максимумом и минимумом цены на
предыдущем баре. Далее на примере BUY: открывается сделка, стоп-лосс которой равен вычисленному Delta. При движении
цены в "нашу" сторону передвигается стоп-лосс за ценой на расстоянии равном разнице максимальной цены минус Delta (H - Delta) -
это и будет новый уровень стопа. При открытии нового бара Delta принимает значение рассчитанное на предыдущем баре,
которое будет отличаться от прежнего значения. Закрытие произойдет при достижении цены уровня Delta.
Для Sell все наоборот - расчет будем производить от минимальной цены плюс Delta.



На первый взгляд, верно. Лишь с ремаркой, что кроме вычисленной дельты используется отступ от расчетного значения в i_slOffsetToPrice пунктов.
Но для того чтобы сказать более определенно, необходимо видеть, каким образом используется функция GetStopLossByTS3. Например, есть ли в вызывающем коде проверки возвращенного значения. Ведь функция GetStopLossByTS3, помимо корректных значений, может вернуть 0 или -1, которые свидетельствуют об ошибке вычислений. Эти моменты должны как-то обрабатываться.

Абитуриент пишет:

 цитата:
2. Нужно ли устанавливать "RefreshRates();" ?


RefreshRates требуется в тех случаях, когда после вызова эксперта по очередному тику до момента запроса значений Bid и Ask могло пройти время, сопоставимое с временем, проходящим между двумя соседними тиками. Это касается, в основном, зацикленных программ, в которых возможна отправка нескольких торговых приказов на одном и том же тике.
Таким образом, здесь тоже нельзя дать конкретного ответа - нужно видеть весь код.

Абитуриент пишет:

 цитата:
3. Добавлена переменная "double sl3". Правильная ли запись newSL закомментированная //?
При правильности записи вышестоящая строка удаляется


Неверно.
Переменная newSL имеет тип double, а в закомментированных строках вычисляется результат типа bool. Если необходимо найти максимальное/минимальное значение из трех представленных, то правильно это делать так:

 цитата:
newSL = MathMax(sl1, MathMax(sl2, sl3));


или так:

 цитата:
newSL = MathMin(sl1, MathMin(sl2, sl3));



В случае нахождения минимального значения не забывайте о том, что минимальным может оказаться значение 0. Ну или вообще отрицательная величина, что для стопа/профита является ошибкой.


Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 1
Зарегистрирован: 24.05.14
Репутация: 0
ссылка на сообщение  Отправлено: 02.06.14 09:42. Заголовок: Добрый день, подполк..


Добрый день, подполковник!
Спасибо за ответы.
Но... трейлинг работает неправильно.
Этот трейлинг добавка к двум другим, которые входят в PIBI_FollowPosition_v7 советника PivotBid_v7_Expert. При тестировании первые два были отключены. Может быть при открытии свечи производить обнуление Д?

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 500
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 2
ссылка на сообщение  Отправлено: 09.06.14 10:59. Заголовок: Абитуриент пишет: Н..


Абитуриент пишет:

 цитата:
Но... трейлинг работает неправильно.


Тогда давайте говорить более предметно. Для этого нужно больше информации, а именно:
1. В чем проявляется неправильность?
2. Как используются приведенные функции? (нужно видеть полный код торговой части или всей программы)

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 505
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 2
ссылка на сообщение  Отправлено: 09.06.14 12:12. Заголовок: Ага, оказывается под..


Ага, оказывается подробности пришли по почте. Дублирую сюда:

 цитата:
как должно работать:
- вычисляется Delta равная разнице между максимумом и минимумом цены на предыдущем баре
- далее на примере BUY: открывается сделка, стоп-лосс которой равен вычисленному Delta. При движении
цены в "нашу" сторону передвигается стоп-лосс за ценой на расстоянии равном разнице максимальной цены минус Delta (MaxPrice - Delta) - это и будет новый уровень стопа
- при открытии нового бара Delta принимает значение рассчитанное на предыдущем баре, которое будет отличаться от прежнего значения
- закрытие произойдет при достижении цены уровня Delta.
Для Sell все наоборот - расчет будем производить от минимальной цены плюс Delta.



По этому описанию приводится код:

 цитата:
double GetStopLossByTS3()
{
// нужно ли производить расчет?
if (!i_useTS3)
return (0);

double H1 = iHigh(NULL, i_workTF, 1);
double L1 = iLow(NULL, i_workTF, 1);
double Delta = H1 - L1;
// RefreshRates(); // нужно или нет? если да, то где поставить?

double MaxPrice = iHigh(NULL, i_workTF, 0);
double MinPrice = iLow(NULL, i_workTF, 0);

// Проверка наличия критерия закрытия ордера
if (IsValuesEquals(iOpen(NULL, i_workTF, 0), (MaxPrice - Delta)) ||
IsValuesEquals(iOpen(NULL, i_workTF, 0), (MinPrice + Delta)))
return (-1);

// Расчет нового значения SL для ордера Buy
double sl;
if (OrderType() == OP_BUY)
{
if ((MinPrice + Delta) > Bid)
return (0);
sl = NP(MaxPrice - Delta);
}
else
{
// Расчет нового значения SL для ордера Sell
if ((MaxPrice - Delta) < Bid)
return (0);

sl = NP(MinPrice + Delta + g_spread);
}

return (sl);
}



Далее рисунок:


 цитата:
При тестировании другие трейлинги были отключены.

№1 открытие по цене 126,648 стоп-лосс равен (MaxPrice - Delta), Delta = 255 пунктов. Сделка не закрылась, т.к. цена не дошла до стоп-лосса.

№2 открытие по цене 127,618 стоп-лосс равен (MaxPrice - Delta), Delta = 444 пункта (разница между максимальной и минимальной ценой на свече №1). Сделка не закрылась.

№3 открытие по цене 128,099 стоп-лосс равен (MaxPrice - Delta), Delta = 716 пунктов (разница между максимальной и минимальной ценой на свече №2). Сделка закрылась по стопу 2 свечи.

В этом месте сделка не должна была закрыться т.к. Delta свечи №2 намного больше самой свечи №3. Аналогично должно было произойти и со свечой №4.
Закрытие должно было бы произойти на свече №7.
Получается, что с открытием новой свечи, должно устанавливаться новое значение стоп-лосса, а старое значение обнуляться или ещё как-то. Как это сделать?

Этот трейлинг похож на трейлинг по цене, но с каждой новой свечой у него новое значение.



Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 506
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 2
ссылка на сообщение  Отправлено: 09.06.14 12:22. Заголовок: Ответ К сожалению, ..


Ответ

К сожалению, даже по этим данным невозможно понять суть проблемы, т. к. в описании фигурируют номера свечей, не указанные на самом рисунке. Отсюда и сложности в слежении за мыслью.

P. S. Чему равно значение параметра i_workTF в данном случае? Если оно не равно 60, то это и есть ответ на вопрос.

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  2 час. Хитов сегодня: 4
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет