Erstellen Sie Ihre eigene MetaTrader-Erweiterung (dll) - Seite 13

 
apprentice coder:
Danke Gibt es eine Möglichkeit, ein Array als Rückgabewert von einer DLL-Funktion zu erhalten?

Die einzige Möglichkeit, dies mit Metatrader zu tun, besteht darin, ein Array zu erstellen, es per Referenz an die DLL-Funktion zu übergeben und dieses Array zu füllen. Metatrader akzeptiert keine Arrays als Rückgabewerte von DLL-Funktionen.

 
mladen:
Die einzige Möglichkeit, dies mit Metatrader zu tun, besteht darin, ein Array zu erstellen, es per Referenz an die DLL-Funktion zu übergeben und dieses Array zu füllen. Metatrader akzeptiert keine Arrays als Rückgabewerte von DLL-Funktionen.

OK, danke

 

Ich habe ein Problem mit mql#.

Hier nicht Problem Code für c#.

using System; using System.Text; using RGiesecke.DllExport; using System.Runtime.InteropServices; using System.Windows.Forms; namespace shine { class Test { [DllExport("AddDouble", CallingConvention = CallingConvention.StdCall)] public static double AddDouble() { System.MetaTrader hano = new MetaTrader(); double Values1 = hano.iCustom(hano.Symbol(), 0, "Borohul", 60, 50, 6, 1.3, true, true, false, false, true, false, false, 1, 0); return (Values1); } } }[/CODE]

Here mql code.

[CODE]

//+------------------------------------------------------------------+ //| testDLL.mq4 | //| Copyright © 2011, Patrick M. White | //| https://sites.google.com/site/marketformula/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2011, Patrick M. White" #property link "https://sites.google.com/site/marketformula/" #import "testUMD600.dll" double AddDouble(); #import //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { //---- Alert(AddDouble()); //---- return(0); } //+------------------------------------------------------------------+

Aber wenn ich testen, Live-Chart, dann Metatrader-Plattform schließen automatisch. Warum für mich?

 

Als Faustregel gilt: Behandeln Sie Fehler immer innerhalb jeder DLL-Funktion in C#. Wenn Sie dies nicht tun, führt dies zu dem Effekt, den Sie sehen, wenn Metatrader automatisch geschlossen wird. Fügen Sie in jeder öffentlichen DLL-Funktion einen try / catch-Block ein, und Sie werden sehen können, was das Problem verursacht. Wahrscheinlich handelt es sich um einen unbehandelten Fehler in Ihrer DLL, der an Metatrader zurückgemeldet wird und zum Abschalten des Programms führt. Die Fehlerbehandlung und der Umgang mit Fehlern ist der schwierigste Teil des Prozesses von C# zu MT4 dll. Ich schaue nicht oft in dieses Forum, also stellen Sie Fragen als Kommentare im Blog, damit ich eine Benachrichtigung erhalte und zeitnah antworten kann.

sosa247:
Hier nicht Problem Code für c#.

using System; using System.Text; using RGiesecke.DllExport; using System.Runtime.InteropServices; using System.Windows.Forms; namespace shine { class Test { [DllExport("AddDouble", CallingConvention = CallingConvention.StdCall)] public static double AddDouble() { System.MetaTrader hano = new MetaTrader(); double Values1 = hano.iCustom(hano.Symbol(), 0, "Borohul", 60, 50, 6, 1.3, true, true, false, false, true, false, false, 1, 0); return (Values1); } } }[/CODE]

Here mql code.

[CODE]

//+------------------------------------------------------------------+ //| testDLL.mq4 | //| Copyright © 2011, Patrick M. White | //| https://sites.google.com/site/marketformula/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2011, Patrick M. White" #property link "https://sites.google.com/site/marketformula/" #import "testUMD600.dll" double AddDouble(); #import //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { //---- Alert(AddDouble()); //---- return(0); } //+------------------------------------------------------------------+
Aber wenn ich testen, Live-Chart, dann Metatrader-Plattform automatisch schließen. Warum für mich?
 
sosa247:
Hier nicht Problem Code für c#.

using System; using System.Text; using RGiesecke.DllExport; using System.Runtime.InteropServices; using System.Windows.Forms; namespace shine { class Test { [DllExport("AddDouble", CallingConvention = CallingConvention.StdCall)] public static double AddDouble() { System.MetaTrader hano = new MetaTrader(); double Values1 = hano.iCustom(hano.Symbol(), 0, "Borohul", 60, 50, 6, 1.3, true, true, false, false, true, false, false, 1, 0); return (Values1); } } }[/CODE]

