自作関数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()