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

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

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年9月17日水曜日

注文しすぎ、その対応結果は

注文しすぎの対処方法は考えました。

では早速、プログラムを修正し、バックテストで確認してみたいと思います。

MetaTrader より”Test1”プログラムを MetaEditor で開きます。

#MetaTrader 画面のナビゲーターウィンドウより Test1 を右クリックし、修正を
#選択すれば”Test1”プログラムを直接 MetaEditor で開くことができます。

下図のように、ini Start() のエリアに前回調べた OrdersTotal() を書きます。

#前回まで残っていた Print("Test1プログラム・・・")の文字表示行は邪魔なので削除しました。

書けたら、コンパイルボタンを押してプログラムにエラーがないことを確認します。

これでプログラムの修正が終わり、実行準備ができました。

では、前回と同じ条件でバックテストで動かしてみます。

テスターウィンドウの結果タグにて注文&決済履歴を見てみると、

①処理1で注文番号1として指値注文
②処理2で注文番号1の指値注文が実行され買いポジション保有
③処理3で注文番号1で保有したポジションを決済
④処理4で注文番号2として指値注文
⑤処理5で注文番号2の指値注文が実行され買いポジション保有
⑥処理6で注文番号2で保有したポジションを決済



見事に「指値注文 -> 買い -> 決済」を一つのポジションで繰り返しています。

ちなみに、自分で作った”Test1”プログラムによって実行されているものは、上記①④などの指値注文のみであり、②③⑤⑥などの「買い」や「決済」は注文に従ってサーバー側で条件が一致した際に勝手に処理されます。

一応、グラフも確認すると、右肩上がりで利益確保できています。

これで、注文しすぎは防げました。

2008年9月15日月曜日

「注文しすぎ」を防ぐ

注文のしすぎを防ぐ手段として、「すでに注文していたら、またはポジションを持っていたら、新しい注文をしない」ということを考えました。

そのため、自分がすでに注文している、並びにポジションを持っているかどうかを調べる必要がありますが、どうすればよいのでしょう・・・

とりあえず Google で”MetaTrader ポジション 調べる”をキーワードに検索してみました。

・・・

どうやら OrdersTotal() を使えば判別できるかもしれません。

OrdersTotal() とは、「保有している注文の数」を返してくれるみたいです。

この「注文の数」には、注文が実行されてまだ決済されていないポジションも含めて数をカウントし、結果を返してくれる様子です。

ですので、「注文をしているかどうか?」と「ポジションを持っているか?」の 2 つを一緒に調べられます。

ただし単に数を返してくれるだけなので、どんな注文があるのか、またはどんなポジションを持っているかは分かりません。

でも私の場合、「一つのポジションを持つのが限界」なので、数さえ分かれば十分です。

では、これをプログラムで具体的にどのように書くかというと

if (OrdersTotal()==0)
{
○○○○○○
}

となります。

これは「もし注文の数が 0 (ゼロ)だったら波括弧({})の間に書いてあるプログラムを実行する」という意味です。

もう少し具体的に説明すると

・if は右側の括弧に書いてあることが正しければ波括弧の間を実行する
・== は左と右が等しいかどうかを表す書き方

となります。

そのため、波括弧の間に前回の OrderSend() を書いてみると

if (OrdersTotal()==0)
{
OrderSend("USDJPY",OP_BUYLIMIT,0.1,109.65,3,0,109.85,NULL,0,0,Green);
}

となり、これで注文のしすぎを防げると思われます。

では、次回、”Test1”プログラムを修正しバックテストを実行してみたいと思います。

2008年9月14日日曜日

注文タイミングをコントロールする

前回のテスト結果を通してレポート機能について調べて書いてみようと思いましたが、レポートの記録(画面ショット)を撮るのを忘れていたので、次の機会にします。

さて、利益は出たといえ恐ろしい注文の仕方をしたプログラムを修正しなければいけません。

まずは、前回の結果から一番大きな問題である「注文しすぎ」について対応したいと思います。

MetaTrader は「プログラムを繰り返し実行することで自動売買を実現している」ために、単に注文するプログラムを書いただけでは、タイミングが来る度に注文してしまいます。

そのため、注文しすぎないようにコントロールする必要があります。

どうすればよいのでしょう・・・

まあ、注文のしすぎという考え方は保有資金やリスクの考え方によって異なるでしょうが、私の場合は「USD/JPY のポジションを 1000 通貨一つ持つ」のが限界です・・・

そのため、「すでにポジションを持っていれば注文しない、または、注文を一つ出したらもう注文しない」というルールを取り入れることで、注文のしすぎを防げると思います。

では、どうやってこれをプログラムにすればよいのでしょうか?

プログラムの流れを図にしてみると、こんな感じです。



次はこの流れをプログラムにするために、「ポジションを持っているかどうか?をどうやって知るか」を調べてみたいと思います。

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

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