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

Loop_Entry : 同じ指値エントリーを繰り返し実行するプログラムです。
estTurn : 高値(安値)で反対売買を実行するプログラムです。
ラベル 基本操作 の投稿を表示しています。 すべての投稿を表示
ラベル 基本操作 の投稿を表示しています。 すべての投稿を表示

2009年2月21日土曜日

ボリンジャーバンドの値を取得する

次に作るプログラムを考えています。

どんなルールにするかまだ決まっていませんが、ボリンジャーバンドを
利用したものを作りたいのだけは決めています。

ボリンジャーバンドは統計学を応用したものらしく、難しいことは
わかりませんが、トレンドの変換点として利用されており、私も
チャートを表示するときはボリンジャーバンドを表示しています。

そのため、プログラムでボリンジャーバンドの情報を扱うには
どうすればよいのか調べてみたいと思います。

なお、MetaTrader のチャート画面でボリンジャーバンドを表示する方法は
こちらをご参考ください。

ボリンジャーバンドは iBands() を使うことで情報が取れるみたいです。

マニュアルを見てみると、次のように記載してあります。

iBands( symbol, timeframe, period, deviation, bands_shift,
applied_price, mode, shift)

symbol:通貨ペアを指定
timeframe:ローソク足の種別( 1 分足、5 分足など)
period:ボリンジャーバンド値を計算するのに利用するローソク足数
deviation:標準偏差
bands_Shift:いくつチャート表示をずらす?
applied_price:ローソク足のどの値(高値、終値など)を取得するか
mode:ボリンジャーバンド上下ラインのどちらの情報を取得するか
shift:何本前のローソク足からボリンジャーバンド情報を取得するか

MetaTrader のチャート画面でボリンジャーバンドを表示する際に設定する
画面で説明すると

period:期間
deviation:偏差
bands_Shift:表示移動
applied_price:適用価格

になります。

実際にプログラムに書く場合には次のようになります。

double boll_price = iBands(NULL,0,20,2,0,PRICE_LOW,MODE_LOWER,0)

symbol:NULL(現在の通貨ペア)
timeframe:0(プログラムが表示されているチャートのローソク足種別)
period:20(20 個分のローソク足でボリンジャーバンド値を計算)
deviation:2(2 シグマ標準偏差)
bands_Shift:0(表示はずらさない?)
applied_price:PRICE_LOW(ボリンジャーバンド情報の終値を取得)
mode:MODE_LOWER(ボリンジャーバンドの下ライン情報を取得)
shift:0(現在のローソク足からボリンジャーバンド情報を取得)

あとは、次のように、取得したボリンジャーバンド値と現在の市場価格と
比較するようなプログラムを作ることになるかと思われます。

if (boll_price < Ask)
{
}

2009年2月11日水曜日

10 ポイント未満利益確定サンプルプログラム

では、実際に 利益確定を 10 ポイント未満で決済するプログラムを作ってみます。

作るプログラムのルールは、次のとおりです。

1. 有効なポジションならびに有効な注文がなければ指値買い注文する
2. 有効なポジションの取得価格より相場の売値が 5 ポイント高ければ決済する

といった感じで、あまり細かい条件をいれずにシンプルなものを作ってみます。

まず、1. についてですが、これは Loop_entry プログラムを作成した際に使ったものを利用し、次のように書きます。

//
//有効なポジションあるいは有効な注文があるかどうかを判定する
//
if (OrdersTotal()==0)
{
//
//有効なポジションならびに有効な注文が一つもないので指値買い注文する。
//
OrderSend(Symbol(),OP_BUYLIMIT,0.1,Bid,3,0,0,NULL,0,0,Green);
}
else
{
//
//ここに、2. の内容に沿ったプログラムを記載する
//
}

次に 2. についてですが、次のような判断をしながら決済することになります。

2.1. トレードプールからポジションを取得する
2.2. 取得したポジションが「有効なポジション」なのか「有効な注文」なのかを判断する
2.3. 有効なポジションであれば取得価格と相場を比較する
2.4. 5 ポイント以上の利益確定なら決済する

で、これをプログラムで書いてみると

//
//トレードポジションプールからポジションを取得する。
//
OrderSelect(0,SELECT_BY_POS,MODE_TRADES);  '--- ①
//
//有効なポジションなのか有効な注文なのかチェックし、
//有効なポジションの場合のみ処理する。
//
if (OrderType()==OP_BUY) '--- ②
{
//
//有効なポジションの取得価格が相場の売値より5ポイント分
//上なのかどうか判断し、上の場合のみ決済する
//
if (OrderOpenPrice()+5*Point '--- ③
{
//
//相場の売値で決済する
//
OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);
'--- ④⑤
}
}

