NTL+言語でEAプログラミングの基礎


はじめに

下記の説明書はNTL+言語でEA(エキスパート・アドバイザー)の初プログラミングするお客様向けです。

NTL+のスクリプトはプログラムを3種類含めています。それは、エキスパート、インジケーターとユーティリティです。


EA作成

新規EAを作成するために「ナビゲーター」ウィンドウ内の「エキスパート・アドバイザー」に右クリックし、出た一覧から「作成」を選択。出たダイアログボックスに新規EAの名を入力。OC Windowsと同様に、*|\:"< >?/の記号は使用不可。


新規EAのファイル作成が完了したら、3つの関数(Initialize[初期化](), Run[実行](), DeInitialize[解放]())のある初期設定画面が自動的に出ます。


EAをスタートしたら、パラメーターを初期化するInitialize()関数が呼ばれます。初期化する時にパラメーター(例えば、買い売りの価格、ポジション及び注文関連の情報等)がまだ設定されていない可能性がありますから、その画面で取引をしないよう方がいいです。


ティックが変わる毎に、主なスクリプトコードの記述されているRun()関数が呼ばれるという仕組みになっています。このコードは市場状況の分析や取引実行用判断、さまざまな算出などを行います。各ティック情報の処理時間は10秒以内のはずです。10秒を超えた場合は、EAが自動停止されます。


EAが停止されたら、DeInitialize()関数が呼ばれます。この関数は、スクリプト停止直前の最終操作を行います。多数のスクリプトは、初期化と解放の関数がなくても稼動するので、Initialize() とDeInitialize()関数をカラにしても、削除してもいいですが、この場合はツールから自動的に呼ばれることもなくなります。


アルゴリズム・EAコード作成

第一ステップは、EAが実行させるアルゴリズムの作成です

このアルゴリズムは、変更・訂正・最適化をしやすくするために、最初から分かりやすく明確な仕組みで作成しなければなりません。


まず、取引基準(取引開始、取引決済、方向(売り・買い)選択条件、オープンポジションの本数制限有無など)の設定が必要です。EAによる未決注文の自動設定を可能にしたら、既存の注文の訂正及び取消のオプションを検討した方が良いです。


EA全体の効率性はポジション開始・決済に関する条件の最適性によります。売買条件はテクニカル・インディケーターや価格水準分析などのお客様の効率的な投資のイメージに基づきます。


EA稼動への手動介入方法をも熟考してください。例えば、EAにより開設されたポジションを取引ツールで閉鎖したらどうなるか、実行中EAに手動介入したら、EAは異常が出ないか、という質問に答えてみて下さい。


正確なEA稼動のために、オープン・ポジションと各ティックに設定した未決注文の現状を分析する必要があります。そのためにオープン・ポジションと未決注文の総回数を示すDeals.TotalOrders.Total、及びポジション選択・注文の発注タイミングを決定するDeals.Select()とOrders.Select()関数を使用します。


取引ツールの再起動後、EAがうまく稼動しているか、ご確認ください。

【注意】再起動の間で損切り・利食いでポジションの決済または未決注文の決済に伴う新規ポジション開始が行われる可能性があります。


標準エラーに対応する行動も検討する必要です。

標準エラーの例)資金不足、現行価格に近すぎる時の発注など


口座関連情報は、「Account」タブとその内の一覧から引っ張られます。「Account.Balance」は口座資金を、「Account.Margin.Free」は有効証拠金を表示します。


