Та самая 4806 ошибка

 

Доброго времени, коллеги!

Прошу помочь разобраться.

Пишу я некий индикатор, который перебирает свои параметры и записывает мне в файл нужные мне результаты. Некий встроенный оптимизатор.

Ниже будут ключевые к вопросу части кода.

Ловлю 4806 даже на текущем ТФ на самой первой итерации.

#property indicator_chart_window
#property indicator_buffers 9   // Увеличим количество буферов
#property indicator_plots 9     // Добавим второй график
#property strict

ENUM_TIMEFRAMES TFs[] = {PERIOD_M1, PERIOD_M2, PERIOD_M3, PERIOD_M5};

double bufferMain[];
double bufferMainColor[];
double bufferPreBuy[];
double bufferPreSell[];
double bufferBuy[];
double bufferSell[];
double arrayADX[];
double arrayATR[];
double arrayRSI[];

int OnInit() {
    //--- indicator buffers mapping

    SetIndexBuffer(0, bufferMain, INDICATOR_CALCULATIONS);
    SetIndexBuffer(1, bufferMainC, INDICATOR_CALCULATIONS);
    SetIndexBuffer(2, bufferPreBuy, INDICATOR_CALCULATIONS);
    SetIndexBuffer(3, bufferPreSell, INDICATOR_CALCULATIONS);
    SetIndexBuffer(4, bufferBuy, INDICATOR_CALCULATIONS);
    SetIndexBuffer(5, bufferSell, INDICATOR_CALCULATIONS);
    SetIndexBuffer(6, arrayATR, INDICATOR_CALCULATIONS);
    SetIndexBuffer(7, arrayATR, INDICATOR_CALCULATIONS);
    SetIndexBuffer(8, arrayRSI, INDICATOR_CALCULATIONS);

    ArraySetAsSeries(bufferMain, true);
    ArraySetAsSeries(bufferMainC, true);
    ArraySetAsSeries(bufferPreBuy, true);
    ArraySetAsSeries(bufferPreSell, true);
    ArraySetAsSeries(bufferBuy, true);
    ArraySetAsSeries(bufferSell, true);
    ArraySetAsSeries(bufferBuy, true);
    ArraySetAsSeries(arrayADX, true);
    ArraySetAsSeries(arrayATR, true);
    ArraySetAsSeries(arrayRSI, true);

    //---
    return (INIT_SUCCEEDED);
}


