Экстремумы ZigZag

Тема в разделе "3. - зиг-заги", создана пользователем maverick518, 11 мар 2010.

  1. maverick518

    maverick518 Новичок

    Доброго времени суток всем. Пробую написать советника на основе индикатора ZigZag. Для правильной работы необходимо отследить момент определения нового экстремума. Используя стандартные параметры (12,5,3) экстремум математически через 3 часа после его появления. Вопрос. как избежать данной ситуации и определять значения экстремума на следующим после него Баре. Сразу хочется задать еще один вопрос, есть ли в MetaEditore MT4.0 трассировки программы на этапе выполнения. мне это необходимо для тетального анализа логики работы программы. Заранее ВСЕМ огромное спасибо. С наилучшими пожеланиями.
     
  2. nen

    nen Профи форума

    1) Это гадание.
    2) Отладчика в МТ4 нет. Есть в МТ5.
     
  3. maverick518

    maverick518 Новичок

    Может я не корректно выразился, но мне необходимо получать математическое значение точки перегиба не через 3 часа, а через час после отображения на графике (наступления события).
     
  4. nen

    nen Профи форума

    Ничего не понял. Может быть проще нарисовать на графике, что нужно?
     
  5. maverick518

    maverick518 Новичок

    Как Вы и просили добавняю рисунок графика. В моем советнике при совершении сделки на покупку сделка закрывается при наступлении соответствующего экстремума. Получается, что постоянно происходят потери из-за несоответствия времени перегиба и пересчета вершин. Если я Вас совсем запутал, то мне надо добиться получения новых значений экстремумов вершин максимально быстро после наступления события. Еще раз спасибо, что уделяете мне время, с уважением Михаил.
     

    Вложения:

  6. nen

    nen Профи форума

    Зигзаг обновляет экстремум мгновенно. Как только хотя бы на один пункт бар вырастет, луч зигзага (экстремум) перескочит мгновенно на пункт выше. Что может быть еще быстрее? Заранее просчитать момент возникновения экстремума, где заканчивается тренд, в большинстве случаев с помощью зигзага не удастся.

    То есть если Вы хотите предъугадать наступление конца тренда, то с помощью зигзага предложенным способом это сделать не получится.
    Это бесперспективное занятие.

    Можно сделать графические построения от прошлых экстремумов зигзага. И эти построения могут в какой-то степени помочь определить конец тренда. Но эту технику необходимо сначала придумать, а потом освоить.

    1) От прошлых трех экстремумов можно строить различные варианты каналов (вилы Эндрюса - тоже каналы).
    2) От предпоследнего экстремума можно строить фибо уровни.
    ...
     
  7. maverick518

    maverick518 Новичок

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

    int n;
    int Zbar[4]; //номер бара с перегибом
    double Zval[4]; //значение зигзага в точке перегиба Zval[1] - в точке 1 и тд.

    for(int i=0;i<Bars;i++){
    double zz=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,i);
    if(zz!=0 && zz!=EMPTY_VALUE){
    Zbar[n]=i;
    Zval[n]=zz;
    n++;
    if(n>=4)break;
    }
    }

    В чем моя ошибка, и как получить значение вновь образованного экстремума сразу, а не через 10 часов.
     

    Вложения:

  8. nen

    nen Профи форума

    Все значения экстремумов рассчитываются за одно мгновение.
    Если на нулевом баре сместился экстремум, то это также рассчитывается за одно мгновение.

    Посмотрите, например, ZUP. Все графические построения-перестроения выполняются мгновенно. Все графические построения привязываются к экстремумам.


    Что это за программа такая, которая через 10 часов выдает результат.

    Приведенный кусок кода также мгновенно рассчитывает значение.
    Тут опять какое-то взаимонепонимание. Либо информация неполная, либо объяснения непонятные.

    Приведенный кусок кода запускается на каждом тике. Этот цикл вычисляется за мгновение.
    Значения Zbar[n]=i; и Zval[n]=zz; получаются практически в момент прихода тика.
    НЕ ЧЕРЕЗ 10 ЧАСОВ, А В МОМЕНТ ПОСТУПЛЕНИЯ ТИКА!!!!!!!!!!!!!
     
  9. maverick518

    maverick518 Новичок

    Привожу полный код программы, объясните пожалуйста где же я совершаю ошибку, что получаю ТАКИЕ результаты.
    В секции Init и Deinit пусто.

    int start()
    {
    //----
    Fun_New_Bar(); // Обращение к ф-ии
    if (New_Bar==True) // Если бар не новый..
    {

    int n;
    int Zbar[4]; //номер бара с перегибом
    double Zval[4]; //значение зигзага в точке перегиба Zval[1] - в точке 1 и тд.

    for(int i=0;i<Bars;i++){
    double zz=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,i);
    if(zz!=0 && zz!=EMPTY_VALUE){
    Zbar[n]=i;
    Zval[n]=zz;
    n++;
    if(n>=4)break;
    }
    }
    if ((Zval[1]==z1_old) && (Zval[2]==z2_old) && (z3_old==Zval[3]))
    {
    }
    else
    {
    if (Zval[1]==z2_old && Zval[2]>Zval[1])
    {
    Alert("Zval1 ",Zval[1]); // для проверки
    Alert("Zval2 ",Zval[2]); // для проверки
    close_sell();
    }
    if (Zval[1]==z2_old && Zval[2]<Zval[1])
    {
    Alert("Zval1 ",Zval[1]); // для проверки
    Alert("Zval2 ",Zval[2]); // для проверки
    close_buy();
    }
    }
    z1_old=Zval[1];
    z2_old=Zval[2];
    z3_old=Zval[3];

    if (Zval[1]<Zval[2] && Zval[2]>Zval[3])
    {
    open_buy();
    return;
    }
    if (Zval[1]>Zval[2] && Zval[2]<Zval[3])
    {
    open_sell();
    return;
    }
    //----
    return(0);
    }

    Далее идут процедуры open_sell, open_buy, close_sell,close_buy,Fun_new_bar. Они никак не влияют на значения экстремумов.
    Подскажите пожалуйста, а то я уже мозги сломал.
     
  10. nen

    nen Профи форума

    Нужен текст функции : Fun_New_Bar(); // Обращение к ф-ии
     
  11. maverick518

    maverick518 Новичок

    Вот, пожалуйста

    // --------------- появление новой свечи ---------------------------
    void Fun_New_Bar() // Ф-ия обнаружения ..
    { // .. нового бара
    static datetime New_Time=0; // Время текущего бара
    New_Bar=false; // Нового бара нет
    if(New_Time!=Time[0]) // Сравниваем время
    {
    New_Time=Time[0]; // Теперь время такое
    New_Bar=true; // Поймался новый бар
    }
    }
     
  12. nen

    nen Профи форума

    Вот здесь необходимо логику проверить:
    <div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>if (Zval[1]==z2_old && Zval[2]>Zval[1])
    {
    Alert("Zval1 ",Zval[1]); // для проверки
    Alert("Zval2 ",Zval[2]); // для проверки
    close_sell();
    }
    if (Zval[1]==z2_old && Zval[2]<Zval[1])
    {
    Alert("Zval1 ",Zval[1]); // для проверки
    Alert("Zval2 ",Zval[2]); // для проверки
    close_buy();
    }</div>

    Эти строчки
    <div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>Zval[1]==z2_old

    </div>
    в каких местах срабатывают?
     
  13. maverick518

    maverick518 Новичок

    Самое интересное, что никогда не выполняется, т.к. по непонятной мне причине сначала изменяется значение Zval[1], а только на следующий час(бар) пересчитывается значение z2_old. Хотя по логике(как было задумано), именно сначала надо было менять z2_old.
     
  14. nen

    nen Профи форума

    Вот здесь и ошибка.
     
  15. maverick518

    maverick518 Новичок

    Ошибку исправил, но все равно, равенство возникает на пересчет Т+4 часа, где Т - время экстремума.
     
  16. nen

    nen Профи форума

    Значит, не все исправлено.
    В приведенных строчках необходимо искать логику ошибки.
    В других местах ошибки нет.
     
  17. maverick518

    maverick518 Новичок

    А объясните пожалуйста, оператор return, не продлевает ли на час каждый раз? А потом, пересчет происходит раньше
     
  18. nen

    nen Профи форума

    return - это оператор выхода из подпрограммы. Этот оператор также возвращает из подпрограммы вычисленное значение. Никаких задержек этот оператор не производит. Если возникают вопросы по закрытию открытых позиций, значит необходимо искать ошибку в логике закрытия. В логике условного оператора if (). Может быть стоит на листке бумаги расписать таблицу, в которой отразить значения переменных Zval* и z*_old на каждом баре. Вычисление этих параметров происходит один раз при открытии каждого нового бара.
    И проанализировать значения этих переменных.
     
  19. nen

    nen Профи форума

    Эта ошибка не относится к логике зигзага.
    Зигзаг здесь нипричем.
    Это ошибка логики открытия-закрытия позиции.
     
  20. maverick518

    maverick518 Новичок

    А при чем открытие и закрытие позиции, в этом коде:

    double y0=iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, 0);

    правильное (последнее) значение выдается с открытием следующего бара после наступления события, а в следующем коде:

    int n;
    int Zbar[4]; //номер бара с перегибом
    double Zval[4]; //значение зигзага в точке перегиба Zval[1] - в точке 1 и тд.

    for(int i=0;i<Bars;i++){
    double zz=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,i);
    if(zz!=0 && zz!=EMPTY_VALUE){
    Zbar[n]=i;
    Zval[n]=zz;
    n++;
    if(n>=4)break;
    }
    }
    правильные (последние) значения выдаются при открытии 4 бара после наступления события, как это может быть?
     

Поделиться этой страницей