原因不明エラー
今日の記事は半分憶測で書いてます。ぶっちゃけ私もよくわかってません。憶測ではありますが同じ目にあった人にとっては少しくらいヒントになるかもしれませんので一応公開しておきます。
謎のエラー発生
cBotを作っているとときどきこんなエラーに出くわすことがあります。
「cBotがクラッシュしました。Error#16302605」・・・いやいや、情報量少なすぎやしませんか?
いやね、これがメジャーなAPIだったらいいんですよ、検索すりゃ原因でてくるので。しかしcAlgoみたいなマイナーAPIでエラーコードだけ表示されても対処しようがありません。もちろん公式ドキュメントにも記載はありません。
謎のエラーコードは他にも何種類かあるようでフォーラムを見る限り"#16302605""#16303974""#16302963""#62082064""#62080512"などがあるようです。
いつもの?クラッシュとはちょっと違う
エラーなんて出したことない人のためにちょっと補足。cBotやIndicatorのコードになんらかのミスがあってクラッシュする場合、たいていこんな表示になるんです。
もちろん説明部分はエラー原因によって異なりますが、いずれにせよcTrader側のログウィンドウからこんな形式でエラーをお知らせしてくれるのが普通です。
Crashed in <クラッシュしたメソッド> with <投げられた例外名>:<例外の説明>
つまり普通なら「どこで何が起きたか」がわかるので対処がしやすいのです。
それに比べてこの謎エラーは「cBotがクラッシュした」という事実しかわかりません。これはおそらくcTrader側から見ても「なんだかわからんうちにcBotがおかしくなってた」ということなのでしょう。
一応cTraderフォーラムでもエラー情報を検索してみたのですが公式からの回答も「調査中です」みたいなのばかりで公式情報はあまりあてにはなりませんでした。
原因らしきもの
まぁ結論から言うとよくわからないんですが、cTraderフォーラムの書き込み等から「こんな感じのエラーなのかなー」程度の推測をメモしておきます。違ったらゴメンネ。
Error #1630xxxx
どうもマルチスレッド関係のエラーな気がします。もともとcTraderのcAlgo APIはマルチスレッドには対応していません。つまりスレッドセーフではないのです。
そのため、マルチスレッドで動くcBotを作るときについスレッドセーフオブジェクトと同じ感覚で使ってしまうと(このエラーに限らず)様々なエラーが発生する可能性があります。
マルチスレッド関連のエラーは実行タイミングによって起きたり起きなかったりするので非常にタチが悪いです。
マルチスレッドあるあるなのが「UIスレッド以外からUIを操作しようとしちゃう」エラー。
cAlgoに限らず、GUIアプリケーション開発においてはUIスレッド以外からUIを操作するのはご法度です。
cAlgoではマルチスレッドでUIを操作したいときは BeginInvokeOnMainThreadメソッドを使用して必ずメインスレッドで処理させるようにします。
マルチスレッドのcBotで謎のエラーが発生してるようであれば
・ロックは適切に行っているか
・サブスレッドからUIを操作しようとしてないか (#1630xxxxの原因としては多分こっち)
を確認することをお勧めします。
ちなみに私の場合はasync,awaitを使ってUI操作をしていた部分で、なぜかawait後の処理がメインスレッドに戻ってなくて(これはこれで謎)そのせいでこのエラーが出てたということがありました。
Error #6208xxxx
特殊な時間足使用に伴うメモリ関連のエラーっぽいです。このエラーは出会ったことがないのでcTraderフォーラムの書き込みからの推測です。
cTraderでは用意されてる時間足が多く、特殊な時間足がいくつもあります。どうも6208系のエラーは共通して、数Tick分を一つの足にまとめるTick足の使用時に発生しているようです。
これはおそらくですがcTrader側の問題と思われますのでどうしょうもないです。Tick足を使用するのをあきらめるというのが一番確実な解決策ですね。・・・解決してませんけど。(「cTrader4.0なら大丈夫なはず」との書き込みも見たので今は起きないかもしれません)
それにしてもこのエラー番号は何からきてるんでしょう・・・cTrader開発上の独自のナンバリングなのでしょうか?なにか情報お持ちの方いたら教えてください。