ここでポイントとなるのは次のとおりです。

注文は必ず 1 つしかないので、OderSelect() でオーダー番号を 0 で取得している

有効なポジションの場合、ポジションのタイプ(取引種別)が "buy"(OP_BUY)になっているはずなので、OrderType() で取得したポジションのタイプを調べている

#指値買い注文で有効な注文の状態であれば、取得したポジションのタイプは "buylimit"(OP_BUYLIMIT)になっています。

有効なポジションの取得価格を OrderOpenPrice() で取得し、5 ポイント加算したものと相場の売値(Ask)で比較している

取得したポジションのチケット番号を OrderTicket() で取得し決済している

取得したポジションのロット数(取引数)を OrderLots() で取得し、決済取引数として指定している

これで、指値注文の際にひっかかる決済制限をクリアできました。

次回は、これを応用して、Loop_Entry を手直ししたいと思います。

2009年2月9日月曜日

OrderClose の書き方

OrderSelect() でのポジション取得については大体わかりました。

次に、決済するための OrderClose() について調べてみます。

OrderClose( ticket, lots, price, slippage, color) ;

ticket:チケット番号を指定する
lots:決済するロット数(取引数)を指定する
price:決済価格を指定する
slippage:スリッページを pips で指定する
color:チャート上に表示する決済矢印の色を指定する

で、実際にどのように書くかというと

OrderClose(1234,0.1,90.50,3,Red) ;

となります。

上記内容は大体わかりましたが、一つだけ疑問が・・・

チケット番号はどのようにして調べるのでしょうか?

チケット番号とは、実は MetaTrader 画面で見られる「注文番号」のことです。

とはいっても、サーバーが勝手に割り振る番号なので、どの注文に何番が割り振られるかをプログラムで事前に予測し割り振られた番号を保持するのは面倒です。

そこで、OrderTicket() を利用します。

OrderTicket() は、OrderSelect()によって取得したポジションのチケット番号を返してくれるものです。

使い方としては、

OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
OrderClose(OrderTicket(),0.1,90.50,3,Red) ;

のように、OrderSelect()とセットで利用します。

つまり、OrderSelect() でポジションを取得し、取得したポジションのチケット番号をOrderClose() に指定するということです。

これで、保有ポジションを取得し、決済する方法はわかりました。

次回は実際にプログラムを作ってみたいと思います。

2009年2月8日日曜日

OrderSelect の書き方

さて、損益 10 ポイント未満で決済するためには、OrderSelect() で有効なポジションを取得し、OrderClose()で決済する必要があることがわかりました。

そのため、これらについて調べてみたいと思います。

まず、OrderSelect() についてですが、マニュアルには次のように書いてありました。

OrderSelect( index, select, pool);

index:オーダー番号かチケット番号を指定する

select:オーダー番号とチケット番号のどちらで探すかを次の中から選ぶ
SELECT_BY_POS - オーダー番号で探す場合
SELECT_BY_TICKET - チケット番号で探す場合

pool
:オーダー番号で探すときにどこから探すかを次の中から選ぶ
MODE_TRADES (default)- 有効なポジションか有効な注文から探す
MODE_HISTORY - 決済済みポジションかキャンセルした注文の履歴から探す

有効なポジションと有効な注文を並べた状態をトレードプール( Trading Pool )、決済済みポジションとキャンセルした注文を並べた状態をヒストリプール( History Pool )と呼ぶみたいです。

OrderSelect() の説明には 2 つの番号が出てきました。それぞれの番号の意味は、

オーダー番号:それぞれのプール内の並び順

チケット番号
:注文した際に勝手に割り振られるユニークな番号(同じ番号の注文は他にはない)

になります。

どのような場合に使い分けるのかというと、複数の有効なポジションを保有している場合に、次々と何らかの処理をしたい場合にはオーダー番号を利用し、あらかじめ処理すべきポジションが特定できている場合にチケット番号を使うみたいです。

ついでに、OrderSend() のプロパティに「マジック番号」というものもあります。

これは、例えば複数のプログラムを同時に動かしているときに、どのプログラムで注文されたものなのかを識別する際に使う番号です。

オーダー番号を利用する際に、一つ注意が必要です。

トレードプールはその時々によって対象となるものが変わりますので、例え同じポジションであっても、同じオーダー番号が割り振られるわけではありません。

なお、どのような番号が割り振られるかというと、0,1,2,3,・・・ といった具合になります。

