自作関数ブレイクストップロスをコメント解説していきます。
/*
(openprice-ratestoploss)< 現在買価格 <(openprice-ratestoploss/denominator)
又は
(openprice+ratestoploss)> 現在売価格 >(openprice+ratestoploss/denominator)
の時
約定価格からratestoplossの幅で決済損益価格を指定
ticket = チケット
ratestoploss = 0.5 //=>50pips USDJPYの時
denominator = 2 //=>ratestoploss/denominator = 0.25
OrderOpenPrice()±0.5に決済損益価格を指定する
*/
void BreakStopLoss(int ticket,double ratestoploss,int denominator){
//チケットが選択できて、決済時間が初期値の場合(ポジション保有中)
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) && OrderCloseTime()==0){
//損切り価格
double BreakStopLossPrice;
//利益確定価格
double BreakTakeProfitPrice;
//価格変更を許可するかどうか?
bool flag = false;
//買いポジションの場合
if(OrderType()==OP_BUY){
//(openprice-ratestoploss)< 現在買価格 <(openprice-ratestoploss/denominator)
if(OrderOpenPrice()-ratestoploss/denominator > Ask && OrderOpenPrice()-ratestoploss < Ask){
//正規化済みの損切り価格と正規化済みの(約定価格-ratestoploss)が同じではない場合
if(NormalizeDouble(OrderStopLoss(),getDigits(Symbol()))!=NormalizeDouble(OrderOpenPrice()-ratestoploss,getDigits(Symbol()))){
//損切り価格
BreakStopLossPrice = OrderOpenPrice()-ratestoploss;
//利益確定価格
BreakTakeProfitPrice = OrderOpenPrice()+ratestoploss;
//価格変更を許可する
flag = true;
}
}
//売ポジションの場合
}else if(OrderType()==OP_SELL){
//(openprice+ratestoploss)> 現在売価格 >(openprice+ratestoploss/denominator)
if(OrderOpenPrice()+ratestoploss/denominator < Bid && OrderOpenPrice()+ratestoploss > Bid){
//正規化済みの損切り価格と正規化済みの(約定価格+ratestoploss)が同じではない場合
if(NormalizeDouble(OrderStopLoss(),getDigits(Symbol()))!=NormalizeDouble(OrderOpenPrice()+ratestoploss,getDigits(Symbol()))){
//損切り価格
BreakStopLossPrice = OrderOpenPrice()+ratestoploss;
//利益確定価格
BreakTakeProfitPrice = OrderOpenPrice()-ratestoploss;
//価格変更を許可する
flag = true;
}
}
//待機注文の場合
}else{
//価格変更を許可しない
flag = false;
//関数処理を終了
return;
}
// 損切り価格の変更許可があれば
if(flag == true){
//損益価格の変更
bool BreakStopLoss = OrderModify(OrderTicket(),OrderOpenPrice(),BreakStopLossPrice,BreakTakeProfitPrice,0,clrNONE);
// エラー処理
if(BreakStopLoss == false){
//BreakStopLossでエラーが起きましたとお知らせ
Print("BreakStopLoss:Ticket::",OrderTicket(),",errorNO::",GetLastError());
}
}
}
}
この関数の執行価格はopenprice±ratestoploss とopenprice±ratestoploss/denominatorの間に現在価格がある場合
getDigits();//=>MarketInfo(Symbol(),MODE_DIGITS); getAsk(); //=>MarketInfo(Symbol(),MODE_ASK); getBid(); //=>MarketInfo(Symbol(),MODE_BID);
関連記事一覧:OrderModify(),NomalizeDouble(),OrderStopLoss(),OrderTakeProfit()
