ブレイクストップロスって関数作ってみた。コード付き

自作関数ブレイクストップロスをコメント解説していきます。

/*
(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()

シェアする

  • このエントリーをはてなブックマークに追加

フォローする