MetastockのDLLはゼロから作成します。 パート1

DLL  Metastock

Metastockは、おそらく市場のテクニカル分析で最も有名なプログラムです。 このプログラムは、CやPascalなどの従来のプログラミング言語の全機能を使用して、ユーザーが作成した外部DLLを接続して独自の取引戦略を作成できます。

インターネットで検索を行った後、このトピックに関する情報が完全に欠けていることに驚きました。 注目に値することが判明した唯一の記事:「Metastock Developer's Kitとは?」( Mdk )は、Delphiの簡単な例を説明していますが、MDKをダウンロードすることもできます。

この記事では、このギャップを埋めて、C / C ++の手順で外部関数のMetastockライブラリ(MSX DLL)を作成するプロセスについて説明します。 すべての例はVisual Studio 2010( part2part3 )で書かれています。



理論のビット



MSX DLLに実装されている関数は、Metastockの標準の組み込み関数とまったく同じように動作します。 すべてのMSX DLL関数は、データの配列を返します。 各外部関数には一意の名前があります。



ExtFml( "DLL Name.Function Name"、arg1、...、argn) 、ここで



arg1 ... argnは、関数の引数です。



各引数は、次の4つのタイプのいずれかです。

•データの配列(たとえば、Open、High、Low、Closeなど、または別の関数の結果)

•数値定数(5、-5、20.55など)

•文字列定数(たとえば、「He​​llo Woodpecker」など)

•カスタムセット(たとえば、シンプル、三角形など)

それらをどのように定義して使用するかについては、特定の例とともに後で検討します。



MSX DLLで定義されている関数は、2つのカテゴリに分類されます。

•初期化関数

•計算関数(または外部関数)。

初期化関数は、起動時にMetaStockによって呼び出され、使用可能な外部関数と必要な引数を決定します。 MetaStockユーザーは計算機能を利用できます。 すべての関数は、MSXStruc.hファイルで定義されたデータ構造を参照します。 このファイルは、DLLをコンパイルするために必要です。

独自の関数を記述する前に、MetostokがDLLと通信できるように、いくつかのMSXサービス関数(初期化関数)を登録する必要があります。 それらの4つがあります。

•MSXInfo-必要な機能。 これは、初期化中に常に呼び出され、DLLがMSX DLLであるかどうかを確認し、その基本情報(作成者、関数の数、バージョン)を返します。

•MSXNthFunction-必要な機能。 MSXInfoで指定された各関数に対して1回呼び出され、ゼロから開始して関数に番号を付けます。 関数の名前(大文字と小文字が区別されます)、その記述子、およびそれぞれの引数の数は次のとおりです。

•MSXNthArg-この関数は、関数に引数がある場合にのみ必要です。 関数の各引数の初期化中に呼び出されます。

•MSXNthCustomString-この関数は、関数にカスタム引数がある場合にのみ必要です。



理論を始めるために、最初のDLLの作成を始めましょう。 この例では、インディケーターに価格の配列、日付と時刻を表示する方法を示します。



コードを書く



VS 2010を開きます。最初に、空のプロジェクトを作成します。

[ファイル]-> [新規]-> [プロジェクト]-> [他の言語]-> [Visual C ++]-> [Win32]-> [Win32コンソールアプリケーション]。

ライブラリの名前を設定し(UsePriceを許可)、[OK]をクリックすると、Win32アプリケーションウィザードが開きます。

Next-> DLLと空のプロジェクトを確認し、Finishをクリックします。 空のプロジェクトが作成されました。 UsePrice.cpp、UsePrice.def、MSXStruc.hの 3つのファイルを追加します。 プロジェクトを右クリックして、「追加」->「新規アイテム...」を選択し、適切な拡張子を持つファイルを選択して、適切な名前を付けます。 追加をクリックします。

UsePrice.cppファイルにコードを記述します。



/ *

- ステップ1-ヘッダー

コメント
#includeディレクティブは、コンパイラに別のソースファイルを読み込むように指示します-

このディレクティブ自体が置かれているファイルに加えて。

ソースファイル名は二重引用符または山括弧で囲む必要があります。



Cライブラリ関数のヘッダー



* /

#include <string.h> #include <stdlib.h> #include <math.h> #include <float.h> #include <tchar.h> //   -  MSX Data Structures (.  MSXStruc.h). #include "MSXStruc.h"
      
      





/ *

- ステップ2-エクスポート

コメント
#defineディレクティブは、識別子と文字のシーケンスを定義します。

この識別子は、テキストで見つかったときに置き換えられます

プログラム。 識別子はマクロ名とも呼ばれ、プロセス

置換はマクロ置換と呼ばれます。 指令の標準タイプ

以下:



#define macro_name文字シーケンス



このステートメントにはセミコロンがないことに注意してください。 間

識別子と文字のシーケンスは任意の数字にすることができます

スペース。 マクロは改行でのみ終了します。



たとえば、値1にTRUE、0にFALSEを使用する場合、

