예제 #1
0
void tradeStocks(Record record, Dataset dataset, Portfolio* portfolio)
{
	float priceRelative;

	priceRelative = (float)record.x / record.y;

	if(priceRelative > dataset.mean + dataset.stdDev) {
		sellStock(X_STR, record.x, portfolio);
		buyStock(Y_STR, record.y, portfolio);
	}

	if(priceRelative < dataset.mean - dataset.stdDev) {
		sellStock(Y_STR, record.y, portfolio);
		buyStock(X_STR, record.x, portfolio);
	}



}
예제 #2
0
void sellAllStock(Record record, Portfolio* portfolio) {

	int entry;
#ifdef PATCHED
	// Checks to make sure portfolio has been initiated.
	for(entry = 0; portfolio->numEntries > 0 && portfolio->stocks[entry].purchasedPrice != 0 && entry<portfolio->numEntries; entry++) {
#else
	// If a Balance record has not been set, then portfolio isn't initailized and the for loop condition will cause a Segementation fault.
	for(entry = 0; portfolio->stocks[entry].purchasedPrice != 0; entry++) {
#endif			
		sellStock(portfolio->stocks[entry].symbol, portfolio->stocks[entry].currentPrice, portfolio);
	}
}

void updateStockValues(Record record, Portfolio* portfolio) {
	
	int entry;
#ifdef PATCHED
	// Checks to make sure portfolio has been initiated.
	for(entry = 0; portfolio->numEntries > 0 && portfolio->stocks[entry].purchasedPrice != 0 && entry<portfolio->numEntries; entry++) {
#else
	// If a Balance record has not been set, then portfolio isn't initailized and the for loop condition will cause a Segementation fault.
	for(entry = 0; portfolio->stocks[entry].purchasedPrice != 0; entry++) {
#endif		
		Stock* stock;
		stock = &portfolio->stocks[entry];

		portfolio->assetBalance -= stock->currentPrice;

		if(stock->symbol == X_STR) 
			stock->currentPrice = record.x;

		if(stock->symbol == Y_STR)
			stock->currentPrice = record.y;

		portfolio->assetBalance += stock->currentPrice;

	}
}

void initPortfolio(Portfolio* portfolio, unsigned int startingBalance)
{
	int ret;

	portfolio->cashBalance = startingBalance;
	portfolio->assetBalance = portfolio->cashBalance;
	portfolio->goal = portfolio->assetBalance*2;
	portfolio->numEntries = INIT_ENTRY_LIST;
	ret = allocate(sizeof(Stock)*portfolio->numEntries, 0, (void **) &portfolio->stocks);
	if(ret != 0)
		_terminate(ALLOCATE_ERROR);

}
void sellMenu()
{
	int i, j;
	i = 1;
	while (i != 0)
	{
		system("cls");
		titleLine("주식 팔기");
		printf("\n [ 팔 주식을 고르세요 ]\n\n");
		j = 1;
		for (now = head->next; now; now = now->next)
		{
			printf("\n %d. 회사 : %-20s, 가격 : %d원", j, CompanyName[now->company], now->price);
			j++;
		}
		printf("\n 돌아가려면 0을 선택하세요.\n");
		scanf("%d", &i);
		if (i != 0) sellStock(i);
	}
	system("cls");
}
예제 #4
0
void RandomAgent::play()
{
    qDebug() << "[Agent] Agent is playing.";
    if(!m_store.isUpToDate() || !m_myOrders.isUpToDate() || m_stocksInfo.size() != STOKS_NUMBER - 1)
    {
        qDebug() << "[Agent] Agent infos aren't up to date.";
        return;
    }
    m_idleTimer->start();

    qint32 money = m_store.getMoney();

    for(int i = 2; i <=  STOKS_NUMBER; ++i)
    {
        if(m_store.contains(i))
        {
            if(static_cast<double>(qrand())/RAND_MAX < m_sellStockChange)
            {
                qint32 price = m_stocksInfo[i].getBestBuyPrice() + 3 - qrand() % 10;
                if(!m_stocksInfo[i].getBestBuyPrice())
                {
                    price =  m_stocksInfo[i].lastPrice() *(0.99 + (0.02 * qrand())/RAND_MAX);
                }
                if(price)
                {
                    qint32 maxAmount = m_store.getStockAmount(i);
                    if(maxAmount)
                    {
                        qint32 amount = pow(1 + static_cast<double>(0.15*qrand())/RAND_MAX, 10 + static_cast<double>(14*qrand())/RAND_MAX) *
                                (1 + static_cast<double>(2*qrand())/RAND_MAX) * (static_cast<double>(money)/1000000) + 2 + qrand() % 5;
                        amount %= maxAmount;
                        if(amount)
                            sellStock(i, amount, price);
                    }
                }
            }
        }
        if(static_cast<double>(qrand())/RAND_MAX < m_buyStockChange)
        {
            qint32 price = m_stocksInfo[i].getBestSellPrice() - 3 + qrand() % 10;
            if(!m_stocksInfo[i].getBestSellPrice())
            {
                price =  m_stocksInfo[i].lastPrice() *(0.99 + (0.02 * qrand())/RAND_MAX);
            }
            if(price)
            {
                qint32 maxAmount = money/price;
                if(maxAmount)
                {
                    qint32 amount = pow(1 + static_cast<double>(0.15*qrand())/RAND_MAX, 10 + static_cast<double>(14*qrand())/RAND_MAX) *
                            (1 + static_cast<double>(2*qrand())/RAND_MAX) * (static_cast<double>(money)/1000000) + 2 + qrand() % 5;
                    amount %= maxAmount;
                    if(amount)
                        buyStock(i, amount, price);
                }
            }
        }
    }

    QMapIterator<int, Order> it(m_myOrders);
    while (it.hasNext())
    {
        it.next();
        if(static_cast<double>(qrand())/RAND_MAX < m_cancelChange)
            cancelReq(it.key());
    }

}