Kendi MetaTrader uzantınızı (dll) oluşturun - sayfa 13

 
apprentice coder:
Teşekkürler dll işlevinden bir diziyi dönüş değeri olarak almamızın bir yolu var mı?

Bunu metatrader kullanarak yapmanın tek yolu bir dizi oluşturmak, onu dll işlevine referans olarak iletmek ve o diziyi doldurmaktır. Metatrader, dizileri dll işlevlerinden dönüş değerleri olarak kabul etmez

 
mladen:
Bunu metatrader kullanarak yapmanın tek yolu bir dizi oluşturmak, onu dll işlevine referans olarak iletmek ve o diziyi doldurmaktır. Metatrader, dizileri dll işlevlerinden dönüş değerleri olarak kabul etmez

Tamam teşekkürler

 

mql# ile ilgili bir sorunum var.

Burada c# için sorun kodu yok.

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); } //+------------------------------------------------------------------+

Ancak canlı grafiği test ettiğimde Metatrader platformu otomatik olarak kapanıyor. Neden benim için?

 

Temel kural, her zaman C# içindeki her DLL işlevinin içindeki hataları ele alın. Bunu yapmamak, Metatrader'ın otomatik olarak kapandığı yerde gördüğünüz etkiye neden olacaktır. Her genel dll işlevine bir try/catch bloğu koyun ve soruna neyin neden olduğunu görebileceksiniz. Muhtemelen dll'nizde Metatrader'a geri beslemenin kapanmasına neden olan işlenmemiş bir hatadır. Hata işleme ve hatalarla başa çıkma, C# - MT4 dll işleminin en zor kısmıdır. Bu forumu sık sık kontrol etmiyorum, bu yüzden blogda yorum olarak sorular sorun, böylece bir bildirim alırım ve daha zamanında cevap verebilirim.

sosa247:
Burada c# için sorun kodu yok.

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); } //+------------------------------------------------------------------+
Ancak canlı grafiği test ettiğimde Metatrader platformu otomatik olarak kapanıyor. Neden benim için?
 
sosa247:
Burada c# için sorun kodu yok.

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); } //+------------------------------------------------------------------+
Ancak canlı grafiği test ettiğimde Metatrader platformu otomatik olarak kapanıyor. Neden benim için?

eski sürümle çalıştığı herhangi bir örnek?

 

Muhtemelen koruma sorunu

 
pipscooper:
Temel kural, her zaman C# içindeki her DLL işlevinin içindeki hataları ele alın. Bunu yapmamak, Metatrader'ın otomatik olarak kapandığı yerde gördüğünüz etkiye neden olacaktır. Her genel dll işlevine bir try/catch bloğu koyun ve soruna neyin neden olduğunu görebileceksiniz. Muhtemelen dll'nizde Metatrader'a geri beslemenin kapanmasına neden olan işlenmemiş bir hatadır. Hata işleme ve hatalarla başa çıkma, C# - MT4 dll işleminin en zor kısmıdır. Bu forumu sık sık kontrol etmiyorum, bu yüzden blogda yorum olarak sorular sorun, böylece bir bildirim alırım ve daha zamanında cevap verebilirim.

Sadece bu koddan neden olduğu belirlenemez (belki sorun bazı kaynaklarda olabilir)

 

Merhaba millet,

Bir DLL göstergesini / MT4'ü çalıştırmayı deniyorum... Bu, özyinelemeli bir SMA'nın kodu, ancak çalışmasını sağlayamıyorum. Bir blogdan aldım.

Hatanın neden/nerede olduğu hakkında bir fikri olan var mı?

DLL dosyası C++ ile yazılmıştır ve VC 2010'da hatasız olarak derlenir ( proje olarak).

Bu kodu çalıştırmayı denediğimde MT4 hiçbir şey yapmıyor. hiçbir gösterge görüntülenmedi...

Herhangi bir ipucu?

Çok teşekkürler ve hoşçakal, AT

MQL4 Kodu:

//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

 

Günlük veya uzmanlar sekmesinde hangi hatayı alıyorsunuz?

 

Merhaba Mladen!

Cevap için teşekkürler!

Hiçbiri! Bu bir sorun... :-/

Gösterge penceresi açıldı, ancak hiçbir gösterge görüntülenmiyor...

Yardım/fikirler için teşekkürler ve hoşçakalın, AT

Neden: