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

 
barabashkakvn:
Насчёт int(round) согласен. Спасибо. Явное приведение типов не помешает. Хотя работало и без явного приведения.
Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Основы языка / Типы данных / Приведение типов - Документация по MQL5
 
Virty:
Насчёт int(round) согласен. Спасибо. Явное приведение типов не помешает. Хотя работало и без явного приведения.
Работать то работало, но вот єти замечания компилятора... Как-то надоедают.
 
barabashkakvn:

У меня нет никаких ошибок. Билд последний.

 

Спасибо, помогло обновление МТ5. Ошибка пропала. билд был от 23 июля 2013.  В старом билде, кстати, не было варнингов по приведению типов, потому я их и не замечал.

Ну вот кто бы мог ожидать таких серьёзных ошибок от компилятора.

Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Основы языка / Типы данных / Приведение типов - Документация по MQL5
 
Virty:

Спасибо, помогло обновление МТ5. Ошибка пропала. билд был от 23 июля 2013.  В старом билде, кстати, не было варнингов по приведению типов, потому я их и не замечал.

Ну вот кто бы мог ожидать таких серьёзных ошибок от компилятора.

Главное заработало :).  Все, баиньки.
 

Необходимо найти минимум во временном промежутке. Составил следующий код для определения времени:

datetime ts=st+StartTime*60;// начало временного диапазона в секундах от 01.01.1970
int tss=(int)ts;//преобразование в секунды
Alert( "tss",tss);
datetime tsp=st+StopTime*60;// конец временного диапазона в секундах от 01.01.1970
int tspp=(int)tsp;//преобразование в секунды

 Для поиска минимумов в данном промежутке использую функцию CopyLow:

double Low[];
CopyLow(_Symbol,_Period,tss,tspp,Low); 

 Далее, если правильно понимаю у меня получается одномерный массив Low[],

ищу в нем минимум с помощью ArrayMinimum: 

int start=0;
int count=WHOLE_ARRAY; 
double min=ArrayMinimum(Low,tss, tspp);  
Alert("min=",min);

Попробовал задать сегодня время стартовое 1 час, стоп 2 часа и вызвать Alert для проверки min=-1. 