#厳密には番号を割り振るわけではあません。トレードプールとは単に配列のこと
#ですので、ここでいうオーダー番号とは配列の番号になります。

実際の書き方としては、次のとおりです。

OrderSelect(0,SELECT_BY_POS,MODE_TRADES);

これで、トレードプール内の最初の有効なポジション(もしくは有効な注文)を取得することができます。

ポジションを取得する書き方は大体わかりました。

次は OrderClose() を調べてみたいと思います。

2009年2月6日金曜日

Publisher 機能で取引結果を公開します。

今日はちょっと MetaTrader の機能について書きたいと思います。

MetaTrader には、取引の明細を HTML ファイルで表示する機能があります。

その HTML ファイルとは、次の操作をすることで見ることができます。

1.ターミナルウィンドウで口座履歴タブを選択
2.履歴エリアで右クリック
3.「レポートの保存」を選択

さらに、このファイルを Web サーバーなどに自動保存する「Publisher」という機能もあります。

本ブログでも、未来のリアル取引に向け、取引明細をこの Publisher 機能を利用して、自動的に公開する仕組みを準備してみたいと思います。

公開する手順は次のとおり。

1.契約しているプロバイダの無料ホームページサーバー領域に特定フォルダを作成

2.MetaTrader の Publisher 機能にて、上記フォルダに定期的に HTML ファイルを
  保存するように設定する

3.本ブログ上に上記 HTML ファイルへのリンクを作成する

Publisher 機能を利用するには、MetTrader 画面のメニューバーより<ツール>-<オプション>を選択し、オプション画面の Publisher タブで設定をする必要があります。

これで、取引明細をブログサイトから見ることができるようになりますが 1 点だけ問題が・・・

この取引明細には、アカウント ID と名前が表示されるため、この情報を隠す必要があります。

Publisher 機能にこれらの情報を隠す機能はないので、強制的に表示させないように手を加えます。

といっても、あるファイルの内容を修正するだけです。

Publisher 機能は、HTMLファイルを生成する際、「Statement.htm」ファイルを利用し、作成する HTML ファイルで表示する項目の定義を行っています。

そのため、このファイル内で定義されている「アカウント ID」 と「名前」の部分の定義を書き換えて、アカウント ID と名前が表示されないようにします。

なお、Statement.htm ファイルがどこに保存されているかと言うと、”C:\Program Files\ODL MetaTrader 4\templates”のフォルダに保存されています。

#ODL Japan 社のダウンロードファイルを利用して MetaTrader をインストール(デフォルト設定)した時に限ります。

Statement.htm ファイルの書き換える場所は、次のとおりです。

本ブログサイトの右側に「 Loop_Entry 損益結果」欄の「取引明細レポート表示」リンクより確認することができます。

よし、あとは、リアル取引を待つばかり。

2009年2月1日日曜日

10 ポイント未満で利益確定するには(その2)

前回、指値注文時に利確/損切ポイントが 10 ポイント未満で決済指定ができないため、10 ポイント未満で決済する方法を考えましたが、「OrderClose() で解決できる」とのコメントを頂きました。

そのコメントを読んだ際に、自分が基本的な勘違いをしていることに気づきました・・・

その勘違いとは、「指値注文で成立したポジションは指値注文時の利確/損切決済指定でしか決済できない」と思い込んでいたこと。

つまり、「成立したポジションは成行でいつでも決済できる」という基本的なことを忘れていました・・・

#こんなレベルです、私って・・・

なので、10ポイント未満で決済する方法は、

1.指値注文し、売買成立したポジションの決済値を変更する
2.成行注文をし、売買成立したポジションを成行決済する

ではなく、「条件付きで成行決済する」です。

この条件付きという部分が、「注文成立時の売買価格と現在の取引価格との差が何ポイントか」みたいな判定条件を付けて、条件に適合すれば成行決済するということになります。

とはいえ、保有ポジションの情報を取得しなければならないことには変わりないので、OrderSelect() については調べてみたいと思います。

2009年1月26日月曜日

10 ポイント未満で利益確定するには

次のプログラムのルールを考え中ですが、その前に 10 ポイント未満での利益確定はどのようなやり方があるのかを調べてみる必要があります。

前回も書きましたが、新規に指値注文する時では 10 ポイント未満の指定はできません。

なので、次の方法が思いつきます。

1.指値注文し、売買成立したポジションの決済値を変更する
2.成行注文をし、売買成立したポジションを成行決済する

#1.については、新規注文で制限されているものを変更できるとは考えにくいですが、
#念のため確認してみます。

