#define EXPERT_MAGIC 123456 // エキスパートアドバイザのMagicNumber
//+------------------------------------------------------------------+
//| 未決注文の変更 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- リクエストと結果の宣言と初期化
MqlTradeRequest request={};
MqlTradeResult result={};
int total=OrdersTotal(); // 保有未決注文数
//--- 全ての保有未決注文を取捨
for(int i=0; i<total; i++)
{
//--- 注文パラメータ
ulong order_ticket=OrderGetTicket(i); //注文チケット
string order_symbol=Symbol(); // シンボル
int digits=(int)SymbolInfoInteger(order_symbol,SYMBOL_DIGITS); // 小数点以下の桁数
ulong magic=OrderGetInteger(ORDER_MAGIC); // 注文のMagicNumber
double volume=OrderGetDouble(ORDER_VOLUME_CURRENT); // 現在の注文量
double sl=OrderGetDouble(ORDER_SL); // 現在の注文のStop Loss
double tp=OrderGetDouble(ORDER_TP); // 現在の注文のTake Profit
ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE); // 注文タイプ
int offset = 50; // 発注の為の現在価格からのオフセット(ポイント)
double price; // 注文発動価格
double point=SymbolInfoDouble(order_symbol,SYMBOL_POINT); // ポイントサイズ
//--- 注文情報の出力
PrintFormat("#%I64u %s %s %.2f %s sl: %s tp: %s [%I64d]",
order_ticket,
order_symbol,
EnumToString(type),
volume,
DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
DoubleToString(sl,digits),
DoubleToString(tp,digits),
magic);
//--- MagicNumberが一致し、Stop LossとTake Profitが設定されていない場合
if(magic==EXPERT_MAGIC && sl==0 && tp==0)
{
request.action=TRADE_ACTION_MODIFY; // 取引操作タイプ
request.order = OrderGetTicket(i); // 注文チケット
request.symbol =Symbol(); // シンボル
request.deviation=5; // 価格からの許容オフセット
//--- 価格レベルの設定、タイプに合わせた注文のTake ProfitとStop Loss
if(type==ORDER_TYPE_BUY_LIMIT)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point;
request.tp = NormalizeDouble(price+offset*point,digits);
request.sl = NormalizeDouble(price-offset*point,digits);
request.price =NormalizeDouble(price,digits); // 正規化された発注価格
}
else if(type==ORDER_TYPE_SELL_LIMIT)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point;
request.tp = NormalizeDouble(price-offset*point,digits);
request.sl = NormalizeDouble(price+offset*point,digits);
request.price =NormalizeDouble(price,digits); // 正規化された発注価格
}
else if(type==ORDER_TYPE_BUY_STOP)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point;
request.tp = NormalizeDouble(price+offset*point,digits);
request.sl = NormalizeDouble(price-offset*point,digits);
request.price =NormalizeDouble(price,digits); // 正規化された発注価格
}
else if(type==ORDER_TYPE_SELL_STOP)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point;
request.tp = NormalizeDouble(price-offset*point,digits);
request.sl = NormalizeDouble(price+offset*point,digits);
request.price =NormalizeDouble(price,digits); // 正規化された発注価格
}
//---リクエストの送信
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // リクエストの送信に失敗した場合、エラーコードを出力する
//--- 操作情報
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
//--- リクエストと結果の値のゼロ化
ZeroMemory(request);
ZeroMemory(result);
}
}
}
//+------------------------------------------------------------------+
|