はじめに
ここでは、EAを作成していると必須の関数であるOrderSelect()関数について、解説していきます。
OrderSelect()って何気なくつかっていたりしませんか?最悪どこにいれたらいいのかわからない!!みたいな事ありませんか?
私もEAを作りだしてから半年間ぐらいまではOrderSelect()関数をそこら中にいれてEAをとにかく動かす・・・、みたいなことをやっていました。今回はそのOrderSelect()関数を、正確に、必要な場所にだけ入れられるようになる考え方をお伝えします。
OrderSelect()関数とは?
そもそも、OrderSelect()関数って何者?と思っている方もいるかもしれません。私もその一人でした。とりあえず変更注文や決済注文する前に入れておけばいいみたいな考え方でした。まぁ、この考えでほぼ大丈夫なんですが・・・。
ポジションが1つだけだったら上記の考えだけで大丈夫ですが、複数ポジションを持つようなEAを作り始めるとそうは言っていられなくなってきます。
実際の操作からイメージする
では、OrderSelect()関数って何をしている機能なのか?これ実はめちゃくちゃ簡単です。
MT4の実際の操作で答えられるので見ていきましょう。
MT4で取引タブを選んで・・・
ポジションを1つ選択する。
はい、これです。これだけ!
OrderSelect()関数は実際の操作でいうと、ポジションをクリック(選択)することなんです。どうですか?意外と簡単な事ではなかったでしょうか?
でもこんな選択するだけの機能なんているんでしょうか・・・?それは、次で答えます。
OrderSelect()関数を使う理由
OrderSelect()関数が『ポジションを選択すること』っていうのは分かったけど、じゃあ何故OrderSelect()関数を使うんでしょうか?
簡単です!これも実際の操作で考えます。実際ポジションをクリック(選択)する時って何をするためですか?
そう。特定のポジションを決済したい時とかには選択して決済ボタン押しますよね。
※ストップロス変更したりする変更注文も同じですよね
EAでポジションを決済したい時も、OrderSelect()関数を使って決済したいポジションを選択してあげないと、どのポジションを決済したらいいのかわかりません。ポジションが1つだけだといいですが、ポジションが2つ以上あった場合、決済したくない方を決済しちゃったら大変ですよね。
なので決済するポジションを選択してあげるためにOrderSelect()関数を使うわけですね。
という事で、OrderSelect()関数はポジションをクリック(選択)する事です。その名の通りですね!
ポジションが複数ある場合にEAで決済や変更注文する場合は必須の関数となります。
OrderSelect()関数の使い方
OrderSelect()関数の使い方ですが、引数が3つあり、戻り値はTrue かFalseです。とても簡単ですので全て理解しましょう。
OrderSelect(引数1,引数2,引数3)= [True or False] ; (例) OrderSelect(0,SELECT_BY_POS,MODE_TRADES)= True;
引数のパターンは大きく2パターンあります。今回はよく使う方の1パターン目を覚えましょう。
- 引数1・・・注文インデックスを指定します。最新のポジションは0、1つ前は1という感じです。
- 引数2・・・SELECT_BY_POSと指定します。
- 引数3・・・注文プールを選択します。MODE_TRADESとした場合はエントリー中の注文(保留中の注文も含まれる)で、MODE_HISTORY とした場合は過去の履歴注文を選択します。
続いて2パターン目。こちらはチケット番号で管理したい場合に使うので上級者向けです。引数のみの説明でとりあえず今回は説明から省きます。
- 引数1・・・チケット番号を指定します。ポジションについている固有の番号。
- 引数2・・・SELECT_BY_TICKETと指定します。
- 引数3・・・MODE_TRADESと指定します。 ※SELECT_BY_TICKETの場合、MODE_HISTORYは使えない
まずは、1パターン目の内容だけは覚えましょう。
引数1はそのままで0とすれば最初のポジション、1としたら次のポジションです。最新のポジションの方が大きい値になります。例えばポジションを2つ持っている場合、最新のポジションを持ったのを選択したい場合は1とします。最初に持ったものを選択したい場合は0とします。
引数2は、SELECT_BY_POSかSELECT_BY_TICKETを選択するだけですが、SELECT_BY_TICKETとしてしまうと引数1にチケット番号をセットしないといけなくなるので、SELECT_BY_POSが簡単です。
引数3は、MODE_TRADESかMODE_HISTORYを選択するだけです。現在のポジションはMODE_TRADESとし、過去の履歴を見たい場合はMODE_HISTORYとします。
ここで、過去の履歴というものが初めて出てきましたが説明していきます。
OrderSelect()関数で過去履歴を見る
OrderSelect()は大きく2つの用途で使います。
1つは冒頭から説明している現在保持しているポジションを選択するための用途です。
もう1つはこれから説明する過去のポジション(トレード履歴)を確認するための用途です。過去のポジションの確認はあまりしないかもしれないですが、今後使うかもしれないので覚えておきましょう。
こんな感じです。
過去履歴の活用方法を実際の操作からイメージする
過去の注文を選択する場合も実際の操作からイメージしてみましょう。
MT4で口座履歴タブを選んで・・・
決済した内容を選択する。
人間は一覧だけみたら決済内容を確認できるんですが、EAは一覧をざーっと1発で確認することができません。そのため、欲しい情報を1行選択してあげる必要があるんですね。こうやって、1つ前に決済したポジションはプラスだったのかとか、ショートだったのかロングだったのか、いくらで決済したのかをEAでも見る事ができます。
この情報を元に次のエントリーに生かしたりできるわけですね。
それを踏まえて、最新取引履歴の損益額を出力するサンプルはこんな感じです。
※EAのマジックナンバーが9999の想定
for(int cnt = OrdersHistoryTotal(); cnt > 0; cnt--){
if(OrderSelect(cnt-1,SELECT_BY_POS,MODE_HISTORY) == true){
if(OrderMagicNumber() == 9999){
Print(OrderProfit());
break;
}
}
}
さいごに
以上が、『OrderSelect()を正しく使えるようになる考え方』です。
OrderSelect()関数って漠然と言われると、何してるんだろう?ってなるかもしれないですが実際の人間の動作で考えると簡単です。使う意味とかどこで使ったらいいのかがわかってきますよね。
OrderSelect()関数が正しく使えるようになれば、複数ポジションを扱うEAを作れたりマジックナンバーの意味が理解できてくるので、分からない方は頑張って理解していきましょう。
※ EAのサンプルソースを一覧表にまとめました
※EA作成依頼はこちら
※オンラインレッスンやってます
コメント