上記の両方とも「売買成立したポジション」に対して操作しなければなりません。

そのため、まずはこのポジション情報を取得する方法を調べてみたいと思います。

Loop_Entry プログラムを作成した際に、OrdersTotal()で「ポジションの数」を取得する方法は解りましたが、これは数しか取得できませんので使えません。

いつものごとく Google で「MetaTrader ポジション 情報取得」で検索してみます。

どうやらポジションの情報を取得するには2段階の手続きを踏む必要があるみたいです。

2段階というのは

1.OrderSelect()を使って情報を取得したいポジションを特定する
2.OrderType()やOrderOpenPrice()などを使って特定したポジションの各種情報を取得する

です。

次回、OrderSelect()に関わる操作方法を調べてみたいと思います。

2008年12月18日木曜日

受け取った値で注文してみる

任意の値(入力した指値の値)をパラメーターとしてプログラムに渡す仕組みはできました。

次は、渡された任意の値をプログラムの中で注文時に利用するようにしたいと思います。

まずは、注文のプログラム部分を作成します。

これは”Test1”のプログラムで作った注文をする部分をコピーしてきます。

#"Test1"プログラムの「 int start() 」エリアに記載した内容をコピーしてください。

すると、"Loop_Entry"プログラムは次のようになります。

注文するプログラム部分である OrderSend は、次のように構成されていました。

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

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

今回は指値を任意の値にしたいので、上記 OrderSend の赤い部分を次のように置き換えます。

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

つまり、OrderSend の 指値の値を指定する場所に、入力パラメータとして定義した指値の識別子(SASHINE)を指定することで、画面で入力した指値の値で注文されるようになります。

ただし、このままだと利食い価格が固定の109.85のままなので、こちらも合わせて修正が必要です。

とりあえず、指値より20ポイント分プラスになったら利食いすることにします。

任意の指値より20ポイントプラスするプログラムの書き方は

SASHINE+20*Point

となります。

そのため、OrderSend の部分は次のようになります。

OrderSend(
"USDJPY",OP_BUYLIMIT,0.1,SASHINE,3,0,SASHINE+20*Point,NULL,0,0,Green);

#表示領域の都合上、改行記載してあります。

もし、利食い価格も都度入力したいと思うのであれば、指値同様、プログラムに渡すプロパティを増やしてやることで可能となります。

例えば、利食いの識別子を "RIKUI" とすれば、パラメータを指定する部分への追加と OrderSend の修正を次のように行えば OK です。

//---- input parameters
extern double SASHINE=0.0;
extern double RIKUI=0.0;

OrderSend("USDJPY",OP_BUYLIMIT,0.1,SASHINE,3,0,RIKUI,NULL,0,0,Green);

これで、注文時の指値の金額を任意に決められるようになりました。

あとは、コンパイルをして、プログラムを実行し試してみてください。

2008年11月24日月曜日

受け取った値を表示してみる

では、ウィザードにより表示されたプログラムをみてみます。

ウィザードの「Parameters」部分に指定した内容が次のように(画面赤枠部分)記述されています。

//---- input parameters
extern double SASHINE=0.0;

これは、「外部から、小数点ありの値を、"SASHINE"という識別子で受け取る」という意味を持ちます。

なお、"SASHINE"の横に"=0.0"とありますが、これは画面に表示する初期の値を指定する書き方で
す。

実際どのように画面に表示されるのか早速試してみます。

まずは、ウィザードにより作成された"Loop_Entry"プログラムを実行形式にコンパイルします。

#コンパイルの手順はこちらを参照ください。

次に、MetaTrader 画面にてコンパイルされた"Loop_Entry"プログラムをチャート上に表示します。

#プログラムをチャートに表示させる手順はこちらを参照ください。

すると、下記ウィンドウが表示されると思います。

このウィンドウの「パラメーターの入力」タグが、プログラムに受け渡すための値を入力する画面になります。

この画面を見てみると、一覧エリアの「Variable」の欄に"SASHINE"が、「Value」の欄に"0.0"が表示されています。

つまり、プログラムの"extern"行で指定した、"SASHINE=0.0"が画面上に表示され、「Value」欄をダブルクリックすることで任意の値を入力でき、OK ボタンをクリックすることでプログラムに入力した任意の値を渡すことができます。

では、本当に任意の値がプログラムに渡せるのか試してみます。

MetaEditor で"Loop_entry"プログラムを表示し、次のプログラムコードを追記します。

Print("指値の値は=",SASHINE);

上記コードは、"SASHINE"の識別子に入っている値を画面に表示するプログラムコードです。

これを、int init()エリアに追記します。

#init()エリアは、プログラムが起動するときに1回だけ実行される部分です。詳しくはこちら

上記図のように記述できたら、再度プログラムをコンパイルします。

コンパイルが終了したら、MetaTrader にて"Loop_entry"プログラムをチャートに表示し、パラメーターの入力画面にて、"SASHINE"の Value 値として"123.45"を入力し OK ボタンをクリックしてください。

#すでにチャートにプログラムを表示済みの場合は、次の手順でも OK です。

1.チャート上のプログラム名が表示されているところにカーソルを合わせます。
2.右クリックをして<Expert Advisors>-<Properties>を選択します。

すると、ターミナルウィンドウの「Experts」タグに、入力された指値の値が表示されると思います。

これで、任意の値(今回は指値)をプログラムに受け渡すプログラムができました。

次は、受け渡した指値の値を注文で扱うようにしたいと思います。

2008年11月23日日曜日

プログラムを起動する時にパラメーターを渡す

では、「プログラムを起動する時にパラメーターを渡す」機能を利用したプログラムを作りたいと思います。

今まで作成した"Test1"プログラムを使って実現することも可能ですが、折角プログラムの目的も決まりましたので、プログラム名を変えて初めから作りたいと思います。

以前、「MetaEditor を起動してみよう」でプログラムの新規作成手順を説明しました。

1.MetaEditor を起動
2.MetaEditor 画面のメニューバーより、<File>-<New>を選択
3.Welcome 画面で"Expert Advisor" を選択

すると、次の画面が表示されます。

前回は上記画面でプログラム名( Name:)に"Test1"とだけ入力して完了ボタンを押しましたが、今回はこの画面の下にある「Parameters」の部分を使います。

まず、プログラム名ですが、繰り返しエントリーするプログラムを作りたいので、"Loop_Entry"と名付けたいと思います。

次に「Parameters」の部分ですが、ここは、今から作成するプログラムに対して値を受け渡す仕組みを定義するためのものです。

今回は「注文する際の指値」を入力できるようにしたいため、次の手順で定義します。

1.Parameters エリアの右にある<Add>ボタンをクリック
2.Parameters の一覧エリアに表示された行の「Name」欄に"SASHINE"と入力
3.同じ行の「Type」欄をダブルクリックして、"double"を選択
4.同じ行の「Initial Value」欄をダブルクリックして、"0"を入力

ちなみに「Name」「Type」「Initial Value」の意味は、

Name:プログラムの中で入力された値(今回は指値)を扱うための識別名
Type:Name で指定された識別名で扱うデータの種類
Initial Value:プログラムに受け渡す値を入力する画面を最初に開いた際に表示する値

となります。

なお、「Type」欄で指定できる種類の意味は、

int:整数のみ入力可能
bool:真か偽の判定値のみ入力可能
datetime:日付のみ入力可能
color:色の定義のみ入力可能
double:小数点ありの数値のみ入力可能
string:文字(数値含む)を入力可能

となります。

今回は指値を入力したいので、小数点ありの数値が入力できる"double"を選択します。

さて、入力した結果の画面は、

となります。

最後に完了ボタンをクリックしプログラムを表示します。

次はウィザードにて作成されたプログラムを修正していきます。

2008年11月22日土曜日

指値を入力する画面を作る

さて、同じエントリーポイントを繰り返すプログラムにおいて、プログラムを変更することなくその時の状況に応じて注文する際の指値を変更する画面を設けたいと思います。

イメージとしては、

1.作った画面を表示する
2.表示された画面上で指値を入力する
3.表示された画面上で OK ボタンをクリックする

といったアクションを起こすと、プログラムで注文する際の指値が置き換わる感じになればいいなぁと思っています。

上記アクションを起こすための「画面」をどうやって作るかを調べてみます。


・・
・・・

解りません・・・

ヘルプやネットで画面を作る手順などの情報を探したのですが、見つけられません・・・

その代わり、「プログラムを起動する時にパラメーターを渡す機能」があることが解りました。

独自の画面を作らなくても、やりたいことは全く同じ事ができますので、この機能を利用することにします。

「プログラムを起動する時にパラメーターを渡す機能」とはどこにあるのでしょうか?

これは、作成したプログラムをチャート上に表示する際に出てくる画面上にあります。

以前、”Test1”プログラムをチャート上で実行する際の手順として次のような操作を行いました。

1.ナビゲータウィンドウの<Expert Advisors>で”Test1”を右クリックする
2.<チャートに表示>を選択する

