Скачать MetaTrader 5

Ошибка в моём коде на MQL4

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
barbarian
339
barbarian  

Написал такой код, не спрашивайте для чего, просто нужен и получил результат несоответствия баров после выполнения ArrayCopyRates:

//+------------------------------------------------------------------+
//|                                              ExportFunctions.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#import "TseriesDll.dll"
void GetTestTime(double rates[][6],int,double& testAR[0],int);
double GetRatesItemValue(double rates[][6],int,int,int,double& xxx[],int);
#import

#define TIME_INDEX   0
#define OPEN_INDEX   1
#define LOW_INDEX    2
#define HIGH_INDEX   3
#define CLOSE_INDEX  4
#define VOLUME_INDEX 5

//---------------------- Входные параметры ---------------------------------------------------+


//---------------------- Глобальные переменные -----------------------------------------------+

/*Тестовый массив вычислений в MQL и C++*/
double testAR[4];    //[0] MQL
                     //[1] C++
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
  vTestTime();
  return(0);
  }
//+------------------------------------------------------------------+
//| array functions call                                             |
//+------------------------------------------------------------------+
int start()
   {
   
   return(0);
   }

//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//X                      Блок функций                                                         X
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

//+----------------------------------------------------------------------------+
//| Описание: Тестовая, для проверки вычисления часа                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//| rates - массив тайм-серии             | testAR - массив вывода             |
//| row - размер по строкам(число баров)  | nomer - переменные советника       |
//+----------------------------------------------------------------------------+
void vTestTime()
   {
   double rates[][6];
   double testAR2[][4];
/*для сравнительных вычислений в MQL и C++*/
   int ci=0,sy,hole;
   for(int i=0;i<4000;i++)
      {
      testAR[0]=iTime(NULL,PERIOD_H1,i);
      ArrayCopyRates(rates,NULL,PERIOD_M15);
      vTestTime_2(rates,iBars(NULL,PERIOD_M15),testAR,i);
      sy=i+1;
      if(testAR[0] != testAR[2])
         {
         testAR[1]=iBarShift(NULL, PERIOD_H1, iTime(NULL,PERIOD_H1, i),true);
         ArrayResize(testAR2,ci+1);
         testAR2[ci][0]=testAR[0];
         testAR2[ci][1]=testAR[1];
         testAR2[ci][2]=testAR[2];
         testAR2[ci][3]=testAR[3];
         vTablLevel(testAR2);
         ci++;
         }
      }
   Alert(sy," проходов ,",ci," несовпадений ,",iBars(NULL,PERIOD_M15)," баров М15");
   }
//+----------------------------------------------------------------------------+
//| Описание: Проверка тайм-серии                                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    arrts - массив тайм-серии |  arrk - массив контроля                     |
//|    row - кол-во строк        |  indx - индекс перебора баров               |
//+----------------------------------------------------------------------------+
void vTestTime_2(double& arrts[][],int row,double& arrk[],int indx)
   {
   int i=iPeriodH1(arrts,row,indx);
   arrk[2]=arrts[i][TIME_INDEX];
   arrk[3]=i;
   }
//+----------------------------------------------------------------------------+
//|     Описание: Перевод PERIOD_M15 на PERIOD_H1                             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//| ts - массив тайм-серии              | shift - индекс начального бара       |
//| row - размер по строкам(число баров)|                                      |
//+----------------------------------------------------------------------------+
int iPeriodH1(double& ts[][],int row,int shift)
        {
        int new_shift=shift*4;
        double chas=MathFloor(ts[new_shift][TIME_INDEX]/60/60);
        double sec=chas*60*60;
        for(int i=new_shift; i<new_shift+4 && i<row-1; i++)
                {
                if(sec == ts[i][TIME_INDEX])
                        {
                        new_shift=i;
                        break;
                        }
                }
        return(new_shift);
        }
//+----------------------------------------------------------------------------+
//| Описание: Создает таблицу и записывает в файл                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    tsarr - массив тайм-серии                                               |
//|    onesize - размерность по первому измерению                              |
//+----------------------------------------------------------------------------+
void vTablLevel(double& tsarr[][])
   {
   string ishfile="test1.txt";                 //Имя файла с выгруженными данными
   double inarray[4];                                    //количество массивов
   int handle=FileOpen(ishfile, FILE_CSV|FILE_WRITE,'\t');
   if(handle>0)
      {
      FileWrite(handle,"MQL4            ","iMQL","C++              ","iC++");
      int row=ArrayRange(tsarr,0);
      for(int i=0; i<row; i++)
         {
         inarray[0]=tsarr[i][0];
         inarray[1]=tsarr[i][1];
         inarray[2]=tsarr[i][2];
         inarray[3]=tsarr[i][3];
         //---- Запись данных в файл*/
         FileWrite(handle,TimeToStr(inarray[0]),inarray[1],TimeToStr(inarray[2]),inarray[3]);
         }
      FileFlush(handle);
      FileClose(handle);
      }
   }

