ストップレベルと比較して返して注文エラーを防ごう!!自作関数(MQ4)

ストップレベルを考慮した損切り利食いレートを返す自作関数

必要な関数をまとめた関数

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;
	}
}

シェアする

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

フォローする