Trade Signalにはバグが存在する
ご無沙汰してます。
更新が滞ってしまって申し訳ないです。
年末年始にかけていろいろあったので・・・
ってことで、まずはリハビリを兼ねてプログラミングTipsで。
実はTSには潜在バグがあるんですよ。
これはひまわり証券さんにも確認をしてあります。
どんなものかというと、下記のソースを見てください。
variables:
iDate,
fDayFilter;
if date <> iDate
then begin
・・・
初期化処理
・・・
iDate = date;
end;
このサンプルは前回ご紹介した date[1]<>date の改良版です。
何を改良したかというと、まず5分足を考えてください。5分足の最初のバーは始値から終値が確定するまで5分かかりますよね。(例外はあります)
TSではティックごとにプログラムが動作すると以前説明しました。この最初のバーで100ティックあったとするとプログラムは100回動きます。
そのとき、 date[1]<>date この判定式だとまずいことが起こりませんか?
そう。この評価式が100回True判定されてしまうのです。
初期化処理等は最初の1回だけ行われてほしいものですから、何回も実行されては困るわけです。よって、iDateという変数を用意し、 date <> iDate という判定式に変えたわけです。
一度処理が実行されるとiDateは当日の日付になりますから2回目以降はFalse判定され、if文内は実行されないことになります。
ところが!!!
このプログラムがまともに動作しないのです。原因は予想もつきませんが、最初のバーの間だけは複数回実行されてしまいます。
マジで?
って思う人は、if文内に
print(date, time, “TEST”);
といった、デバッグ用のprint命令を入れてみてください。
ものすごい数のアウトプットが出るはずです。
基本的にシステムでは各足の終値を参照することが多いのであまり大きな影響は出ないと思うのですが、影響の大きいものとして始値から判断して成り行き注文を出すようなシステムでは影響があります。
(※まさに私のシステムがそうなのです。だから発覚したのですが・・・)
どのような場合に影響が出るかというとその日の最初の足の終値が確定する前に何らかの処理をするロジックのときです。
上述のように始値からEntryの判断をする場合などがその典型です。
この回避策としては注文ならばマネーマネジメントのプロパティでピラミッティングを無効か異なる注文のみにすれば何回も注文をすることはありません。これ以外の対処法は・・・分かりません。ゴメンナサイ。
直接システム作りには関係ありませんが、こういうことを頭に入れておくとデバッグのときにすごく楽になります。実際、このことが分かるまでに2週間以上怪現象に悩まされていましたから。過去データではこの現象は起きません。リアルタイムで動いて初めて出る現象なのです。
このように、どんなに完璧なプログラムを作っても実際に動かして検証することが如何に大切か分かって頂けたかと思います。
次回はずっと放置されてきたMAシステムの改良に本気で着手していきましょう。
if date[1] <> date
and fDayFilter
then begin
・・・
if [条件1]
then begin
・・・
BUY ("LONG") 1 shares this bar at market
・・・
end;
fDayFilter = false;
・・・
end;










