本ブログは、MetaTrader を利用して、EA プログラムを自作紹介するサイトです。
決して儲かるシステムを紹介するものではありませんのであしからず・・・
もし、記事中に嘘偽りを発見された方、ご連絡頂けると幸いです。
なお、過去に作成した EA プログラムの作り方はこちらになります。

Loop_Entry : 同じ指値エントリーを繰り返し実行するプログラムです。
estTurn : 高値(安値)で反対売買を実行するプログラムです。

2008年8月30日土曜日

バックテスト結果の見方

前回、とりあえず買い注文を出すプログラムを作ってバックテストしてみました。

どんな結果になったかを説明すると同時にバックテスト機能の使い方についても見て行きたいと思います。

バックテストを実行すると、テスターウィンドウに「結果」「Graph」「レポート」といったタグが表示されます。

結果タグには、過去のデータを使って注文したり決済したりした結果が時系列で表示されます

表形式で各列にはタイトルもありますので大体わかると思います。

今回のプログラム実行結果を見ながら各列を説明してみると、まず、一番左側の”#”は、処理NOであり、プログラムによって注文されたり、利益確定や損きり処理などされたときの処理番号になります。

次に”時間”の列ですが、これは各行の処理が行われた日時を表しています。今回は”Daily”モードで動かしていますので、注文処理は1日1回のタイミングで処理されています。

次は”取引種別”ですが、ここでは取引の種別を次のように表しています。

buylimit : 指値買い注文
buy : 買い
t/p : 利益確定決済
delete:注文取消し
close at stop:ストップロス?

取引種別には他にもあるみたいですが、プログラムの結果を見てみると、最初は全て BUYLIMIT (指値買い注文)が続いています。

"Test1"プログラムでは注文をする場合の条件を特に付けていないので、プログラム実行タイミング(Tickが変動する度)がくる度に注文してしまっています・・・

次に注文番号欄ですが、こちらはプログラムにより注文処理された際に番号が割り振られていき、その注文に対して処理がなされた場合に、該当する注文 NO が、この注文番号欄に表示されます。

つまり、処理 NO 3880 の行を見てみると、注文番号欄に 1 が表示されていますので、注文 NO 1 の内容に従い、買いポジションを持つ処理が行われたことになります。


あとは、タイトルとおりの内容になります。

Graphタグには、取引期間中の資産履歴がグラフで表示されます。横軸に時間、縦軸に資産という形になりますので、グラフの線が右肩上がりになれば、どんどん資産が増えることを意味します。

ちなみに、青い線と緑の線が表示されていますが、青い線が資産履歴を表しているみたいですが、緑いの線は、何を表しているのでよくわかりません・・・(あとでもうちょっと調べてみます)



今回のプログラムの結果を見てみると、見事に上がり続けてはいますが・・・

レポートは次回に。

2008年8月23日土曜日

注文ルール

注文の書き方は大体分かりました。

では早速、今まで作成してきた”Test1”プログラムを使って、注文するプログラムを作ってみます。

まず、どのような注文ルールにするかを決めたいと思います。

あるメールマガジンサイトで紹介されていた手法を前からやってみたいと思っていましたので、そのルールに沿ったプログラムを作ってみたいと思います。

そのルールとは、「相場が一定のレンジ内で上がったり下がったする時に、買いと売り注文のセットを繰り返す」というものです。

と言葉で書いただけでは?でしょうから、下の図で説明すると


「109.65 円で買って 109.85 円で売る」という注文を繰り返したいのです。

すると赤丸の部分(109.65)で”買い”、青丸の部分(109.85)で”売り”が成立するようになり利益が獲得できるというルールです。

これをプログラムするにはどうすればよいでしょうか?

まずは前回調べた OrderSend() を使って注文を書いてみます。

注文内容としては、次のようになります。

・注文する通貨ペアは"USDJPY"
・注文方法は指値買い
・ロット数(取引数)は 1 万通貨
・指値は 109.65 円
・スリッページは 3 Pips
・損きり価格は無し
・利食い価格は 109.85 円
・コメントは無し
・識別番号は無し
・有効期限は無し
・チャートの色は緑

これを OrderSend() で書いてみると

OrderSend("USDJPY",OP_BUYLIMIT ,0.1,109.65,3,0,109.85,NULL,0,0,Green);