В чем может быть причина, может в нарушении целостности памяти или в неправильной отработке самой функции ArrayCopyRates?

Гуру форума пока молчат, наверное заняты или не знают сами ответа.

PS. код подправлен для удобства

Mikhail Kozhemyako
1254
Mikhail Kozhemyako  
void vTablLevel(double& tsarr[][4])

Сразу бросилось в глаза с бодуна....)

Существует возможность передавать параметры по ссылке. В этом случае модификация таких параметров отразится на соответствующих переменных в вызываемой функции, переданных по ссылке. Нельзя передавать по ссылке элементы массивов. Параметры по ссылке можно передавать только в пределах одного модуля, для библиотечных функций такая возможность не предусмотрена. Для того чтобы указать, что параметр передается по ссылке, после типа данных необходимо поставить модификатор &.


barbarian
339
barbarian  
Sepulca:

Сразу бросилось в глаза с бодуна....)

Существует возможность передавать параметры по ссылке. В этом случае модификация таких параметров отразится на соответствующих переменных в вызываемой функции, переданных по ссылке. Нельзя передавать по ссылке элементы массивов. Параметры по ссылке можно передавать только в пределах одного модуля, для библиотечных функций такая возможность не предусмотрена. Для того чтобы указать, что параметр передается по ссылке, после типа данных необходимо поставить модификатор &.

Видимо точно с бодуна :) Все в порядке, по ссылке передан адрес массива, это соответствует соглашениям стандарта MQL4.
Mikhail Kozhemyako
1254
Mikhail Kozhemyako  
void vTablLevel(double& tsar)
без всяких [ ]
Barbarian:
Видимо точно с бодуна :) Все в порядке, по ссылке передан адрес массива, это соответствует соглашениям стандарта MQL4.

Так вы в формальных параметрах функции забили конкретный элемент массива. Неправильно это...
barbarian
339
barbarian  

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

Кстати администраторы форума бдят, даже название темы изменили, а ведь ошибка именно в функции MQL4. Если посмотреть вывод, то видно смещение баров и соответственно несогласованность их в последствии.

Mikhail Kozhemyako
1254
Mikhail Kozhemyako  
А что Вам мешает просто объявить массив на глобальном уровне и незаморачиваться с передачей ссылок? Тем более в коде я вижу ArrayResize. По моему нету никакой ошибки. Нафика Вы этих VOIDов накрутили?
barbarian
339
barbarian  
Sepulca:
А что Вам мешает просто объявить массив на глобальном уровне и незаморачиваться с передачей ссылок? Тем более в коде я вижу ArrayResize. По моему нету никакой ошибки. Нафика Вы этих VOIDов накрутили?

Если Вы смотрите код, то обратите внимание, что ArrayResize используется для массива который в файл записывает несовпадения и ни коим образом ArrayResize не влияет на работу ArrayCopyRates и вообще передаваемой тайм-серии. Насчет VOIDов - читайте первые строчки первого поста, тема не для объяснения для чего это нужно!!!

Я ведь и пишу как раз о том, что при обращении к тайм-серии обнаруживается несоответствие баров. Скорее всего нарушена структура самой тайм-серии. Вы вывод файла посмотрите, можете в цикл добавить больше баров к примеру 65000 (как по умолчанию в терминале), я 4000 сделал для скорости обработки и показа до первой ошибки. Кстати в часовом интервале на М15, параметру тайм соответствует параметр Open, они на одном временном периоде находятся и соответственно М15 открывается в одно время с Н1. Если функцию перевода в Н1 переделать под полные параметры OCHLV и Time, то смещение баров у Time Open и Time Close произойдет одинаково.

o_o
Модератор
23921
o_o  

Barbarian:

Вы вывод файла посмотрите

а самому посмотреть не судьба? порядок данных таймсерии проверил?
barbarian
339
barbarian  
sergeev:
а самому посмотреть не судьба? порядок данных таймсерии проверил?

Вопросом на вопрос, как будто сейчас начнут камнями закидывать :) Я вывод файла смотрел иначе не писал бы тут. Если видите мою ошибку то напишите.
Mikhail Kozhemyako
1254
Mikhail Kozhemyako  
Barbarian:
Вопросом на вопрос, как будто сейчас начнут камнями закидывать :) Я вывод файла смотрел иначе не писал бы тут. Если видите мою ошибку то напишите.


А ведь прав товарищ,

int ArrayCopyRates(     void dest_array[], string symbol=NULL, int timeframe=0)
Это из документации. Я просто в такие дебри не залезал)))
o_o
Модератор
23921
o_o  
Barbarian:

Вопросом на вопрос, как будто сейчас начнут камнями закидывать :)

и таки начнут.

Я вывод файла смотрел

и что там пишут?
12345
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий