Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 441

 

Подскажите пожалуйста, что я делаю не так!?

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

   if(Bars>1400)
     {
      int Stop;
      double MATcycle;
      for(int i=0;i!=1000 || Stop!=1; i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i+1);
         if(MATcycle<High[i+1] && MATcycle>Low[i+1])
           {
            Stop=1;
            Print("MATcycle=",MATcycle," i=",i);
           }
         else return (0);
        }

 
-Aleks-:

Подскажите пожалуйста, что я делаю не так!?

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

   if(Bars>1400)
     {
      int Stop;
      double MATcycle;
      for(int i=0;i<1000 || Stop==1; i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i+1);
         if(MATcycle<High[i+1] && MATcycle>Low[i+1])
           {
            Stop=1;
            Print("MATcycle=",MATcycle," i=",i);
           }
         else return (0);
        }

Насколько я понимаю, после того, как вы определили пересечение и установили значение stop=1, сразу идет выход из цикла. Хорошо, тогда нужно пойти дальше и запомнить номер свечи, на которой произошло пересечение. Т.е. 

Легче написать самому:

for( int i = 1; i < 1000; i++ )
{
 iMaValue = ...;   // Значение МА на i свече
 if( iMaValue < High[ i ] && iMaValue > low[ i ] )
 {
  num = i;   // Запоминаем номер свечи, на котором произошло пересечение
  break;     // Выходим из цикла
 }
}

 Это вы определили номер свечи. Если номер = 2 и не учитываем текущую, то с момента пересечения образовалась одна свеча (ну или интерпретируйте так, как Вам угодно).

 
Tapochun:

Насколько я понимаю, после того, как вы определили пересечение и установили значение stop=1, сразу идет выход из цикла. Хорошо, тогда нужно пойти дальше и запомнить номер свечи, на которой произошло пересечение. Т.е. 

Легче написать самому:

 Это вы определили номер свечи. Если номер = 2 и не учитываем текущую, то с момента пересечения образовалась одна свеча (ну или интерпретируйте так, как Вам угодно).

Спасибо, у меня так получилось


int Stop=0;
   if(Bars>1400)
     {
     
      double MATcycle;
      for(int i=1;(i!=1000 || Stop==0); i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i);
         if(MATcycle<=High[i] && MATcycle>=Low[i])
           {
            Print("MATcycle=",MATcycle," i=",i);
            Stop=i;
            break;
           }
        }
     }

 
alph:
Подскажите пожалуйста, такой показатель тестера в жизни реален? И хороший это или плохой результат за год с депо 3000$?
Ответ прост: показатели тестера в жизни НЕ РЕАЛЬНЫ, если вы тестируете советника. Тестер стратегий используется трейдерами для проверки работоспособности АТС, либо для тестирования ручных стратегий в он-лайне.
 
-Aleks-:

Спасибо, у меня так получилось


int Stop=0;
   if(Bars>1400)
     {
     
      double MATcycle;
      for(int i=1;(i!=1000 || Stop==0); i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i);
         if(MATcycle<=High[i] && MATcycle>=Low[i])
           {
            Print("MATcycle=",MATcycle," i=",i);
            Stop=i;
            break;
           }
        }
     }

Не стоит так писать, т.к. если за последние 1000 баров пересечения не было, во-первых, цикл пойдет дальше, во-вторых, возможно зацикливание/иные ошибки, т.к. если история закончится, а пересечения так и не произойдет, выхода из цикла не будет, т.к. Stop = 0. Лучше написать так, как я указал выше.

 
Tapochun:

Не стоит так писать, т.к. если за последние 1000 баров пересечения не было, во-первых, цикл пойдет дальше, во-вторых, возможно зацикливание/иные ошибки, т.к. если история закончится, а пересечения так и не произойдет, выхода из цикла не будет, т.к. Stop = 0. Лучше написать так, как я указал выше.

А разве знак "или" не работает - по условию же либо перебор будет на 1000 баров или завершится как только будет найден искомый результат. Или он и так завершится не доходя до 1000, если будет найден искомый результат - пересечение ценой МА?
 
-Aleks-:
А разве знак "или" не работает - по условию же либо перебор будет на 1000 баров или завершится как только будет найден искомый результат. Или он и так завершится не доходя до 1000, если будет найден искомый результат - пересечение ценой МА?
|| означает, что если хотя бы одно из условий в скобках истинно, то цикл будет повторяться, следовательно, даже когда будет i >= 1000, но stop = 0, то цикл будет продолжаться, i будет и дальше инкрементироваться, что повлечет за собой неверный значения МА (в случае, если произойдет выход за пределы истории). А за завершение при нахождении искомого результата отвечает оператор break;
 
Tapochun:
|| означает, что если хотя бы одно из условий в скобках истинно, то цикл будет повторяться, следовательно, даже когда будет i >= 1000, но stop = 0, то цикл будет продолжаться, i будет и дальше инкрементироваться, что повлечет за собой неверный значения МА (в случае, если произойдет выход за пределы истории). А за завершение при нахождении искомого результата отвечает оператор break;
Понял, спасибо за разъяснение! Я думал, что одно из условий будет не верно и тогда цикл прекратится...
 

     Здравствуйте! 2015.09.19_02:13 МСК. В функции ArrayResize() в любом случае компилятор пишет

напротив размера массива -- comma expected, хоть пиши int, хоть нет. А если не писать int, то пишет: "-

declaration without type. А ссылку & убрал и квадратные скобки, -- помогло!
     Предупреждения: когда было нормально написано, -- компилятор писал: идентификатор скрывает

объявление на глобальном уровне. А когда убрал объявление идентификатора на глобальном уровне, -- стал

писать: ошибка, необъявленный идентификатор. А массивы High[] и Low[] я сменил на HighP[] и LowP[]. Не

помогло. Компилятор пишет то же самое. 02:27 МСК. Прилагаю файл скриншота.     

Файлы:
 
Николай Никитюк:

     Здравствуйте! 2015.09.19_02:13 МСК. В функции ArrayResize() в любом случае компилятор пишет

напротив размера массива -- comma expected, хоть пиши int, хоть нет. А если не писать int, то пишет: "-

declaration without type. А ссылку & убрал и квадратные скобки, -- помогло!
     Предупреждения: когда было нормально написано, -- компилятор писал: идентификатор скрывает

объявление на глобальном уровне. А когда убрал объявление идентификатора на глобальном уровне, -- стал

писать: ошибка, необъявленный идентификатор. А массивы High[] и Low[] я сменил на HighP[] и LowP[]. Не

помогло. Компилятор пишет то же самое. 02:27 МСК. Прилагаю файл скриншота.     

  1. Картинки нужно вставлять так: Форум: как вставить картинку
  2. Вы вообще не читаете, то, что Вам советуют? 

    Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

    Вопросы от начинающих

    Karputov Vladimir, 2015.09.17 18:46

    1. Неправильное написание ArrayResize. Надобно так:
      //--- устанавливаю размеры массивов с запасом (reserve)
      ArrayResize(mrate,16,9);
      ArrayResize(maVal,16,9);
      ArrayResize(fVal,3,2);
      ArrayResize(zVal,3);
    2. А установка флага таймсерии для массива будет выглядеть так:
      //--- массив максимальных цен баров
      ArraySetAsSeries(High,true);
      //---  
      ArraySetAsSeries(Low,true);


Причина обращения: