// Test order when printing out void RunTest3( Aggregator& aggregator ) { auto test = { Trade( 1, "bbb", 1, 100 ), Trade( 2, "aaa", 1, 100 ), }; METRICS expected = { std::make_pair( "aaa", SymbolMetrics( 0, 1, 100, 100 ) ), std::make_pair( "bbb", SymbolMetrics( 0, 1, 100, 100 ) ) }; RunTest( aggregator, test, expected ); }
void RunSequence::HandleQuote2( const ou::tf::Quote& quote ) { m_quote = quote; ptime dt( quote.DateTime() ); std::cout << dt << " quote: B:" << quote.Bid() << "-A:" << quote.Ask() << std::endl; static ptime mark( date( 2012, 7, 22 ), time_duration( 21, 7, 5, 368590 ) ); if ( quote.DateTime() == mark ) { std::cout << dt << " quote " << std::endl; } if ( quote.IsValid() ) { m_quotes.Append( quote ); switch ( m_stateTimeFrame ) { case EPreOpen: if ( m_dtOpeningBell <= dt ) { m_stateTimeFrame = EBellHeard; } break; case EBellHeard: m_stateTimeFrame = EPauseForQuotes; break; case EPauseForQuotes: if ( m_dtStartTrading <= dt ) { m_stateTimeFrame = EAfterBell; } break; case EAfterBell: m_stateTimeFrame = ETrading; break; case ETrading: if ( m_dtCancelTrades <= dt ) { m_pPosition->CancelOrders(); m_stateTimeFrame = ECancelling; } else { Trade(); } break; case ECancelling: if ( m_dtClosePositions <= dt ) { m_pPosition->ClosePosition(); m_stateTimeFrame = EClosing; } break; case EGoingNeutral: assert( false ); break; case EClosing: if ( m_dtClosingBell <= dt ) { m_stateTimeFrame = EAfterHours; } break; case EAfterHours: break; } } }
int main(int argc, const char * argv[]) { //1.初始化数据 Init(); printf("\n------交易前-------------\n"); //2.打印这些初始化数据 ShowProps(); ShowPlayers(); Trade(&players[0], 3); //进行交易 printf("\n------交易后-------------\n"); ShowProps(); ShowPlayers(); return 0; }
static void RunTest1( Aggregator& aggregator ) { auto test = { Trade( 52924702, "aaa", 13, 1136 ), Trade( 52924702, "aac", 20, 477 ), Trade( 52925641, "aab", 31, 907 ), Trade( 52927350, "aab", 29, 724 ), Trade( 52927783, "aac", 21, 638 ), Trade( 52930489, "aaa", 18, 1222 ), Trade( 52931654, "aaa", 9, 1077 ), Trade( 52933453, "aab", 9, 756 ) }; METRICS expected = { std::make_pair( "aaa", SymbolMetrics( 5787, 40, 1161, 1222 ) ), std::make_pair( "aab", SymbolMetrics( 6103, 69, 810, 907 ) ), std::make_pair( "aac", SymbolMetrics( 3081, 41, 559, 638 ) ) }; RunTest( aggregator, test, expected ); }
void TradingEngine::createTrade(Ask ask, Bid bid) { auto trade = Trade(ask, bid); // qDebug() << "Created New Trade: " << trade; emit newTradeCreated(trade); }
void MXTree::Split(GiSTnode **node, const GiSTentry& entry) { double radii[2], dist, *dists = new double[(*node)->NumEntries()*2]; int pageNums[2], cands[2]; vector<vector<int>> vec(2); ((MXTnode *)(*node))->TestPromotion(radii, &dist, pageNums, cands, dists, vec); if (Trade((*node)->Path().IsRoot(), radii, dist, pageNums, ((MXTnode *)(*node))->GetPageNum()+1, (*node)->NumEntries())) { // don't split now delete[] dists; GiSTpath oldPath = (*node)->Path(); int startPage = ((*node)->Path().IsRoot() ? rootPage : (*node)->Path().Page()); int pageNum = ((MXTnode *)(*node))->GetPageNum(); ((MXTfile *)store)->Deallocate(startPage, pageNum); startPage = ((MXTfile *)store)->Allocate(++pageNum); (*node)->Path().MakeSibling(startPage); rootPage = ((*node)->Path().IsRoot() ? startPage : rootPage); ((MXTnode *)(*node))->SetPageNum(pageNum); WriteNode(*node); if (!(*node)->Path().IsRoot() && startPage != oldPath.Page()) { GiSTpath parentPath = oldPath; parentPath.MakeParent(); GiSTnode *parentNode = ReadNode(parentPath); GiSTentry *e = parentNode->SearchPtr(oldPath.Page()); assert(e != NULL); int pos = e->Position(); e->SetPtr(startPage); parentNode->DeleteEntry(pos); parentNode->InsertBefore(*e, pos); WriteNode(parentNode); delete parentNode; delete e; } } else { // split now bool bLeft = false, bNewRoot = false; if ((*node)->Path().IsRoot()) { bNewRoot = true; (*node)->Path().MakeChild(rootPage); rootPage = store->Allocate(); } int oldPageNum = ((MXTnode *)(*node))->GetPageNum(); GiSTnode *node2 = ((MXTnode *)(*node))->PickSplit(cands, dists, vec); delete[] dists; int curPageNum = ((MXTnode *)(*node))->GetPageNum(); assert(oldPageNum >= curPageNum); if (oldPageNum > curPageNum) { ((MXTfile *)store)->Deallocate((*node)->Path().Page()+curPageNum, oldPageNum-curPageNum); } node2->Path().MakeSibling(((MXTfile *)store)->Allocate(((MXTnode *)node2)->GetPageNum())); WriteNode(*node); WriteNode(node2); GiSTentry *e = (*node)->SearchPtr(entry.Ptr()); if (e != NULL) { bLeft = true; delete e; } GiSTentry *e1 = (*node)->Union(); GiSTentry *e2 = node2->Union(); e1->SetPtr((*node)->Path().Page()); e2->SetPtr(node2->Path().Page()); // Create new root if root is being split if (bNewRoot) { GiSTnode *root = NewNode(this); root->SetLevel((*node)->Level() + 1); root->InsertBefore(*e1, 0); root->InsertBefore(*e2, 1); root->Path().MakeRoot(); WriteNode(root); delete root; } else { // Insert entry for N' in parent GiSTpath parentPath = (*node)->Path(); parentPath.MakeParent(); GiSTnode *parent = ReadNode(parentPath); // Find the entry for N in parent GiSTentry *e = parent->SearchPtr((*node)->Path().Page()); assert(e != NULL); // Insert the new entry right after it int pos = e->Position(); parent->DeleteEntry(pos); parent->InsertBefore(*e1, pos); parent->InsertBefore(*e2, pos+1); delete e; if (!parent->IsOverFull(*store)) { WriteNode(parent); } else { Split(&parent, bLeft? *e1: *e2); // parent is the node which contains the entry inserted GiSTpage page = (*node)->Path().Page(); (*node)->Path() = parent->Path(); // parent's path may change (*node)->Path().MakeChild(page); page = node2->Path().Page(); node2->Path() = (*node)->Path(); node2->Path().MakeSibling(page); } delete parent; } if (!bLeft) { delete *node; *node = node2; // return it } else { delete node2; } delete e1; delete e2; } }