Вопрос: для данной задачи правильно ли выбраны функции для решения этой задачи или у где-то ошибка? Необходимо получить минимальную цену.

 
                                      ЗдравствуйтеУважаемые трейдеры, прошу помощи в правильном оформлении куска программы для 3-х скользящих в мультивалютном советнике.

      Пытался разобраться с этим вопросом по Справочнику, но там пример с применением классов, а я к этому пока не подготовлен.

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

      используемой валюте написал следующий кусок программы:

 

     input int Kurtz_Period=5;    // период быстрой скользящей Kurtz

     input int Mittel_Period=8; 

     input int  Long_Period=13;

 

 

      int maHandle;  // хэндл индикатора Moving Average

    double ma_buf[]; // это буферный массив для отсчетов скользящей, получаемых с функции МА

                                           // и которые затем будут переписываться в соответствующие массивы

 

    datetime Time_buf[];  //базовый массив времени открытия баров

    datetime Time_[6][150];  // массив времени открытия баров                    

 

    double Kurtz[6][70];  //это массив для  быстрой скользящей Kurtz , номера строк здесь совпадают с номерами используемых валют, а столбцы – это отсчеты скользящих

    double Mittel[6][70];  //  это массив для среднепериодной  скользящей Mittel 

    double Long[6][70];  //  это массив для  длиннопериодной скользящей Long

 

     string Name_symbol[6] = { "AUDUSD","EURUSD", "GBPUSD", "USDCAD", "USDCHF", "USDJPY" } ; // это текстовый массив названий валют:

    int nomer_instr; // это номер инструмента (валюты), только для организации циклов по валютам

 

    int OnInit()

        {

           //-----

          //-------

        }

 

     void OnDeinit(const int reason)

            {

               //---

               ArrayFree(Time_buf);

              ArrayFree( ma_buf ); // обнуляем освободившийся массив

             //-------

           }

 

      void OnTick()

         {

            //---------------------

           ArraySetAsSeries(Time_buf, true);   //устанавливаем индексацию для массива time_array как в таймсерии

          ArraySetAsSeries(ma_buf, true);   //устанавливаем индексацию для массива ma_buf как в таймсерии

 

 

          for( nomer_instr=0; nomer_instr<=5; nomer_instr++ ) // это цикл по всем используемым валютам

              {

                       int digit = int( SymbolInfoInteger( Name_symbol[nomer_instr], SYMBOL_DIGITS)); // это число знаков в котировке валюты

 

                      CopyTime( Name_symbol[nomer_instr], PERIOD_M1,0,160,Time_buf); // копируем в буфер исторические данные time для каждого бара

                     for( i=1; i<=145; i++ )   Time[nomer_instr][i]=Time_buf[i];  // время открытия 1-вых баров

 

                     //#############################################################################################

                     //  БЛОК формирования отсчетов первых 3-х скользящих:  Kurtz, MittelLong

 

                         manHandle = iMA( Name_symbol[nomer_instr],PERIOD_M1, Kurtz_Period , 0, MODE_SMMA, PRICE_CLOSE );

                         if( CopyBuffer(maHandle,0,0,155,ma_buf)<0 )

                             {

                                  Alert("Ошибка копирования буферов индикатора ---PERIOD_M1,Kurtz_Period--- Moving Average - номер ошибки:",GetLastError());

                                  return;

                             }

              

                           for( i=1; i<=45; i++ ) Kurtz[nomer_instr][ i ] = NormalizeDouble( ma_buf[i], digit);

 

              /*  

                 //===============================================================

                 // БЛОК проверки смещения баров как в таймсерии и точности нормализации чисел

                 //   быстрая скользящая МА-5

                

                   if( Multi_Torgi == 0 && Optim_parametrov == nomer_instr ) // это ключ для выбора режима работы советника, сейчас он в режиме отладки программы

                    {

                       for( i=1; i<=5; i++ )

                          {

                               if(i==1) Alert("====================");

                               if(i==1) Alert(" время открытия 1-го бара: Time[nomer_instr][1]=",Time[nomer_instr][1] );

                               Alert(" номер бара: i=",i,",    MA_buf[i]=",MA_buf[i],",    Kurtz[nomer_instr][i]=",Kurtz[nomer_instr][i]);

                          }

                    }

                 //=================================================================

                */

 

 

 

 

      //---------------------------------------------------------------------------------------------------------------------------

 

             maHandle = iMA( Name_symbol[nomer_instr],PERIOD_M1, Mittel_Period, 0, MODE_SMMA, PRICE_CLOSE );

             if(CopyBuffer(maHandle,0,0,155,ma_buf)<0)

                  {

                       Alert("Ошибка копирования буферов индикатора ===PERIOD_M1, Mittel_Period,=== Moving Average - номер ошибки:",GetLastError());

                       return;

                   }

              

                  for( i=1; i<=45; i++ )  Mittel[nomer_instr][ i ] = NormalizeDouble( ma_buf[i], digit);

        //----------------------------------------------------------------------------------------------------------------------

 

                maHandle = iMA( Name_symbol[nomer_instr],PERIOD_M1, Long_Period, 0, MODE_SMMA, PRICE_CLOSE );

                if(CopyBuffer(maHandle,0,0,155,ma_buf)<0)

                   {

                        Alert("Ошибка копирования буферов индикатора ===PERIOD_M1, Long_Period,===Moving Average - номер ошибки:",GetLastError());

                         return;

                   }

              

                  for( i=1; i<=45; i++ )  Long[nomer_instr][ i ] = NormalizeDouble( ma_buf[i], digit);

                           

 

       //  конец   БЛОКа формирования отсчетов первых 3-х скользящих:  Kurtz, MittelLong

      //#############################################################################################

    

               } // конец цикла по используемым валютам

 

          

              //============================================================

                     Другие операторы программы

             //============================================================

 

          //-----------------------------------------

 

            }//  конец функции OnTick()

      //+------------------------------------------------------------------+

 

                            По данной программе при компиляции ошибки не выявляются, но при тестировании в Журнале по каждой скользящей выдаётся сообщение

             об ошибке:   4806 – это « запрошенные данные не найдены».

                                   Подскажите пожалуйста, где у меня ошибка.

                                                                                                                  Спасибо.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
DC2008:

Не ужели Вы принцип приведения типов так и не поняли? Это же так просто:

Теперь вроде понятно) Выходит int st операнд более маладшего типа чем datetime tp[].

Поэтому не преобразования в секунды в операции:

int st=tp[0];

 Попробовал найти минимум в промежутке времени. Не уверен, что правильно делаю. Можете посмотреть предыдущее сообщение?

Как можно вызывать Alert или Comment  без новых тиков, чтобы делать проверки в выходные дни?

 
forexman77:

Необходимо найти минимум во временном промежутке. Составил следующий код для определения времени:

 Для поиска минимумов в данном промежутке использую функцию CopyLow:

 Далее, если правильно понимаю у меня получается одномерный массив Low[],

ищу в нем минимум с помощью ArrayMinimum: 

Попробовал задать сегодня время стартовое 1 час, стоп 2 часа и вызвать Alert для проверки min=-1. 

Вопрос: для данной задачи правильно ли выбраны функции для решения этой задачи или у где-то ошибка? Необходимо получить минимальную цену.

Читаем внимательно:

Возвращаемое значение

Функция возвращает индекс найденного элемента с учетом серийности массива. В случае неудачи функция возвращает -1. 

поэтому, надо так:

Alert("min=",Low[ArrayMinimum(Low)]);
 

Проверять и тестировать в выходные и не только, надо скриптами.

 
DC2008:

Проверять и тестировать в выходные и не только, надо скриптами.

Спасибо!
Причина обращения: