ストップレベルを考慮した損切り利食いレートを返す自作関数
必要な関数をまとめた関数
double getStopLevleRateUnit(string symbol, int pips_slippage, int pipsval){ if(pipsval != 0){ double rate_val = RatePipsUnit( PipsComparison( getStopLevle(symbol), (int)PointConvert(SlippagePipsUnit(pips_slippage,_Point),_Point), (int)pipsval) , _Point ); return rate_val; } return 0; }
この関数に通貨ペアとpips単位のスリッページとpips単位の損切りpips又は利食いpipsを入れてやると
例えば
通貨ペアがUSDJPY
ストップレベルが50point(_Point=0.001)
損切りpipsが50pips
利食いpipsが 3pips
スリッページが3pipsと引数に入力した場合
double stoploss =getStopLevleRateUnit(Symbol(),3,50); //実行結果->0.5 //つまりレート上の50pipsを返してくれます。 double takeprofit =getStopLevleRateUnit(Symbol(),3,3); //実行結果->0.08 //つまりレート上の8pipsを返してくれます。 //こちらはストップレベルが5pipsなので、利食いpipsに5pips以下を代入しているので //ストップレベル+スリッページの値を足した8pipsをレートに変換して返しています。
この値をpriceから足し算引き算してやれば、損切り価格と利食い価格を割り出せます。
必要な関数たち
//1point=1pipsをレート上の1pipsに変換 /* convert 1pips~ point _Point 50pips _Point=0.00001をいれるとreturn=0.005 50pips _Point=0.0001をいれても return=0.005 */ double RatePipsUnit(double convert_pips, double point){ if( point==0.01 || point==0.001 ){ convert_pips *= 0.01; }else if(point==0.0001||point==0.00001){ convert_pips *= 0.0001; } return(convert_pips); } //ストップレベルと損益pipsを比較して大きい方を返す /* stoplevel 1point~ pips_slippage 1pips~ pipsval 1pips~ */ double PipsComparison(double stoplevel,int pips_slippage,int pipsval){ if(stoplevel==0)return pipsval; double pipsStoplevel = PointConvert(stoplevel,_Point); if(pipsval<(pipsStoplevel+pips_slippage)){ return(pipsStoplevel+pips_slippage); }else{ return(pipsval); } } //ストップレベルをpoint単位で取得する double getStopLevle(string symbol){ return (MarketInfo(symbol,MODE_STOPLEVEL)); } //pointを入れてpipsで返す=>30pointをいれると3pipsで返る デコード /* convert_point 1point~ point _Point */ double PointConvert(double convert_point, double point){ if( point==0.001 || point==0.00001 ){ convert_point /= 10; } return(convert_point); } //pipsをいれてpoint単位で返す=>3pipsをいれると30pointで返る エンコード /* slippage 1pips~ point _Point */ int SlippagePipsUnit(int pips_slippage, double point){ if( point==0.001 || point==0.00001 ){ pips_slippage *= 10; } return(pips_slippage); }
実行サンプル
//グローバル変数 extern int MagicNumber = 12345; int sellTicket = 0; int buyTicket = 0; bool flag = true; void OnTick(){ int slippage = 3; if(flag){ double rate_stoploss = getStopLevleRateUnit(Symbol(),slippage,50); Print(Symbol(),":50pips;",rate_stoploss); double rate_takeprofit = getStopLevleRateUnit(Symbol(),slippage,3); Print(Symbol(),":3pips;",rate_takeprofit); double stoploss=0; if(rate_stoploss != 0){ stoploss = MarketInfo(Symbol(),MODE_ASK)-rate_stoploss; } double takeprofit=0; if(rate_takeprofit != 0){ takeprofit = MarketInfo(Symbol(),MODE_ASK)+rate_takeprofit; } //エントリー buyTicket = OrderSend(Symbol(),OP_BUY,MarketInfo(Symbol(),MODE_MINLOT),MarketInfo(Symbol(),MODE_ASK) ,slippage,stoploss,takeprofit,"OP_BUY",MagicNumber,0,clrNONE); flag=false; } }