PS:总之,我发现这个库非常强大,但也很复杂,很难理解,不过一旦掌握了它,就能很快开发出各种由 EA 驱动的策略......除了巨大的学习曲线外,我还注意到回测性能相当缓慢,因此我希望您能在完成您为 DoEasy 设想的功能集后解决这一点。
void EventsHandling(void)
{
//--- 如果出现交易事件if(engine.IsTradeEvent())
{
//--- 同时发生的交易事件数量int total = engine.GetTradeEventsTotal();
for (int i = 0; i < total; i++)
{
//--- 按索引从同时发生的事件列表中获取下一个事件
CEventBaseObj *event = engine.GetTradeEventByIndex(i);
if(event == NULL)
continue;
int shift = i;long lparam = event.LParam();
double dparam = event.DParam();
string sparam = event.SParam();
OnDoEasyEvent(CHARTEVENT_CUSTOM+event.ID(), lparam, dparam, sparam, shift);
}
}
//...//...
}
void OnDoEasyEvent(constint id, constlong &lparam, constdouble &dparam, conststring &sparam, int shift=0)
{
//...//...//--- 处理交易事件if(idx > TRADE_EVENT_NO_EVENT && idx < TRADE_EVENTS_NEXT_CODE)
{
//--- 获取交易事件列表
CArrayObj *list = engine.GetListAllOrdersEvents();
if(list == NULL) return;
//--- get the event index shift relative to the end of the list//--- in the tester, the shift is passed by the lparam parameter to the event handler//--- outside the tester, events are sent one by one and handled in OnChartEvent()int shift=(testing ? (int)lparam : 0);
CEvent *event=list.At(list.Total()-1-shift);
if(event==NULL) return;
//...//...
}
你好,我提的问题发现了吗?
嗨,Artyom -- 在仔细研究这段代码时,我注意到了在事件处理() 和OnDoEasyEvent() 中实现的"shift"值的特殊性,它可以在测试器中运行时正确处理交易事件......我知道,正如您在文章中指出的,当运行实时交易 时,交易事件 会在引擎触发后逐一从OnChartEvent() 中 发送,而在测试模式 下,它们会被分组并以列表形式发送...
我的问题是:在事件处理程序中实现一个专门的函数参数,而不是牺牲包含对事件处理程序有用信息的"lparam",不是更好吗?我还认为这样会使代码更简单/更易读;你同意吗?
PS:总之,我发现这个库非常强大,但也很复杂,很难理解,不过一旦掌握了它,就能很快开发出各种由 EA 驱动的策略......除了巨大的学习曲线外,我还注意到回测性能相当缓慢,因此我希望您能在完成您为 DoEasy 设想的功能集后解决这一点。
您好,Artyom -- 在仔细研究这段代码时,我注意到在事件处理() 和OnDoEasyEvent() 中实现的 "shift"值有一个特殊性,即在测试模式下运行时要正确处理交易事件...我知道,正如您在文章中指出的,当运行实时交易 时,交易事件 会在引擎触发后逐一从OnChartEvent() 中 发送,而在测试模式 下,它们会被分组并以列表形式发送...
我的问题是:与其牺牲包含对事件处理有用信息的 "lparam",不如在事件处理程序中实现一个专用的函数参数,这样不是更好吗?我还认为这样可以使代码更简单/更易读;你同意吗?
PS:总之,我发现这个库非常强大,但也很复杂,很难理解,不过一旦掌握了它,就能很快开发出各种由 EA 驱动的策略......除了巨大的学习曲线外,我还注意到回测性能相当缓慢,因此我希望您能在完成您为 DoEasy 设想的功能集后解决这一点。
不,我不打算重做任何事情,而且很可能也不会重做。所有必要的数据都已经传递给了事件对象,其余数据也已经从事件被注册的对象中获取。
不,在这里我不打算重做任何事情,而且很可能也不会重做。所有必要的数据都已经传递给了事件对象,其余的数据也已经从那些注册了事件的对象中获取。
好吧,很公平...我同意所有必要数据都在事件对象中。
能否请您提供一些示例代码,以便在获得最后一个交易事件时,可以提取订单/仓位票据 和其他属性?