となります。

上記 OrderSend を書く場所は、int Start() の部分になるので、”Test1”プログラムに次のように書きます。

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
// Print("Test1プログラムを実行しています");
OrderSend("USDJPY",OP_BUYLIMIT,0.1,109.65,3,0,109.85,NULL,0,0,Green);
//----
return(0);
}
//+------------------------------------------------------------------+

なお、"Test1プログラムを実行しています"の文字を画面に表示する必要はもうないため、削除するか、左端にスラッシュ("/")を2つ入れてコメント状態にします。

これでコンパイルをすれば、とりあえず注文はできるはずです。

それでは早速注文してみようと思いましたが、デモ用のIDとはいえ、さすがにいきなり取引しては何がおきるか分かりませんので、バックテスト環境でまずは取引してみます。

バックテスト環境での動かし方は以前ご紹介したように、MetaTrader のメニューバーから<表示>-<Strategy Tester>を選択します。

前回と同じように「セッティング」タグにて次の内容を指定してスタートボタンをクリックします。

・Expert Advisor:”Test1, Copyright ・・・”
・通貨ペア :”USDJPY, US Dollar vs Japanese Yen”
・期間 :”Daily”
・モデル :”Open prices only (fastest method to ・・・”

では、実行!!

おっ、注文してるしてる!!って注文しすぎだろ!!

結果の詳細は次回に。

2008年8月16日土曜日

注文の書き方

では、自動売買に必要となるであろうプログラムを試していきたいと思います。

何はともあれ、注文するプログラムを作ってみます。

注文する時のプログラムの書き方が分からなかったので、Google で”MetaEditor と 注文”をキーワードにネットで調べてみると、”OrderSend()”というものを使ってプログラムを書くことが分かりました。

MetaEditor の Navigator ウィンドウの Search タグにて”OrderSend()”を検索してみると Help タグに詳しい説明が表示されます。

ヘルプの中には具体的なプログラムの書き方も紹介されており、次のように記載されています。

いろいろ書いてありますが、とりあえず必要なのは OrderSend(); の行みたいなので、この部分だけカンマごとに分解してみます。

OrderSend(
Symbol(), //通貨ペア
OP_BUY, //注文方法
1, //ロット数(取引数)
Ask, //売買価格
3, //スリッページ
Ask-25*Point, //損きり価格
Ask+25*Point, //利食い価格
"My order #2", //コメント
16384, //識別番号
0, //有効期限
Green //チャート上矢印の色
);

大体見聞きしたことがある言葉ばかりだと思いますが、OrderSend は括弧の中で指定された内容に従い注文をします。

また、注文内容の指定順番は決まっており、カンマで区切って指定する形になります。

それぞれの指定内容について、もう少し詳しく見ていきます。

[通貨ペア]
注文したい通貨ペアを指定します。指定の種類としては次のようになります。

指定内容 : 通貨ペア
----------------------------
"EURUSD" : ユーロ・ドル
"USDJPY" : ドル・円
"EURJPY" : ユーロ・円

そのため、”ドル・円”で取引をしたい場合には、

OrderSend("USDJPY",・・・);

と書きます。

#通貨ペアは文字で指定する必要があるためダブルクォーテーション("")で囲みます。

なお、サンプルに記載されている「Symbol()」は、プログラムを連動させているチャートと同じ通貨ペアを指定する場合の記述方法になるようです。


[注文方法]
注文方法を指定します。指定の種類としては次のようになります。

指定内容 : 注文方法
--------------------------------------------------
0 : 成り行き買い
1 : 成り行き売り
2 : 指値買い
3 : 指値売り
4 : 逆指値買い
5 : 逆指値売り

そのため、「指値買い」で取引したい場合には

OrderSend("USDJPY",2,・・・);

と書きます。

#注文方法は数値で指定する必要があるためダブルクォーテーション("")では囲みません。

また、次のような指定方法もできます。

指定内容 : 注文方法
------------------------------------------------------
OP_BUY : 成り行き買い
OP_SELL : 成り行き売り
OP_BUYLIMIT : 指値買い
OP_SELLLIMIT : 指値売り
OP_BUYSTOP : 逆指値買い
OP_SELLSTOP : 逆指値売り

そのため、次の注文方法の指定は、同じ「指値買い」を意味しています。

OrderSend("USDJPY",OP_BUYLIMIT,・・・);


[ロット数]
売買数量を指定します。1 ロット当たり 10 万通貨となりますので、1 万通貨の場合には、0.1 を次のように指定します。

OrderSend("USDJPY",OP_BUYLIMIT ,0.1,・・・);

#ロットは数値を指定する必要があるためダブルクォーテーション("")では囲みません。


[売買価格]
売買価格を指定します。指定の仕方として売買価格(105.25)を直接指定する場合

OrderSend("USDJPY",OP_BUYLIMIT ,0.1,105.25,・・・);

と書きます。

#売買価格は数値を指定する必要があるためダブルクォーテーション("")では囲みません。

なお、上記は価格を直接記載する方法ですが注文時に計算(情報取得)させる記載方法もあります。

チャート表示されている通貨ペアの注文時レート(売り値)で指定する場合
OrderSend(Symbol(),OP_BUYLIMIT ,0.1,Ask,・・・);

チャート表示されている通貨ペアの注文時レート(買い値)で指定する場合
OrderSend(Symbol(),OP_BUYLIMIT ,0.1,Bid,・・・);

Ask」と「Bid」はプログラムを連動させているチャートの通貨ペアの現在レート価格を取得する書き方のため、一番最初に指定する「通貨ペア」も”Symbol()”を指定することになると思われます。


[スリッページ]
スリッページの許容範囲を指定します。Pips で指定します。

3 Pips (USDJPYならば 0.03円)までを許容する場合には

OrderSend("USDJPY",OP_BUYLIMIT ,0.1,105.25,3,・・・);

と書きます。

#スリッページは数値を指定する必要があるためダブルクォーテーション("")では囲みません。


[損きり価格]
損きり価格を指定します。損きり価格を設定しない場合には 0 (ゼロ)を指定します。

OrderSend("USDJPY",OP_BUYLIMIT ,0.1,105.25,3,0,・・・);

価格(105.00)を直接記載する場合には

OrderSend("USDJPY",OP_BUYLIMIT ,0.1,105.25,3,105.00,・・・);

と書きます。

#損きり価格は数値を指定する必要があるためダブルクォーテーション("")では囲みません。

なお、上記は価格を直接記載する方法ですが注文時に計算(情報取得)させる記載方法もあります。

注文時に計算した結果を損きり価格として指定する場合には

OrderSend(Symbol(),OP_BUYLIMIT ,0.1,Bid,3,Ask-25*Point,・・・);

などと書きます。

これは「注文時レート価格(売値)から 25 ポイント引いた価格を損きり価格とする」を表しています。

”ポイント(Point)” とは、プログラムを連動させているチャートの通貨ペアの最小単位を取得する書き方で、”USD/JPY”の場合には「0.01」になります。

つまり、注文時レート価格(売値)が 105.25 ならば、損きり価格は「105.00」になります。

Ask - 25 * Point
105.25 - 25 * 0.01 = 105.00

#上記計算式の * は掛け算を意味します。


[利食い価格]
利食い価格を指定します。利食いを設定しない場合には 0(ゼロ) を指定します。

指定の仕方は[損きり価格]の場合と同じです。


[コメント]
注文時の履歴情報としてコメントを残す場合に指定します。

#コメントは文字を指定する必要があるためダブルクォーテーション("")で囲みます。

MetaTrader は以前作成した”Test1”プログラムのように、注文時の結果を自動的に画面に表示する仕組みの様子です。 その際に、この「コメント」欄に記載された内容が表示されます。


[識別番号]
注文を識別するための番号を指定します。複数の注文をする場合や、後から注文したものを特定する場合に有効な情報です。不要であれば 0(ゼロ) を指定します。

#識別番号は数値を指定する必要があるためダブルクォーテーション("")では囲みません。


[有効期限]
注文の有効期限を指定します。指値注文と逆指値注文の時のみ有効であり、期限を設けない場合には 0 (ゼロ)を指定します。

有効期限を指定する場合には、Navigator ウィンドウの Dictionary タグ にて「MQL4 Reference」-「Basics 」-「Data types」-「Datetime constants」を選択し、サンプルとして記載してある各種日時指定方法を参考にします。


[チャート上矢印の色]
チャート上に表示される注文印の色を指定します。MetaTrader では、プログラムが連動しているチャート上に、注文が成立した日時ならびに価格情報を矢印で表現してくれます。

色を指定する場合には、Navigator ウィンドウの Dictionary タグ にて「MQL4 Reference」-「Basics 」-「Data types」-「Color constants」を選択し、サンプルとして記載してある各種色指定方法を参考にします。

なお、Color constants ページ内にある「Web colors set」リンク部分をクリックすると実際の色を見比べながら指定すべき文字を検索できます。



長くなりましたので実際の注文は次回にします。

2008年8月6日水曜日

プログラムの起動と終了

とりあえずプログラムを動かすことを体験できました。

とは言っても、とりあえず動かすことを目的に、画面にメッセージを表示するという実際の売買には余り役に立たないプログラムでしたので、もう少し役に立つプログラムを書いてみたいと思います。

その前に、後で調べようと思っていたことを先に整理しておきます。

まず、”Test1”プログラムを作成した際に、次のような行を書きました。

Print("Test1プログラムを実行しています");

これは、MetaTrader 画面の ターミナルウィンドウ内の Expert タグにメッセージを表示するためのものですが、書いた場所に注目してみます。

//+------------------------------------------------------------------+
// expert start function
//+------------------------------------------------------------------+
int start()
{
//----
Print("Test1プログラムを実行しています");
//----
return(0);
}
//+------------------------------------------------------------------+

int start() って何でしょう?

MetaEditor では、疑問に思った箇所にカーソルを合わせて F1 キーを押すと、ヘルプが表示されます。

#"start"の文字部分にカーソルを合わせ F1 キーを押してみると、

#英語が得意な方は、是非読んでみてください。

私は英語が不得手なので、何となくで理解してしまいましたが、int Start() の後にある中括弧”{ }”の間に書かれたプログラムが、Tick に沿って繰り返し実行される様子です。

また、ヘルプにはその他にも、int init() int deinit() についても記載してあります。

これは、Expert Advisor ウィザードにより作成された”Test1”プログラム内にも、次のようにあらかじめ準備されている内容です。

//+------------------------------------------------------------------+
// expert initialization function
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
// expert deinitialization function
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}