その後、次の2つのマクロを宣言できます。



#define TRUE 1

#define false 0



その結果、コンパイラがプログラムテキストでTRUEまたはFALSEを検出した場合、

それらをそれぞれ1と0に置き換えます。

この場合、コードにDLL_EXPORTが見つかった場合、マクロが実行されます



extern "C" __declspec(dllexport)



名前のマングリングが欠落しているCにC ++コードを適切に結合するために導入

extern "C"。エクスポートされた変数/関数名に対してこのメ​​カニズムを無効にします。

extern“ C”は、単純な関数シグネチャ生成を使用することを意味します

(C言語のスタイルで)オブジェクトファイルを受信するとき。 特に、それは禁止しています

追加の関数名を「装飾」するC ++コンパイラー

DLLへのエクスポート時の文字。

dllexportストレージクラス属性は、Microsoft固有の拡張機能です

CおよびC ++言語。 関数、データ、およびオブジェクトのエクスポートに使用できます。

DLLに。

__declspec(dllexport)宣言子

この属性は、クライアントのDLLインターフェイスによって明示的に定義されます。

実行可能ファイルまたはその他のDLL。 関数宣言として

dllexportを使用すると、少なくともモジュール定義ファイル(DEF)なしで実行できます。

少なくともエクスポートされた関数の仕様に関して。



* /

 #define DLL_EXPORT extern "C" __declspec(dllexport)
      
      





/ *

- ステップ3-初期化関数

コメント
関数を書く前に、いくつかのサービスを登録する必要があります

MSXは、MetostokがDLLと通信できるように機能します。

最初の例では、引数なしで1つの関数を記述します。したがって、

MSXNthArgおよびMSXNthCustomStringは必要ありません。



MSXInfo

フィールド<VS 2010 C ++ MSX DLL、Copyright Pretzel、2014>を

著者情報、および関数の数= 1を設定します。

strncpy(strDest、strSource、count)-1行の文字を別の行にコピーします。

•strDestは、宛先文字列です。

•strSourceはソース文字列です。

•count-コピーする文字数。

strncpyには必須の<string.h>ヘッダーが必要です。

strncpyでは、VS C ++コンパイラは警告を生成します。

strncpy_s(チェック済み-すべて機能しますが、これがどれほど正しいかは言えません)。



