Исправление ошибки массива вне диапазона в MT4 EA
Страница 1 из 812 12 ПоследняяПоследняя
Results 1 to 10 of 13

Thread: Исправление ошибки массива вне диапазона в MT4 EA

  1. #1
    Я сделал советник со следующим...

    внешний интервал IntIndTF1 = 4;
    внешний интервал IntInd1S1 = 2;
    внешний интервал IntInd1S2 = 14;

    внешний интервал IntIndTF2 = 1;
    внешний интервал IntInd2S1 = 3;
    внешний интервал IntInd2S2 = 9;
    Вставленный код PerH1 = High#91;iHighest(SymbolToManage,IntIndTF1,MODE_HIG H,IntInd1S2,IntInd1S1)#93;; PerL1 = Low#91;iLowest(SymbolToManage,IntIndTF1,MODE_LOW,I ntInd1S2,IntInd1S1)#93;; PerM1 = NormalizeDouble((PerH1 PerL1)/2,Digits); PerH2 = High#91;iHighest(SymbolToManage,IntIndTF2,MODE_HIG H,IntInd2S2,IntInd2S1)#93;; PerL2 = Low#91;iLowest(SymbolToManage,IntIndTF2,MODE_LOW,I ntInd2S2,IntInd2S1)#93;; PerM2 = NormalizeDouble((PerH2 PerL2)/2,Digits);
    Он отлично работал, пока я не начал тестировать с ним другие символы, а затем появилась ужасная ошибка «Массив вне диапазона», поэтому я изменил его на это...
    Вставленный код int BarCount = Bars; если (BarCount lt; 1) BarCount = 1; for (int i=0; igt;Bars; i--) { PerH1 = High#91;iHighest(SymbolToManage,IntIndTF1,MODE_HIG H,IntInd1S2,i IntInd1S1)#93;; PerL1 = Low#91;iLowest(SymbolToManage,IntIndTF1,MODE_LOW,I ntInd1S2,i IntInd1S1)#93;; PerM1 = NormalizeDouble((PerH1 PerL1)/2,Digits); PerH2 = High#91;iHighest(SymbolToManage,IntIndTF2,MODE_HIG H,IntInd2S2,i IntInd2S1)#93;; PerL2 = Low#91;iLowest(SymbolToManage,IntIndTF2,MODE_LOW,I ntInd2S2,i IntInd2S1)#93;; PerM2 = NormalizeDouble((PerH2 PerL2)/2,Digits); } Ошибок массива вне диапазона стало меньше. ОДНАКО, теперь я не могу заставить его имитировать предыдущие настройки, которые работали хорошо...

    внешний интервал IntIndTF1 = 4;
    внешний интервал IntInd1S1 = 2;
    внешний интервал IntInd1S2 = 14;

    внешний интервал IntIndTF2 = 1;
    внешний интервал IntInd2S1 = 3;
    внешний интервал IntInd2S2 = 9;

    Я тестировал диапазоны 1 и -1, но теперь советник не возвращается к одним и тем же расчетным значениям для одних и тех же баров. Как я могу изменить код, чтобы устранить ошибки, но сохранить ранее проверенные значения и результаты.

    Это в советнике без индикатора. Значения для HHLL находятся в самом советнике. Я хочу, чтобы он мог читать и получать те же результаты для переменной extern на панели, которая запускает сигнал.

  2. #2
    Я добавил -1 к лимиту количества баров, и, похоже, он работает, не влияя на какие-либо изменения результатов, так что все в порядке. Чтобы убедиться, что iLowest/iHigheset не возвращает -1, я сделал это, уверен, что это неправильный способ, потому что результаты ужасны... Вставленный код int BarsCounted1 = TFBars1-MathMax(IntInd1S2,IntInd1S1 1); if (BarsCounted1 lt; 0) {return;} int LimitBars1 = TFBars1-BarsCounted1; for (BarCount1 = LimitBars1-1; BarCount1 gt;= 0; BarCount1--) { if ((iHighest(SymbolToManage,IntIndTF1,MODE_HIGH,IntI nd1S2,BarCount1 IntInd1S1) lt; 0) || (iLowest(SymbolToManage,IntIndTF1,MODE_LOW ,IntInd1S2,BarCount1 IntInd1S1) lt;0)) return; если ((iHighest(SymbolToManage,IntIndTF1,MODE_HIGH,IntI nd1S2,BarCount1 IntInd1S1) gt; -1) (iLowest(SymbolToManage,IntIndTF1,MODE_LOW,IntInd1 S2,BarCount1 IntInd1S1) gt;-1)) продолжить; PerH1 = High#91;iHighest(SymbolToManage,IntIndTF1,MODE_HIG H,IntInd1S2,BarCount1 IntInd1S1)#93;; PerL1 = Low#91;iLowest(SymbolToManage,IntIndTF1,MODE_LOW,I ntInd1S2,BarCount1 IntInd1S1)#93;;/PerM1 = NormalizeDouble((PerH1 PerL1)/2,Digits); }

  3. #3

    Quote Originally Posted by ;
    Да, это была ошибка копирования и вставки выше. Не уверен, что понимаю концепцию пробега после 17-го такта и как это реализовать или почему это работает. А пока я остановился на этом... повторил второй раз со вторым набором переменных для второго индикатора в советнике. Бары со сдвигом во времени, упомянутые в разделе, сделали тестирование более контролируемым и менее зависимым от прихоти компилятора MT4, поскольку он тестирует любой ТФ, но помещается на 4-часовой график. В конце концов, я хочу, чтобы советник работал одинаково с одинаковыми результатами, независимо от графика TF, который он...
    Don#8217;не забывайте (-1) для преобразования размера в позицию BarCount1=LimitBars1-1 и убедитесь, что iLowest/iHighest не возвращает -1

  4. #4
    Да, это была ошибка копирования и вставки выше. Не уверен, что понимаю концепцию пробега после 17-го такта и как это реализовать или почему это работает. А пока я остановился на этом... повторил второй раз со вторым набором переменных для второго индикатора в советнике. Бары со сдвигом во времени, упомянутые Beerrun, сделали тестирование более контролируемым и менее зависимым от прихоти компилятора MT4, поскольку он тестирует любой ТФ, но ставится на 4-часовой график. В конце концов, я хочу, чтобы советник работал одинаково с одинаковыми результатами, независимо от того, на каком графике TF он находится. Я думаю, что чтение TF из Bars() является частью решения. Ошибка массива вне диапазона все еще остается проблемой, каково значение 17-го бара и как заставить советник работать после 17-го бара? Вставлен код в BarCount1; int TFBars1 = Bars (SymbolToManage, IntIndTF1); int BarsCounted1 = TFBars1-MathMax(IntInd1S2,IntInd1S1 1); if (BarsCounted1 lt; 0) {return;} int LimitBars1 = TFBars1-BarsCounted1; for (BarCount1 = LimitBars1; BarCount1 gt;= 0; BarCount1--) { PerH1 = High#91;iHighest(SymbolToManage,IntIndTF1,MODE_HIG H,IntInd1S2,BarCount1 IntInd1S1)#93;; так далее... }

  5. #5

    Quote Originally Posted by ;
    Мне удалось передать переменные и очень точно смоделировать предыдущие результаты с помощью этого... int counted_bars=Bars-MathMax(MathMax(IntInd1S2,IntInd2S2),MathMax(IntIn d1S1,IntInd2S1)); for(int i=Bars-counted_bars-1;igt;0;i--) { PerH1 = High[iHighest(SymbolToManage,IntIndTF1,MODE_HIGH,IntInd 1S2,i IntInd1S1)]; PerL1 = Low[iLowest(SymbolToManage,IntIndTF1,MODE_LOW,IntInd1S 2,i IntInd1S1)]; PerM1 = NormalizeDouble((PerH1 PerL1)/2,Digits); PerH2 = High[iHighest(SymbolToManage,IntIndTF2,MODE_HIGH,IntInd 2S2,i IntInd2S1)]; PerL2 = Low[iLowest(SymbolToManage,IntIndTF2,MODE_LOW,IntInd2S 2,i IntInd2S1)];...
    Вы уверены, что получаете ошибку из приведенного выше? Поскольку это не заполняет никакие массивы, оно просто присваивает значение последнего i двойникам и выполняет ненужные циклы. Привет! ofc, он может попасть в какой-то высокий или низкий уровень за пределами диапазона. Для этого просто настройте советник на запуск после 17-го бара.

  6. #6

    Quote Originally Posted by ;
    Ну, я все еще получаю ошибки массива вне диапазона на других символах во время тестов с этим. Размещение его вне галочки путем проверки галочки делает его быстрее, это плюс, но это не решает исходную проблему. Вернемся к борьбе.
    Возможно, используйте функцию Bars(), которая принимает символ и таймфрейм в качестве параметров, вместо переменной Bars, которая ограничена текущим символом графика и таймфреймом. Дополнительный момент, который следует учитывать, это то, что если iLowest/Highest возвращает ошибку, вы #8217;будете делать Low[-1]

  7. #7
    Мне удалось передать переменные и очень точно смоделировать предыдущие результаты с помощью этого... Вставленный код int counted_bars=Bars-MathMax(MathMax(IntInd1S2,IntInd2S2),MathMax(IntIn d1S1,IntInd2S1)); for(int i=Bars-counted_bars-1;igt;0;i--) { PerH1 = High#91;iHighest(SymbolToManage,IntIndTF1,MODE_HIG H,IntInd1S2,i IntInd1S1)#93;; PerL1 = Low#91;iLowest(SymbolToManage,IntIndTF1,MODE_LOW,I ntInd1S2,i IntInd1S1)#93;; PerM1 = NormalizeDouble((PerH1 PerL1)/2,Digits); PerH2 = High#91;iHighest(SymbolToManage,IntIndTF2,MODE_HIG H,IntInd2S2,i IntInd2S1)#93;; PerL2 = Low#91;iLowest(SymbolToManage,IntIndTF2,MODE_LOW,I ntInd2S2,i IntInd2S1)#93;; PerM2 = NormalizeDouble((PerH2 PerL2)/2,Digits); IntInd1S2,i IntInd1S1 ранее были установлены на 2 и 14, а теперь работают на 1 и 13, что имеет смысл. Тем не менее, все еще получаю массив вне диапазона ошибок.

  8. #8
    Ну, я все еще получаю ошибки массива вне диапазона на других символах во время тестов с этим. Размещение его вне галочки путем проверки галочки делает его быстрее, это плюс, но это не решает исходную проблему. Вернемся к борьбе. Вставленный код int counted_bars=IndicatorCounted(); for(int i=Bars-counted_bars-1;igt;0;i--) { PerH1 = High#91;iHighest(SymbolToManage,IntIndTF1,MODE_HIG H,IntInd1S2,IntInd1S1)#93;; PerL1 = Low#91;iLowest(SymbolToManage,IntIndTF1,MODE_LOW,I ntInd1S2,IntInd1S1)#93;; PerM1 = NormalizeDouble((PerH1 PerL1)/2,Digits); PerH2 = High#91;iHighest(SymbolToManage,IntIndTF2,MODE_HIG H,IntInd2S2,IntInd2S1)#93;; PerL2 = Low#91;iLowest(SymbolToManage,IntIndTF2,MODE_LOW,I ntInd2S2,IntInd2S1)#93;; PerM2 = NormalizeDouble((PerH2 PerL2)/2,Digits); }

  9. #9

    Quote Originally Posted by ;
    {quote} Да, должно работать. Если нет, создайте переменную, чтобы вести текущий счет. В противном случае цикл будет выполняться для каждого бара на каждом тике.
    Вот что я сделал... Вставленный код int counted_bars=IndicatorCounted(); for(int i=Bars-counted_bars-1;igt;0;i--) { и т. д. и т. д. и т. д. } Похоже, он позаботился о массиве вне допустимого диапазона, мне нужно проверить другие символы, чтобы проверить . Однако проверка по галочке тянулась целую вечность. Итак, я просмотрел, когда и где вызывается этот код, вынул его из верхней части void OnInit и поместил после вставленного кода static datetime prevtime = Time#91;0#93;; если (предыдущее время == Время#91;0#93 вернуть; предвремя = Время#91;0#93;; который у меня есть в нижней части OnInit. Его не нужно проверять тик за тиком, только по бару, тогда как другие части стратегии выхода требуют мониторинга тик за тиком. Я думаю, что это должно работать сейчас. Я должен сравнить его с другими символами, которые доставляли мне проблемы, но вывод кода из тика путем проверки тиков, конечно, заставляет его работать намного быстрее.

  10. #10

    Quote Originally Posted by ;
    {quote} Код находится только внутри советника, а не индикатор. Будет ли IndicatorCounted() работать внутри советника?
    Да, это должно работать. Если нет, создайте переменную, чтобы вести текущий счет. В противном случае цикл будет выполняться для каждого бара на каждом тике.

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

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