自作関数インフィニティプロフィットのコメント解説をしていきます。
/*
ブレイクイーブンからのトレーリングストップ
takeprofit = 50pips;
引数
ticket = チケット
ratetakeprofit = 0.50 //USDJPY => 50pips
ratetakeprofit = 0.0050 //GBPUSD => 50pips
execution_denominator = 2 // 分母
変更価格 = price±ratetakeprofit/execution_denominator=0.25 //USDJPY=>25pips
変更価格 = price±ratetakeprofit/execution_denominator=0.0025 //GBPUSD=>25pips
例:USDJPYが買いポジション。takeprofit=50pips。execution_denominator=2
108.00円で約定してブレイクイーブンが実行される時
現在価格(買値)108.25以上の時に損切り価格が108.00に変更されます。
例:USDJPYが買いポジション。takeprofit=50pips。execution_denominator=2
108.00円で約定してトレーリングストップが実行される時
現在価格(買値)108.50以上の時に損切り価格が108.25に変更されます。
*/
void InfiniteProfit(int ticket,double ratetakeprofit,int execution_denominator){
//チケットが選択できて決済時間が初期値の場合(ポジションを決済していない状態)
if( OrderSelect(ticket,SELECT_BY_TICKET) && OrderCloseTime()==0 ){
double rate_execution = ratetakeprofit; //トレーリングストップ執行価格
double securing_profit = rate_execution/execution_denominator; //利益確定値
double EvenExecutionPrice; //トントン執行価格
double current_price; //現在の価格
bool flag = false; //損切り価格変更許可
double InfiniteProfitPrice; //変更価格
//買いポジションの場合
if(OrderType() == OP_BUY){
//現在の価格(買値)
current_price = getAsk(Symbol());
//トントン執行価格
EvenExecutionPrice = OrderOpenPrice()+securing_profit;
//トントン執行価格<現在価格 && 約定価格!=注文した損切り価格 && 約定価格>注文した損切り価格 の場合
if(EvenExecutionPrice < current_price && OrderOpenPrice() != OrderStopLoss() && OrderOpenPrice() > OrderStopLoss()){
//損切り価格の変更を許可する
flag = true;
//ブレイクイーブンに変更を申請
InfiniteProfitPrice = OrderOpenPrice();
//約定価格を正規化<=注文した損切り価格を正規化 &&
}else if(NormalizeDouble(OrderOpenPrice(),getDigits(Symbol())) <= NormalizeDouble(OrderStopLoss(),getDigits(Symbol()))
//注文した損切り価格+執行pips<現在価格 の場合
&& OrderStopLoss()+rate_execution < current_price){
//損切り価格変更許可
flag = true;
//トレーリングストップを申請
InfiniteProfitPrice = OrderStopLoss()+securing_profit;
}
//売りポジションの場合
}else if(OrderType()==OP_SELL){
//現在の価格(売値)
current_price = getBid(Symbol());
//トントン執行価格
EvenExecutionPrice = OrderOpenPrice()-securing_profit;
//トントン執行価格>現在価格 && 約定価格!=注文した損切り価格 && (約定価格<注文した損切り価格 又は 注文時の損切り価格を指定していない )の場合
if(EvenExecutionPrice > current_price && OrderOpenPrice() != OrderStopLoss() && (OrderOpenPrice() < OrderStopLoss() || OrderStopLoss()==0)){
//損切り価格変更許可
flag = true;
//ブレイクイーブンに変更を申請
InfiniteProfitPrice = OrderOpenPrice();
//約定価格を正規化>=注文した損切り価格を正規化 &&
}else if(NormalizeDouble(OrderOpenPrice(),getDigits(Symbol())) >= NormalizeDouble(OrderStopLoss(),getDigits(Symbol()))
//注文した損切り価格+執行pips>現在価格 の場合
&& OrderStopLoss()-rate_execution > current_price){
//損切り価格変更許可
flag = true;
//トレーリングストップを申請
InfiniteProfitPrice = OrderStopLoss()-securing_profit;
}
//待機注文の場合
}else{
//損切り価格の変更を許可しない
flag = false;
//関数処理終了
return;
}
// 損切り価格の変更許可があれば
if(flag == true){
//損切り価格を変更する
bool InfiniteProfit = OrderModify(OrderTicket(),OrderOpenPrice(),InfiniteProfitPrice,0,0);
// エラー処理
if(InfiniteProfit == false){
//インフィニティプロフィット関数でエラーを吐いたとお知らせ
Print("InfiniteProfit:Ticket::",OrderTicket(),",errorNO::",GetLastError());
}
}
}
}
getDigits();//=>MarketInfo(Symbol(),MODE_DIGITS); getAsk(); //=>MarketInfo(Symbol(),MODE_ASK); getBid(); //=>MarketInfo(Symbol(),MODE_BID);
関連記事一覧:OrderModify(),NomalizeDouble(),OrderStopLoss(),OrderTakeProfit()