* /

 DLL_EXPORT BOOL __stdcall MSXInfo (MSXDLLDef *a_psDLLDef) { strncpy (a_psDLLDef->szCopyright, "VS 2010 C++ MSX DLL, Copyright (c) Pretzel, 2014", sizeof(a_psDLLDef->szCopyright)-1); a_psDLLDef->iNFuncs = 1; //  . a_psDLLDef->iVersion = MSX_VERSION; //  return MSX_SUCCESS; }
      
      





/ *

コメント


MSXNthFunction

a_sFuncDef-> szFunctionNameにコピーされる値は完全に一致する必要があります

エクスポートする関数は大文字と小文字を区別します。

変数値:

•名前-関数の名前。

•説明-Metastockでの読み取り方法([貼り付け機能]ウィ​​ンドウ)。

•引数-関数への引数の数。

strcpyでは、VS C ++コンパイラが警告を生成します; strcpy_sを使用できます

(チェック-すべて機能しますが、これがどれほど正しいかはわかりません)。



* /

 DLL_EXPORT BOOL __stdcall MSXNthFunction (int a_iNthFunc, MSXFuncDef *a_psFuncDef) { BOOL l_bRtrn = MSX_SUCCESS; switch (a_iNthFunc) { case 0: strcpy (a_psFuncDef->szFunctionName, "Price"); strcpy (a_psFuncDef->szFunctionDescription, "FirstFunction"); a_psFuncDef->iNArguments = 0; //   break; default: l_bRtrn = MSX_ERROR; break; } return l_bRtrn; }
      
      







/ *

- ステップ4-機能



* /

 DLL_EXPORT BOOL __stdcall Price(const MSXDataRec *a_psBasic, const MSXDataInfoRecArgsArray *a_psArrayArgs, const MSXNumericArgsArray *a_psNumericArgs, const MSXStringArgsArray *a_psStringArgs, const MSXCustomArgsArray *a_psCustomArgs, MSXResultRec *a_psResult) { //     Close for (int i= a_psBasic ->sClose.iFirstValid; i<= a_psBasic ->sClose.iLastValid; i++) a_psResult->psResultArray->pfValue[ i ] = a_psBasic ->sClose.pfValue[ i ]; //    : // a_psResult->psResultArray->pfValue[ i ] = float (a_psBasic ->psDate[i].lDate); //  // a_psResult->psResultArray->pfValue[ i ] = float (a_psBasic ->psDate[i].lTime); //     . return MSX_SUCCESS; }
      
      





次に、 UsePrice.defファイルに、次のコードを入力します。



 LIBRARY UsePrice EXPORTS MSXInfo MSXNthFunction Price
      
      





MSXStruc.hにコードを入力します。

MSXStruc.h


 #ifndef MSX_Structures_h #define MSX_Structures_h /* Structures required for MetaStock External Function DLL interface */ #ifndef BOOL typedef int BOOL; #endif #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif // -------------------------------------------------------------------------- // Return this DLL version constant // -------------------------------------------------------------------------- const int MSX_VERSION = 1; // -------------------------------------------------------------------------- // Maximum number of aguments // -------------------------------------------------------------------------- const int MSX_MAXARGS = 9; // -------------------------------------------------------------------------- // Maximum string size (does not include MSXString arguments passed in to // external functions). // -------------------------------------------------------------------------- const int MSX_MAXSTRING = 100; // -------------------------------------------------------------------------- // The following two BOOL return values are returned from MSX functions // -------------------------------------------------------------------------- const BOOL MSX_SUCCESS = FALSE; const BOOL MSX_ERROR = TRUE; // ---------------------------------------------------------------------------------------- // There are four potential argument types // ---------------------------------------------------------------------------------------- const int MSXDataArray = 0; const int MSXNumeric = 1; const int MSXString = 2; const int MSXCustom = 3; // ---------------------------------------------------------------------------------------- // The following structure is used by the exported function MSXInfo // ---------------------------------------------------------------------------------------- typedef struct { char szCopyright[MSX_MAXSTRING]; int iNFuncs; int iVersion; } MSXDLLDef; // ---------------------------------------------------------------------------------------- // The following structure is used by the exported function MSXNthFunction // ---------------------------------------------------------------------------------------- typedef struct { char szFunctionName[MSX_MAXSTRING]; char szFunctionDescription[MSX_MAXSTRING]; int iNArguments; } MSXFuncDef; // ---------------------------------------------------------------------------------------- // The following structure is used by the exported function MSXNthArg // ---------------------------------------------------------------------------------------- typedef struct { int iArgType; // argtype constants: // 0 DataArray // 1 Numeric // 2 String // 3 CustomType char szArgName[MSX_MAXSTRING]; int iNCustomStrings; } MSXFuncArgDef; // ---------------------------------------------------------------------------------------- // The following structure is used by the exported function MSXNthCustomString // ---------------------------------------------------------------------------------------- typedef struct { char szString[MSX_MAXSTRING]; int iID; } MSXFuncCustomString; // ---------------------------------------------------------------------------------------- // the following datastructures are passed into and out of the user-written external // calculation functions. // ---------------------------------------------------------------------------------------- typedef struct { long lDate; long lTime; } MSXDateTime; typedef struct { float *pfValue; int iFirstValid; int iLastValid; } MSXDataInfoRec; typedef struct { MSXDateTime *psDate; MSXDataInfoRec sOpen; MSXDataInfoRec sHigh; MSXDataInfoRec sLow; MSXDataInfoRec sClose; MSXDataInfoRec sVol; MSXDataInfoRec sOI; MSXDataInfoRec sInd; char *pszSecurityName; // Security Name char *pszSymbol; // Security Symbol char *pszSecurityPath; // Path where security is stored (may be in UNC format) char *pszOnlineSource; // Unused - reserved for future use... int iPeriod; // 'D'aily, 'W'eekly, 'M'onthly, 'Q'uarterly, 'I'ntraday int iInterval; // For period='I'ntraday only. 0=tick, other value = minutes compression. int iStartTime; // HHMM format. Undefined for non-intraday period. int iEndTime; // HHMM format. Undefined for non-intraday period. int iSymbolType; // Unused - reserved for future use } MSXDataRec; typedef struct { // possible for MSX_MAXARGS data arrays MSXDataInfoRec *psDataInfoRecs[MSX_MAXARGS]; // pointers to the data arrays int iNRecs; // number of arrays present (just a sanity check) } MSXDataInfoRecArgsArray; typedef struct { float fNumerics[MSX_MAXARGS]; // possible for MSX_MAXARGS numerics int iNRecs; // also a sanity check - func knows how many there should be. } MSXNumericArgsArray; typedef struct { char *pszStrings[MSX_MAXARGS]; // possible for MSX_MAXARGS strings int iNRecs; // ditto the above } MSXStringArgsArray; typedef struct { int iCustomIDs[MSX_MAXARGS]; // numeric ID associated with a custom arg int iNRecs; // ditto the above } MSXCustomArgsArray; typedef struct { MSXDataInfoRec *psResultArray; // Pointer to result array char szExtendedError[MSX_MAXSTRING]; // Extended Error string } MSXResultRec; #endif
      
      







Visual Studioで、[ビルド]-> [ソリューションのビルド(F6)]をクリックし、DLLを取得します。 Metastock'eの「External Function DLLs」フォルダに送信し、使用できます。 インジケーターは次のようになります。



ExtFml( "UsePrice.Price")



次のパートでは、関数を検討し、引数を接続し、例外を追加して、データを外部環境に出力します。



All Articles