当我们关闭市价订单时,我们将以当前市场价格退出交易,这将是买单的当前买价和卖单的当前卖价。 在这篇完整的 MQL4 OrderClose Function 文章中了解如何对 EA 进行编程以在满足退出条件时关闭未结订单。
要关闭市场订单,使用的代码是 OrderClose() 函数,其语法如下:
bool OrderClose (int Ticket, double Lots, double Price, int Slippage, color Arrow);
下表描述了这些参数中的每一个:
范围 | 描述 |
---|---|
Ticket | 平仓市价单的票号 |
Lots | 要平仓的手数。 |
Price | 关闭交易的首选价格。 |
Slippage | 收盘价允许的点差。 |
Color | 闭合箭头的颜色常量。 |
下面的示例关闭了从 MACD 示例中借用的买入市价订单:
for(cnt=0; cnt<total ;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // check for opened position
OrderSymbol()==Symbol()) // check for symbol
{
if(OrderType()==OP_BUY) // long position is opened
{
// should it be closed?
if(MacdCurrent>0 && MacdCurrentSignalPrevious &&
MacdCurrent>(MACDCloseLevel*Point))
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
return(0); // exit
}
这里的关闭代码以 for 运算符开始,不断循环代码块以计算关闭条件。
函数 OrderSelect() 用于检查打开的订单池,寻找匹配的交易品种,以及订单类型(OP_BUY 或 OP_SELL)。
此代码块的最后也是最重要的条件是观察退出策略条件,在上面的示例中是 MACD 退出条件。
一旦确定了开仓品种和订单类型,并且满足 MACD 退出条件,就可以部署 OrderClose() 函数,其参数在上表中进行了讨论。
使用自定义关闭函数可能很有用,因为这样您就可以在需要根据任何一组条件关闭订单时从 Start() 函数中轻松调用它。 您的自定义平仓函数应检查当前未结订单池,识别您的订单类型及其幻数。
void close(int type){
if(OrdersTotal()>0){
for(Counter=OrdersTotal()-1;Counter>=0;Counter–){
OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES);
if(type==OP_BUY && OrderType()==OP_BUY){
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) {
RefreshRates();
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits), vSlippage);
} }
if(type==OP_SELL && OrderType()==OP_SELL){
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) {
RefreshRates(); OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),vSlippage);
}}
}}}
if (OType==0 && CloseBuy==true)
{
close (OP_BUY); // Close Buy
我们选择 close() 作为我们自定义关闭函数的名称,每当我们想要调用它时,我们只需在我们的关闭条件之后插入一个词,就像上面的用法示例一样。
如果总未平仓头寸大于零,则第二行启动该函数。 第三行检查当前打开的订单池,计算它们。 第四行调用 OrderSelect() 函数以选择这些已计数的订单以进行进一步处理。
我们只为自定义close函数构造了一个参数,就是括号()中的变量int类型。 此参数将成为我们订单类型的标识符。 在自定义函数中,我们指示类型将等于 (==) OP_BUY 或 OP_SELL,因此当我们调用 close() 时,我们必须指示 close() 是收盘(OP_BUY)还是收盘(OP_SELL),如 上面的用法示例。 在函数中,我们将 type==OP_BUY 和 OrderType==OP_BUY 与符号 (&&) 关联在一起。
我们还想确保我们选择了正确代码和幻数的买单,就像您在第 6 行中所做的那样:
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) {
Refresh Rates() 是一个刷新货币对汇率的函数,以便以最新汇率进行填充。
最后,我们部署 OrderClose() 函数,其参数可在上表中找到。