将订单详细信息保存在数组中?
Keep order details in arrays?
你能帮帮我吗?
1) 将订单保存在 EA 的数组中比使用 mql4 中的 Order.. 命令查询系统更好吗?将数据保存在数组中意味着您必须更少地查询系统,并且 Internet 可靠性可能不是一个问题。然而,保持准确订单簿所需的编码非常繁琐。
2) 您如何跟踪同一交易品种但来自两个不同 EA 的订单?
非常感谢
这取决于你的需求和想法,没有它可能很难说出任何东西。
您可以保留一组票号(或 CArrayObj
),但需要在执行其他操作(如跟踪)之前检查票证是否存在。如果您遇到互联网问题 - 更改 vps 并且不要尝试通过编码来解决它。
每个 EA 都有自己的交易记录。
无法想象只保留票数的感觉,但也许它存在。如果除了可以从 Order...() 获得的数据之外还需要存储一些数据,则使用 类 或结构,一些字段可能会用 osl、tp、oop、lot、magic、symbol 等填充一次以后不要调用 Order.() 函数,除了 OrderProfit(),OrderClosePrice() and OrderCloseTime()
- 这样的函数会一直被调用。
如何存储数据的示例如下:CTrade 实例添加到 CArrayObj
#include <Object.mqh>
#include <Arrays\ArrayObj.mqh>
class CTrade : public CObject
{
private:
int m_ticketId;
double m_oop,m_osl,m_otp,m_lot;//OrderOpenPrice() and sl, tp, lot-add more
public:
CTrade(const int ticket){
m_ticketId=ticket;
}
bool isTicketExist(){
if(OrderSelect(m_ticketId,SELECT_BY_TICKET))
return(OrderCloseTime()==0);
else return(false);//or GetLastError()!=4108
}
};
CArrayObj* listOfTrades=NULL;
int OnInit(void){
listOfTrades=new CArrayObj;
}
void OnDeinit(const int reason){
if(CheckPointer(listOfTrades)==POINTER_DYNAMIC)
delete(listOfTrades);
}
void OnTick(){
for(int i=listOfTrades.Total()-1;i>=0;i--){
CTrade *trade=listOfTrades.At(i);
if(!trade.isTicketExist())
{listOfTrades.Delete(i);continue;}
//do trail or what you need
} // - loop over the array when necessary but clean it first
}
listOfTrades.Add(new CTrade(ticket));// - way to add elements to the list
你能帮帮我吗?
1) 将订单保存在 EA 的数组中比使用 mql4 中的 Order.. 命令查询系统更好吗?将数据保存在数组中意味着您必须更少地查询系统,并且 Internet 可靠性可能不是一个问题。然而,保持准确订单簿所需的编码非常繁琐。
2) 您如何跟踪同一交易品种但来自两个不同 EA 的订单?
非常感谢
这取决于你的需求和想法,没有它可能很难说出任何东西。
您可以保留一组票号(或 CArrayObj
),但需要在执行其他操作(如跟踪)之前检查票证是否存在。如果您遇到互联网问题 - 更改 vps 并且不要尝试通过编码来解决它。
每个 EA 都有自己的交易记录。
无法想象只保留票数的感觉,但也许它存在。如果除了可以从 Order...() 获得的数据之外还需要存储一些数据,则使用 类 或结构,一些字段可能会用 osl、tp、oop、lot、magic、symbol 等填充一次以后不要调用 Order.() 函数,除了 OrderProfit(),OrderClosePrice() and OrderCloseTime()
- 这样的函数会一直被调用。
如何存储数据的示例如下:CTrade 实例添加到 CArrayObj
#include <Object.mqh>
#include <Arrays\ArrayObj.mqh>
class CTrade : public CObject
{
private:
int m_ticketId;
double m_oop,m_osl,m_otp,m_lot;//OrderOpenPrice() and sl, tp, lot-add more
public:
CTrade(const int ticket){
m_ticketId=ticket;
}
bool isTicketExist(){
if(OrderSelect(m_ticketId,SELECT_BY_TICKET))
return(OrderCloseTime()==0);
else return(false);//or GetLastError()!=4108
}
};
CArrayObj* listOfTrades=NULL;
int OnInit(void){
listOfTrades=new CArrayObj;
}
void OnDeinit(const int reason){
if(CheckPointer(listOfTrades)==POINTER_DYNAMIC)
delete(listOfTrades);
}
void OnTick(){
for(int i=listOfTrades.Total()-1;i>=0;i--){
CTrade *trade=listOfTrades.At(i);
if(!trade.isTicketExist())
{listOfTrades.Delete(i);continue;}
//do trail or what you need
} // - loop over the array when necessary but clean it first
}
listOfTrades.Add(new CTrade(ticket));// - way to add elements to the list