[原创转载] macy01.blogcn.com
一般一个EA中会定义止损水平和止赢水平,一般大家定义的参数都是int型,即点数。例如下面的变量定义:
extern int _SlipPage = 2; //最大允许滑点数
extern int _StopLoss = 30; //止损水平
extern int _TakeProfit = 100; //赢利水平
extern int _Magic = 0; //订单Migc号码
在使用OrderSend开仓的时候,并不能够直接将上面的参数传递给OrderSend,因为OrderSend需要的是真实的市场价位,例如EURUSD开多仓位置为1.5000,则对应止损为1.4970,止赢为1.5100;对于其他货币小数位数可能不同,例如USDJPY。注意事项为:
(1)如果没有经过转换,或者价位设置错误(例如多单的止损高于入场价位),则会返回错误码130: errorDescription=\"无效的止损(invalid stops)\";
(2)在传入OrderSend时,最好使用NormalizeDouble(stopLoss,Digits)将参数处理为小数位数合适的Double类型
转换的代码如下面所示:
/*
此函数的功能是根据指标返回信号进场交易。
函数参数:无
返回值类型:无
*/
void Trade()
{
double openLots = LotsMgmt(); //开仓手数
int ticket; //订单编号
double stopLoss=0, takeProfit=0;
if(CheckForOpen()==OPEN_BUY)
{
//计算止赢点位
if(_TakeProfit==0)
takeProfit=0;
else
takeProfit=Ask+_TakeProfit*Point;
//计算止损点位
if(_StopLoss==0)
stopLoss=0;
else
stopLoss=Ask-_StopLoss*Point;
//这里止损和止赢必须使用NormalizeDouble处理和相应货币的小数位数对应
ticket=OrderSend(Symbol(), OP_BUY, openLots, Ask, _SlipPage, NormalizeDouble(stopLoss,Digits),NormalizeDouble(takeProfit,Digits), ORDER_COMMENT, _Magic, 0, Red);
if(ticket==-1)
Print(\"Error Occured : \"+ErrorDescription(GetLastError()));
}
if(CheckForOpen()==OPEN_SELL)
{
//计算止赢点位
if(_TakeProfit==0)
takeProfit=0;
else
takeProfit=Bid-_TakeProfit*Point;
//计算止损点位
if(_StopLoss==0)
stopLoss=0;
else
stopLoss=Bid+_StopLoss*Point;
//这里止损和止赢必须使用NormalizeDouble处理和相应货币的小数位数对应
ticket=OrderSend(Symbol(), OP_SELL, openLots, Bid, _SlipPage, NormalizeDouble(stopLoss,Digits),NormalizeDouble(takeProfit,Digits), ORDER_COMMENT, _Magic, 0, Green);
if(ticket==-1)
Print(\"Error Occured : \"+ErrorDescription(GetLastError()));
}
} |