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

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 09:26 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