![見出し画像](https://assets.st-note.com/production/uploads/images/117883753/rectangle_large_type_2_98e389f08f3c8c97ce2f612765b07744.jpeg?width=800)
時間制限ありの逆指値発注(発注の応用)
//<<<<<>>>>><<<<<>>>>><< include >><<<<<>>>>><<<<<>>>>>
#include <Trade\Trade.mqh>
//<<<<<>>>>><<<<<>>>>><< 発注用変数 >><<<<<>>>>><<<<<>>>>>
CTrade mytrade;
ENUM_ORDER_TYPE_FILLING fillPolicy;
input group "MagicNumber"
input int MagicNumber_bid = 1111; // bidマジックナンバー
input int MagicNumber_ask = 1112; // askマジックナンバー
input group "order_time_limit"
input int order_time_limit = 300; // 発注後約定しなかったオーダーが自動消滅する時間(秒)
//<<<<<>>>>><<<<<>>>>><< オーダー用リクエスト >><<<<<>>>>><<<<<>>>>>
MqlTradeRequest myrequest_ask= {};
MqlTradeRequest myrequest_bid= {};
MqlTradeResult myresult= {};
//<<<<<>>>>><<<<<>>>>><< Tick価格変数 >><<<<<>>>>><<<<<>>>>>
MqlTick last_tick;
//<<<<<>>>>><<<<<>>>>><< 取引ロット >><<<<<>>>>><<<<<>>>>>
input group "lot"
input double entry_lot = 0.01;//取引ロット
OnTick()
//発注価格取得(last_tick.ask:買う場合の価格 last_tick.bid:
売る場合の価格)
SymbolInfoTick(_Symbol,last_tick);
//逆指値注文(10pip先に逆指値注文)
bidrequest(MagicNumber_bid,entry_lot,last_tick.ask + 100*_Point,0,0);
askrequest(MagicNumber_ask,entry_lot,last_tick.bid - 100*_Point,0,0);
Deal_bidrequest(int magic,double volume,double price,double sl,double tp)
//+------------------------------------------------------------------+
//|BIDオーダーのテンプレートを反映した上で、requestベースで発注する |
//+------------------------------------------------------------------+
void bidrequest(int magic,double volume,double price,double sl,double tp)
{
ZeroMemory(myrequest_bid); //初期化
//固定値
myrequest_bid.action = TRADE_ACTION_PENDING; //注文を指定
myrequest_bid.symbol = _Symbol; //通貨ペア名
myrequest_bid.deviation = 20; //スリッページ
myrequest_bid.comment = "bid"; //コメント
myrequest_bid.type_filling = fillPolicy;
myrequest_bid.type = ORDER_TYPE_BUY_STOP; //逆指値買
//時間制限
if(order_time_limit > 60)//業者により、有効期限の下限制限あり
{
myrequest_bid.type_time = ORDER_TIME_SPECIFIED; //有効期限あり;
myrequest_bid.expiration = TimeCurrent() + order_time_limit; //有効時間
}
//可変(オーダー時に代入)
myrequest_bid.magic = magic; //マジックナンバー(識別用)
myrequest_bid.volume = volume; //ロット数
myrequest_bid.price = price; //注文価格
myrequest_bid.sl = sl; //ストップロス価格
myrequest_bid.tp = tp; //リミット価格
//発注
OrderSend(myrequest_bid, myresult);
TradeErrorCheck();
Sleep(500);
}
Deal_askrequest(int magic,double volume,double price,double sl,double tp)
//+------------------------------------------------------------------+
//|ASKオーダーのテンプレートを反映した上で、requestベースで発注する |
//+------------------------------------------------------------------+
void askrequest(int magic,double volume,double price,double sl,double tp)
{
ZeroMemory(myrequest_ask); //初期化
//固定値
myrequest_ask.action = TRADE_ACTION_PENDING; //注文を指定
myrequest_ask.symbol = _Symbol; //通貨ペア名
myrequest_ask.deviation = 20; //スリッページ
myrequest_ask.comment = "ask"; //コメント
myrequest_ask.type_filling = fillPolicy;
myrequest_ask.type = ORDER_TYPE_SELL_STOP; //逆指値売
//可変(オーダー時に代入)
myrequest_ask.magic = magic; //マジックナンバー(識別用)
myrequest_ask.volume = volume; //ロット数
myrequest_ask.price = price; //注文価格
myrequest_ask.sl = sl; //ストップロス価格
myrequest_ask.tp = tp; //リミット価格
//時間制限
if(order_time_limit > 60)//業者により、有効期限の下限制限あり
{
myrequest_ask.type_time = ORDER_TIME_SPECIFIED; //有効期限あり;
myrequest_ask.expiration = TimeCurrent() + order_time_limit; //有効時間
}
//発注
OrderSend(myrequest_ask, myresult);
TradeErrorCheck();
Sleep(500);
}
TradeErrorCheck()
//+------------------------------------------------------------------+
//| オーダー成否確認 |
//+------------------------------------------------------------------+
void TradeErrorCheck()
{
if(myresult.retcode==TRADE_RETCODE_PLACED || myresult.retcode==TRADE_RETCODE_DONE)
{
Print("注文が成功しました。 リターンコード= ",myresult.retcode);
}
else
Print("注文が失敗しました。リターンコード= ",myresult.retcode);
}
//+------------------------------------------------------------------+
MQL5コード一覧はコチラ
この記事が気に入ったらサポートをしてみませんか?