我如何才能 select 只有 Metatrader 4 上最后关闭的订单?
How can I select only the last closed order(s) on Metatrader 4?
现在我select只要有新的历史交易(定时器周期为 1 秒的 onTimer 处理程序),所有历史交易都使用循环:
/*
3.) History Trades
*/
static int historyTradesTotal=0;
if(OrdersHistoryTotal()==historyTradesTotal) return;
historyTradesTotal = OrdersHistoryTotal();
int i,hstTotal = OrdersHistoryTotal();
string historical_trades = "";
for(i=hstTotal; i >= 0; i--)
{
//---- check selection result
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) continue;
historical_trades = historical_trades +
"historical_trades|" +
version + "|" +
DID + "|" +
IntegerToString(AccountNumber()) + "|" +
IntegerToString(OrderTicket()) + "|" +
TimeToString(OrderOpenTime(), TIME_DATE|TIME_SECONDS) + "|" +
TimeToString(OrderCloseTime(), TIME_DATE|TIME_SECONDS) + "|" +
IntegerToString(OrderType()) + "|" +
DoubleToString(OrderLots(),2) + "|" +
OrderSymbol() + "|" +
DoubleToString(OrderOpenPrice(),5) + "|" +
DoubleToString(OrderClosePrice(),5) + "|" +
DoubleToString(OrderStopLoss(),5) + "|" +
DoubleToString(OrderTakeProfit(),5) + "|" +
DoubleToString(OrderCommission(),2) + "|" +
DoubleToString(OrderSwap(),2) + "|" +
DoubleToString(OrderProfit(),2) + "|" +
"<" + OrderComment() + ">|";
}
}
那么现在我怎样才能 select 在最后一个 onTimer 事件之间关闭的订单,以避免在新订单一直关闭时循环遍历所有交易?
解决方案还应考虑在一秒内同时关闭两个或多个交易的罕见情况,例如..
这在 MQL4 中是不可能的。订单按其 ID 存储和返回,您不能应用自定义排序。所以你必须从最后一个开始遍历它们才能找到你需要的那个。另一种方法是将所有未结订单保存在 CArrayInt
或数组中(在新交易开始时添加,在找到关闭的交易时删除,在执行 init/deinit 时删除 read/write)并检查 live_trades_array 元素仍然打开。如果您的 ea 只有几个订单并且平台上有几个不同的 ea,那可能会快得多。
int i = OrdersHistoryTotal();
int a = OrdersHistoryTotal() - 10;
int b = OrdersHistoryTotal();
for (i = a;i < b ;i++)
{
if (OrderSelect(i,SELECT_BY_POS, MODE_HISTORY) == true)
{
Alert("orders found"+ OrderTicket() + " " + OrderCloseTime());
}
}
此代码有效,它从历史上上一个订单的第 10 个订单开始,但如果您只想检查上一个订单,您可以在 int a 中用 10 代替 1。如果您只想检查最后 5 个订单,请将 10 更改为 5。简单。
现在我select只要有新的历史交易(定时器周期为 1 秒的 onTimer 处理程序),所有历史交易都使用循环:
/*
3.) History Trades
*/
static int historyTradesTotal=0;
if(OrdersHistoryTotal()==historyTradesTotal) return;
historyTradesTotal = OrdersHistoryTotal();
int i,hstTotal = OrdersHistoryTotal();
string historical_trades = "";
for(i=hstTotal; i >= 0; i--)
{
//---- check selection result
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) continue;
historical_trades = historical_trades +
"historical_trades|" +
version + "|" +
DID + "|" +
IntegerToString(AccountNumber()) + "|" +
IntegerToString(OrderTicket()) + "|" +
TimeToString(OrderOpenTime(), TIME_DATE|TIME_SECONDS) + "|" +
TimeToString(OrderCloseTime(), TIME_DATE|TIME_SECONDS) + "|" +
IntegerToString(OrderType()) + "|" +
DoubleToString(OrderLots(),2) + "|" +
OrderSymbol() + "|" +
DoubleToString(OrderOpenPrice(),5) + "|" +
DoubleToString(OrderClosePrice(),5) + "|" +
DoubleToString(OrderStopLoss(),5) + "|" +
DoubleToString(OrderTakeProfit(),5) + "|" +
DoubleToString(OrderCommission(),2) + "|" +
DoubleToString(OrderSwap(),2) + "|" +
DoubleToString(OrderProfit(),2) + "|" +
"<" + OrderComment() + ">|";
}
}
那么现在我怎样才能 select 在最后一个 onTimer 事件之间关闭的订单,以避免在新订单一直关闭时循环遍历所有交易?
解决方案还应考虑在一秒内同时关闭两个或多个交易的罕见情况,例如..
这在 MQL4 中是不可能的。订单按其 ID 存储和返回,您不能应用自定义排序。所以你必须从最后一个开始遍历它们才能找到你需要的那个。另一种方法是将所有未结订单保存在 CArrayInt
或数组中(在新交易开始时添加,在找到关闭的交易时删除,在执行 init/deinit 时删除 read/write)并检查 live_trades_array 元素仍然打开。如果您的 ea 只有几个订单并且平台上有几个不同的 ea,那可能会快得多。
int i = OrdersHistoryTotal();
int a = OrdersHistoryTotal() - 10;
int b = OrdersHistoryTotal();
for (i = a;i < b ;i++)
{
if (OrderSelect(i,SELECT_BY_POS, MODE_HISTORY) == true)
{
Alert("orders found"+ OrderTicket() + " " + OrderCloseTime());
}
}
此代码有效,它从历史上上一个订单的第 10 个订单开始,但如果您只想检查上一个订单,您可以在 int a 中用 10 代替 1。如果您只想检查最后 5 个订单,请将 10 更改为 5。简单。