iCustom возвращает Empty_val
Results 1 to 8 of 8

Thread: iCustom возвращает Empty_val

  1. #1
    Привет

    Я использую следующий интерьер, который хорошо работает сам по себе, печатая стрелки и т. Д. Пример кода ниже.

    #свойство indior_chart_window
    #свойство indior_buffers 2
    #property indior_color1 Лайм
    #свойство indior_width1 1
    #property indior_color2 Желтый
    #свойство indior_width2 1
    extern bool UseAlert = true;
    внешний интервал BarsToCount = 1000;

    двойной SarUpSig[];
    двойной SarDownSig[];

    дата и время ТТ;
    int инициализация ()
    {
    //---- в помещении
    SetIndexStyle(0,DRAW_ARROW);
    SetIndexArrow (0,233);
    SetIndexBuffer(0,SarUpSig);

    SetIndexStyle(1,DRAW_ARROW);
    SetIndexArrow (1234);
    SetIndexBuffer(1,SarDownSig);

    TT=iTime(Символ(),0,0);
    //----
    возврат (0);
    }

    начало ()
    {

    внутренний предел;
    int counted_bars = IndiorCounted();
    //---- будет пересчитан последний посчитанный бар
    if(counted_barsgt;0) counted_bars--;
    limit=бары-counted_bars;
    //---- macd посчитал в 1-м буфере
    если(Период()!=ПЕРИОД_H1)
    {
    возврат (0);
    }

    если (BarsToCount lt; лимит)
    лимит = BarsToCount;


    for(int i=limit; igt;=0; i--)
    {
    дата и время = iTime (символ (), 0, я);
    int shiftD1 = iBarShift(Symbol(), PERIOD_D1, время, ложь);
    int shiftH4 = iBarShift(Symbol(), PERIOD_H4, время, ложь);
    int shiftH1 = iBarShift(Symbol(),PERIOD_H1,время,ложь);

    двойной OsMa1 = iCustom(Symbol(),PERIOD_H1,OsMA,30,200,5,0,shiftH1 );
    двойной OsMa2 = iCustom(Symbol(),PERIOD_H1,OsMA,5,35,35,0,shiftH1) ;

    двойной POsMa1 = iCustom(Symbol(),PERIOD_H1,OsMA,30,200,5,0,shiftH1 1);
    двойной POsMa2 = iCustom(Symbol(),PERIOD_H1,OsMA,5,35,35,0,shiftH1 1);

    //double Up_ST = iCustom(Symbol(),0,4xRider STRONG-TREND Signal v2,14,2,i);
    //double Dn_ST = iCustom(Symbol(),0,4xRider STRONG-TREND Signal v2,14,1,i);

    двойной SARD1 = iSAR(Symbol(),PERIOD_D1,0.22,0.2,shiftD1);
    двойной SARH4 = iSAR(Symbol(),PERIOD_H4,0.05,0.2,shiftH4);
    двойной SARH1 = iSAR(Symbol(),PERIOD_H1,0.01,0.2,shiftH1);
    //двойной SARпоследний = iSAR(Symbol(),0,0.02,0.2,i 1);
    двойной ЗАКРЫТ1 = iClose(Symbol(),PERIOD_D1,shiftD1);
    двойной CLOSEH4 = iClose(Symbol(),PERIOD_H4,shiftH4);
    двойной CLOSEH1 = iClose(Symbol(),PERIOD_H1,shiftH1);

    двойной PSARD1 = iSAR(Symbol(),PERIOD_D1,0.22,0.2,shiftD1 1);
    двойной PSARH4 = iSAR(Symbol(),PERIOD_H4,0.05,0.2,shiftH4 1);
    двойной PSARH1 = iSAR(Symbol(),PERIOD_H1,0.01,0.2,shiftH1 1);
    //двойной SARпоследний = iSAR(Symbol(),0,0.02,0.2,i 1);
    двойной PCLOSED1 = iClose(Symbol(),PERIOD_D1,shiftD1 1);
    двойной PCLOSEH4 = iClose(Symbol(),PERIOD_H4,shiftH4 1);
    двойной PCLOSEH1 = iClose(Symbol(),PERIOD_H1,shiftH1 1);

    SarUpSig[i]=EMPTY_VALUE;
    SarDownSig[i]=EMPTY_VALUE;

    струнная покупка;
    //КУПИТЬ

    //если(Up_ST!=EMPTY_VALUE)
    //{
    //SarUpSig[1] = 1,6094;
    if(SarUpSig[i 1] != EMPTY_VALUE SARH1lt;CLOSEH1 OsMa2gt;0 SARH4lt;CLOSEH4)
    {
    SarUpSig[i] = SARH1;
    если(TT!=iTime(Symbol(),0,0)UseAlert)
    {
    //строка time = TimeToStr(TimeCurrent());
    Предупреждение (4xRider (КУПИТЬ) Символ ());
    Воспроизведение звука (предупреждение.wav);
    TT=iTime(Символ(),0,0);
    }
    }
    если((PSARH4gt;PCLOSEH4POsMa1lt;0PSARH1gt;PCLO SEH1)
    (SARH4lt;CLOSEH4OsMa1gt;0SARH1lt;CLOSEH1SARD1lt;З АКРЫТ1) OsMa2gt;0)
    {
    SarUpSig[i] = SARH1;
    покупка = торговля;
    если(TT!=iTime(Symbol(),0,0)UseAlert)
    {
    //строка time = TimeToStr(TimeCurrent());
    Предупреждение (4xRider (КУПИТЬ) Символ ());
    Воспроизведение звука (предупреждение.wav);
    TT=iTime(Символ(),0,0);
    }
    }

    //}
    продажа строки;
    //ПРОДАВАТЬ

    //если(Dn_ST!=EMPTY_VALUE)
    //{
    if(SarDownSig[i 1] != EMPTY_VALUE SARH1gt;CLOSEH1 OsMa2lt;0 SARH4gt;CLOSEH4)
    {
    SarDownSig[i] = SARH1;
    если(TT!=iTime(Symbol(),0,0)UseAlert)
    {
    //строка time = TimeToStr(TimeCurrent());
    Предупреждение (4xRider (ПРОДАТЬ) Символ());
    Воспроизведение звука (предупреждение.wav);
    TT=iTime(Символ(),0,0);
    }
    }
    если((PSARH4lt;PCLOSEH4POsMa1gt;0PSARH1lt;PCLO SEH1)
    (SARH4gt;ЗАКРЫТЬH4OsMa1lt;0SARH1gt;ЗАКР ЫТЬH1SARD1gt;ЗАКРЫТО1) OsMa2lt;0)
    {
    SarDownSig[i] = SARH1;
    если(TT!=iTime(Symbol(),0,0)UseAlert)
    {
    //строка time = TimeToStr(TimeCurrent());
    Предупреждение (4xRider (ПРОДАТЬ) Символ());
    Воспроизведение звука (предупреждение.wav);
    TT=iTime(Символ(),0,0);
    }
    }

    //}

    //ПРОДАВАТЬ

    }
    //----
    //Комментарий(От indior: , DoubleToStr(SarUpSig[1], Digits));
    возврат (0);
    }


    Я использую советник для чтения значений следующим образом.

    #define ИНДИ MyIndior

    двойной IndiUpVal = iCustom (NULL, 0, INDI, ложь, 5, 0, 1);
    двойной IndiDownVal = iCustom (NULL, 0, INDI, ложь, 5, 1, 1);

    Комментарий(IndiUpVal: D2S(IndiUpVal) . IndiUpVal: D2S(IndiDownVal));

    D2S = DoubleToString с цифрой

    Что бы я ни делал, iCustom возвращает EMPTY_VAL.

    Если я распечатаю значение изнутри в нужное время SarUpSig[1]
    вернет правильные значения. Но iCustom всегда дает EMPTY_VAL.

    Почему?

    Любая помощь приветствуется.

  2. #2
    кодестер, ты меня понял. мой ответ был неправильным. у меня был массовый пердеж мозга. ОП: если вы сделаете 2 вещи, это поможет вам разобраться. 1. скопируйте и вставьте код внутри тегов CODE, чтобы мы могли точно скопировать код. вы можете этого не осознавать, но то, как вы только что вставили скрипт, вызывает МНОЖЕСТВО проблем при попытке скопировать его в метаредактор и скомпилировать. если вы хотите, чтобы мы скомпилировали код и искали вас, то вы просто ДОЛЖНЫ сделать это ДЛЯ НАС. 2. Кратко объясните, для чего предназначена инди и ожидаемый результат. редактировать: неважно. похоже, что iwjw на высоте для вас.

  3. #3
    2 вложения iCustom вызов инди получает те же значения, что и сам indi Я скопировал ваш код в .mq4 и назвал инди 4xRider Второй инди (4xRider_call) использует iCustom для получения значений 4xRider. Тот же вывод на графике (только 3 области, где появляются сигналы в течение последних 1000 баров H1)
    https://www.forex-russian.com/attach...5463976314.mq4
    https://www.forex-russian.com/attach...1176270264.mq4

  4. #4
    Опять же, я не пытался просмотреть код, поэтому я основываю свой ответ на ваших наблюдениях, а не на том, что может происходить. Самый простой способ проверить правильность вашего вызова iCustom — установить индекс для бара, который закрылся, скажем, для 10-го бара (если он имеет значение). Не рекомендуется пытаться найти значение для бара, который пересчитывается (перерисовывается), если вы не понимаете, как с этим обращаться. Я тоже использовал iCustom много раз без проблем, но я полагаю, что может быть ситуация, когда indior делает что-то, с чем iCustom не может справиться.

  5. #5

    Quote Originally Posted by ;
    Возвращаемое значение из indior не имеет ничего общего с iCustom. iCustom считывает значения из внутренних буферов, а не возвращаемое значение. Первое, что нужно сделать, это проверить в окне данных, что индикатор выдает ожидаемые значения. Затем убедитесь, что количество параметров и типы значений верны для вызова iCustom. Это можно сделать, изучив все внешние переменные и сравнив их с назначенными им значениями iCustom. Код беспорядок, и я не буду пытаться сделать это для вас.
    Ага. Я уже проверил, что окна данных отображают значения правильно. Я также могу подтвердить, что все значения, переданные в вызов iCustom, имеют правильный тип. Согласитесь, что код indior - это бардак (не мой). Я думаю, может быть, эта проблема возникает из-за того, что индикатор переходит от предела к 0 (i--), т.е. в обратном направлении. Так может ли быть, что iCustom возвращается ДО того, как indior успеет заполнить весь массив? Не уверен, что возврат из iCustom имеет тайм-аут. Кто-нибудь знает это? Или вызов БЛОКИРУЕТСЯ до тех пор, пока не запустится и не завершится внутренний вызов. Чтобы исключить это, я отправил только 5 в качестве параметра Barcount, чтобы indior зациклил только последние 5 тактов. Я подтвердил, что это происходит, вставив Print(i) в внутренний цикл. Но возвращаемое значение по-прежнему EMPTY_VALUE. Я просто не могу понять, почему. Особенно потому, что данные печатаются в окне данных, а мой оператор Print изнутри также печатает правильные значения в буфере. Я использовал iCustom так много раз, что впервые вижу что-то странное.

  6. #6
    во-первых, вам нужно использовать теги [code]: S, во-вторых, при кратком просмотре вы не возвращаете никакого значения, кроме нуля. измените значение, возвращаемое функциями запуска, на то, которое вы хотите прочитать с помощью icustom, и посмотрите, как вы пойдете оттуда.

  7. #7
    Возвращаемое значение из indior не имеет ничего общего с iCustom. iCustom считывает значения из внутренних буферов, а не возвращаемое значение. Первое, что нужно сделать, это проверить в окне данных, что индикатор выдает ожидаемые значения. Затем убедитесь, что количество параметров и типы значений верны для вызова iCustom. Это можно сделать, изучив все внешние переменные и сравнив их с назначенными им значениями iCustom. Код беспорядок, и я не буду пытаться сделать это для вас.

  8. #8

    Quote Originally Posted by ;
    iCustom вызов indi получает те же значения, что и сам indi. Я скопировал ваш код в .mq4 и назвал indi 4xRider. Второй indi (4xRider_call) использует iCustom для получения значений 4xRider. Тот же вывод на графике (только 3 области, где появляются сигналы в течение последних 1000 баров H1)
    Да, от инди к инди проблем нет. Вырежьте ту же часть и поместите ее в советник, и мы вернемся к EMPTY_VAL. Однако это не всегда. Я нахожу эту проблему много GBPUSD. На EURUSD это работает, но есть случаи, когда он возвращает EMPTY_VAL. Отсюда мое первоначальное предположение, что это как-то связано с возвратом. Ну что ж. Я буду пытаться.

Действующие разрешения

  • Вы не можете создавать новые темы
  • Вы не можете размещать ответы
  • Вы не можете использовать вложения
  • Вы не можете редактировать ваши записи
  •  
  • BB-код - Вкл.
  • Смайлики - Вкл.
  • Код [IMG] - Вкл.
  • Код [VIDEO] - Вкл.
  • HTML-код - Выкл.
Веб-сайт использует cookies
Веб-сайт использует cookies, в настоящее время некоторые из них уже установлены. Вы можете ознакомиться с более подробной информацией об использовании нами cookies здесь. Чтобы принять условия использования cookies, пожалуйста, нажмите на кнопку справа. Если вы продолжаете пользоваться веб-сайтом, вы по умолчанию принимаете условия использования cookies.