if(OrderType()==OP_BUY) { while(fastma < slowma) //Use if not while { ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE); if(ticket < 1) //ticket is a local variable and has not been assigned a value { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Buy order closed : ", OrderClosePrice()); } else Print("Error closing order : ", GetLastError()); return(0); } }
关于在多个货币对或时间框架上使用您的EA,还有一个非常重要的说明。
您的代码没有使用 "神奇数字 "选择,也没有在检查历史上的未结订单时检查使用的符号(或 "神奇数字")。因此,从本质上讲,你的EA将不能正确地工作,既不能与自己也不能与其他EA一起工作。
就像现在这样,你只能在没有其他EA运行的情况下单独使用该EA,甚至不能在另一个图表上使用该EA!
bool ans;
//You do not select an order
if(OrderType()==OP_BUY){
while(fastma < slowma) //Use if not while
{
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
if(ticket < 1) //ticket is a local variable and has not been assigned a value
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Buy order closed : ", OrderClosePrice());
}
else
Print("Error closing order : ", GetLastError());
return(0);
}
}
非常感谢你到目前为止对我的代码的帮助和你的时间,我将努力做出必要的调整。
因为您的EA有太多的逻辑问题,我建议您看一下MetaQuotes 的示例代码,即"Moving Average.mq4 "和/或 "MACD Sample.mq4",并在此基础上进行开发,直到您理解EA工作的基本原则。
我已经附上了这些文件,但您可以在 "MQL4/Experts "文件夹中找到它们。
编辑:关于代码,你正在使用OrderSelect,但你总是假设它每次都有效。当它不工作时,你就继续使用订单的细节函数,如OrderTicket(),如果最初的OrderSelect() 也失败了,这可能会失败。
在注意到你的编辑.....
我一直认为,当有新的tick时,OrderSelect()就会丢失。
所以我检查了一下,发现一旦一个订单被选中,即使在随后的新刻度线中也会保持选中。
每天都能学到新东西 :)
我一直认为,当有新的tick时,OrderSelect()就会丢失。
所以我检查了一下,发现一旦一个订单被选中,即使在随后的新刻度线中也会保持选中。
每天都能学到新东西:)
关于在多个货币对或时间框架上使用您的EA,还有一个非常重要的说明。
您的代码没有使用 "神奇数字 "选择,也没有在检查历史上的未结订单时检查使用的符号(或 "神奇数字")。因此,从本质上讲,你的EA将无法正常工作,无论是对自己还是对其他EA。
就像现在这样,你只能在没有其他EA运行的情况下单独使用这个EA,甚至不能在另一个图表上使用这个EA!
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) continue;
//---Check Order Type
if(OrderType()==OP_BUY)
{
if(fastma < slowma)
{
if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
}
else
Print("Error : ", GetLastError());
return(0);
break;
}
if(OrderType()==OP_SELL)
{
if(fastma > slowma)
{
if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
}
else
Print("Error : ", GetLastError());
return(0);
break;
}
}
这里是OrderClose部分,我不再得到无效的票据错误,但我现在得到了无效的价格。
这里是直接来自日志的内容
2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1: invalid price 1.05454000 for OrderClosefunction
{
if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
}
...
{
if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
这里是OrderClose部分,我不再得到无效票据的错误,但我现在得到了无效的价格。
这里是直接来自日志的内容
2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1: Invalid price 1.05454000 for OrderClosefunction
平仓时不要使用Bid/Ask,使用OrderClosePrice()。它将自动成为好的价格。
我是否应该在OrderClose函数中替换它?如果是,我是否应该在它下面的打印函数 中删除OrderClosePrice?
编辑。
我刚刚这样做了,但现在它不会保持任何仓位。只是开仓和平仓,尽管它现在在多个货币对上工作没有任何问题。
if(OrderType()==OP_BUY)
{
if(fastma < slowma)
{
if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
}
else
Print("Error : ", GetLastError());
return(0);
break;
}
因为你需要完成循环,所以不需要返回或中断。
另外,你的错误打印取决于
if(fastma < slowma)
为假,与OrderClose()是否失败无关。
if(OrderType()==OP_BUY)
{
if(fastma<slowma)
{
if(OrderClose(OrderTicket(),Lots, OrderClosePrice(),10,clrNONE))
Print("Order Closed : ",OrderClosePrice());
else
Print("Error : ",GetLastError())
}
}