すると次のウィンドウが表示され、OK ボタンをクリックすることで、チャート上にプログラムを表示することができました。

実は、この画面上に「プログラムを起動する時にパラメーターを渡す機能」が出てくるのですが、残念ながら”Test1”プログラムでは出てきません。

「プログラムを起動する時にパラメーターを渡す機能」に対応したプログラムを作成すると、上記画面上で次のような「パラメータの入力」タグが表示されます。

次は、このタグが表示されるようなプログラムを作ってみましょう。

2008年11月9日日曜日

Mismatched charts errors

レポート機能の見方でもう一つわからない項目に「Mismatched charts errors」がありました。

こちらについてネットで調べてみると、「周期ごとの時間足データに不整合がある数」とのこと。

おそらく同じ時間帯における1分足と5分足の高値や安値の値が一致しないってことだと思われますが、何のために周期ごとの情報を比較しエラーとしているのかは不明です・・・

もしかしたら、不足している時間足データを擬似的に作成する際のエラー情報なのではないかと思われます。

#この項目に関する日本語の情報があまり無かったのでちょっと自信ないです・・・

いずれにしろ、テストで使われた時間足データに不備があることを意味するみたいなので、このエラーが発生する場合には、時間足データを入れ替え(作り変え)た方がよさそうです。

ちなみに、時間足データはどこにあるるのでしょう?

MetaTrader のメニューバーより<ツール>-<History Center>を選択すると、各通貨ペアごとの時間足データが表示されます。


このヒストリーセンター画面にて、時間足データの修正ができます。

ただし大量なデータですので、一つずつ追加や修正することは、ほぼ無いでしょう。

そのため、時間足データを一旦全て削除し、新しくダウンロードし直すかインポート機能を使って取り込むことになるでしょう。

2008年9月28日日曜日

テストのタイプについて

レポートの結果を調べてみたところ、テストデータの精度については、テストのやり方に左右されることがわかりました。

そのため、テストのやり方について調べてみます。

今までのテストでは、テスターウィンドウの「セッティング」タグにて、初期設定の状態でテストを実施していました。

各項目をみてみると

Expert Advisor

テストしたい EA プログラムを選択する

通貨ペア

テストしたい通貨ペアを選択する

日付と時間を使用

テストしたい期間を指定する

項目のタイトルが合っていませんが、送信者に開始期間、宛先に終了期間を指定します。指定しない場合には、MetaTrader が保有する全てのテストデータ期間でテストされます。

Visual Mode

ここにチェックを付けると、テスト時の取引状況を、チャート図に表しながら実行してくれます。

チャート図を作成しながらテストするため、結果が出るまで時間がかかりますが、ちょっと臨場感を味わえておもしろいです。またその横にあるボタンを押すとテストが一時停止されたり、指定した期日までスキップできたりします。

ここまでは、特にテストデータの精度にかかわる項目ではありませんが、次の「期間」と「タイプ」の2つをどのように指定するかで結果がだいぶ変わる様子です。

「期間」はテストで利用するローソク足を選択する項目で、ここで選択したローソク足の値(始値/終値/高値/安値)を使ってテストが実施されるみたいです。

試しに、期間を”Daily”と”H1”に切り替えて Test1 プログラムを実行してみると

”Daily”では、1日1回の注文しか実行されていない


”H1”では、1日に何回か注文はされているものの、1時間以内に2回以上の注文は実行されていない

となりました。

となると、MetaTrader は Tick の変動タイミングによってプログラムが実行されるため、一番短い周期のローソク足を利用してテストすれば、より精度の高い結果がでるものと思われます。

では、モデルは何のためにあるのでしょう?

モデルには、次の3つの選択肢があります。

Open prices only

これは、期間で指定した周期のローソク足情報のみを使ってテストするタイプで、今までやってきたテストがこれになります。

#ちなみに、MetaTrader では、周期が短いほどテストデータの保有期間が短くなり、テストできる期間が短くなります。

Control points

期間で指定したローソク足より一つ周期の短いローソク足を使ってテストする様子ですが、何のためにこのモデルがあるのかは、ちょっと解りません・・・

Every tick

Tick(1分足?)を利用してテストをするみたいです。つまり、期間でどの周期を選択しても、Tickデータを利用してテストするみたいです。

試しに、テスト期間と周期設定(日足)を同じ状態で3つのモデルを実行してみました。

左から「Open Price Only」「Control Point」「Every Tick」になりますが、確かに、それっぽく注文をしているみたいです。

