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

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

2009年3月1日日曜日

次に作るプログラムのルールを決めました

次に作るプログラムのルールを考えました。

ボリンジャーバンドをベースにしたルールですが、素人が考えることですから
大した物ではありませんが・・・

ルールを説明する前に、まずは次の図を。

上記図は、USD/JPY の 1 分足でボリンジャーバンド 2σ(赤線)と 3σ(水色線)を
表しています。

今回のプログラムでターゲットにするのは、上図のピンク色で囲んだ丸の部分です。

一言で説明すると「3σ を 2 回超えたら逆張りでエントリーする」です。

もう少し具体的に説明すると次のようになります。

1.過去 10 ローソク足のボリンジャーバンド値(20 日間/終値/3σ)を
  それぞれ調べる

2.さらに、同じローソク足期間の最高値を調べる

3.そして、過去 10 ローソク足において、それぞれの高値が 3σを超える
  ローソク足が何本あるか調べる

4.もし、3σ を超えるローソク足が 2 本以上あり、かつ調べた最高値より
  高い市場価格であれば売り注文する

5.画面で入力した利確ポイントまたは損切りポイントを超えたら決済する

これを、買いと売りの 2 本立てでポジション保持できるようにしたいと思います。

本当はトレンドを調べて買いと売りのエントリーを判断したいですが、トレンドを
計るすべがわからないので、とりあえずボリンジャーバンドの上ラインを超えたら
売り、下ラインを超えたら買いで作ってみたいと思います。

名づけて、"Bolli_Entry"です。

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月14日土曜日

Loop_Entry プログラムを手直ししてみました。

さて、損益 10 ポイント未満で決済できるように Loop_Entry プログラムを手直ししてみました。

手直ししたプログラムはこちら↓にアップしてあります。

http://www1.bbiq.jp/hideho-fx-auto/loop_entry/source/loop_entry.htm

#上記プログラムは十分なテストを行っておりません。もしご利用の際には
#自己責任でお願いします・・・


手直しのポイントは次のとおりです。

・トレードプールに複数のポジションがある場合を見越した対応

・複数の EA 同時実行を見越しマジック番号での識別対応

・注文の仕方を指値注文っぽい成行注文に変更

・画面より入力した利益確定ポイント幅を基準に成行決済

現時点では 1 つのEA ならびに 1 つの注文しかしないため複数ポジション対応の必要はありませんが、将来的に他の EA を同時に動かしたりする場合を見越し、トレードプールに複数のポジションがあっても動作するように対応しました。

また、指値注文についても、指値と相場価格にある一定以上の価格差がないと注文が成立しなかったため、こちらも画面で指定した価格で即注文成立するように変更しました。


手直しの詳しい内容は次のとおりです。

1. トレードプールにあるポジションを順番に調べ、Loop_Entry プログラムによる注文のマジック番号をもつポジションを見つける。

まず、トレードプールにあるポジションを順番に調べる方法として次のような書き方をしています。

---------------------------------------------------------
int MAGIC_NO=1; //Loop_Entryプログラムで注文したことを識別するマジック番号
int Entry_Cnt=0; //トレードプールにLoop_Entryプログラムでのポジションが何個あるか保持する
int i; //トレードプールからポジションを取得するためのオーダー番号を格納する
int j=OrdersTotal(); //トレードプールにある全ポジションの数を取得し保持する

for(i=0; i<j; i++)
{
}
---------------------------------------------------------

これは、i という数値が入る識別子を準備し、かつ、トレードプールの全ポジション数を j という識別子に格納し、i を 0 から一つずつカウントアップしながら j の数より小さい間、for の中括弧の内容を実行するというものです。

このカウントアップしていく i の値をオーダー番号として利用し、OrderSelect() でポジションを取得していきます。

そして、Loop_Entry プログラムによるポジションがみつかったら、見つかったことを識別するための Entry_Cnt 識別子に 1 を加算し、for の処理を中断しています。

Loop_Entry プログラムによるポジションかどうかは、取得したポジションのマジック番号を OrderMagicNumber() で調べ、新規注文の時に指定しているマジック番号(MAGIC_NO)とを比較して判断しています。


2. ポジションが見つからなかったら、新規に注文する

