MetaTrader4のスクリプトをNetTradeX Advisorsへ変換

はじめに

多数のエキスパートアドバイザーとスクリプトがMetaTrader4取引プラットフォームに対応するように作成された。従来は、同じコードをNetTradexプラットフォームで使うために、MT4用のスクリプトは一から書き直す必要があった。このライブラリは、MQL4言語とNTL+言語の互換表となります。本ライブラリーを利用すればスクリプト変換の流れがシンプルになります。基本的に、互換の大部分がMQL.ntlのライブラリーに変換されますが、トレーダーが手動で書き直す場合もあります。この記事は、変換するためのライブラリーの機能とオプションの説明をします。

MQL4.ntlライブラリーについて豆知識

MQL言語で作成したスクリプトに間違いのないか確認した上、NTL+言語のスクリプトへ変換します。

ステップ1:NetTradeX Advisorsにおいてナビゲーター画面のスクリプト・ツリーに新規のスクリプトファイルを作成します。スクリプトのファイルはスクリプトのによりAdvisorsまたはUtilitiesのファイルに保存してください。その後、MQL4のスクリプトを保存したファイルにコピーします。

ステップ2:MQL2.ntlライブラリーの実行。そのため、使ったファイル名の頭に#include "Libraries\MQL4.ntl"を追加してください。

ステップ3:ファイルのコンパイル。コード編集画面に「Compile」ボタン、あるいはF7を押してください。おそらく、ミス・間違いその他のメッセージが出ますが、今の時点ではコンパイラ(コード変換プログラム)がライブラリーを読み込めるか、を確認します。

コンパイラがライブラリーを読み込めなければ、「Failed to open script file」(スクリプトファイルが開きません)のメッセージが出ます。この場合は、MQL4.ntlの保存先とファイル名は #includeと一緒だと確認してください。

MQL4言語の特殊の関数はinit(), start(), deinit()。NetTradeX Advisorsターミナルで実行させるために同じような関数が入れないといけませんが、一つか二つの関数が不足していれば、コンパイラが「No matching signatures to 'init()'」あるいは「No matching signatures to 'deinit()'」のメッセージが出ます。この場合は、return 0オペレーターのあるinit() とdeinit()の関数を追加してください。

int init()
{
	return 0;
}
int deinit()
{
	return 0;
}

「Failed to open script file」と「No matching signatures to 'init()'」 / 「No matching signatures to 'deinit()'」のメッセージがなければ、一次設定が無事に完了しました。

コンパイラのよく出るメッセージの一覧とその解決方法

No matching signatures to Print

NTL+言語で可変パラメーターが使用不可なので、変換されたパラメーター数は元のパラメーター数と一致するようにしてください。Print()関数のパラメーター値は一つしかならない。元のPrint(パラメーター1、パラメーター2、パラメーター3)Print(パラメーター1+パラメーター2+パラメーター3)に変換します。

Unexpected token ('unrecognized token')

#include ディレクティブを通じてMQL4のライブラリーを追加しようとする時に出ます。NTL+言語はこのライブラリーが読み込めないわけです。そのため、スクリプトからこのコードを削除してください。

'True'/'False' is not declared

NTL+の理論変数は小文字で入力されますので、Trueをtrueへ、Falseをfalseに変換してください。

No conversion from '_bars&' to 'int' available

MQL4言語でBars変数は現行のグラフのローソク足の数を決定するために使われますが、NTL+のBars変数の利用方法が違います。そのためローソク足の変数を小文字のbarsにしてください。

Must return a value

戻り値のない'return'オペレーターが呼び出される場合、このメッセージが出ます。このオペレーターが入っている関数はvoid と違う戻り値を出します。この場合は、関数を直すか、もしくはreturnの値を指定することが必要です。

マジックナンバー(Magic number)の使用

現在のNTL+バージョンはマジックナンバーの使用を対応していません。全てのオープンポジションのマジックナンバーの戻り値は0となります。通常は、この関数の削除が解決になります。

固定変数

NTL+では「static」という言葉が使われていません。変数を固定するために、その変数をグローバル(「static」言葉なし)にしてください。EAのローンチ又はEAの稼動中に編集が必要になったらextern修飾子を追加したほうがいいです。

ロットサイズの設定

