Не удается передать таймсерии с помощью ArrayCopyRates()

 

Доброго дня!

Раньше создавал массив, копировал кусок графика и отправлял в ДЛЛ, но способ долгий. Решил попробовать через копи_рэйтс и не могу…

MQL:
int start()
{  
   double price[][6];
   if( ArrayCopyRates(price) < 1 )
      Alert("Ошибка");
   fn(price);
   Alert( "После fn" );
   
   return(0);
}

DLL:
#include <Windows.h>
#include <string>
using namespace std;
void __stdcall fn(void **ar)
{
   double *high = (double*)ar[1];
   MessageBoxA(NULL, 
               to_string(high[0]).c_str(), 
               "", 
               MB_OK);

   MessageBoxA(NULL, 
               "Второе сообщение", 
               "", 
               MB_OK);
}
///////////////////////////// MessageBox'ы не вылетают. (коммент к коду выше)

DLL:
#include <Windows.h>
#include <string>
using namespace std;
void __stdcall fn(double *ar)
{
   MessageBoxA(NULL, 
               to_string(ar[0]).c_str(), 
               "", 
               MB_OK);

   MessageBoxA(NULL, 
               "Второе сообщение", 
               "", 
               MB_OK);
}
/////////////////////////// MessageBox'ы вылетают, но первый содержит бред.  (коммент к коду выше)
Первый вариант вроде логичней, но в МКЛ нет массивов массивов? В общем получить хоть какой-нибудь положительный результат не удается. Кому-нибудь удавалось?
 

Залез в папку с примерами, нашел структуру RateInfo, разобрался.

 
220Volt:

Доброго дня!

Раньше создавал массив, копировал кусок графика и отправлял в ДЛЛ, но способ долгий. Решил попробовать через копи_рэйтс и не могу…

Первый вариант вроде логичней, но в МКЛ нет массивов массивов? В общем получить хоть какой-нибудь положительный результат не удается. Кому-нибудь удавалось?

ArrayCopyRates(price,NULL,0);
 
220Volt:

Залез в папку с примерами, нашел структуру RateInfo, разобрался.

То, что в коде, теперь работает? Этот массив у меня имеет нулевой указатель. Ниразу не получалось передать такой массив. Только через дополнительное копирование.
 
Zhunko:
То, что в коде теперь работает?

Пока не проверил, попробую отпишусь.
 

Все работает, на всякий случай код:

MQL:
#import "DDD.dll"
   void fn(double ar[], int count);

int start()
{  
   double price[][6];
   int count = ArrayCopyRates(price);
   if( count < 1 )
      Alert("Ошибка");
   fn(price, count);
   
   return(0);
}

Dll:            // MSVC
#include <Windows.h>
#include <string>
using namespace std;

#pragma pack(push,1)
struct RateInfo
  {
   unsigned int      ctm;
   double            open;
   double            low;
   double            high;
   double            close;
   double            vol;
  };
#pragma pack(pop)

void __stdcall fn(const RateInfo *data, int count)
{
        MessageBoxA(NULL, 
                    to_string(data[count - 1].high).c_str(), 
                    "", 
                    MB_OK);
}
 
 Одна особенность - последний индекс RateInfo это нулевой бар.
 
220Volt:

Все работает, на всякий случай код:

Спасибо! Но с помощью ArrayCopyRates() ещё не передавал. Не было случая. Обычно таймсерию передавал (ArrayCopySeries()). Там указатель нулевой. У индикаторных буферов тоже NULL.
 
Через ArrayCopySeries() у меня тоже не получилось, плюнул на нее.
 

Соорудил небольшой эксперимент - сравнил время двух способов (копирование истории "руками" и через ArrayCopyRates). На таймфрейме 216617 свечек. Задача - скопировать open, high, low, close, time. Соответственно два кода:

int start()
{  
   int time_s = GetTickCount();
   double price[][6];
   int count = ArrayCopyRates(price, NULL, PERIOD_M1);
   if( count < 1 )
      Alert("Ошибка");
   Alert( GetTickCount() - time_s );
   return(0);
}

и

int start()
{  
   int time_s = GetTickCount();
   int count = iBars(NULL, PERIOD_M1);
   double high[], low[], open[], close[];
   int time[];
   ArrayResize(high, count);
   ArrayResize(low, count);
   ArrayResize(open, count);
   ArrayResize(close, count);
   ArrayResize(time, count);
   for(int i = 0;  i < count;  i++)
   {
      high[i] = iHigh(NULL, PERIOD_M1, i);
      low[i] = iLow(NULL, PERIOD_M1, i);
      open[i] = iOpen(NULL, PERIOD_M1, i);
      close[i] = iClose(NULL, PERIOD_M1, i);
      time[i] = iTime(NULL, PERIOD_M1, i);
      if(high[i] == 0  ||  low[i] == 0  ||  open[i] == 0  ||  close[i] == 0  ||  time[i] == 0)
      {
         Alert("Ошибка");
         return(0);
      }
   }  
   Alert( GetTickCount() - time_s );
   return(0);
}

"Ручной" способ занял 499 мсек, через copyRates 7.75 (быстрее в 64 раза). Это для тех, кто сомневается ))

 
220Volt:

Соорудил небольшой эксперимент - сравнил время двух способов (копирование истории "руками" и через ArrayCopyRates). На таймфрейме 216617 свечек. Задача - скопировать open, high, low, close, time. Соответственно два кода:

и

"Ручной" способ занял 499 мсек, через copyRates 7.75 (быстрее в 64 раза). Это для тех, кто сомневается ))

В описании ArrayCopyRates() написано, что она ничего не копирует. Просто указатель передаёт.