Trade Signalにはバグが存在する

Posted by admin on 1月 19th, 2010 under プログラミングTips Tags: , , ,  •  No Comments

ご無沙汰してます。
更新が滞ってしまって申し訳ないです。
年末年始にかけていろいろあったので・・・

ってことで、まずはリハビリを兼ねてプログラミング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;

Post to Twitter Post to Twitter

プログラミングTips:営業日をまたいで変数を初期化する

Posted by admin on 12月 26th, 2009 under プログラミングTips Tags: , , ,  •  No Comments

前回エントリーしたソースで特徴的なプログラムの解説をしていきます。

コメント「1日ごとに初期処理」のところで

if date[1] <> date
then begin
・・・
end;

という記述があります。

これはデイリーのシステムでよく使われる書き方です。プログラミングにおいて変数を初期化することは度々あり、デイリーシステムにおいては1日ごとに初期化する変数が多数あります。その際にこの記述はとても便利です。

では、解説します。

分足と営業日の関係

ローソク足の持つ日付で営業日の変化を捉える

ローソク足の持つ日付で営業日の変化を捉える

1日の最初の足、つまり9:05の足を見てください。この足の日付は当然今日ですよね。date[1]の足、9:05の足のひとつ前の足の日付はいつでしょう?今日を基準にして前営業日ですよね。よって、この式は正しい(true判定)ことになりif文以下が実行されます。

では、次の足を見てみましょう。9:10の足ですね。dateで参照される9:10の足の日付は当然今日ですね。さらに1つ前のdate[1]で参照される日付も今日ですね。つまり、if文は誤り(false判定)となり、以下のプログラムは実行されません。

このように実行されるのは9:05の足のみとなり、結果として1日の最初の足でのみ実行されるというわけです。

ここで、

if time=9:05
then begin
・・・
end;

とかいてもいいのでは?と思うかもしれません。でも、よく考えて見てください。最初の足が9:05となるのはインターバルで5分足を選択した場合のみです。システムによっては15分足、30分足、60分足等々を使うこともありますよね。そのたびにプログラムを書き換えていたのでは効率も悪いですし、何より修正忘れによる潜在的なバグを誘発することになります。
こういうリスクは極力避けなければなりません。そういう意味においても「date[1]<>date」という記述は優れていることがお分かりになるはずです。

Post to Twitter Post to Twitter