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さん、こんにちは。このコードを詳しく調べているうちに、テスターで実行中のトレードイベントを正しく処理するために、EventsHandling() とOnDoEasyEvent() に実装されている「shift」値の特殊性に気づきました。記事の中でご指摘されているように、ライブで稼動している場合、取引イベントは エンジンによってトリガーされるとOnChartEvent() から1つずつ配信されるのに対し、テストモードでは グループ化され、リストとして配信されると理解しています。
私の質問は、イベント・ハンドラーにとって有用な情報を含むことができる'lparam'を犠牲にするよりも、イベント・ハンドラーに専用の関数パラメータを実装する方が良いのではないかということです。その方がコードがシンプルになり、読みやすくなると思うのですが、そう思いますか?
追記:とにかく、このライブラリは本当に強力だが、複雑で、頭を使いこなすのが難しいライブラリだと感じている。DoEasyの機能セットを完成させたら、この点に対処してほしいです。
Artyomさん、こんにちは。このコードを詳しく調べているうちに、EventsHandling() とOnDoEasyEvent() に実装されている、テスターで実行中のトレードイベントを正しく処理するための'shift'値の特殊性に気づきました。記事の中でご指摘されているように、ライブで稼動している場合、取引イベントは エンジンによってトリガーされるようにOnChartEvent() から1つずつ配信されるのに対し、テストモードでは グループ化され、リストとして配信される...と理解しています。
私の質問は、イベント・ハンドラーにとって有用な情報を含むことができる'lparam' を犠牲にするよりも、イベント・ハンドラーに専用の関数パラメータを実装する方が良いのではないかということです。また、その方がコードがシンプルになり、読みやすくなると思います。
追記:とにかく、このライブラリは本当に強力ですが、複雑で頭を使いこなすのが難しいものだと感じています。DoEasyの機能セットを完成させたら、この点に対処してほしいです。
いいえ、何もやり直すつもりはありませんし、おそらくやり直すこともないでしょう。必要なデータはすべてイベントオブジェクトに配信済みで、残りのデータはイベントが登録されたオブジェクトから取得済みです。
いや、ここでは何もやり直すつもりはなかったし、おそらくやり直すこともないだろう。必要なデータはすべてイベント・オブジェクトに配信済みで、残りのデータはイベントが登録されたオブジェクトから取得済みだ。
わかりました。必要なデータはすべてイベントオブジェクトの中にあるというのは同意する。
最後の取引イベントを取得したときに、注文/ポジションチケットや その他のプロパティを引き出すことができるように、サンプルコードを提供していただけませんか?