では、Every Tick でテストするのと、Open Price Only で1分足でテストするのでは、何が違うのでしょうか?

Open Price Only タイプでは、先にも書いたように、MetaTrader が保有しているローソク足の情報のみを使ってテストするため、テストできる期間が保有データに左右されます。 

つまり1分足のデータは大量になるため、あまりデータが保持されておらず、最近のデータでしかテストできません。

Every Tick は、MetaTrader が保有している全てのローソク足情報を駆使して、指定されたテスト期間分の Tick データを擬似的に作成し、そのデータを使ってテストしているみたいです。

#どのようなルールで擬似データを作成しているかは、解りません・・・

そのため、長い期間で精度の高いテストを行うためには、Every Tick タイプでテストすれば良いみたいですが、擬似的なデータですので参考程度に考えていた方がよいのかもしれません。

#どうやら、1分足のデータを追加するやり方もある様子ですので、いつか調べてみます。

2008年9月21日日曜日

レポート機能の見方

注文履歴ならびに利益グラフとも、まあまあの結果でした。

では、レポート機能の情報について確認してみます。

私のレポート結果は次の図になります。

英語のマニュアルを翻訳ソフトを使いながら、それぞれの項目を日本語で表してみると

Bars in test : テストで利用したバー(ローソク足)の数
Ticks modelled : テストで利用した Tick の数
Modelling quality :?
Mismatched charts errors :?
Initial deposit : プログラム開始時の保有資産
Total net profit : 純利益(総利益-総損失)
Gross profit : 総利益
Gross loss : 総損失
Profit factor : 勝率(総利益÷総損失)
Expected payoff : 平均利益
Absolute drawdown : 絶対ドローダウン
Maximal drawdown : 最大ドローダウン
Relative drawdown : 相対ドローダウン
Total trades : トレード回数合計
Short positions : 売りポジション回数(割合)
Long positions : 買いポジショントレード回数(割合)
Profit trades : 利益が出たトレード回数(割合)
Loss trades : 損失が出たトレード回数(割合)
Largest profit trade :1トレード当たり最大利益
Largest loss trade :1トレード当たり最大損失
Average profit trade :1トレード当たり平均利益
Average loss trade :1トレード当たり平均損失
Maximum consecutive wins : 最大連勝回数
Maximum consecutive losses : 最大連敗回数
Maximal consecutive profit : 最大連続利益(回数)
Maximal consecutive loss : 最大連続損失(回数)
Average consecutive wins : 平均連勝回数
Average consecutive losses : 平均連敗回数

となります。

日本語にすることで大体理解できたのですが、次の項目の意味がわかりません・・・

Modelling quality :?
Mismatched charts errors :?

翻訳ソフトではさっぱり分からないので、ネットで調べてみました。

・・・

どうやら、Modelling quality とは、テストで利用した「データの精度の高さ」を表しているみたいです。

私の結果を見ると”n/a”となっていますが、これは判定できないレベルらしく、本来は数字(パーセント)が表示されるようです。

さらに、その下に表示されている「バー」は、MetaTrader がテスト用に保持しているデータの期間を表しており、判定した期間分だけ色(ピンクか緑)がつく様子です。

#グレー部分は判定期間外となります

また、色のつき方にもデータの精度が関わっているらしいです。

私の結果をみると、全てピンク色となっていますが、これは「擬似的に作成されたデータで判定している期間」を表すみたいです。

擬似的に作成された???

これはテストのやり方に関わる事らしいので、テストのやり方と合わせて調べてみたいと思います。

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月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.チャートよりプログラム削除(プログラム終了)

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

2008年7月30日水曜日

プログラムは Tick をきっかけに動いている

MetaTrader はプログラムを繰り返し実行することで自動売買の仕組みを実現していることはわかりましたが、繰り返すタイミングがどうやら定期的ではない様子です。

いったい何をきっかけに動作させているのでしょうか?

ちょっと、”Test1”プログラムが表示するメッセージを眺めてみます。

やっぱり、一定時間ごとには表示されません。

チャートにプログラムを連携させて動かしている様子ですので、何かチャートに関係することだと思うのですが、試しに周期設定(1分/5分/15分・・・)を切り替えてみました。

すると、プログラムは再起動しましたがプログラム実行タイミングが大きく変化する様子ではありません。

ちなみに、プログラムが再起動しているかどうかは、ターミナルウィンドウの Experts タグのメッセージ欄に

deinitialized
uninit reason 3
initialized

が表示されていることで分かります。

#それぞれの行について、詳しくはプログラムを作成する時に改めて調べてみます。

