RepellingOrder()って関数を作ってみたけど何か?【コード付き】

自作関数RepellingOrder()のコメント解説をしていきます。

/*
引数
ticket = チケット
ratetakeprofit = レート上の利確pips
escape_pips = レート上の注文価格を逃がすpips距離
deadline_price = 上限下限のレート価格

BUY_LIMITの場合は下に逃げるのでdeadline_priceに下限価格を設定(現在価格は上に逃走中(笑))
SELL_LIMITの場合は上に逃げるのでdeadline_priceに上限価格を設定(現在価格は下に逃走中(笑))
※約定価格に上限下限は効果ない。あくまでも変更時(LIMIT待機中)のみの上限下限

逃がす際の基準として使っているのが待機注文の利確価格。(現在価格が待機注文の送信位置からどの程度離れたかの基準)
なので、約定後に利確幅を元に戻しています。
現在価格が動けば同じ方向に待機注文の利確価格が動き(現在価格を利確が追尾している)、それに反して待機注文の価格は逆方向に(利確と)同じだけ動きます。
つまりどんどん待機価格が逃げていきます。
乖離を考慮したらこうなりました。
*/
void RepellingOrder(int ticket, double ratetakeprofit ,double escape_pips ,double deadline_price=0){
	// チケットが選択でき                   &&  ポジション保有中(待機注文送信済み)
	if(OrderSelect(ticket,SELECT_BY_TICKET) && OrderCloseTime()==0){
		//執行pips
		double execution_pips = ratetakeprofit;
		//現在価格
		double current_price;
		//変更価格
		double NewOpenPrice;
		//変更許可フラグ
		bool   flag = false;
		//現在の待機注文価格
		double OpenPrice = NormalizeDouble(OrderOpenPrice(),getDigits(Symbol()));
		//現在の待機利益確定価格
		double TakeProfitPrice = NormalizeDouble(OrderTakeProfit(),getDigits(Symbol()));
		//現在の待機損失確定価格
		double StopLossPrice = NormalizeDouble(OrderStopLoss(),getDigits(Symbol()));
		
		// 買いの指値注文の場合
		if(OrderType() == OP_BUYLIMIT){
			// 現在価格(買値)
			current_price = getAsk(Symbol());
			// 現行の利確価格+執行pips < 現在の価格
			if( TakeProfitPrice+execution_pips < current_price ){
				// 移動後の待機注文価格
				NewOpenPrice = OpenPrice - escape_pips;
				// 現行の損切り価格が設定されている場合 変更後の損切り価格 = 現行の損切り価格 - 逃がすpips
				if(OrderStopLoss() != 0)StopLossPrice = StopLossPrice - escape_pips;
				// 現行の利確価格が設定されている場合   変更後の利確価格 = 現行の利確価格 - 逃がすpips
				if(OrderTakeProfit() != 0)TakeProfitPrice = TakeProfitPrice + escape_pips;
				// 待機注文の変更を許可する
				flag = true;
				// 下限価格が設定されていて && 変更後の待機注文価格 < 下限価格
				if(deadline_price!=0 && NewOpenPrice < deadline_price){
					// 待機注文の変更を許可しない
					flag = false;
				}
			}
		}
		
		// 買いの指値注文が約定したら && 現行の利確価格 != 約定価格 + 利確pips
		if(OrderType() == OP_BUY && OrderTakeProfit()!= OrderOpenPrice() + ratetakeprofit){
			// 現在価格(買値)
			current_price = getAsk(Symbol());
			// 新しい待機注文価格 = 約定価格(変更しない。約定しているので変更不可)
			NewOpenPrice = OrderOpenPrice();
			// 現行の損切り価格が設定されている場合 変更後の損切り価格 = 現行の損切り価格(変更しない)
			if(OrderStopLoss() != 0)StopLossPrice = OrderStopLoss();
			// 現行の利確価格が設定されている場合   変更後の利確価格 = 約定価格 + 利確pips
			if(OrderTakeProfit() != 0)TakeProfitPrice = OrderOpenPrice() + ratetakeprofit;
			// 利確を元に戻すのを許可する。(このチケットの利確価格は遥か地底にありますので(笑))
			flag = true;
		}
		
		// 売りの指値注文の場合
		if(OrderType() == OP_SELLLIMIT){
			// 現在価格(売値)
			current_price = getBid(Symbol());
			// 現行の利確価格 - 逃がすpips > 現在価格
			if(TakeProfitPrice-execution_pips > current_price){
				// 新しい待機注文価格 = 現行の待機注文価格 + 逃がすpips
				NewOpenPrice = OpenPrice + escape_pips;
				// 現行の損切り価格が設定されている場合 変更後の損切り価格 = 現行の損切り価格 + 逃がすpips
				if(OrderStopLoss() != 0)StopLossPrice = StopLossPrice + escape_pips;
				// 現行の利確価格が設定されている場合   変更後の利確価格 = 現行の利確価格 - 利確pips
				if(OrderTakeProfit() != 0)TakeProfitPrice = TakeProfitPrice - escape_pips;
				// 待機注文の変更を許可する
				flag = true; 
				// 上限価格が設定されていて && 変更後の待機注文価格 > 上限価格
				if(deadline_price!=0 && NewOpenPrice > deadline_price){
					// 待機注文の変更を許可しない
					flag = false;
				}
			}
		}
		
		// 売りの指値注文が約定したら && 現行の利確価格 != 約定価格 - 利確pips
		if(OrderType() == OP_SELL && OrderTakeProfit()!= OrderOpenPrice() - ratetakeprofit){
			// 現在価格(売値)
			current_price = getBid(Symbol());
			// 新しい待機注文価格 = 約定価格(変更しない。約定しているので変更不可)
			NewOpenPrice = OrderOpenPrice();
			// 現行の損切り価格が設定されている場合 変更後の損切り価格 = 現行の損切り価格(変更しない)
			if(OrderStopLoss() != 0)StopLossPrice = OrderStopLoss();
			// 現行の利確価格が設定されている場合   変更後の利確価格 = 約定価格 - 利確pips
			if(OrderTakeProfit() != 0)TakeProfitPrice = OrderOpenPrice() - ratetakeprofit;
			// 利確を元に戻すのを許可する。(このチケットの利確価格は遥か上空にありますので(笑))
			flag = true;
		}
		
		// 価格の変更許可があったら
		if(flag == true){
			// 価格変更
			bool RepellingOrder = OrderModify(OrderTicket(),NewOpenPrice,StopLossPrice,TakeProfitPrice,0);
			// 変更に失敗したら
			if(RepellingOrder == false){
				// RepellingOrder関数でエラーを吐いたとお知らせします。
				Print("RepellingOrder:Ticket::",OrderTicket(),",errorNO::",GetLastError());
			}
		}
	}
}
getDigits();//=>MarketInfo(Symbol(),MODE_DIGITS);
getAsk();   //=>MarketInfo(Symbol(),MODE_ASK);
getBid();   //=>MarketInfo(Symbol(),MODE_BID);

関連記事一覧:関数OrderModify(),関数OrderOpenPrice(),関数OrderStopLoss(),関数OrderTakeProfit(),関数OrderCloseTime()

シェアする

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

フォローする