Не могу запустить ZigZag!... :(

 

Форум работает "хуже не куда"...

Хочу "скормить" ZigZag`у вместо привычных баровых значений, бары Эквити виртуальной корзины ордеров от момента Zero_Point. Каждый бар на любом TF имеет четыре привычных значения ("цены"). Индикаторы (ZigZag не единственный), которые я сделал на эквити корзины, запускаются пользовательскими функциями (впоследствии сделаю библиотеку индюков на эквити корзины). 

 

Вот функция:

int fZZ (int Ext_Depth, int Ext_Deviation, int Ext_Backstep, int Limit_Bars, int cnt_Bars, bool change_Bar, int flag_NewBar,
            double a_High[], double a_Low[], double& Low_buffer[], double& High_buffer[], double& ZZ_buffer[])
{
    int pos, counted_bars = cnt_Bars - Limit_Bars;
    int limit, counterZ, whatlookfor;
    int shift, back, lasthighpos, lastlowpos;
    double val, res;
    double curlow, curhigh, lasthigh, lastlow;
    bool downloadhistory = false;
//----
    if (Limit_Bars == cnt_Bars)
    {
        ArrayResize (Low_buffer, cnt_Bars);
        ArrayResize (High_buffer, cnt_Bars);
        ArrayResize (ZZ_buffer, cnt_Bars);
    }
    //----
    if (counted_bars == 0 && downloadhistory) // history was downloaded
    {
        ArrayInitialize (ZZ_buffer, 0.0);
        ArrayInitialize (High_buffer, 0.0);
        ArrayInitialize (Low_buffer, 0.0);
    }
    if (counted_bars == 0) 
    {
        limit = cnt_Bars - Ext_Depth;
        downloadhistory = true;
    }
    if (counted_bars > 0) 
    {
        while (counterZ < level && pos < 100)
        {
            res = ZZ_buffer[pos];
            if (res != 0)
            {counterZ++;}
            pos++;
        }
        pos--;
        limit = pos;
        if (Low_buffer[pos] != 0) 
        {
            curlow = Low_buffer[pos];
            whatlookfor = 1;
        }
        else
        {
            curhigh = High_buffer[pos];
            whatlookfor = -1;
        }
        for (pos = limit - 1; pos >= 0; pos--)  
        {
            //ZZ_buffer[pos] = 0.0;  
            fCompletionArray (StringConcatenate ("fZZ(", Ext_Depth, ",", Ext_Deviation, ",", Ext_Backstep, ")"), "ZZ_buffer", pos, change_Bar,
            flag_NewBar == 1 && Limit_Bars != cnt_Bars, true, 0.0, ZZ_buffer, cnt_Bars);
            //Low_buffer[pos] = 0.0;
            fCompletionArray (StringConcatenate ("fZZ(", Ext_Depth, ",", Ext_Deviation, ",", Ext_Backstep, ")"), "Low_buffer", pos, change_Bar,
            flag_NewBar == 1 && Limit_Bars != cnt_Bars, true, 0.0, Low_buffer, cnt_Bars);
            //High_buffer[pos] = 0.0;
            fCompletionArray (StringConcatenate ("fZZ(", Ext_Depth, ",", Ext_Deviation, ",", Ext_Backstep, ")"), "High_buffer", pos, change_Bar,
            flag_NewBar == 1 && Limit_Bars != cnt_Bars, true, 0.0, High_buffer, cnt_Bars);
        }
    }
    for (shift = limit; shift >= 0; shift--)
    {
        val = a_Low[fLowest (a_Low, Ext_Depth, shift)];
        if (val == lastlow)
        {val = 0.0;}
        else 
        { 
            lastlow = val; 
            if ((a_Low[shift] - val) > Ext_Deviation)
            {val = 0.0;}
            else
            {
                for (back = 1; back <= Ext_Backstep; back++)
                {
                    res = Low_buffer[shift+back];
                    if ((res != 0) && (res > val))
                    {
                        //Low_buffer[shift+back] = 0.0;
                        fCompletionArray (StringConcatenate ("fZZ(", Ext_Depth, ",", Ext_Deviation, ",", Ext_Backstep, ")"), "Low_buffer", shift+back, change_Bar,
                        flag_NewBar == 1 && Limit_Bars != cnt_Bars, false, 0.0, Low_buffer, cnt_Bars);
                    }
                }
            }
        } 
        fCompletionArray (StringConcatenate ("fZZ(", Ext_Depth, ",", Ext_Deviation, ",", Ext_Backstep, ")"), "Low_buffer", shift, change_Bar,
        flag_NewBar == 1 && Limit_Bars != cnt_Bars, true, IIFd ((a_Low[shift] == val), val, 0.0), Low_buffer, cnt_Bars);
        /*if (a_Low[shift] == val)
        {Low_buffer[shift] = val;}
        else {Low_buffer[shift] = 0.0;}*/
        //--- high
        val = a_High[fHighest (a_High, Ext_Depth, shift)];
        if (val == lasthigh)
        {val = 0.0;}
        else 
        {
            lasthigh = val;
            if ((val - a_High[shift]) > Ext_Deviation)
            {val = 0.0;}
            else
            {
                for (back = 1; back <= Ext_Backstep; back++)
                {
                    res = High_buffer[shift+back];
                    if ((res != 0) && (res < val))
                    {
                        //High_buffer[shift+back] = 0.0;
                        fCompletionArray (StringConcatenate ("fZZ(", Ext_Depth, ",", Ext_Deviation, ",", Ext_Backstep, ")"), "High_buffer", shift+back, change_Bar,
                        flag_NewBar == 1 && Limit_Bars != cnt_Bars, false, 0.0, High_buffer, cnt_Bars);
                    }
                } 
            }
        }
        fCompletionArray (StringConcatenate ("fZZ(", Ext_Depth, ",", Ext_Deviation, ",", Ext_Backstep, ")"), "High_buffer", shift, change_Bar,
        flag_NewBar == 1 && Limit_Bars != cnt_Bars, true, IIFd ((a_High[shift] == val), val, 0.0), High_buffer, cnt_Bars);
        /*if (a_High[shift] == val)
        {High_buffer[shift] = val;}
        else {High_buffer[shift] = 0.0;}*/
            if (Limit_Bars != cnt_Bars && PrintCom)
            {Print ("fZZ(): Low_buffer[", shift, "] = ", Low_buffer[shift], "; High_buffer[", shift, "] = ", High_buffer[shift]);}
    }
    //---- final cutting 
    if (whatlookfor == 0)
    {
        lastlow = 0;
        lasthigh = 0;  
    }
    else
    {
        lastlow = curlow;
        lasthigh = curhigh;
    }
    for (shift = limit; shift >= 0; shift--)
    {
        res = 0.0;
        switch (whatlookfor)
        {
            case 0: // look for peak or lawn 
                if (lastlow == 0 && lasthigh == 0)
                {
                    if (High_buffer[shift] != 0)
                    {
                        lasthigh = a_High[shift];
                        lasthighpos = shift;
                        whatlookfor = -1;
                        //ZZ_buffer[shift] = lasthigh;
                        res = 1;
                    }
                    if (Low_buffer[shift] != 0)
                    {
                        lastlow = a_Low[shift];
                        lastlowpos = shift;
                        whatlookfor = 1;
                        //ZZ_buffer[shift] = lastlow;
                        res = 1;
                    }
                    fCompletionArray (StringConcatenate ("fZZ(", Ext_Depth, ",", Ext_Deviation, ",", Ext_Backstep, ")"),
                    "ZZ_buffer", shift, change_Bar, flag_NewBar == 1 && Limit_Bars != cnt_Bars, true,
                    IIFd ((High_buffer[shift] != 0), lasthigh, IIFd ((Low_buffer[shift] != 0), lastlow, 0.0)), ZZ_buffer, cnt_Bars);
                }
                break;  
            case 1: // look for peak
                if (Low_buffer[shift] != 0.0 && Low_buffer[shift] < lastlow && High_buffer[shift] == 0.0)
                {
                    ZZ_buffer[lastlowpos] = 0.0;
                    lastlowpos = shift;
                    lastlow = Low_buffer[shift];
                    //ZZ_buffer[shift] = lastlow;
                    fCompletionArray (StringConcatenate ("fZZ(", Ext_Depth, ",", Ext_Deviation, ",", Ext_Backstep, ")"), "ZZ_buffer", shift, change_Bar,
                    flag_NewBar == 1 && Limit_Bars != cnt_Bars, true, lastlow, ZZ_buffer, cnt_Bars);
                    res = 1;
                }
                if (High_buffer[shift] != 0.0 && Low_buffer[shift] == 0.0)
                {
                    lasthigh = High_buffer[shift];
                    lasthighpos = shift;
                    //ZZ_buffer[shift] = lasthigh;
                    fCompletionArray (StringConcatenate ("fZZ(", Ext_Depth, ",", Ext_Deviation, ",", Ext_Backstep, ")"), "ZZ_buffer", shift, change_Bar,
                    flag_NewBar == 1 && Limit_Bars != cnt_Bars, true, lasthigh, ZZ_buffer, cnt_Bars);
                    whatlookfor = -1;
                    res = 1;
                }   
                break;               
            case -1: // look for lawn
                if (High_buffer[shift]!= 0.0 && High_buffer[shift] > lasthigh && Low_buffer[shift] == 0.0)
                {
                    ZZ_buffer[lasthighpos] = 0.0;
                    lasthighpos = shift;
                    lasthigh = High_buffer[shift];
                    //ZZ_buffer[shift] = lasthigh;
                    fCompletionArray (StringConcatenate ("fZZ(", Ext_Depth, ",", Ext_Deviation, ",", Ext_Backstep, ")"), "ZZ_buffer", shift, change_Bar,
                    flag_NewBar == 1 && Limit_Bars != cnt_Bars, true, lasthigh, ZZ_buffer, cnt_Bars);
                }
                if (Low_buffer[shift] != 0.0 && High_buffer[shift] == 0.0)
                {
                    lastlow = Low_buffer[shift];
                    lastlowpos = shift;
                    //ZZ_buffer[shift] = lastlow;
                    fCompletionArray (StringConcatenate ("fZZ(", Ext_Depth, ",", Ext_Deviation, ",", Ext_Backstep, ")"), "ZZ_buffer", shift, change_Bar,
                    flag_NewBar == 1 && Limit_Bars != cnt_Bars, true, lastlow, ZZ_buffer, cnt_Bars);
                    whatlookfor = 1;
                }   
                break;               
            default: return; 
        }
            if (Limit_Bars != cnt_Bars && PrintCom)
            {Print ("fZZ(): ZZ_buffer[", shift, "] = ", ZZ_buffer[shift]);}
    }
//----
    return (Limit_Bars);
}
Кто-нибудь сможет дать дельный совет? Я джаже не знаю что запустить на проверку (Принтовать), чтобы попытаться отыскать ошибку???
 

Функция:

 

int fCompletionArray (string txt,          // Отличительный текст
                      string Name,         // Имя обрабатываемого массива
                      int shift,           // Номер обрабатываемого бара
                      bool Cond1,          // Условие изменяемости массива
                      bool Cond2,          // Флаг прихода нового бара
                      bool Cond3,          // Флаг обратного счёта баров
                      double Value,        // Вносимое значение в обрабатываемый бар
                      double& Out_Array[], // Обрабатываемый массив
                      int cntBar)          // Количество всех обработанных баров
- это замена буферного индикатора на динамический массив.
 
Спасибо (за сочувствие), но если чуть-чуть посмотреть вперёд, если я упоминал про Эквити корзины - то мне всё это нужно для МУЛЬТИВАЛЮТНИКА, который в тестере МТ4 не тестируется... :)
 

Например, когда я брал зигзаг от уважаемого нена (nen),
то оказалось, что он работает на положительных данных,
а между сериями high и low должна быть дельта хотя бы 0,0001.
... иначе оно виснет.
В итоге перед зигзагом прибавлял константу, а после- вычитал.
Может поможет.

 
У меня "родной код" ZigZag`a и ничего не виснет, просто буфера пустые и картинки нет... :(
 
ДА!... Как перезагрузить терминал - народ отзывчив - "Всегда пожалуйста!" Посочувствовать - тоже не проблема!.. Послать в другом направлении - "Не той дорогой идёте, Товарищ!" - "на Ура!" А вот с кумеканием?! как повезёт... :(
 
TarasBY:
ДА!... Как перезагрузить терминал - народ отзывчив - "Всегда пожалуйста!"

"Вот функция", вырезанная х.з. откуда и зачем- никому не интересно в ней копаться.
Тем более, что если кажется, что там работы на 15 минут- то реально часа 2-3.
Работа тупая- делал, знаю. Ловит на невнимательности.
Зачем возмущаться? пообещайте, наконец, денег.
.
P.S.: не возьмусь. Может кто-то.
.
P.S.2: все просто. все буфера которые есть в функции -
должны стать буферами индикатора.
Т.е. написать ZigZag2, который обязан показать LowBuffer / HighBuffer, а потом ZZBuffer.
Ессно, все должно совпасть с ZigZag индикатором.
.
А там смотреть. Если пусто- разбираться.
.
Смешной вопрос.
"У меня в HighBuffer пусто". Поздравляю. 
Нанимайте учителя разбираться. К кому претензия-то?

 

Уважаемый! Х.З. откуда - это моего мозга работа! 
Этот мозг, как часть моего организма лишён иллюзий, что мимо пробегающий кодер будет в этом моём коде разбираться, но не предоставив код, этот самый первый пробегающий мимо кодер бросит: "А где код?" И чтобы упредить "следующий акт" - "Код в студию!"...
А вот надежду, что у кого-то, заглянувшего на эту страничку и прочитавшего первый пост родится просто мысль в каком направлении мне копать - НА ЭТО НАДЕЖДА ВСЕГДА ЕСТЬ!!! НАДЕЖДА на некий "мозговой штурм"... Любой процесс требует стимуляции  - кумекание не исключение!... Кстати, стимуляция деньгами далеко не всегда "лучший и надёжный способ"! И при том, не нужно забывать, что перед "Б" ВСЕГДА сдедует "А", и пишущий сначала ждёт от читающего "ПОНИМАНИЯ" (о содержании своего вопроса)! А этот процесс никакими деньгами не стимулируешь!... :)))
И при чём здесь разговор о каких-то претензиях - это просто жизненный опыт (взляд на жизнь) того же мозга... :)

P.S. Про "пообещайте денег"... Мне проще сделать самому, чем выслушивать многозначительный трёп, что "так как я хочу у меня не получится"! Умение "ГОВОРИТЬ" не должно отставать от умения "СЛЫШАТЬ"!

 

TarasBY:

Умение "ГОВОРИТЬ" не должно отставать от умения "СЛЫШАТЬ"!

По моему Вы слишком агрессивны во всех постах данной ветке...
 
Просто не люблю МНОГОЗНАЧИТЕЛЬНЫЙ пустотрёп!!! :)
Причина обращения: