4

私がすでに試したループを使用して実装する標準的な方法。渡された px リストが巨大になるため、ティック データでこれを行うと時間がかかります。ループを使用せずにこれを行う効率的な方法はありますか。何らかの方法でリストを使用している可能性がありますか?

tlstop: {[ls; entry; loss; pxs]
origentry: entry;
i:0;
curloss: 0f;
exitpx: 0n;
while[(i<count pxs) and (curloss>loss);
        curpx: pxs[i];
        curpnl: $[ls=`l; curpx-entry; entry-curpx];
        exitpx: $[curpnl<=loss; curpx; exitpx];  
        entry: $[curpnl>curloss; curpx; entry];
        curloss: curpnl;
        i: i+1;
];
exitpx: $[exitpx=0n; last pxs; exitpx];
ans: $[ls=`l; exitpx-origentry; origentry-exitpx];
ans
};
/tlstop[`s; 100.0; -2.0; (99 98 97 96 93)]
4

2 に答える 2

1

以下に示すように、非常に冗長な q の約 3 行、または同僚を困らせたい場合は簡潔な q の 1 行で慣用的にアルゴリズムを実装するのは簡単です。

q)pxs:100 101 102 101 100 99 98 //Our price ticks.
q)pxs
100 101 102 101 100 99 98
q)entry:({max (x;y)}\) pxs //Calculate entry prices for each tick.
q)entry
100 101 102 102 102 102 102
q)(pxs-entry) <= -2 //Determine tick where stop loss condition is triggered.
0000111b
q)first pxs where (pxs-entry) <= -2 //Calculate the price at which we would exit.
100
q)first pxs where (pxs-entry) <= -5 //We get null (0N) if stop loss is not triggered.
0N

これは調査を行っている場合にのみ有効であり、実際の取引システムのストップ ロスを計算する場合には適していないことを指摘しておく必要があります。これの実行時間とメモリは、ティック数に比例して増加するため、1 日の終わりまでには遅くなり、メモリを大量に消費します。

実際にこれを行う方法は、各オープン ポジションのエントリ価格のテーブルを維持し、ティッカー プラントによってアプリケーションにティックが (もちろん非同期で) プッシュされるたびに実行される関数を設定することです。この関数は、エントリー価格を更新するか、エグジット イベントをトレード マネージャーにプッシュします。重要なのは、実行時間とメモリの複雑さが、処理するティック数に対して一定である必要があるということです。

于 2013-06-28T04:40:20.150 に答える