Порылся, пока только такое решение:
берем обе точки по которым строится фибо веер. пускай первая High. вторая Low (условно)
строим 3 луча (для 3х лучей фибо), первая точка соответствует Low, вторая:
1. время High, цена Low+(High-Low)/(1-38.2) фибо луч 61.8
2. время High, цена Low+(High-Low)/2 фибо луч 50.0
3. время High, цена Low+(High-Low)/(1-61.8) фибо луч 38.2
А уже по этим лучам с помощью функции ObjectGetValueByShift будем вычислять на какой цене тот или иной луч фибо веера.
Есть решение получше?
покажите пожалуйста ваше уравнение, буду очень благодарен!
double ValueFromTrand (string szName, int pos, double& koef) { // NB!!! // ObjectGetValueByShift(szName, 0) дает неверный результат, если Time[pos] > x2 koef = 0; double t,p1 = ObjectGet(szName, OBJPROP_PRICE1); double p2 = ObjectGet(szName, OBJPROP_PRICE2); datetime d,x1 = ObjectGet(szName, OBJPROP_TIME1); // iBarShift(Symbol(), 0, ); datetime x2 = ObjectGet(szName, OBJPROP_TIME2); // iBarShift(Symbol(), 0, ); //Print("(1)=", DoubleToStr(p1,Digits), " ", x1, " (2)=", DoubleToStr(p2,Digits), " ", x2); if (x1 == x2) return(-1); else if (x1 > x2) { t = p1; p1 = p2; p2 = t; d = x1; x1 = x2; x2 = d; } koef = p2-p1; p2 = NormalizeDouble(p1+koef*(Time[pos]-x1)/(x2-x1), Digits); return(p2); }Вот, нашел в своем архиве (хорошо, что не стер :) ) Проверяйте, почти три года назад это было, может в нынешних билдах исправили.
Все перепутно! OneDepo, это ваш код будет неправильо через выходные работать,
Да, давно это было, спутал. Но не трудно заметить, что в моей версии кода заложен и второй вариант, а именно, переход от datetime к барам через функцию iBarShift(), который лишен отмеченного недостатка.
ну у меня же в комментарии написано, когда ObjectGetValueByShift() работала не верно - вне временнОго диапазона, в котором был задан объект. Повторю, это было в предыдущих билдах МТ, возможно сейчас ObjectGetValueByShift() работает корректно как внутри, так и вне диапазона. Надо проверять, на что и было обращено внимание топикстартера.
Освободилось время, решил проверить сам функцию ObjectGetValueByShift() для трендовой линии для 388 билда. Строим трендовую линию с началом примерно на 20-м бара и концом на 5-м баре. Задаем ей имя "Test". Выключаем свойство "Луч". Запускаем это индикатор
#property indicator_chart_window extern string szTrendName = "Test"; void init() { IndicatorDigits(Digits); IndicatorShortName("Test"); } void start() { int j, k; string szName; datetime d, x1, x2; for (k = 0; k < ObjectsTotal(); k++) { szName = ObjectName(k); if (ObjectType(szName) != OBJ_TREND) continue; if (StringFind(szName, szTrendName) == -1) continue; x1 = ObjectGet(szName, OBJPROP_TIME1); x2 = ObjectGet(szName, OBJPROP_TIME2); if (x1 > x2) { d = x1; x1 = x2; x2 = d; } for (j = iBarShift(Symbol(), 0, x2)+8; 0 <= j; j--) { Print("bar=", j, " VBS=", DoubleToStr(ObjectGetValueByShift(szName, j),Digits)); } break; } }
и видим в журнале:
20:55:19 forInt EURUSD,M15: initialized 20:55:24 forInt EURUSD,M15: bar=20 VBS=1.3901 20:55:24 forInt EURUSD,M15: bar=19 VBS=1.3901 20:55:24 forInt EURUSD,M15: bar=18 VBS=1.3901 20:55:24 forInt EURUSD,M15: bar=17 VBS=1.3901 20:55:24 forInt EURUSD,M15: bar=16 VBS=1.3901 20:55:24 forInt EURUSD,M15: bar=15 VBS=1.3902 20:55:24 forInt EURUSD,M15: bar=14 VBS=1.3902 20:55:24 forInt EURUSD,M15: bar=13 VBS=1.3902 20:55:24 forInt EURUSD,M15: bar=12 VBS=1.3902 20:55:24 forInt EURUSD,M15: bar=11 VBS=0.0000 20:55:24 forInt EURUSD,M15: bar=10 VBS=0.0000 20:55:24 forInt EURUSD,M15: bar=9 VBS=0.0000 20:55:24 forInt EURUSD,M15: bar=8 VBS=0.0000 20:55:24 forInt EURUSD,M15: bar=7 VBS=0.0000 20:55:24 forInt EURUSD,M15: bar=6 VBS=0.0000 20:55:24 forInt EURUSD,M15: bar=5 VBS=0.0000 20:55:24 forInt EURUSD,M15: bar=4 VBS=0.0000 20:55:24 forInt EURUSD,M15: bar=3 VBS=0.0000 20:55:24 forInt EURUSD,M15: bar=2 VBS=0.0000 20:55:24 forInt EURUSD,M15: bar=1 VBS=0.0000 20:55:24 forInt EURUSD,M15: bar=0 VBS=0.0000
Правда включая свойство "Луч", имеем:
21:08:14 forInt EURUSD,M15: bar=20 VBS=1.3901 21:08:14 forInt EURUSD,M15: bar=19 VBS=1.3901 21:08:14 forInt EURUSD,M15: bar=18 VBS=1.3901 21:08:14 forInt EURUSD,M15: bar=17 VBS=1.3901 21:08:14 forInt EURUSD,M15: bar=16 VBS=1.3902 21:08:14 forInt EURUSD,M15: bar=15 VBS=1.3902 21:08:14 forInt EURUSD,M15: bar=14 VBS=1.3902 21:08:14 forInt EURUSD,M15: bar=13 VBS=1.3902 21:08:14 forInt EURUSD,M15: bar=12 VBS=1.3902 21:08:14 forInt EURUSD,M15: bar=11 VBS=1.3902 21:08:14 forInt EURUSD,M15: bar=10 VBS=1.3902 21:08:14 forInt EURUSD,M15: bar=9 VBS=1.3902 21:08:14 forInt EURUSD,M15: bar=8 VBS=1.3903 21:08:14 forInt EURUSD,M15: bar=7 VBS=1.3903 21:08:14 forInt EURUSD,M15: bar=6 VBS=1.3903 21:08:14 forInt EURUSD,M15: bar=5 VBS=1.3903 21:08:14 forInt EURUSD,M15: bar=4 VBS=1.3903 21:08:14 forInt EURUSD,M15: bar=3 VBS=1.3903 21:08:14 forInt EURUSD,M15: bar=2 VBS=1.3903 21:08:14 forInt EURUSD,M15: bar=1 VBS=1.3903 21:08:14 forInt EURUSD,M15: bar=0 VBS=1.3903
Так что в режиме луча для трендовой линии функция ObjectGetValueByShift() работает корректно.
Ну значит все нормально, как я и предполагал.
Спасибо OneDepo.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Вопрос: Можно ли реализовать сигнал на пробое одного из лучей фибо веера выставленного советником (имеет четкое название).
если да то как можно вычислить на какой цене луч фибо веера на текущем/прошлом баре?