何がきっかけで動いているのかさっぱり分からないので、ネットで調べてみました。

すると、「Tick に沿って動作する」との記事を見つけたので、MetaTrader のヘルプで tick を検索してみると、それらしき説明が記載してありました。

#英語は得意ではないので、違ったらごめんなさい。

試しに気配値表示ウィンドウの「ティックチャート」タグを選択し、眺めていると、tick チャートが変動するたびに、”Test1”のメッセージも表示されているように見えました。

ここまでで、プログラムは「チャートに連動した環境で Tick をきっかけに繰り返し実行される」ことがわかりました。

よし次は、エントリーするプログラムを作ってみようかな。

2008年7月23日水曜日

プログラムとチャートの関係

無事、ライブでプログラムを動かすことができました。

MetaEditor は、作成したプログラムをチャート画面に連動させて動かす仕組みの様子。

プログラムとチャート画面の関係について、いろいろ試してみます。

まずは、ひとつのチャート上で2つのプログラムが同時に動くのか試してみました。

”Test1”と似たようなプログラム”Test2”を作成し、同じチャート画面で動かす設定(「チャートに表示を選択」)をしてみたところ、

”Test1”が”Test2”のプログラムに変わってしまいました。

どうやら1チャート上で動かせるプログラムは1つみたいです。

次に、複数のチャート上で2つのプログラムが同時に動くのか試してみました。

別なチャート(EUR/USD)を表示し、画面上に2つ以上のチャートを表示した状態で、それぞれのチャート上でプログラムを動かす設定をしてみたところ、

2つのプログラムが同時に動きました。

どうやら、複数のプログラムを同時に動かせるみたいです。

さらに、同じプログラムが別々のチャートで同時に動くかどうか試してみました。

”Test1”プログラムを2つ以上のチャートで動かす設定をしたところ、

バッチリ動きました。

あと、チャート画面を切り替えてみましたが、プログラムは動き続けている様子です。

最後に、チャート画面を閉じてみると、

プログラムはとまりました。

と、チャートごとにプログラムを動かせることが確認できましたが、気になることが一つ。

同じプログラム内で表示されるメッセージの表示タイミングが一定間隔ではありません

何を基準にプログラムが繰り返し実行されているのでしょう?

次はプログラムが動くタイミングについて試してみます。

2008年7月21日月曜日

ライブでプログラムを動かしてみます

いよいよリアルタイム(ライブ)な自動売買の開始です。

とは言っても、メッセージを表示するだけですから損も得もしませんので気楽ですが。

まずは、プログラムを動かす準備が必要です。

MetaTrader を起動し、ナビゲーターウィンドウを見てみると、「Expert Advisors」のフォルダ?のところに”Test1”が表示されています。

ネットで MetaTrader について色々調べているときに、よく”EA”という言葉が出てきていたのですが、どうやら「自動売買用のプログラム?」のことを”Expert Advisor”略して”EA”と呼んでいる様子です。

#そう言えば、MetaEditor で”Test1”プログラムを「ウィザード機能」を利用して作成するとき、”Expert Advisor”を選択したことを思い出しました。

ナビゲータウィンドウの Expert Advisors にて”Test1”を右クリックすると「チャートに表示」と書かれた選択肢が表示されます。

#ここから MetaEditor を起動してプログラムの修正/削除/追加もできるみたいです。

この「チャートに表示」を選択すると、”Test1”というタイトルで下図のようなプロパティ画面が表示されます。

このプロパティ画面の「Live Trading」(上図赤枠)の部分の「Allow live trading」にチェックをつけて OK ボタンをクリックします。

#他にも項目はありますが、とりあえずそのままで。

すると、チャートの右上部分に「Test1 ×」の文字が表示されます。

どうやら、これで準備は完了みたいです。

あとは、画面上部にある「Expert Advisors」ボタンをクリックすると、チャートの右上部分の「Test1 ×」の×部分がニコチャンマーク?に変りプログラムが動作している状態になりました。


実際に動いているかどうか確認してみます。

画面下のターミナルウィンドウに「Experts」タグが現れ、プログラムした”Test1プログラムを実行しています”の文字がバックテストと同じように次々と表示されました。

プログラムを止めるには、画面上部にある「Expert Advisors」ボタンをクリックすると、チャートの右上部分が再び「Test1 ×」になりプログラムがとまりました。

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

#ひと満足です。

MetaEditor は、作成したプログラムをチャート画面に連動させて動かす仕組みの様子ですので、次は、もう少しチャートとの関係性について調べてみようと思います。

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

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