实现使用循环的标准方法我已经尝试过了。如果对滴答数据进行此操作将花费很长时间,因为传递的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)]
答案 0 :(得分:1)
正如您在下面所看到的,如果您想要惹恼您的同事,那么在大约三行非常详细的q或者一行简洁q中惯用地实现您的算法是微不足道的。
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 :(得分:1)
...向量化
/ trailing stop for long
{[stoplossAtStart;prices]
previous:prev prices;
xtreme:maxs previous;
sl:stoplossAtStart + sums (0|0,1_deltas[prices]) * 0b,1_(&). prices>/:(previous;xtreme);
sl
};
/ trailing stop for short
{[stoplossAtStart;prices]
previous:prev prices;
xtreme:mins previous;
sl:stoplossAtStart + sums (0&0,1_deltas[prices]) * 0b,1_(&). prices</:(previous;xtreme);
sl
};