Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   dll Frage (http://www.expert-advisor.com/forum/showthread.php?t=4507)

Ca$hDigger 23.12.15 03:32

Hallo,

dank obiger Beispiele läuft das prima. Ich habe jetzt probiert per ArrayCopyRates (ArrayCopyRates - MQL4 Documentation) der dll die Bars im Chart zur Verfügung zu stellen und komme da nicht weiter. Scheinbar gibt es bei einer zweiten Dimension noch etwas zu beachten...?

mql:
im import
Code:

double Arrays(double &bars[][6]);

dann per MqlRates bars[]; oder double bars[][6];

(welches auch immer die richtige Wahl ist...)

dann
Code:

ArrayCopyRates(bars, NULL, 0);
(hier auch die Frage reicht es im OnInit oder muss es permanent OnTick)

dll:
Code:

#define MT4_EXPFUNC extern"C"__declspec(dllexport)
MT4_EXPFUNC double _cdecl Arrays(double *bars[][6])

double test;
test = bars[0][2];

return ((double)test);


Vermutlich stimmt irgendwas mit den *& stimmt noch nicht... Ich habe alle mögliche probiert und immer kommt ein Fehler wie "Access violation read to 0xDA9003EF"

Gruß

yytrader 05.01.16 19:26

Hallo CashDigger,

wenn du die Funktion ArrayCopyRates verwendest, wird keine Matrix, sondern ein Strukt übergeben.

anbei der Code:
Code:

#import "Project1.dll"
double GetRatesItemValue(MqlRates &rates[],int);
int SingleArray(double &a[], int &b[]);
#import

int init()
{
  int retValue;
  double a[10]={2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0};
  int b[10]={1,2,3,4,5,6,7,8,9};
 
  retValue = SingleArray(a, b);
  Print("SingleArray: retValue:",retValue," a:",a[0]," ",a[1]," ",a[2]," ",a[3]," ",a[4]);
 
 
  int selection = 1;
    MqlRates rates[];
  ArrayCopyRates(rates,NULL,0);
  Print("GetRatesItemValue:",GetRatesItemValue(rates,selection));
 
  return(0);
}

Code:

struct RateInfo
  {
  __int64          ctm;
  double            open;
  double            low;
  double            high;
  double            close;
  unsigned __int64  vol_tick;
  int              spread;
  unsigned __int64  vol_real;
  };
 
__declspec (dllexport) double GetRatesItemValue(const struct RateInfo* rates, const int typeSelect)
  {
  switch(typeSelect)
  {
      case 0: return rates[0].ctm;
      case 1: return rates[0].open;
      case 2: return rates[0].low;
      case 3: return rates[0].high;
      case 4: return rates[0].close;
     
     
      default:
              return -1.0;
  }
}


Wenn die Werte aktualisiert werden sollen, dann musst du diese Funktion in OnTick aufrufen, da so immer die neuesten Werte verwendet werden. Ich verwende immer nur init zum testen, da es so nur einmal und sofort ausgeführt wird.


Gruß

yytrader


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:43 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum