Vlad,
- Your algorithm is using 10,000,000 dollars and trying to buy all that in 1 minute. If an order is too big, Quantopian assumes the order would fill over 2 or 3 minutes.
- order_target_percent() does not check for open orders which have not fully filled yet. So the over-ordering is because of this.
I have added lots of PRINT statements to your example to show the state of open orders:
2007-05-02 PRINT 13:31 : SPY=148.79, volume=395908, SPYshares=0, open position value=0.00
2007-05-02 PRINT 13:31 : NO OPEN ORDERS
2007-05-02 PRINT 13:31 : target_value=10000000.00, req_shares=67208
2007-05-02 PRINT 13:31 : OPEN ORDER 2007-05-02 13:31:00+00:00 [amt=67208,filled=0,left=67208]
2007-05-02 PRINT --
2007-05-02 PRINT 13:32 : SPY=148.84, volume=136368, SPYshares=34092, open position value=5074253.28
2007-05-02 PRINT 13:32 : OPEN ORDER 2007-05-02 13:31:00+00:00 [amt=67208,filled=34092,left=33116]
2007-05-02 PRINT 13:32 : target_value=9967263.16, req_shares=32874
2007-05-02 PRINT 13:32 : OPEN ORDER 2007-05-02 13:31:00+00:00 [amt=67208,filled=34092,left=33116]
2007-05-02 PRINT 13:32 : OPEN ORDER 2007-05-02 13:32:00+00:00 [amt=32874,filled=0,left=32874]
2007-05-02 PRINT --
2007-05-02 PRINT 13:33 : SPY=148.83, volume=176860, SPYshares=78307, open position value=11654430.81
2007-05-02 PRINT 13:33 : OPEN ORDER 2007-05-02 13:32:00+00:00 [amt=32874,filled=11099,left=21775]
2007-05-02 PRINT 13:33 : target_value=9937991.59, req_shares=-11532
2007-05-02 PRINT 13:33 : OPEN ORDER 2007-05-02 13:32:00+00:00 [amt=32874,filled=11099,left=21775]
2007-05-02 PRINT 13:33 : OPEN ORDER 2007-05-02 13:33:00+00:00 [amt=-11532,filled=0,left=-11532]
2007-05-02 PRINT --
2007-05-02 PRINT 13:34 : SPY=148.90, volume=233100, SPYshares=88550, open position value=13185095.00
2007-05-02 PRINT 13:34 : NO OPEN ORDERS
2007-05-02 PRINT 13:34 : target_value=9936138.75, req_shares=-21819
2007-05-02 PRINT 13:34 : OPEN ORDER 2007-05-02 13:34:00+00:00 [amt=-21819,filled=0,left=-21819]
2007-05-02 PRINT --
2007-05-02 PRINT 13:35 : SPY=148.97, volume=1484000, SPYshares=66731, open position value=9940917.07
2007-05-02 PRINT 13:35 : NO OPEN ORDERS
2007-05-02 PRINT 13:35 : target_value=9941612.41, req_shares=4
2007-05-02 PRINT 13:35 : OPEN ORDER 2007-05-02 13:35:00+00:00 [amt=4,filled=0,left=4]
2007-05-02 PRINT --
2007-05-02 PRINT 13:36 : SPY=149.03, volume=490577, SPYshares=66735, open position value=9945517.05
2007-05-02 PRINT 13:36 : NO OPEN ORDERS
2007-05-02 PRINT 13:36 : target_value=9945616.15, req_shares=0
2007-05-02 PRINT 13:36 : NO OPEN ORDERS
2007-05-02 PRINT --
Which account for all 7 transactions.
Hope that is now clear!
You can get round this by using
# check there are no current open orders
if not sid in get_open_orders().keys():
order_target_percent(sid, target)
and you get the following output
2007-05-02 PRINT 13:31 : SPY=148.79, volume=395908, SPYshares=0, open position value=0.00
2007-05-02 PRINT 13:31 : NO OPEN ORDERS
2007-05-02 PRINT 13:31 : target_value=10000000.00, req_shares=67208
2007-05-02 PRINT 13:31 : OPEN ORDER 2007-05-02 13:31:00+00:00 [amt=67208,filled=0,left=67208]
2007-05-02 PRINT --
2007-05-02 PRINT 13:32 : SPY=148.84, volume=136368, SPYshares=34092, open position value=5074253.28
2007-05-02 PRINT 13:32 : OPEN ORDER 2007-05-02 13:31:00+00:00 [amt=67208,filled=34092,left=33116]
2007-05-02 PRINT 13:32 : target_value=9967263.16, req_shares=32874
2007-05-02 PRINT 13:32 : OPEN ORDER 2007-05-02 13:31:00+00:00 [amt=67208,filled=34092,left=33116]
2007-05-02 PRINT --
2007-05-02 PRINT 13:33 : SPY=148.83, volume=176860, SPYshares=67208, open position value=10002566.64
2007-05-02 PRINT 13:33 : NO OPEN ORDERS
2007-05-02 PRINT 13:33 : target_value=9948648.71, req_shares=-362
2007-05-02 PRINT 13:33 : OPEN ORDER 2007-05-02 13:33:00+00:00 [amt=-362,filled=0,left=-362]
2007-05-02 PRINT --
2007-05-02 PRINT 13:34 : SPY=148.90, volume=233100, SPYshares=66846, open position value=9953369.40
2007-05-02 PRINT 13:34 : NO OPEN ORDERS
2007-05-02 PRINT 13:34 : target_value=9953342.40, req_shares=0
2007-05-02 PRINT 13:34 : NO OPEN ORDERS
2007-05-02 PRINT --