
エキスパートアドバイザ作成の特徴
MetaTrader 4取引システムでのエキスパートアドバイザの作成とテストにはいくつかの特徴があります。
ポジションを開く前に、アカウントに利用可能な資金があるか確認する必要があります。資金が不足している場合、ポジションオープンの操作は失敗に終わります。この時、"FreeMargin"の値のテストの時のみ、1ロットの金額が1000であるため、1000以上である必要があります。
if(AccountFreeMargin() < 1000) return(0); // 資金がない-戻る
Time、Open、Low、High、Close、Volumeなど定義済みの配列を使って、履歴データを利用することが出来ます。これらの配列のインデックスは終りから始めに向けて増加するようになっています。つまり、最後のデータはインデックスの値がゼロとなります。インデックス1は、1期間前にシフトしたデータ、インデックス2は2期間前、インデックス3は3期間前となります。
// もし前のバーのCloseが // これより先のCloseより小さい場合 if(Close[1] < Close[2]) return(0);
違う期間や違う通貨ペアによる履歴データも利用することができます。そういった履歴データを取得するには、事前に1次元配列を定義し、ArrayCopySeries機能を使いコピー操作を行う必要があります。関数を呼び出す際、より少ない数のパラメータをパスすることができ、デフォルトのパラメータ を指定しなくてもよいです。
double eur_close_m1[]; int number_copied = ArrayCopySeries(eur_close_m1, MODE_CLOSE, "EURUSD", PERIOD_M1);
任意の他のパラメータ作成時と同様に、エキスパートアドバイザを作成する際、いくつかの追加のデバッグデータを取り出すことが必要です。MQL4言語はいくつかのそのようなデータを取り出す方法を提供しています。
Alert機能はユーザによって定義されたデータを持つダイアログボックスを起動します。
Alert("FreeMargin grows to ", AccountFreeMargin(), "!");
Comment機能はチャートの左上の角にユーザによって定義されたデータを表示します。文字配列\nは改行の為に使用します。
Comment("FreeMargin is ", AccountFreeMargin(), ".");
Print機能はユーザによって定義されたデータをシステムログに保存します。
Print("FreeMargin is ", AccountFreeMargin(), ".");
GetLastError関数によってプログラムエラーを見つけることが出来ます。例えば、注文操作はチケット番号を返します。チケット番号がゼロに等しい場合(何らかのエラーが発生した)、エラーについての追加情報を明確にする為に、GetLastError関数を呼び出す必要があります。
int iTickNum = 0; int iLastError = 0; ... iTickNum = OrderSend(Symbol(), OP_BUY, g_Lots, Ask, 3, 0, Ask + g_TakeProfit * g_Points); if(iTickNum <= 0) { iLastError = GetLastError(); if(iLastError != ERR_NO_ERROR) Alert("Some Message"); }
GetLastError関数は最後に発生したエラーのコードを取得してエラー値をゼロ値に変換することに注意する必要があります。このため、この関数の繰り返しの呼出は、いつもゼロの値を返します。新しいバーの開始をどうやって定義したらよいのか?これにはいくつかの方法があります。
1つ目の方法は、バーの数のチェックに基づいた定義です。
static int prevbars = 0; ... if(prevbars == Bars) return(0); prevbars = Bars; ...
この方法は履歴のロード中に動作しないことがあります。つまり、バーの数が変わりましたが、『前の』バーはまだ作成されていません。この場合、1に等しい数値の間の差の検証を複雑化することがあります。
次の方法は、Volume値は各バーのティック数を元に作成され、初めのティックは再び形成されたバーのVolume値が1と等しいことを意味しています。if( Volume[0] > 1) return(0); ...
この方法は価格ティックが集中しすぎた場合に動作しないことがあります。入ってくる価格ティックの処理は別のスレッドで行われます。もしこのスレッドが次のティックが入る時にビジー状態の場合、プロセッサの過負荷を回避する為、このティックは処理されません!この場合、同様に、以前のVolume値の保存を使った検証が複雑化することがあります。
3つ目は、バー開始の時間に基づいた定義方法です。static datetime prevtime=0; ... if(prevtime == Time[0]) return(0); prevtime = Time[0]; ...
これは最も信頼性の高い方法です。どのような状態でも動作します。
CSV形式ファイルでの作業例:
int h1; h1 = FileOpen("my_data.csv", MODE_CSV | MODE_WRITE, ";"); if(h1 < 0) { Print("Unable to open file my_data.csv"); return(false); } FileWrite(h1, High[1], Low[1], Close[1], Volume[1]); FileClose(h1);
コードに対しいくつか説明をします。初めにCSV形式ファイルが開きます。ファイルが開かないエラーが発生した場合、プログラムは自動的に終了します。ファイルが正常に開いた場合、内容が削除され、データをファイルに書き込み、ファイルを閉じます。あなたが開いているファイルの内容を保持する必要がある場合は、MODE_READ口モードを使用する必要があります。
int h1; h1 = FileOpen("my_data.csv", MODE_CSV | MODE_WRITE | MODE_READ, ";"); if(h1 < 0) { Print("Unable to open file my_data.csv"); return(false); } FileSeek(h1, 0, SEEK_END); FileWrite(h1, High[1], Low[1], Close[1], Volume[1]); FileClose(h1);
この例で保存はファイルの終わりに行われています。これを行う為に、私たちはファイルが開かれた直後に「FileSeek」機能を使用しました。
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/1494



- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索