2013-06-25 3 views
4

Стандартный способ реализации с использованием циклов, которые я уже пробовал. Это займет много времени, если будет сделано по данным тика, поскольку пройденный список px будет огромным. Есть ли эффективный способ сделать это без использования циклов. Может ли кто-нибудь использовать списки?Как вычислить стоп-лосс в kdb?

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)] 

ответ

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 

Я должен отметить, что это только хорошо, если вы делаете исследования и не способ сделать это, если вы хотите, чтобы вычислить потери остановки для живой торговой системы. Время выполнения и память об этом увеличиваются линейно по отношению к количеству тиков, которые у вас есть, поэтому к концу дня он будет медленным, а память - свиньей.

Способ для этого состоит в том, чтобы поддерживать таблицу цен на вход для каждой открытой позиции и настраивать функцию, которая запускается каждый раз, когда тик будет толкаться (асинхронно, конечно) к вашему приложению с помощью вашего устройства тиккера. Эта функция либо обновляет ваши цены на вход, либо толкает событие выхода вашему торговому менеджеру. Ключ заключается в том, что время выполнения и сложность памяти должны быть постоянный относительно количества тиков, которые вы обрабатываете.

+0

Эта функция предназначена для Бэктэстинг, а не жить торговые системы. –

1

vectorised ...

/ 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 
};