Here mql code.

[CODE]

//+------------------------------------------------------------------+ //| testDLL.mq4 | //| Copyright © 2011, Patrick M. White | //| https://sites.google.com/site/marketformula/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2011, Patrick M. White" #property link "https://sites.google.com/site/marketformula/" #import "testUMD600.dll" double AddDouble(); #import //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { //---- Alert(AddDouble()); //---- return(0); } //+------------------------------------------------------------------+
Aber wenn ich testen, Live-Chart, dann Metatrader-Plattform schließen automatisch. Warum für mich?

jedes Beispiel, wo es mit alten Version gearbeitet?

 

Wahrscheinlich Schutzproblem

 
pipscooper:
Als Faustregel gilt: Behandeln Sie Fehler immer innerhalb jeder DLL-Funktion in C#. Wenn Sie dies nicht tun, wird der Effekt, den Sie sehen, wo Metatrader schließt automatisch. Fügen Sie in jede öffentliche DLL-Funktion einen Try/Catch-Block ein, und Sie werden sehen können, was das Problem verursacht. Wahrscheinlich handelt es sich um einen unbehandelten Fehler in Ihrer DLL, der an Metatrader zurückgemeldet wird und zum Abschalten des Programms führt. Die Fehlerbehandlung und der Umgang mit Fehlern ist der schwierigste Teil des Prozesses von C# zu MT4 dll. Ich schaue nicht oft in dieses Forum, also stellen Sie Fragen als Kommentare im Blog, damit ich eine Benachrichtigung erhalte und zeitnah antworten kann.

Nur von diesem Code kann es nicht bestimmt werden, warum (vielleicht ist das Problem in einigen der verwendeten Ressourcen)

 

Hallo Leute,

ich versuche, einen DLL-Indikator / MT4 zum Laufen zu bringen... Es ist der Code für eine rekursive SMA, aber ich bekomme es nicht zum Laufen. Ich habe es von einem Blog.

Hat jemand eine Idee, warum / wo ist der Fehler?

Die DLL-Datei ist in C++ geschrieben und lässt sich (als Projekt) in VC 2010 ohne Fehler kompilieren.

Wenn ich versuche, diesen Code auszuführen, tut MT4 nichts. kein Indikator angezeigt...

Irgendwelche Tipps?

Vielen Dank und auf Wiedersehen, AT

MQL4 Code:

//sma_rec.mqh file begin

#import "sma_rec.dll"

void updateBuffer( double& Rates[], double& buffer[], int bars, int indicator_counted, int ma_period, double& internal_calcs[2] );

#import

//sma_rec.mqh file end

//sma_rec.mq4 file begin

#include

#property indicator_chart_window // indicator plotted in main chart window

#property indicator_buffers 1 // one indicator line to be plotted

#property indicator_color1 Red // plot colour is red - change via GUI

//+------------------------------------------------------------------+

// Import and declare the DLL, with its parameters defined

#import "sma_rec.dll"

// history, buffer and internal_calcs are passed by reference, this means the dll

// will receive pointers to the arrays

void updateBuffer(double& Rates[][6], double& buffer[], int bars, int indicator_counted, int period, double& internal_calcs[2] );

#import

extern int ma_period = 10; // default period is 10 - change via GUI

extern int ma_shift = 0; // default is no shift - change via GUI

double buffer[]; // the indicator buffer - the DLL will

// write to this and it will be plotted

double Rates[][6]; // this will later point to the complete

// chart history

double internal_calcs[2]; // this array will hold the values of the

// internal calculations of the DLL and will

// be read from and written to by the DLL.

// The size of the array is set at 2. If

// needs be, the size can be increased to

// accommodate more complicated calculations

// within the DLL.

int init(){

// set up the indicator buffer

SetIndexStyle(0, DRAW_LINE);

SetIndexShift(0, ma_shift);

SetIndexBuffer(0, buffer);

SetIndexLabel(0, "Recursive SMA");

IndicatorDigits(Digits);

}

int start(){

ArrayCopyRates( Rates, NULL, 0 );

updateBuffer( Rates, buffer, Bars, IndicatorCounted(), ma_period, internal_calcs );

//Print(buffer[]);

}

//sma_rec.mq4 file end

[/CODE]

Code in C++

//dllmain.cpp:

#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved

)

{

switch (ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:

break;

}

return TRUE;

}