現行バージョンは、全取り扱い商品のロットサイズは100000通貨単位となります。違うロットサイズの商品をトレードする場合、ロット量に該当する変数を選抜し必要なロット量を変数に書き込んでください。

DLLファイルの操作

NetTradeX AdvisorsとMetaTrader4のDLLファイルの操作が異なります。MQL4の場合は、DLL内の関数を明確に説明すべきですが、NTL+言語でこの説明が省略されています。MQL4の

#import "ファイル名またはパッケージ名"
    function1の説明;
    function2の説明;
    functionNの説明;
#import

の代わりに、dllの 任意の識別子("ファイル名またはパッケージ名");を作成し、必要な関数を
識別子.Call("関数名",コンマで区切った関数の引数;)
又は
識別子.CallProc("ファイル名",コンマで区切った関数の引数);で呼び出してください。

予約言葉のチェック

MQL4の予約言葉がNTL+言語で使用していない変数名や関数名で表示できます。例えば、コンパイラは括弧が必要のないExpected '(' (括弧付け)のメッセージを出すこともあります。理由の一つは変数名が予約言葉と一致することです。この場合は、変数名を全箇所で変更してください。Replace画面を呼び出すためにCtrl+Hを押します。

Float value truncated in implicit conversion to integer

float型またはdouble型の数値をint型の変数に代入する時、このメッセージが出ます。スクリプトを実行させるため必須ではありませんが、望ましいです。Double型の数値とfloat型の数値をint型の数値へ変更するときは、全ての操作を明確にしなくてはいけません。例えば、変換したdouble型のd変数はint(d)の形になります。

Boot型の変数からintへ(逆も同様)自動的変換なし

NTL+言語ではint i; bool b = true; i=b;のような変換が不可能です。Can't implicitly convert from 'bool' to 'int'というエラーが出ます。この変換が必要になる場合、以下の構造を使ってください。

int Run()
{
	// convertion from bool to int;
	bool a=false;
	int b = a?1:0;
	
	// convertion from int to bool
	int c=1;
	bool d = c==0?false:true;
}
Can't implicitly convert from 'datetime' to 'int'

NTL+言語で下記の例のようにdatetimeオブジェクトをint変数に変換できます。int i; datetime d; i=int(d);

カラー定数

MQL4言語にカラーコンポーネントがあります。このカラー定数は「White」や「Black」のように色を表し、基本16色をコードへ書き込めます。グラフィックインディケーターの場合のみ、NTL+言語が読み込めない色をRGB値を使用して表記しにくてはなりません。例えば、トマトの色は以下のように表します。color Tomato = 0xFF6347

データの処理

MQL4とNTL+言語のデータ処理が異なります。NTL+言語はデータ類 名前[]のコードがインジケーターの処理のためにのみ使用されます。他のデータが array "データ類" 名前;あるいは array "データ類" 名前 (サイズ) で表示されます。故に、string symb[3] = {"EURUSD", "GBPUSD", "AUDCAD"};の代わりにarray "string" symb= {"EURUSD", "GBPUSD", "AUDCAD"}; を使います。

未対応関数の一覧(一部):

  • SendMail()
  • onArray関数群
  • FileOpenHistory, FileIsLineEnding関数
  • objects関数群
  • 以下のモードにMarketInfo関数が0を返します:
    • MODE_SWAPLONG
    • MODE_SWAPSHORT
    • MODE_STARTING
    • MODE_EXPIRATION
    • MODE_MINLOT
    • MODE_LOTSTEP
    • MODE_SWAPTYPE
    • MODE_PROFITCALCMODE
    • MODE_MARGINCALCMODE
    • MODE_MARGININIT
    • MODE_MARGINHEDGED
    • MODE_FREEZELEVEL
  • gotoオペレーター
  • iCustomインジケーターの値を算出する関数
  • (Window functions)画面, MessageBoxを操作するための関数群
  • TerminalCompany(), TerminalName(), TerminalPath()
  • #propertyのパラメーター

終わりに

本記事は、MetaTraderのスクリプトをNetTradeX対応スクリプトを変換する時に起こる一般的な問題点について説明しました。取引プラットフォームに追加しているMQL4.ntlライブラリーを利用する際にその変換プロセスがより簡単になります。このライブラリーの最大利点は、完全編集可能なコードです。トレーダーが自分でそのコードが編集できます。今後ともライブラリーのデーターベースを更新していきます。



なぜアイエフシー?