rowAlign

Syntax

rowAlign(left, right, how)

Arguments

left/right is an array vector or a columnar tuple.

  • left and right must be of the same data type and size (number of rows), but the number of elements in corresponding rows do not have to match. For example, if left has 3 rows and the first row has 5 elements, then right must also have 3 rows but the first row does not necessarily have 5 elements.

  • Data in each row of left and right must be strictly increasing/decreasing.

how is a string indicating how left and right will be aligned. It can take the following values:

how (case-insensitive) Description Max. Value in the Alignment Result Min. Value in the Alignment Result
"bid" left and right are bid prices sorted in strictly decreasing order. The output will only include the indices of prices that fall within the alignment range. max(max(left), max(right)) max(min(left), min(right))
"allBid" left and right are bid prices sorted in strictly decreasing order. The output will include the indices of all prices from left and right. max(max(left), max(right)) min(min(left), min(right))
"ask" left and right are ask prices sorted in strictly increasing order. The output will only include the indices of prices that fall within the alignment range. min(max(left), max(right)) min(min(left), min(right))
"allAsk" left and right are ask prices sorted in strictly increasing order. The output will include the indices of all prices from left and right. max(max(left), max(right)) min(min(left), min(right))

Details

The rowAlign function aligns corresponding rows from left and right based on their values. It returns a tuple containing two elements (either array vectors or columnar tuples, matching the input type). Each element in this tuple contains indices that map the aligned elements to their original positions in left and right respectively. Unmatched elements from one input are marked as -1 in the other input's returned index.

This function is typically used for aligning bid/ask prices, where left represents prices from one time point and right represents prices from a previous time point. The returned indices can be used with the rowAt function to extract the aligned elements from the original left and right arrays, with any unaligned elements left blank.

The alignment process for each row is illustrated in the accompanying images, where blue blocks indicate the elements not included in the output when using the "bid" or "ask" method.

  • how = "bid" or "allBid"



  • how = "ask" or "allAsk":



Examples

left = array(DOUBLE[], 0, 5).append!([9.01 9.00 8.99 8.98 8.97, 9.00 8.98 8.97 8.96 8.95, 8.99 8.97 8.95 8.93 8.91])
right = array(DOUBLE[], 0, 5).append!([9.02 9.01 9.00 8.99 8.98, 9.01 9.00 8.99 8.98 8.97, 9.00 8.98 8.97 8.96 8.95])
leftIndex, rightIndex = rowAlign(left, right, "bid")
leftIndex
// output
[[-1,0,1,2,3],[-1,0,-1,1,2],[-1,0,-1,1,-1,2]]

left.rowAt(leftIndex)
// output
[[,9.01,9.00,8.99,8.98],[,9,,8.99,8.97],[,8.99,,8.97,,8.95]]

rightIndex
// output
[[0,1,2,3,4],[0,1,2,3,4],[0,-1,1,2,3,4]]

right.rowAt(rightIndex)
// output
[[9.02,9.01,9.00,8.99,8.98],[9.01,9.00,8.99,8.98,8.97],[9.00,,8.98,8.97,8.96,8.95]]

// output all bid prices in one array vector after aligning left and right
left.rowAt(leftIndex).nullFill(right.rowAt(rightIndex))
// output
[[9.02,9.01,9,8.99,8.98],[9.01,9.00,8.99,8.98,8.97],[9.00,8.99,8.98,8.97,8.96,8.95]]

// the bid sizes
leftBidQty = array(INT[], 0, 5).append!([10 5 15 20 13, 12 15 20 21 18, 7 8 9 9 10])
rightBidQty = array(INT[], 0, 5).append!([8 12 10 12 8, 10 5 15 18 13, 12 15 20 21 19])

// calculate the difference in bid quantities between left and right 
leftBidQty.rowAt(leftIndex).nullFill(0) - rightBidQty.rowAt(rightIndex).nullFill(0)
// output
[[-8,-2,-5,3,12],[-10,7,-15,-3,7],[-12,7,-15,-12,-21,-10]]

leftIndex, rightIndex = rowAlign(left, right, "allBid")
leftIndex
// output
[[-1,0,1,2],[-1,-1,0,1,2],[-1,0,-1,1,2]]

rightIndex
// output
[[0,1,2,-1],[0,1,2,-1,-1],[0,-1,1,2,-1]]
left = array(DOUBLE[], 0, 3).append!([8.99 9.00 9.01, 8.97 8.99 9.00, 8.95 8.97 8.99])
right = array(DOUBLE[], 0, 3).append!([9.00 9.01 9.02, 8.99 9.00 9.01, 8.97 8.98 9.00])
leftIndex, rightIndex = rowAlign(left, right, "ask")
leftIndex
// output
[[0,1,2],[0,1,2],[0,1,-1,2]]
 
rightIndex
// output
[[-1,0,1],[-1,0,1],[-1,0,1,-1]]

leftIndex, rightIndex = rowAlign(left, right, "allAsk")
leftIndex
// output
[[0,1,2,-1],[0,1,2,-1],[0,1,-1,2,-1]]
 
rightIndex
// output
[[-1,0,1,2],[-1,0,1,2],[-1,0,1,-1,2]]
sym = `st1`st2`st3
left = [[3.1,2.5,2.8], [3.1,3.3], [3.2,2.9,3.3]]
left.setColumnarTuple!()
right = [[3.1,2.5,2.8], [3.1,3.3], [3.2,2.9,3.3]]
right.setColumnarTuple!()
rowAlign(left, right, "bid")
//output:
[([0,1,2],[0,1],[0,1,2]), ([0,1,2],[0,1],[0,1,2])]