main function of SMA rec.cpp

[CODE]

#include

#include "stdafx.h"

#include

#define WIN32_LEAN_AND_MEAN

#define MT4_EXPFUNC __declspec(dllexport)

//+------------------------------------------------------------------+

//| MT4 HISTORY DATA STRUCT |

//+------------------------------------------------------------------+

#pragma pack(push,1)

struct RateInfo

{

__int64 ctm;

double open;

double low;

double high;

double close;

unsigned __int64 vol_tick;

// int spread;

// unsigned __int64 vol_real;

};

#pragma pack(pop)

//---

struct MqlStr

{

int len;

char *string;

};

static int CompareMqlStr(const void *left,const void *right);

//+------------------------------------------------------------------+

//|

EXTERN_C __declspec(dllexport) void __stdcall updateBuffer( RateInfo* Rates, double buffer[],int Bars, int IndicatorCounted, int ma_period, double internal_calcs[2] )

// MT4_EXPFUNC void _stdcall updateBuffer( RateInfo* Rates, double buffer[],int Bars, int IndicatorCounted, int ma_period, double internal_calcs[2] )

{

// check if the DLL is being called for the very first time

if ( IndicatorCounted == 0 )

{

// if so, calculate indicator values from the beginning of the array up to

// "current" bar - firstly for buffer[0] to buffer[ma_period - 1] fill the

// buffer with increasing moving average values up to the desired moving

// average period i.e. the second bar in buffer has value of ma_period = 2;

// the third bar in buffer array has value of ma_period = 3 etc.

buffer[0] = Rates[0].close;

buffer[1] = ( Rates[0].close + Rates[1].close ) / 2.0;

for( int ii = 2 ; ii < ma_period ; ii++ )

{

buffer = ( ( buffer * ii ) / (ii+1) ) + ( Rates.close/(ii+1) );

}

// secondly, after the initial part of the buffer is filled, the rest of the

// buffer is filled using a recursive SMA algorithm. If the SMA were

// calculated by looping over previous bar values there would be ma_period-1

// additions and one division operation per loop of a nested loop. This

// simple recursive algorithm does away with the need for a nested loop

// completely and reduces the number of arithmetic operations to four per

// bar. More importantly, for learning purposes, it will enable code to be

// shown for passing parameters that hold the state of internal calculations

// to and from the DLL.

for( int ii = ma_period ; ii < Bars - 1 ; ii++ )

{

buffer = ( buffer - (Rates.close/ma_period) ) + ( Rates.close/ma_period );

}

// now return the values of the internal calculations to the internal_calcs

// array pending the next call to the DLL

internal_calcs[0] = (Rates.close/ma_period);

// the value // to be used in the next SMA calculation

internal_calcs[1] = Bars - 1; // how many indicator values calculated so far

} // end of ( IndicatorCounted = 0 ) if statement for first call of the DLL.

// Once this piece of the code has been run once, on the initial call to the

// DLL, it will never be run again because the condition IndicatedCounted ==

// 0 will never be true again.

// this next piece of code will be evaluated on the second and all subsequent

// calls to the DLL because the condition IndicatorCounted > 0 will always be

// true after the DLL's initial call. Note that the second part of the

// logical AND, namely (Bars - 1) > internal_calcs[1], ensures that the code

// will only run when a bar has completely formed and a new bar has opened.

// This is important to ensure that values contained in the internal_calcs

// array are not overwritten by the constantly changing values of the

// currently forming bar. Note that, as above, this is a recursive SMA

// algorithm so there is no loop.

if ( IndicatorCounted > 0 && (Bars - 1) > internal_calcs[1] ) // evaluates to TRUE if there is a new bar

{

buffer = ( buffer - internal_calcs[0] ) + ( Rates.close/ma_period ); // calculate new SMA value

internal_calcs[0] = (Rates.close/ma_period); // update

// internal_calcs with new value for next SMA calc.

internal_calcs[1] = Bars - 1; // update how many indicator values calculated so

// far

} // end of ( IndicatorCounted > 0 && (Bars - 1) > internal_calcs[1]) if

// statement

} // end of main function call

 

Welcher Fehler wird in der Registerkarte "Journal" oder "Experten" angezeigt?

 

Hallo Mladen!

Danke für die Antwort!

Keine! Das ist ein Problem... :-/

Indikatorfenster ist geöffnet, aber es wird kein Indi angezeigt...

Danke für Hilfe/Ideen und tschüss, AT