自作関数KeepDistance()のコメント解説をしていきます。
/*
現行の損切り価格が0(指定していない)場合はただのトレーリングストップ
現行の損切り価格が指定されていたら損切り価格を切り上げていく 損益0を超えるとただのトレーリングストップ
※損切りを設定しているとトータル損益がマイナスになりやすいのでオススメしない=>今後の課題。。。
現行の利益確定価格は変更しないので設定している場合は天井で決済され、ない場合はどこまでもトレールされる
引数
ticket = チケット
execution_pips = 現在価格からどれだけ離れたら損切り価格の変更を実施するか?(レート上のpips)
narrow_loss = execution_pips分,離れたら現行の損切り価格に加えて減損するpips(損切り縮小pips)(レート上のpips)
*/
void KeepDistance(int ticket,double execution_pips, double narrow_loss){
if(OrderSelect(ticket,SELECT_BY_TICKET) && OrderCloseTime()==0){
double OpenPrice = NormalizeDouble(OrderOpenPrice(),getDigits(Symbol())); //約定価格
double CurrentStopPrice = NormalizeDouble(OrderStopLoss(),getDigits(Symbol())); //損切り価格
double current_price; //現在の価格
double KeepDistancePrice; //変更する損切り価格
double execution_price; //執行価格
bool flag = false;
if(OrderType() == OP_BUY){
//--- 現在の価格(買値)
current_price = getAsk(Symbol());
//--- 執行価格 = 現在の価格 - 執行pips
execution_price = current_price-execution_pips;
//--- 変更する損切り価格 = 現在の損切り価格 + 狭めるpips
KeepDistancePrice = CurrentStopPrice+narrow_loss;
//--- 執行価格 > 現損切り価格 && 変更する損切り価格 > 現在の損切り価格
if( execution_price > CurrentStopPrice && KeepDistancePrice > CurrentStopPrice ){
//--- 約定価格 >= 現在の損切り価格 || 約定価格 < 現損切り価格
if( (OpenPrice >= CurrentStopPrice || OpenPrice < CurrentStopPrice) && CurrentStopPrice != 0 ){
//--- 損切り価格の変更を許可する
flag = true;
//--- 現在の損切り価格がない場合
}else if(CurrentStopPrice == 0){
//--- 約定価格 >= 執行価格
if(OpenPrice >= execution_price){
//--- 損切り価格の変更を許可しない
flag = false;
//--- 約定価格 < 執行価格
}else if(OpenPrice < execution_price){
//変更する損切り価格 = 約定価格 + 狭めるpips
KeepDistancePrice = OpenPrice+narrow_loss;
//--- 損切り価格の変更を許可する
flag = true;
}
}
}
}else if(OrderType() == OP_SELL){
//--- 現在の価格(売値)
current_price = getBid(Symbol());
//--- 執行価格 = 現在の価格 + 執行pips
execution_price = current_price+execution_pips;
//--- 変更する損切り価格 = 現在の損切り価格 - 狭めるpips
KeepDistancePrice = CurrentStopPrice-narrow_loss;
//--- 執行価格 < 現損切り価格 && 変更する損切り価格 < 現在の損切り価格
if( execution_price < CurrentStopPrice && KeepDistancePrice < CurrentStopPrice && CurrentStopPrice != 0 ){
//--- 約定価格 <= 現在の損切り価格 || 約定価格 > 現損切り価格
if( (OpenPrice <= CurrentStopPrice || OpenPrice > CurrentStopPrice) ){
//--- 損切り価格の変更を許可する
flag = true;
}
//--- 現在の損切り価格がない場合
}else if(CurrentStopPrice == 0){
//--- 約定価格 <= 執行価格
if(OpenPrice <= execution_price){
//--- 損切り価格の変更を許可しない
flag = false;
//--- 約定価格 > 執行価格
}else if(OpenPrice > execution_price){
//変更する損切り価格 = 約定価格 - 狭めるpips
KeepDistancePrice = OpenPrice-narrow_loss;
//--- 損切り価格の変更を許可する
flag = true;
}
}
//--- 待機注文の場合
}else{
//--- 損切り価格の変更を許可しない
flag = false;
}
//--- 損切り価格の変更許可があったら
if(flag == true){
bool KeepDistance = OrderModify(OrderTicket(),OrderOpenPrice(),KeepDistancePrice,OrderTakeProfit(),0);
//--- 損切り価格の変更に失敗したら
if(KeepDistance == false){
//--- KeepDistance関数でエラーを吐いたとお知らせします。
Print("KeepDistance:Ticket::",OrderTicket(),",errorNO::",GetLastError());
}
}
}
}
getDigits();//=>MarketInfo(Symbol(),MODE_DIGITS); getAsk(); //=>MarketInfo(Symbol(),MODE_ASK); getBid(); //=>MarketInfo(Symbol(),MODE_BID);
関連記事一覧:OrderModify(),NomalizeDouble(),OrderStopLoss(),OrderTakeProfit()
