待機注文(Pending Order)とは?
相場の現在値でポジションをオープンさせる成行注文(Market Order)とは異なり、
待機注文は特定の価格に到達する事を想定し、現在値から一定数離れた価格で注文を出す方式となります。
指値注文といった方が馴染みがある人が多いかもしれません。
現在値より有利な価格を指定する、リミットオーダーや、現在値より不利な価格を指定するストップオーダーがあります。
リミットオーダーはポジションがオープンした後、相場が反転することを想定した戦略に用いられます。
ストップオーダーはポジションがオープンした後、相場がそのままトレンドを継続させることを想定した戦略に用いられます。
MT5だけに実装されたストップリミット注文という形式の待機注文もあります。
この待機注文方式には、ストップとリミットの両方の価格を指定します。相場がブレイクアウトする形でストッププライスに到達した後、価格がいったん押し目を作ることを想定して最終的にリミット価格でポジションを持ちます。
★<注意>:この記事で言及している「ストップ」「リミット」というのはあくまでも待機注文の種類の一つとしてのものであり、すでに有効化したポジションの損切りや利益獲得を意味するものではない点に注意してください。
<待機注文に関連する記事↓>
待機注文削除記述のロードマップ
以下の手順でコードを記述していきます
- 標準ライブラリのトレードファイルをインクルードし、CTradeクラスのインスタンスを宣言
- OnTick関数内に必要な値と、発注命令、待機注文削除命令を記述
- グローバル領域(関数の外の領域)に待機注文削除関数の定義を記述
標準ライブラリのトレードファイルをインクルードし、CTradeクラスのインスタンスを宣言
発注回路をOnTick関数内に簡単に組み込むために、Trade.mqhをインクルードして、CTradeクラスのインスタンスを生成します。
#include <Trade\Trade.mqh>
//標準ライブラリーのトレードファイルを使えるようにする
CTrade trade;
// CTradeクラスのインスタンスを宣言
OnTick関数内に必要な値と、発注命令、待機注文削除命令を記述
今回は「ポジションも待機注文もなければ、待機注文を出す」という回路を組み込みます。
待機注文削除命令はまだ定義がされていないので、この後グローバル領域に定義していきます。
★注意:以下のソースコードには発注回路が含まれています。
ソースコードの内容を試されるときは、必ずストラテジーテスターのバックテストモードか、
デモ口座お試しいただくようお願いします。
void OnTick()
{
//口座残高情報を取得
double accountBalance=AccountInfoDouble(ACCOUNT_BALANCE);
//有効証拠金情報を取得
double accountEquity=AccountInfoDouble(ACCOUNT_EQUITY);
//現在値(Ask)取得と正規化
double AskPrice=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
//現在値(Bid)取得と正規化
double BidPrice=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
if(PositionsTotal()<1 && OrdersTotal()<1)//ポジションも待機注文もなければ
{
//現在値より高い価格での買い注文を出す
trade.BuyStop(0.01,AskPrice+100*_Point,_Symbol,0,AskPrice+200*_Point,
ORDER_TIME_GTC);//←注文の有効期限は指定しない
//現在値より安い価格での売り注文を出す
trade.SellStop(0.01,BidPrice-100*_Point,_Symbol,0,BidPrice-200*_Point,
ORDER_TIME_GTC);//←注文の有効期限は指定しない
}//if(PositionsTotal()<1 && OrdersTotal()<1)
//口座残高と有効証拠金が同じでないときは、待機注文を取り下げる
if(accountBalance!=accountEquity)CancelOrder();
}
AccountInfoDouble関数については↓をご覧ください。
グローバル領域に待機注文削除関数の定義を記述
「残高と有効証拠金が等しくなければ待機注文を削除する」という内容を待機注文削除関数に記述していきます。
//待機注文削除関数の定義
void CancelOrder()
{
//注文プール内を古い方にむかってループチェック
for(int icounter=OrdersTotal()-1 ; icounter>=0 ;icounter--)
{
//待機注文のチケット番号を取得
ulong pendingOrderTicket=OrderGetTicket(icounter);
//待機注文を削除
trade.OrderDelete(pendingOrderTicket);
}//for(int icounter=PositionsTotal()-1 ; icounter>=0 ;i--)
}//void CancelOrder()
※ちなみにMQL5において、すでに有効化しているポジション数のチェックにはこのソースコードで使われているOrdersTotal関数は使えません。
有効化しているポジション数のチェックにはPositionsTotal関数を用います。
詳しくは↓をご覧ください。
全体のプログラムコード
//標準ライブラリーのトレードファイルを使えるようにする
#include <Trade\Trade.mqh>
// CTradeクラスのインスタンスを宣言
CTrade trade;
void OnTick()
{
//口座残高情報を取得
double accountBalance=AccountInfoDouble(ACCOUNT_BALANCE);
//有効証拠金情報を取得
double accountEquity=AccountInfoDouble(ACCOUNT_EQUITY);
//現在値(Ask)取得と正規化
double AskPrice=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
//現在値(Bid)取得と正規化
double BidPrice=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
if(PositionsTotal()<1 && OrdersTotal()<1)//ポジションも待機注文もなければ
{
//現在値より高い価格での買い注文を出す
trade.BuyStop(0.01,AskPrice+100*_Point,_Symbol,0,AskPrice+200*_Point,
ORDER_TIME_GTC);//←注文の有効期限は指定しない
//現在値より安い価格での売り注文を出す
trade.SellStop(0.01,BidPrice-100*_Point,_Symbol,0,BidPrice-200*_Point,
ORDER_TIME_GTC);//←注文の有効期限は指定しない
}//if(PositionsTotal()<1 && OrdersTotal()<1)
//口座残高と有効証拠金が同じでないときは、待機注文を取り下げる
if(accountBalance!=accountEquity)CancelOrder();
}
//+------------------------------------------------------------------+
//待機注文削除関数の定義
void CancelOrder()
{
//注文プール内を古い方にむかってループチェック
for(int icounter=OrdersTotal()-1 ; icounter>=0 ;icounter--)
{
//待機注文のチケット番号を取得
ulong pendingOrderTicket=OrderGetTicket(icounter);
//待機注文を削除
trade.OrderDelete(pendingOrderTicket);
}//for(int icounter=PositionsTotal()-1 ; icounter>=0 ;i--)
}//void CancelOrder()
サンプルコードの挙動は以下のようになります。
最後まで読んでいただきありがとうございました。<(_ _)>
★注意再掲:コード内には発注記述が入っています。
ソースコードの内容を試されるときは、必ずストラテジーテスターのバックテストモードか、
デモ口座お試しいただくようお願いします。
リアル口座に導入するといきなりポジションを持ってしまいます。ソースコードを利用されたことによって金銭的被害を被られたとしても当方では責任を負うことができません。
詳しくは免責事項をご確認ください。
※当サイトでは、プログラミング経験ゼロの方でも、プログラミングの基礎から学べる
をメインコンテンツとして展開しています。
第0回から、順を追って勉強していけばプログラミングの経験がなくてもMQL5を使って、MT5用のEAが作れるように書いています。最初は難しいと感じるかもしれませんが、繰り返し勉強していく事で自然とスキルが身についていくはずです。興味ある方は是非ご覧ください。
コメント