自作関数ブレイクストップロスをコメント解説していきます。
/* (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()