Форум » Консультации по программированию » код трейлиг стопа » Ответить

код трейлиг стопа

Абитуриент: Добрый день. Помогите разобраться с кодом трейлинга. 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); } Спасибо.

Ответов - 5

Scriptong: Абитуриент пишет: 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. Ну или вообще отрицательная величина, что для стопа/профита является ошибкой.

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

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


Scriptong: Ага, оказывается подробности пришли по почте. Дублирую сюда: как должно работать: - вычисляется 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. Получается, что с открытием новой свечи, должно устанавливаться новое значение стоп-лосса, а старое значение обнуляться или ещё как-то. Как это сделать? Этот трейлинг похож на трейлинг по цене, но с каждой новой свечой у него новое значение.

Scriptong: Ответ К сожалению, даже по этим данным невозможно понять суть проблемы, т. к. в описании фигурируют номера свечей, не указанные на самом рисунке. Отсюда и сложности в слежении за мыслью. P. S. Чему равно значение параметра i_workTF в данном случае? Если оно не равно 60, то это и есть ответ на вопрос.



полная версия страницы