Mql4 关闭订单时无效的票据
我正在尝试关闭所有打开的订单,它们都是市场订单,而不是挂起订单,并且SL和TP设置为0,因此它们不应该关闭自己(它们仍然在终端中打开)。我正在阵列中存储票证,因此我的循环如下所示:Mql4 关闭订单时无效的票据,mql4,Mql4,我正在尝试关闭所有打开的订单,它们都是市场订单,而不是挂起订单,并且SL和TP设置为0,因此它们不应该关闭自己(它们仍然在终端中打开)。我正在阵列中存储票证,因此我的循环如下所示: for(int i = 0; i < trades.size(); ++i) OrderClose(tickets[i], lots[i], Bid, Slippage); for(inti=0;i
for(int i = 0; i < trades.size(); ++i) OrderClose(tickets[i], lots[i], Bid, Slippage);
for(inti=0;i
但我仍然收到“无效票”错误,你能告诉我为什么吗?
这种情况并不总是发生,就像有些订单关闭了,而有些则抛出了无效的罚单。
我没有注意到只有一个订单的这种行为,所以我假设只有当订单更多时才会发生
代码:
模板
结构向量{
向量(){}
向量(整数数组化){
如果(arraySize<0){arraySize*=-1;}
ArrayResize(m_数据,arraySize);
}
向量(向量和rhs){
如果(size()
当您成功关闭某些票据时,您不会将其从列表中删除交易
,对吗?看来你应该这么做。如果订单关闭成功,请使用结构清除元素。
顺便说一句,可能没有必要重新发明轮子,使用
CArrayObj
作为元素的容器,并在订单关闭后删除它们 哦,你说得对,谢谢:D我在其他数组上调用了erase(),但在m_buyTicket和m_sellTicket数组上没有调用。如果你不介意的话,我想再问你一个问题。OrderCommission()的返回值是否以点数或实际货币(如美分)表示?以您的帐户货币表示,如美元或欧元。掉期交易也是如此。许多经纪人根本没有佣金,佣金将为零。
template < typename T >
struct vector {
vector() {}
vector(int arraySize) {
if (arraySize < 0) { arraySize *= -1; }
ArrayResize(m_data, arraySize);
}
vector(vector & rhs) {
if (size() < rhs.size()) { ArrayResize(m_data, rhs.size()); }
for(uint i = 0; i < size(); ++i) { m_data[i] = rhs.m_data[i]; }
}
vector operator=(vector & rhs) {
if (size() < rhs.size()) { ArrayResize(m_data, rhs.size()); }
for(uint i = 0; i < size(); ++i) { m_data[i] = rhs.m_data[i]; }
return this;
}
T operator[](uint index) { return m_data[index]; }
void push_back( T value ) {
ArrayResize(m_data, ArraySize(m_data) + 1);
m_data[ ArraySize(m_data) - 1 ] = value;
}
uint size() { return ArraySize(m_data); }
void resize(uint newSize) { ArrayResize(m_data, newSize); }
void erase() {
ZeroMemory(m_data);
ArrayResize(m_data, 0);
}
void assign(uint index, T value) {
m_data[index] = value;
}
private:
T m_data[];
};
string Buy(double lots) {
string alertString = "";
int __ticket;
if ( (__ticket = OrderSend (Symbol(), OP_BUY, lots, Ask, Slippage, 0, 0, NULL, m_magic)) != -1 )
{
m_buyTicket.push_back( __ticket );
m_buyLots.push_back( lots );
m_buyPrice.push_back( Ask );
m_buyAccel.push_back( lots / Lots );
m_buyPos.push_back( 0 );
alertString = "Buy function call." +
"\nAsk\t= " + (string)Round(Ask) +
"\nBid\t= " + (string)Round(Bid) +
"\nLots\t= " + (string)Round(lots) +
"\nSpread\t= " + (string)m_spread +
"\nID\t= " + (string)CountAll();
}
else {
int _error = GetLastError();
alertString = "Error " + (string)_error + "\n" + TranslateError( _error );
}
return alertString;
}
string CloseAll() {
string alertString = "CloseAll function call.";
// Buy closing
for (uint i = 0; i < m_buyPrice.size(); ++i)
{
if ( OrderClose ( m_buyTicket[i], m_buyLots[i], Bid, Slippage) )
{
alertString += "\nBuy " + (string)(i+1) + " closed with profit " +
(string)Shrink ( (Bid - m_buyPrice[i]) * m_buyAccel[i] );
}
else
{
int _error = GetLastError();
alertString += "\nError " + (string)_error + "\n" + TranslateError( _error ) +
"\n(while closing Buy " + (string)(i+1) + ")";
}
}
// Sell closing
for (uint i = 0; i < m_sellPrice.size(); ++i)
{
if ( OrderClose ( m_sellTicket[i], m_sellLots[i], Ask, Slippage) )
{
alertString += "\nSell " + (string)(i+1) + " closed with profit " +
(string)Shrink ( (m_sellPrice[i] - Ask) * m_sellAccel[i] );
}
else
{
int _error = GetLastError();
alertString += "\nError " + (string)_error + "\n" + TranslateError( _error ) +
"\n(while closing Sell " + (string)(i+1) + ")";
}
}
return alertString;
}