次に、上記1. で調べた結果である Entry_Cnt が 0 のままであれば、Loop_Entry による注文ポジションは存在しないため、新たな注文を実行しています。

注文する際には、注文方法を指値注文ではなく成行注文に変えてあります。

つまり「OrderSend(Symbol(),CHUMON_TYPE,・・・」の CHUMON_TYPE の値を、入力画面で"買"が指定されたら"0"とし、"売"が指定されたら"1"をセットしています。

これで成行注文となりましたが、Loop_Entry はあくまでも「同じ価格で注文を繰り返す」プログラムなので、画面で指定した指値と相場価格が同じ場合のみ成行注文が実行されるようにしました。


3. ポジションが見つかったら、「有効なポジション」なのか「有効な注文」なのかを判断し、有効なポジションであれば、決済注文を出す。

Entry_Cnt が 0 以外なら、最後に取得したポジションは Loop_Entry により注文されたポジションなので、ポジションタイプ(取引種類)を OrderType() で調べ判断しています。


4. 決済注文を出す際には、市場価格と利食い価格と損切り価格から判断し成行決済を行う

最後に、市場価格(Bid/Ask)と、画面で指定した入力パラメータより算出した利食い価格と損切り価格から、決済すべきかどうかを判断し処理しています。


なお、今回は判断の方法として「switch」を利用しています。これは「if」でも書ける内容ですが、一つの判定基準に対して複数の結果がありえる場合に便利な書き方です。

つまり、switch の横に判定される内容(今回はポジションタイプ)を書き、判定基準を case の行に書いて、それぞれの場合に即した処理を書いていきます。


ざっと変更点を書きましたが、公開しているプログラムにもできるだけコメントを書き込んでいますので、参考にしてみてください。

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月7日土曜日

デモ環境を変えちゃいました

MetaTrader が使える日本の業者である ODL のデモ環境を利用していましたが、最近 121 証券のデモ環境へ変更しました。

理由はただ一つ、「日本時間で表示されるから!!」です。

以前も書きましたが、ほとんどの MetaTrader 利用可能な業者は、サーバーの時刻設定が GMT 基準になっているため、いちいち時間を読み替える必要がありました。

私にとっては結構面倒だったので、日本時間が適用されている 121 証券のサーバーへ、デモ環境を変えちゃいました。

これで、すっきりです。

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()に関わる操作方法を調べてみたいと思います。

2009年1月25日日曜日

次に作るプログラムは・・・

Loop_Entry プログラムでのライブ初取引は、順調な滑り出しでした。

今後もデモアカウントで動かしながら様子をみていきたいと思います。

さて、Loop_Entry プログラムを使う際に気づいたのですが、指値注文する際に利益確定のための決済金額の指定をしようとすると、指値価格より 10 ポイント以上幅のある価格でないと指定できませんでした。

これは、おそらく「スキャル対策」なのかもしれませんが、10 ポイント未満で利益確定したい場合もあると思います。

そこで、次に作る EA は、10 ポイント未満で利益確定できるようなプログラムを作ってみようと思います。

どんな取引ルールのプログラムにするかは、明日考えます・・・

2009年1月12日月曜日

初陣を飾れました!!

完成した EA プログラムである "Loop_Entry" を早速デモ環境でライブ取引を試してみました。

実施期間は、日本時間で「2009.01.08 夜 ~ 2009.01.10 朝」までです。

自動で取引を行ってくれるとはいえ、エントリーポイントは自分で考えねばならないので、とりあえず次の内容でエントリーしてみました。

・通貨ペアは "USDJPY"
・指値は "91.15"
・ロット数(取引数)は "0.1"
・スリッページは "3"
・注文種別は "買い"
・利食い計算は "プラス 20 ポイント"
・損きり計算は "マイナス 40 ポイント"(これは自動計算される)

結果、

上記のように、4勝1敗で、プラス 43.43 ポイントの利益確定となりました!!

デモ環境とはいえ、初めての自動売買でよい結果を残すことができました。

とは言っても、途中、子供達にパソコンを使われ電源落とされたりしたため、連続稼動とはいきませんでした。

これらがなければ、もしかしたら違う結果が出ていたかも知れません・・・

まあ、初めて作った EA にしては、プログラムが暴走することなく、思うとおりの動きをしたので、よしとしましょう。

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

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