Не зарегистрирован
Зарегистрирован: 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);
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. Ну или вообще отрицательная величина, что для стопа/профита является ошибкой.
Отправлено: 02.06.14 09:42. Заголовок: Добрый день, подполк..
Добрый день, подполковник! Спасибо за ответы. Но... трейлинг работает неправильно. Этот трейлинг добавка к двум другим, которые входят в PIBI_FollowPosition_v7 советника PivotBid_v7_Expert. При тестировании первые два были отключены. Может быть при открытии свечи производить обнуление Д?
Тогда давайте говорить более предметно. Для этого нужно больше информации, а именно: 1. В чем проявляется неправильность? 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(); // нужно или нет? если да, то где поставить?
// Расчет нового значения 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. Получается, что с открытием новой свечи, должно устанавливаться новое значение стоп-лосса, а старое значение обнуляться или ещё как-то. Как это сделать?
Этот трейлинг похож на трейлинг по цене, но с каждой новой свечой у него новое значение.
Отправлено: 09.06.14 12:22. Заголовок: Ответ К сожалению, ..
Ответ
К сожалению, даже по этим данным невозможно понять суть проблемы, т. к. в описании фигурируют номера свечей, не указанные на самом рисунке. Отсюда и сложности в слежении за мыслью.
P. S. Чему равно значение параметра i_workTF в данном случае? Если оно не равно 60, то это и есть ответ на вопрос.
Все даты в формате GMT
2 час. Хитов сегодня: 4
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет