ブレイクイーブンをつくろう!!サンプル付き

今回は自作のブレイクイーブン関数をコメント解説していきます。

//引数はチケットとレートに変換済みの利益確定pipsです。
/*
前提条件USDJPY _Point=0.001 takeprofit=50pips
引数ratetakeprofit = 0.50
実際に使うときはratetakeprofit/2にとかにして使ってます。
*/
void BreakEven(int ticket,double ratetakeprofit){
        //チケットが選択できたら
	if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) && 
                //約定価格と損切り価格を正規化して約定価格と損切り価格が同じでない場合
                //_Digitsは最小レート変動の少数点の位を返す。0.001==3を返す
		NormalizeDouble(OrderOpenPrice(),getDigits(Symbol())) != NormalizeDouble(OrderStopLoss(),getDigits(Symbol())) 
                //ポジションの決済時間がない場合
		&& OrderCloseTime()==0 ){
			double price_over = ratetakeprofit; //ブレイクポイント
			double EvenExecutionPrice;          //ブレイクイーブン執行価格
			double current_price;               //現在の価格
			bool flag = false;                  //損切り価格の変更許可
                //買ポジションの場合
		if(OrderType()==OP_BUY){
                        //現在の価格(買値)
			current_price = getAsk(Symbol());
                        //ブレイクイーブン執行価格
			EvenExecutionPrice = OrderOpenPrice()+price_over;
                        //ブレイクイーブン執行価格より現在の価格が大きい
			if(EvenExecutionPrice < current_price ){
                                //損切り価格の変更を許可する
				flag = true;
			}
                //売ポジションの場合
		}else if(OrderType()==OP_SELL){
                        //現在の価格(売値)
			current_price = getBid(Symbol());
                        //ブレイクイーブン執行価格
			EvenExecutionPrice = OrderOpenPrice()-price_over;
                        //ブレイクイーブン執行価格より現在の価格が小さい
			if(EvenExecutionPrice > current_price ){
                                //損切り価格の変更を許可する
				flag = true;
			}
                //待機注文の場合
		}else{
                        //変更を許可しない
			flag = false;
                        //関数処理終了
			return;
		}
		// 損切り価格の変更許可があったら
		if(flag == true){
                        //損切り価格をオープン価格(約定価格)に変更する
			bool BreakEven = OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0);
			// エラー処理
			if(BreakEven == false){
                                        //ブレイクイーブン関数のModify()関数がエラーを吐いたとお知らせ
					Print("BreakEven::",GetLastError());
			}
		}			
	}
}

関連記事一覧:OrderModify(),NomalizeDouble(),OrderStopLoss(),OrderTakeProfit()

この関数はチケットを指定するので1つずつしかできません。なので使用するときは

int BuyTicket=0;
BuyTicket = OrderSend(Symbol(),...);
//BreaKEven(買ポジションチケット、レート上のpips);
BreaKEven(BuyTicket,rateTakeProfit);

まぁ複数のチケットでやりたい際はチケット変数を配列にして

int BuyTickets[3];             //要素数3で作成=>[0],[1],[2]で3つ
ArrayInitialize(BuyTickets,0); //配列の要素全てを0で初期化
BuyTickets[0] = OrderSend(Symbol(),...);
BuyTickets[1] = OrderSend(Symbol(),...);
BuyTickets[2] = OrderSend(Symbol(),...);
for(int i=0;i<3;i++){
   BreakEven(BuyTickets[i],rateTakeProfit);
}
//BreakEvenを汎用的にするなら条件式には
/*
( (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) || OrderSelect(ticket,SELECT_BY_POS,MODE_TRADES)) )
*/
//ですかね、、、

ブレイクイーブン執行価格とはその価格を現在の価格が過ぎた時に損切り価格をオープン価格(約定価格)に変更する条件価格です。
買いと売りで処理を分けているのは買い値(Ask)売り値(Bid)だからです。

getDigits();//=>MarketInfo(Symbol(),MODE_DIGITS);
getAsk();   //=>MarketInfo(Symbol(),MODE_ASK);
getBid();   //=>MarketInfo(Symbol(),MODE_BID);

関連記事一覧:OrderModify(),NomalizeDouble(),OrderStopLoss(),OrderTakeProfit()

以上お読みいただきありがとうございました。

シェアする

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

フォローする