MetaTrader4用API関数のライブラリを開発 - ページ 7

 
こんにちは、そこで知り合いのプログラマーに相談したところ、このDLLがOmegaで使用するために特別に書かれていない場合、機能の保証はできないとの説明を受けました。なぜなら、オメガはDLLの関数呼び出しパラメータに必要なリソースを持っていないかもしれないからです。以下はその例です :
int TikKot(char *kotx, double *bid, double *ask, TDateTime *tim);
この行は、Omegaの "TDateTime *tim "といったデータをサポートしません。
パラメータが設定されていない端末の開始と終了の機能のみが動作することを意味します。パラメータが設定されているところでは、DLLがどのようなパラメータをとっているのか知る必要があるので、例があればいいと思います。
必要なものを正確に教えてくれるプログラマと一緒にDelphiでの例を見て、必要なパラメータをDLLに渡すためのOmegaツールを探す必要があると思います。もし、YOUがOmega専用のDLLをリリースしたいのなら、それは計り知れないほど迅速なテストと使用を容易にするでしょう、Omegaのユーザーはたくさんいると思います。すでに関心のあるユーザーもいるようです。以下はOmega HELPからの小さな抜粋です:
サポートされるデータ型の重要なポイントリストは以下を参照してください。



DLL関数定義

EasyLanguageからDLL関数を呼び出す前に、DLL関数宣言命令を使用してDLLを宣言する必要があります。

構文です。

DefineDLLFunc: "DLLNAME.DLL", Return Type, "FunctionName", Parameters;

DLLNAME.DLL は関数が存在する DLL の名前、Return Type は関数が返す式のタイプ、FunctionName は DLL で定義される関数名、 Parameters は関数が必要とするパラメータ(カンマで区切る各パラメータ)のリストです。

32ビットDLLでは、_cdecl、stdcall、またはfastcallを使用してエクスポートされた大文字小文字を区別する宣言関数を使用することを覚えておくことが非常に重要です。DLLがEasyLanguageと互換性を持つためには、エクスポートされる関数は 大文字で作成され、_stdcallとして宣言されなければなりません。これらのエクスポート関数は、DLLファイルのEXPORTS .DEFセクション内にリストされている必要があります。関数プロトタイプから"_declspec (dllexport) "を使用することは、EasyLanguageがエクスポートされたDLL関数を見つけるのに十分ではありません。

例えば、以下の命令では、USER32.DLLというDLLに永久に配置されるMessageBeepという名前の関数を宣言しています。これはブール値(true/false)を返し、単一のパラメータであるintを期待するものである。

DefineDLLFunc: "USER32.DLL", bool, "MessageBeep", int;

データ型

EasyLanguageは、DLLに含まれる関数と情報を送受信するために使用できる多くの有効なデータ型をサポートしています。以下は、EasyLanguageがサポートするデータ型の一覧です。

基本データ型:

BYTE
1バイトの整数データ型です。

char
1 バイトの整数データ型。

int
4 バイトの符号付き整数データ型です。

WORD
2 バイト符号なし整数のデータ型。

long
4 バイトの符号付き整数データ型。

DWORD
4 バイト符号なし整数のデータ型。

float
4 バイトの浮動小数点データ型。

double
8 バイトの浮動小数点データ型。

BOOL
4 バイトのブーリアンデータ型。




Variants:


UNSIGNED LONG
DWORDと同じ。

VOID
「返された値がない」という意味。

ポインターの種類:


LPBYTE
BYTE へのポインター。

LPINT
intへのポインタ。

LPWORD
WORDへのポインタ。

LPLONG
LONGへのポインタ。

LPDWORD
DWORDへのポインタ。

LPFLOAT
float(floatFAR単位)へのポインタ。

LPDOUBLE
double(doubleFAR内)へのポインタ。

LPSTR
char へのポインタ。


すべてのポインタは32ビットポインタであり、EasyLanguageはそれぞれを同じように扱います。

また、EasyLanguageのすべての値は浮動小数点数であり、オープン、ハイ、ロー、クローズは整数であることを覚えておくことが非常に重要です。これらの価格を制御するには、チャートを構成するシンボルに価格目盛機能を送信する必要があります。

例えば、ある証券の価格スケールが1/1000で、最終価格が105.125であった場合、その価格は105125としてDLLに送信されます。DLLがこの価格の読み方を知るためには、予約語のPriceScaleで値を送る必要があり、この場合、値1,000を返します。
 
オメガは、DLL関数呼び出しのパラメータに必要なリソースが含まれていない可能性があります。以下はその例です :<br/ translate="no"> int TikKot(char *kotx, double *bid, double *ask, TDateTime *tim);
この行のデータ型 "TDateTime *tim" は Omega ではサポートしません。

これですべて納得です。この問題を回避するには、TDateTimeの代わりにOmegaでdouble型を 指定してみてください - すなわち、int TikKot(char, double, double, double); 実は、これらの型は簡単に交換可能で、それぞれ8バイトのメモリーを使用するのです。がんばってください。
 
OK、ありがとうございます。OmegaはNumericを要求しているが、DLLはtextを要求している "char "型はどうでしょうか?交換は可能ですか?
 
OK、ありがとうございます。OmegaはNumericを要求しているが、DLLはtextを要求している "char "型はどうでしょうか?と置き換えることができるのでしょうか?<br /> translate="no">。

なぜ?説明文にあります。
エルピーエスティーアール
charへのポインタ。

同じことなんです。Omegaのドキュメントに、このようなタイプの変数の例はあるのでしょうか?そこに似たようなバリエーションがないか、よく見ておく必要があります。がんばってください。
 
注意:32ビットのDLLでは、_cdecl, _stdcall , またはfastcallを使って宣言されたエクスポート関数は、大文字小文字を区別して使用されます。DLLがEasyLanguageと互換性を持つためには、エクスポートされる関数はすべて大文字で作成し、_stdcallとして宣言する必要があります。これらのエクスポートされた関数は、DLLの.DEFファイルのEXPORTSセクションにリストされている必要があります。関数のプロトタイプから "_declspec (dllexport)" を使用することは、EasyLanguage が DLL のエクスポートされた関数を見つけるのに十分ではありません。つまり、オメガは大きな文字で書かれたファンクションにしか対応できないと書いてある。別のDLLでどのように書かれているのか確認したところ、本当にBIG LETTERSでしか書かれていませんでした。


Functionsの呼び方(大文字の名前)を変えていただければ、さらにテストが可能です。個人的には御社の製品に非常に興味があり、御社への要望はDLLをOmegaに適合させることです。うまくいくといいのですが・・・。健闘を祈るそうでない場合は、ここに投稿してください。私は別のトレード自動化ソリューションに取り組まなければなりません。ありがとうございます。
 
<br / translate="no"> 関数の呼び出し(大文字の名前)を変更すれば、さらにテストができます。
個人的には御社の製品に非常に興味があり、御社への要望はDLLをOmegaに適合させることです。うまくいくといいのですが・・・。健闘を祈る

大きな機能文字でバリアントを作って送ってみました。がんばってください。
 
ありがとうございました!テストをして、結果を投稿します。