int OnCalculate(const int       rates_total,
                const int       prev_calculated,
                const datetime &time[],
                const double   &open[],
                const double   &high[],
                const double   &low[],
                const double   &close[],
                const long     &tick_volume[],
                const long     &volume[],
                const int      &spread[]) {
    //---
        for(int tf = 0; tf < ArraySize(TFs) && !IsStopped(); tf++) {
            int needCalcBars = ((i_days_calc * 1440) * 60) / PeriodSeconds(TFs[tf]); //Узнаю сколько баров мне надо рассчитать для выбранного ТФ с учетом кол-ва дней из инпутов
            needCalcBars     = MathMin(needCalcBars, BARS(_Symbol, TFs[tf]));//Проверяю хватает ли баров на выбранном ТФ и назначаю то значение где меньше.

            for(int adx = i_ADX_period_start; adx <= i_ADX_period_end && !IsStopped(); adx++) {
                for(int atr = i_atr_period_start; atr <= i_atr_period_end && !IsStopped(); atr++) {
                    for(int dogon = i_max_dogon_start; dogon <= i_max_dogon_end && !IsStopped(); dogon++) {
                        for(int exp = i_exp_start; exp <= i_exp_end && !IsStopped(); exp++) {
                            for(int shift = i_enter_shift_start; shift <= i_enter_shift_end && !IsStopped(); shift++) {
                                for(int level = i_line_percent_start; level <= i_line_percent_end; level++) {

                                        //Далее согласно перебору параметров создаю хендлы с этими параметрами. Ошибок создания хэндла нет, проверял.
                                    int handleADX = iADX(_Symbol, TFs[tf], adx);
                                    int handleATR = iATR(_Symbol, TFs[tf], atr);
                                    int handleRSI = iRSI(_Symbol, TFs[tf], i_rsi_period, PRICE_CLOSE);
                                    
                                                
                                    ArrayInitialize(arrayADX, 0.0); //Аннулирую данные в массивах
                                    ArrayInitialize(arrayATR, 0.0);
                                    ArrayInitialize(arrayRSI, 0.0);

                                    int copiedADX = CopyBuffer(handleADX, 0, 0, needCalcBars, arrayADX);
                                    int copiedATR = CopyBuffer(handleATR, 0, 0, needCalcBars, arrayATR);
                                    int copiedRSI = CopyBuffer(handleRSI, 0, 0, needCalcBars, arrayRSI);

                                        //Собственно CopyBuffer мне выдает 4806, каждая. Ретёрнит мне -1. Пробовал делать цикл ожидания и повторного копирования. Пробовал уменьшать кол-во баров копирования и начальный копируемый бар. Ошибка не уходит.

                                    IndicatorRelease(handleADX);
                                    IndicatorRelease(handleATR);
                                    IndicatorRelease(handleRSI);
                                        

                                        //Далее расчетный код который не выполняется из за -1 копирования буферов.
                                    
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        FileClose(fileHandle);
    return (rates_total);
}

 
Petr Zharuk:

Доброго времени, коллеги!

Прошу помочь разобраться.

Пишу я некий индикатор, который перебирает свои параметры и записывает мне в файл нужные мне результаты. Некий встроенный оптимизатор.

Ниже будут ключевые к вопросу части кода.

Ловлю 4806 даже на текущем ТФ на самой первой итерации.

Это не будет работать на первой итерации

Хендлы нужно создавать в OnInit, таймфреймы хендлов записывайте в массив и их подставляйте в CopyBuffer

Покажу на примере символов, но вам нужны таймфреймы

  for(int i=0; i<Sym_count; i++) {
    hRSI[i]=iRSI(Sym_arr[i],Period(),rsi_period,rsi_price);
    if(hRSI[i]==INVALID_HANDLE) {
      Print("Failed to create handle RSI: Symbol = ",Sym_arr[i]," : ",GetLastError());
      return(INIT_FAILED);
    }

 
Vitaly Muzichenko #:

Это не будет работать на первой итерации

Хендлы нужно создавать в OnInit, таймфреймы хендлов записывайте в массив и их подставляйте в CopyBuffer

Покажу на примере символов, но вам нужны таймфреймы

Вы мне предлагаете создать 2 миллиона хэндлов в OnInit?)


Хорошо. Я сейчас предварительно объявил хэндлы в OnInit. 
А в OnCalculate их переназначаю под нужные параметры. В целом все идет ок, но на 2512 итерации выдает ошибку 4806 на текущем ТФ.

 
Petr Zharuk #:
Вы мне предлагаете создать 2 миллиона хэндлов в OnInit?)
Это с чего такое число?
 
Petr Zharuk:

Доброго времени, коллеги!

Прошу помочь разобраться.

Пишу я некий индикатор, который перебирает свои параметры и записывает мне в файл нужные мне результаты. Некий встроенный оптимизатор.

Ниже будут ключевые к вопросу части кода.

Ловлю 4806 даже на текущем ТФ на самой первой итерации.

у вас в циклах излишние инициализации [ iATR -- IndicatorRelease ].. так-же и про RSI, ADX

на каждом баре нужно "всего" ~50 ATR (число таймфреймов * число_периодов_atr) ... а вы делаете 100500 раз

так-же и со всеми.

---

в вашем случае эффективнее самому написать функции рассчёта MassATR(..) - для рассчёта подряд 30-ти разнопериодных atr...там во всех индикаторах усреднения, поэтому подобный массовый рассчёт быстрый

 
Sergey Gridnev #:
Это с чего такое число?

С того что кол-во переборов данных большое. И для каждого значения свой хэндл нужен. 
Вы видите кол-во циклов?

В каждом из них примерно значение от 3 до 15. 

 
Maxim Kuznetsov #:

у вас в циклах излишние инициализации [ iATR -- IndicatorRelease ].. так-же и про RSI, ADX

на каждом баре нужно "всего" ~50 ATR (число таймфреймов * число_периодов_atr) ... а вы делаете 100500 раз

так-же и со всеми.

---

в вашем случае эффективнее самому написать функции рассчёта MassATR(..) - для рассчёта подряд 30-ти разнопериодных atr...там во всех индикаторах усреднения, поэтому подобный массовый рассчёт быстрый

Я убирал IndicatorRelease и за пределы циклов, просто переопределяя хендлы. И делал их меньше в кол-ве, чтобы исключить проблему кол-ва. 
Я все равно получаю ошибку 4806.

в вашем случае эффективнее самому написать функции рассчёта MassATR(..) - для рассчёта подряд 30-ти разнопериодных atr...там во всех индикаторах усреднения, поэтому подобный массовый рассчёт быстрый

Интересно. Но ничего не понятно.

 

В МТ4 это без проблем работает в связи с особенностями опроса индикаторов. 

С CopyBuffer борода какая то. 

 
Petr Zharuk #:
И для каждого значения свой хэндл нужен
В том-то и дело, что нет.
 
Sergey Gridnev #:
В том-то и дело, что нет.

Аргументируете? 

Мне надо перебрать например АДХ от 3 до 15 периода с АТР от 3 до 15 периода. 
Как я получу значения индикатора с этими периодами не меняя хэндл?

 
Petr Zharuk #:

Аргументируете? 

Мне надо перебрать например АДХ от 3 до 15 периода с АТР от 3 до 15 периода. 
Как я получу значения индикатора с этими периодами не меняя хэндл?

Ну получается  АДХ 12 плюс  АТР 12 итого 24. А откуда вы набираете

Petr Zharuk #:

Вы мне предлагаете создать 2 миллиона хэндлов в OnInit?)

Плюс ко всему вы можете создать массив  АДХ[] и массив АТР[] отдельно…

Да и зачем цикл в цикле? Я может и совсем слепой, но я не вижу чтобы в цикле применялись значения вложенного цикла. Или наоборот…