int Run() { // 変数(ベース通貨建て資金額)を初期化 int volume = 10000; if(Account.MarginFree < volume/Account.Leverage) return -1; } 【注意】«return -1»はEAを強制終了させる関数です。

為替レート過去データ

市場状況を分析するために、時系列データを通じて通貨ペアの過去データが引っ張れます。使用する時系列は大きなサブ・グループからなっています。それは、Open[]-バーの始値、Close[]-バーの終値、High[]-バーの高値、Low[]-バーの安値、Time[]-バーの開始時刻、Volume[]-バーの出来高(ティック数)。

EAで運用する通貨ペアのグラプには、全時系列データが有効です。通常、時系列は降順(最新のエントリーが常に上に来るように)に並べています。故に、上にある値は0、下にある値は Bars.Total(Chart.Symbol, Chart.Interval) -1 になります。

他の商品に関するデータを引っ張る時は、またBars関数を利用します。通貨が指摘されたケース(上記のケース)と同様に、Open[]、Close[]、High[]、Low[]、Time[]、Volume[]のデータがありますが、通貨ペア、バーの期間と番号を指摘しなければなりません。スクリプトを実行する前に、相場ウィンドウを呼び出し、空のところに右クリックし、出た一覧からSubscribeを選択し、該当欄にチェックを入れる必要があります。


バーの開始と前のバーの完成のタイミングが分かるためにVolume関数を使います。ティックが変わる度に、Volume[0]の値に1単位が足しますが、新バーの最初のティック後は「1」になります。すると、バーの開始時刻が分かるために下記のようにコードを書き込んでよいです 。


int Run() { if(Volume[0]==1) { // ティック時点で実行される新バー開始のコード } }

Run()関数を実行させるために「1」以外にVolume[0]の全ての値に対してもreturnオペレーターが使えます。


int Run()
{
	if(Volume[0]>1)
		return (0);
		
	// ティック時点で実行される新バー開始のコード
}

別の方法は、新バー開始の時刻の分析。直前の2本のティックの時刻が一致した場合は、スクリプトを閉じるためにreturn(0)オペレーターを使用します。新しいローソク足が形成される時、現行のローソク足のTime[0]値と直前のローソク足のTime[0]値が異なってきます。それは新しいローソク足の開始を示唆します。


datetime lasttime=0; int Run() { if(lasttime == Time[0]) return(0); // ティック時点で実行される新バー開始のコード lasttime = Time[0]; }

EAのバックテスト

バックテスターであるAdvisor Testerはエキスパートが正しく動作するかどうか確認するテストです。メニューバーの「View」→「Advisor Tester」で実行。テスター画面の上に下記のタブが並んでいます。


  • Parameters - テスターのパラメーター
  • Results – 項目別の結果表
  • Equity Graph - 口座残高と口座資金のグラフ
  • Journal – 操作履歴

パラメーター

「パラメーター」タブで下記の重要なパラメータが設定できます。


  • Advisorのドロップダウン・リスト – テスト実行対象のインジケーターの選択
  • Propertiesのボタン – エキスパート修正のパラメーターの呼び出し。extern修飾子のないアドバイザーなら、このボタンが無効。
  • Symbol - テスト用記号*.
  • Interval – テスト用時間足.
  • Spread - スプレッド値の選択。Current spreadは現在のスプレッドに相当します。Spread欄に任意の正の値が入力できます。
  • Method -テスト方法。下記の選択肢の中から選べます。Control Points 、それともOpen Price OnlyControl Pointsを選ぶと、各ローソク当たりにティック4本が形成されます。終値が始値より高い場合、ティックは始値(Open)→高値(High)→安値(Low)→終値(Close)に相当します。終値が始値より安い場合、ティックは始値(Open)→安値(Low)→高値(High)→終値(Close)を相当します。
    img
    Open Prices Onlyを選ぶと、全ての操作は始値のみを含めます。0でインデックスされた時系列の要素は等しくなります。始値[0] = 高値[0] = 安値[0] = 終値[0]。0インデックスでない時系列の要素はControl Pointsの値と等しくなります。
  • Limit Datesボックスにチェックを入れたら、テスト用の期間が指定できるようになります。
  • From(から)To(まで)の指定欄はテスト用の期間を設定するために使います。デフォルトでダウンロードしたデータの期間が設定されます。
  • Initial Deposit – テスト開始時点の残高(初回資金)
電話