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 12.10.15 23:55

dll Frage
 
Guten Tag,

ist es bei der Verwendung einer dll, um eine Berechnung durchzuführen, möglich das eine dll einen bestimmten Wert aus MT4 bekommt ohne das dieser vorher in mql definiert wurde? (da die Parameter der Variablen durch die dll vorgegeben werden).

Beispiel:
die dll durchläuft irgendeine Logik und braucht darin mehrfach unterschiedlichste Werte aus iMA(NULL,timeframe,ma_period,ma_shift,ma_method,ap plied_price,shift) in verschiedenen Kombinationen wo timeframe, periode, shift etc sich immer wieder ändern.

thx im voraus
lg

yytrader 13.10.15 05:59

Hallo Ca$hDigger,

wenn ich deine Frage richtig verstanden habe, willst du innerhalb einer DLL, wenn diese Code durchführt auf Werte von Metatrader zugreifen.
Das ist nicht möglich. Es müssen alle Daten per Funktionsargumenten vom Metatrader in die DLL übergeben werden.

Gruß

yytrader

Ca$hDigger 13.10.15 17:29

Ok danke, ich habe mir schon gedacht das das Auslesen von zB iMA(...) mit den entsprechend unterschiedlichen Parametern nur durch ex4/mt4 ausgelesen werden kann. Ich überlege eben ob es ein Trick gibt den Programmablauf in der dll zu haben und trotzdem an die Werte heranzukommen...

Ca$hDigger 13.10.15 22:24

und noch eine Frage: ist es möglich mehrdimensionale Arrays über die Funktion zu transferieren?

yytrader 14.10.15 20:53

Hallo Ca$hDigger,

ja das ist möglich, allerdings must du einiges beachten. Die zweite Seite des Arrays sollte vorher bekannt sein.
Versuche zuerst mal mit fixen Werten. Im MQL Sample gibt es dazu ein Beispiel.

Versche mal folgende Funktion zu integrieren. void func(int x[5][5])

Gruß

yytrader

Ca$hDigger 23.10.15 13:50

Hallo,
ich hab das nochmal probiert aber hat nicht hingehauen. Habe anhand dieses Schemas Creating Metatrader DLLs with Lazarus / Free Pascal @ Forex Factory (Lazarus) versucht Arrays zu übertragen aber ich will das in C++ machen, habe es leider nicht hinbekommen. Stand der Dinge ist folgender:

MQL:
Code:

#import "test.dll"
void VarsByReference(double& a[], int& b[]);
#import

int init()
{
  double foo[2]; // define pair of doubles
  int bar[2];    // define pair of integers
 
  foo[0] = 1.23;
  foo[1] = 4.56;
 
  bar[0] = 42;
  bar[1] = 23;
 
  VarsByReference(foo, bar);
}

Der C++ Versuch:

Code:

MT4_EXPFUNC int _cdecl VarsByReference(double &a, int &b)
{
  a[0] += a[1];
  a[1] -= a[0];
  b[0] += b[1];
  b[1] -= b[0];

  Return(VarsByReference);
}

Gruß

yytrader 23.10.15 20:28

Hallo Ca$hDigger,

hier ein Beispiel:
MQL4:
Code:

#import "Project1.dll"
int Arrays (double a[], int b[]);
#import

int init()
{
  int tmp;
  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};
 
  tmp = Arrays(a, b);
  Print("tmp:",tmp);
  return(0);
}

C-Code:
Code:

__declspec (dllexport) int Arrays (double *a, int *b)
{
 a[0] += a[1];
 a[0] += a[2];
 
 b[0] += b[1];
 b[0] += b[2];
 
 return ((int)a[0] + b[0]);
}

Gruß

yytrader

Ca$hDigger 28.10.15 18:07

Zitat:

Zitat von yytrader (Beitrag 31418)
MQL4:
Code:

#import "Project1.dll"
int Arrays (double a[], int b[]);
#import

int init()
{
  int tmp;
  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};
 
  tmp = Arrays(a, b);
  Print("tmp:",tmp);
  return(0);
}


Hallo, danke für das Beispiel. Ich bekomme nur beim kompilieren zwei mal die Fehlermeldung:
'a' - arrays are passed by reference only
'b' - arrays are passed by reference only

Gruß

Ca$hDigger 28.10.15 18:57

Hab es hinbekommen da hatte noch das & gefehlt :) Prima das funktioniert jetzt schon mal sehr gut.

Ist das gleiche auch umgedreht möglich, also ein beliebiges Array von der dll wieder ins mql zu transportieren?

Gruß

yytrader 29.10.15 20:23

Hallo,

das kannst du nicht über die return Funktion machen. Da du Aufrufparameter als adressen übergeben hast, kannst du in der DLL einfach das Aufrufarray ändern und dann kannst du die geänderten Werte im Metatrader verwenden.
Beispiel wie vorher:

MQL4-Code:
Code:

int init()
{
  int tmp;
  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};
 
  tmp = Arrays(a, b);
  Print("tmp:",tmp," a:",a[0]," ",a[1]," ",a[2]," ",a[3]," ",a[4]);
  return(0);
}

C-Code:
Code:

__declspec (dllexport) int Arrays (double *a, int *b)
{
 a[0] += a[1];
 a[0] += a[2];
 
 b[0] += b[1];
 b[0] += b[2];
 
 a[0] = 1.1;
 a[1] = 2.2;
 a[2] = 3.3;
 a[3] = 4.4;
 a[4] = 5.5;
 
 
 return ((int)a[0] + b[0]);
}

Gruß

yytrader


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:19 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