проблема возникает в том, что Вы хотите передать таймсерию. я уже как-то говорил, что функция ArrayCopySeries не копирует данные, а всего лишь говорит массиву о перенаправлении доступа. для передачи серий в длл-функцию мы специально предусмотрели функцию ArrayCopyRates. объявите двумерный массив со вторым измерением 6 и после "копирования" передавайте его своей функции. на самом деле - это массив структур
#pragma pack(push, 1) struct RateInfo { time_t ctm; // текущее время в секундах double open; double low; double high; double close; double vol; }; #pragma pack(pop)
если не получится, пишите - будем разбираться
Нет и так результат тот же
Кроме того есть проблема с использованием функции ArrayCopyRates
Вот получается как :
На <С> :
Кроме того есть проблема с использованием функции ArrayCopyRates
Вот получается как :
На <С> :
typedef struct RateInfo { long ctm; // текущее время в секундах double open; double low; double high; double close; double vol; }RATE_INFO; int testArray(RATE_INFO *arr,int index){ double data; return (0); }
------------------------------------------------------------------------------------------------------
На MQL-4 кусок:
#import "testMeta.dll" int testArray(double arr[],int index); #import int start(){ double array[100][6]; int cnt; // ArrayCopyRates(array,WHOLE_ARRAY,Symbol(),PERIOD_M5); ArrayCopyRates(array); Print("Значение = ",array[1][4]); cnt = testArray(array,1); Print("Возврат = ",cnt); return (0);
Результат таких манипуляций аналогичный. Для MQL-4 при попытке использовать функцию ArrayCopyRates
выдается ошибка при компиляции :
ArrayCopyRates(array,WHOLE_ARRAY,Symbol(),PERIOD_M5);
')' - wrong parameters count
Работает только если писать :
ArrayCopyRates(array);
во-первых, структура должна быть упакована на границу 1 байта.
во-вторых, в функции ArrayCopyRates нет параметра WHOLE_ARRAY (это Вы видимо из всплывающей подсказки взяли, поправим)
в-третьих, у нас неправильно передаётся массив баров. в следующем билде поправим.
я сейчас всё проверил, тексты должны быть такими:
.mq4 file
во-вторых, в функции ArrayCopyRates нет параметра WHOLE_ARRAY (это Вы видимо из всплывающей подсказки взяли, поправим)
в-третьих, у нас неправильно передаётся массив баров. в следующем билде поправим.
я сейчас всё проверил, тексты должны быть такими:
.mq4 file
... #import "ExpertSample.dll" double GetRatesItemValue(double arr[,6],int,int,int); ... double open_0; double Rates[,6]; int rates_total=ArrayCopyRates(Rates); Print("rates_total=",rates_total); open_0=GetRatesItemValue(Rates,rates_total,0,1); Print("Open[0]=",Open[0]," open_0=",open_0); ...
.h file
#pragma pack(push, 1) struct RateInfo { unsigned int ctm; double open; double low; double high; double close; double vol; }; #pragma pack(pop) double __stdcall GetRatesItemValue(RateInfo* rates,int rates_total,int shift,int nrate);
.cpp file
double __stdcall GetRatesItemValue(RateInfo* rates,int rates_total,int shift,int nrate) { if(rates==NULL) return 0.0; if(rates_total<0) return 0.0; if(shift<0 || shift>=rates_total) return 0.0; if(nrate<0 || nrate>5) return 0.0; int nitem=rates_total-1-shift; switch(nrate) { case 0: return double(rates[nitem].ctm); case 1: return rates[nitem].open; case 2: return rates[nitem].low; case 3: return rates[nitem].high; case 4: return rates[nitem].close; case 5: return rates[nitem].vol; } return 0.0; }
повторяю, что всё будет работать со следующего билда. спасибо за замеченную проблему
Привет Slawa.
В 145-ом билде наблюдаются следующие проблемы:
1. Вышеописанный вами пример таки не работает.
В логе вижу такие вот строчки:
2004.12.26 14:30:23 UseDll1 EURUSD,H4: Open[0]=1.3531 open_0=0
2004.12.26 14:30:23 UseDll1 EURUSD,H4: rates_total=5860
2. Терминал постоянно требует подтверждать вызов функций импортируемых из DLL.
Перепробовал все комбинации чекбоксов "Разрешить импорт DLL" и "Подтверждать вызов функций DLL"
в "Сервис\Настройки\Советники" и в параметрах индикатора.
В частности проявляется при запуске терминала.
В 145-ом билде наблюдаются следующие проблемы:
1. Вышеописанный вами пример таки не работает.
В логе вижу такие вот строчки:
2004.12.26 14:30:23 UseDll1 EURUSD,H4: Open[0]=1.3531 open_0=0
2004.12.26 14:30:23 UseDll1 EURUSD,H4: rates_total=5860
2. Терминал постоянно требует подтверждать вызов функций импортируемых из DLL.
Перепробовал все комбинации чекбоксов "Разрешить импорт DLL" и "Подтверждать вызов функций DLL"
в "Сервис\Настройки\Советники" и в параметрах индикатора.
В частности проявляется при запуске терминала.
Slawa, сорри что настаиваю, но подтвердились ли мои результаты исследований :) ?
1. у меня всё в порядке. Вы как собирали свою DLL? принципиальный момент заключается в том, что Ваша функция должна за собой чистить стек. я могу выслать Вам готовую длл для анализа ситуации. напишите мне на адрес stringo@metaquotes.ru
2. не воспроизводится. но этот момент я ещё посмотрю
2. не воспроизводится. но этот момент я ещё посмотрю
1. Спасибо за пример. Все работает.
2. Посмотрите. Уменя 145 билд. Постоянно требует подтверждения.
2. Посмотрите. Уменя 145 билд. Постоянно требует подтверждения.
2. да, конечно. я внимательно посмотрю
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вот как это выглядит в программах :
На <С>:
int testArray(double *arr,int index){
double data;
data = arr[index];
return (1);
}
Функция <testArray> - Экспортируется из DLL
-------------------------------------------------------------
Теперь из программы на <MQL-4> :
#import "test.dll"
int testArray(double arr[],int index);
#import
int start(){
double closeArrayM5[100];
int cnt;
// -------------------------------------------------------------------------------
ArrayCopySeries(closeArrayM5,MODE_CLOSE,Symbol(),PERIOD_M5);
cnt = testArray(closeArrayM5,1);
Print("Значение возврата = ",cnt);
return (0);
}
Что я делаю неправильно ?
C передачей одиночных параметров (передать строку ,число и так далее ) проблем не возникает ...