これは、それぞれ、「プログラムが起動するときにだけ実行させたいものを書く場所」と、「プログラムが終了するときにだけ実行させたいものを書く場所」になる様子です。

プログラムが起動や終了する時とは、次のような場合です。

[起 動]
・チャートにプログラムを表示し、Expert Advisors ボタンを有効にした場合

[再起動]
・周期設定(1分足/5分足/15分足・・・)を変更した場合

[終 了]
・チャートよりプログラムを削除した場合
・チャートを閉じた場合

#ちなみに、プログラム実行中に通信が切れた場合どうなるか試してみましたが、
#プログラムの再起動は行われず、ずっと動き続けて( Tick に変化があるのを
#監視して)いる様子です。

実際に起動時と終了時に1回だけ実行されるのか試してみます。

またもや、メッセージを表示するコードを”Test1”プログラムに次のように追加してみます。

#”Test1”プログラムを修正するには、MetaTrader 画面の Navigater ウィンドウより”Test1”を右クリックし、「修正」を選択すると MetaEditor が起動します。

//+------------------------------------------------------------------+
// expert initialization function
//+------------------------------------------------------------------+
int init()
{
//----
Print("Test1プログラムの起動時メッセージです");
//----
return(0);
}
//+------------------------------------------------------------------+
// expert deinitialization function
//+------------------------------------------------------------------+
int deinit()
{
//----
Print("Test1プログラムの終了時メッセージです");
//----
return(0);
}
//+------------------------------------------------------------------+
// expert start function
//+------------------------------------------------------------------+
int start()
{
//----
Print("Test1プログラムを実行しています");
//---- return(0);
}
//+------------------------------------------------------------------+

プログラムをコンパイルして実行形式ファイルを作成し、次の手順でプログラムの実行と終了を行ってみます。

1.MetaTrader を起動
2.新しいチャートを表示
3.チャートにプログラムを表示
4.Expert Advisors ボタンを有効にする(プログラム起動)
5.チャートよりプログラム削除(プログラム終了)

本当でした。少しすっきりしました。

参考になりました? よろしければご協力ください。

にほんブログ村 為替ブログへ 人気ブログランキング【ブログの殿堂】