Пробой фибо веера

 

Вопрос: Можно ли реализовать сигнал на пробое одного из лучей фибо веера выставленного советником (имеет четкое название).

если да то как можно вычислить на какой цене луч фибо веера на текущем/прошлом баре?

 

Порылся, пока только такое решение:

берем обе точки по которым строится фибо веер. пускай первая 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 будем вычислять на какой цене тот или иной луч фибо веера.

Есть решение получше?

 
В ваш алгоритм не вчитывался, а вот относительно функции ObjectGetValueByShift(), не рекомендовал бы ее использовать, может подвести. В свое время решал аналогичную задачу, только пробивалась трендовая линия, и если ее начало было в "пятнице", а конец - в "понедельнике", функция дурила по-черному. Не помню деталей, но выбросил ее, а значения цены получал из обычного уравнения прямой собственной реализации, чего и вам советую.
 
покажите пожалуйста ваше уравнение, буду очень благодарен!
 
отнимаем от большего меньшие, делим на продолжительность линии в барах и затем в зависимости от того на сколько далеко мы отошли, простым умножением получаем нужную точку?
 
Sys15975382:
покажите пожалуйста ваше уравнение, буду очень благодарен!
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, это ваш код будет неправильо через выходные работать, а ObjectGetValueByShift() будет работать правильно.
 
Integer:
Все перепутно! OneDepo, это ваш код будет неправильо через выходные работать,

Да, давно это было, спутал. Но не трудно заметить, что в моей версии кода заложен и второй вариант, а именно, переход от datetime к барам через функцию iBarShift(), который лишен отмеченного недостатка.

... а ObjectGetValueByShift() будет работать правильно.

ну у меня же в комментарии написано, когда 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.

Причина обращения: