Example #1
0
void BookCopy::Update()
{
    if (status_ == BookStatus::LENT)
    {
        NotifyOverdueIfNeeded();
    }
    else if (status_ == BookStatus::AT_LOAN_DESK)
    {
        bool need_nodify = false;
        std::time_t today = Today();

        while (std::difftime(today, due_date_) > 0.0)
        {
            // another one missed the book
            request_queue_.erase(request_queue_.begin());
            if (request_queue_.empty())
            {
                // all the people missed the book
                status_ = BookStatus::ON_SHELF;
                return;
            }
            else  // move to next person
            {
                need_nodify = true;
                due_date_ = nDaysLater(due_date_, kReserveDays);
            }
        }
        // nodify the new person
        NotifyRequest();
    }
}
Example #2
0
bool BookCopy::Borrow(User *user)
{
    if (status_ == BookStatus::AT_LOAN_DESK &&
        request_queue_.front() == user->id())
    {
        // retrieve the book requested
        request_queue_.erase(request_queue_.begin());
    }
    else if (status_ != BookStatus::ON_SHELF)
    {
        std::cout << "该馆藏不在架上,无法借取\n";
        return false;
    }

    if (!(user->Borrow(id_)))  // error info will be printed inside
        return false;

    // borrowed
    status_ = BookStatus::LENT;
    holder_ = user->id();
    begin_date_ = Today();

    if (borrow_type_ == BorrowType::GENERAL)
        due_date_ = nDaysLater(user->general_period());
    else  // BorrowType::SHORT
        due_date_ = nDaysLater(user->short_period());

    renew_times_ = 0;
    recalled_ = false;

    return true;
}
Example #3
0
bool BookCopy::Request(User *user)
{
    if (status_ != BookStatus::LENT)
    {
        std::cout << "只能预约当前被借出的馆藏\n";
        return false;
    }

    if (!(user->Request(id_)))  // error info will be printed inside
        return false;

    // requested
    if (!recalled_)  // haven't been recalled yet, do it now
    {
        std::time_t today = Today();

        if (DaysDiff(today, begin_date_) >= kMinHoldDays &&
            DaysDiff(due_date_, today) > kDaysAfterRecall)
        {
            // should advance due date
            due_date_ = nDaysLater(kDaysAfterRecall);
        }

        NotifyRecall();
        recalled_ = true;
    }
    request_queue_.push_back(user->id());

    return true;
}
Example #4
0
void CreateID(char* pOut, char* pDate, char*pZh, char* wtbh)
{
	if (pDate == nullptr || strlen(pDate) == 0)
	{
		sprintf(pOut, "%d:%s:%s", Today(0), pZh, wtbh);
	}
	else
	{
		sprintf(pOut, "%s:%s:%s", pDate, pZh, wtbh);
	}
}
Example #5
0
int RefreshContactListIcons(HANDLE hContact)
{
	if (hContact == 0)
		return 0;

	int count = CallService(MS_DB_CONTACT_GETCOUNT, 0, 0);
	int hidden = db_get_b(hContact, "CList", "Hidden", 0);
	int ignored = db_get_dw(hContact, "Ignore", "Mask1", 0);
	ignored = ((ignored & 0x3f) != 0) ? 1 : 0;
	int ok = 1;
	if (commonData.notifyFor & EXCLUDE_HIDDEN)
		ok &= (hidden == 0);

	if (commonData.notifyFor & EXCLUDE_IGNORED)
		ok &= (ignored == 0);

	time_t today = Today();

	int dtb = NotifyContactBirthday(hContact, today, commonData.daysInAdvance);
	int dab = NotifyMissedContactBirthday(hContact, today, commonData.daysAfter);

	if (ok && (dtb >= 0 || dab > 0)) {
		int age = GetContactAge(hContact);
		db_set_b(hContact, "UserInfo", "Age", age);

		if ((bShouldCheckBirthdays) && (commonData.bUsePopups))
		{
			if (dtb >= 0) {
				bBirthdayFound = 1; //only set it if we're called from our CheckBirthdays service
				PopupNotifyBirthday(hContact, dtb, age);
			}
			else if (dab > 0)
				PopupNotifyMissedBirthday(hContact, dab, age);
		}

		if (bShouldCheckBirthdays)
			if (dtb >= 0)
				SoundNotifyBirthday(dtb);

		if ((bShouldCheckBirthdays) && (commonData.bUseDialog)) {
			if (dtb >= 0)
				DialogNotifyBirthday(hContact, dtb, age);
			else if (dab > 0)
				DialogNotifyMissedBirthday(hContact, dab, age);
		}

		if (dtb >= 0)
			ExtraIcon_SetIcon(hWWIExtraIcons, hContact, GetDTBIconHandle(dtb));
	}
	else ExtraIcon_Clear(hWWIExtraIcons, hContact);

	return 0;
}
Example #6
0
DatePickerWindow initDatePicker() {
   DatePickerWindow w;

   w.selected = 0;
   w.date = Today();

   w.window = window_create();
   w.day.layer = text_layer_create(GRect(9, 66, 28, 35));
   w.month.layer = text_layer_create(GRect(43, 66, 28, 35));
   w.year.layer = text_layer_create(GRect(76, 66, 58, 35));

   char* day = Day(&w.date);
   text_layer_set_text(w.day.layer, day);
   text_layer_set_font(w.day.layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));
   text_layer_set_text_alignment(w.day.layer, GTextAlignmentCenter);
   text_layer_set_background_color(w.day.layer, C_BACKGROUND);
   text_layer_set_text_color(w.day.layer, C_FOREGROUND);
   layer_add_child(window_get_root_layer(w.window), text_layer_get_layer(w.day.layer));

   char* month = Month(&w.date);
   text_layer_set_text(w.month.layer, month);
   text_layer_set_font(w.month.layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));
   text_layer_set_text_alignment(w.month.layer, GTextAlignmentCenter);
   text_layer_set_background_color(w.month.layer, C_BACKGROUND);
   text_layer_set_text_color(w.month.layer, C_FOREGROUND);
   layer_add_child(window_get_root_layer(w.window), text_layer_get_layer(w.month.layer));

   char* year = Year(&w.date);
   text_layer_set_text(w.year.layer, year);
   text_layer_set_font(w.year.layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));
   text_layer_set_text_alignment(w.year.layer, GTextAlignmentCenter);
   text_layer_set_background_color(w.year.layer, C_BACKGROUND);
   text_layer_set_text_color(w.year.layer, C_FOREGROUND);
   layer_add_child(window_get_root_layer(w.window), text_layer_get_layer(w.year.layer));

   updateWhichSelected(w);

   window_set_click_config_provider_with_context(w.window, (ClickConfigProvider)config_provider, (void*)&w);

   return w;
}
Example #7
0
INT_PTR CheckBirthdaysService(WPARAM, LPARAM lParam)
{
	bBirthdayFound = 0; //no birthdays have been found in the given interval

	SYSTEMTIME today;
	GetLocalTime(&today);

	DWORD lastChecked = db_get_dw(NULL, ModuleName, "LastChecked", 0); //get last checked date
	int lcDay = LOBYTE(LOWORD(lastChecked));
	int lcMonth = HIBYTE(LOWORD(lastChecked));
	int lcYear = HIWORD(lastChecked);

	int daysAfter = DaysAfterBirthday(Today(), lcYear, lcMonth, lcDay); //get difference between last checked date and today
	int savedDaysAfter = 0;

	savedDaysAfter = commonData.daysAfter; //save value

	if ((daysAfter > commonData.daysAfter) && (commonData.daysAfter > 0))//check for passed birthdays
		commonData.daysAfter = daysAfter; //bigger values of the two

	if ((lParam) && (commonData.bOncePerDay)) //if force check then we don't take OncePerDay into account
		if (lcDay == today.wDay && lcMonth == today.wMonth && lcYear == today.wYear)
			return 0; //already checked today

	bShouldCheckBirthdays = 1;
	RefreshAllContactListIcons();
	if ((!bBirthdayFound) && (commonData.bNoBirthdaysPopup))
		PopupNotifyNoBirthdays();

	bShouldCheckBirthdays = 0;

	commonData.daysAfter = savedDaysAfter; //restore previous value

	if (lParam) //if not forced - i.e. timer check
		db_set_dw(NULL, ModuleName, "LastChecked", MAKELONG(MAKEWORD(today.wDay, today.wMonth), today.wYear)); //write the value in DB so we don't check again today

	return 0;
}
Example #8
0
int main(){

Date Today(4,18,2012);
Date Maturity(12,31,2025);
Date Purchase(2,28,2012);

Bond Y("NYC_Obligation", 885.0, Purchase, Maturity);
Bond *bond_ptr = new Bond("GW_Bridge_Obligation", 895.0, Purchase, Maturity);

int Y_days = Y.daysToMaturity(Today);
float Y_years = Y_days / 365;
cout<<"The name of the First Bond is : "<< Y.get_name() <<endl;
cout<<"The price of the First Bond is : "<< Y.get_price() << endl;
cout<<"The difference between Maturity Date and Today's Date is: "<< Y_days << " Days."<<endl;
cout<<"The difference between Maturity Date and Today's Date is: "<< Y_years << " Years."<<endl;

int ptr_days = bond_ptr -> daysToMaturity(Today);
float ptr_years = ptr_days / 365;
cout<<"The name of the Second Bond is : "<< bond_ptr -> get_name() <<endl;
cout<<"The price of the Second Bond is : "<< bond_ptr -> get_price() << endl;
cout<<"The difference between Maturity Date and Today's Date is: "<<ptr_days<< " Days."<<endl;
cout<<"The difference between Maturity Date and Today's Date is: "<<ptr_years<< " Years."<<endl;
return 0;
}
Example #9
0
TDate TSecurity::StandardSettlement() const
{
  return StandardSettlement( Today() );
}
Example #10
0
int OnExtraImageApply(WPARAM wParam, LPARAM lParam)
{
	HANDLE hContact = (HANDLE) wParam;
	if ((hContact))
		{
			int count = CallService(MS_DB_CONTACT_GETCOUNT, 0, 0);
			//int daysInAdvance = DBGetContactSettingWord(NULL, ModuleName, "DaysInAdvance", DAYS_TO_NOTIFY);
			//int popupTimeout = DBGetContactSettingWord(NULL, ModuleName, "PopupTimeout", POPUP_TIMEOUT);
			//DWORD foreground = DBGetContactSettingDword(NULL, ModuleName, "Foreground", FOREGROUND_COLOR);
			//DWORD background = DBGetContactSettingDword(NULL, ModuleName, "Background", BACKGROUND_COLOR);
			//int bUsePopups = DBGetContactSettingByte(NULL, ModuleName, "UsePopups", TRUE);
			//int bUseClistIcon = DBGetContactSettingByte(NULL, ModuleName, "UseClistIcon", TRUE);
			//int bUseDialog = DBGetContactSettingByte(NULL, ModuleName, "UseDialog", TRUE);
			//int clistIcon = DBGetContactSettingByte(NULL, ModuleName, "AdvancedIcon", CLIST_ICON);
			//int notifyFor = DBGetContactSettingByte(NULL, ModuleName, "NotifyFor", 0);
			int hidden = DBGetContactSettingByte(hContact, "CList", "Hidden", 0);
			int ignored = DBGetContactSettingDword(hContact, "Ignore", "Mask1", 0);
			ignored = ((ignored & 0x3f) != 0) ? 1 : 0;
			int ok = 1;
			if (commonData.notifyFor & EXCLUDE_HIDDEN)
			{
				ok &= (hidden == 0);
			}
			if (commonData.notifyFor & EXCLUDE_IGNORED)
			{
				ok &= (ignored == 0);
			}
		
			int dtb;
			int dab;
			int caps = ServiceExists(MS_CLIST_EXTRA_ADD_ICON); // CallService(MS_CLUI_GETCAPS, 0, 0);
			
			time_t today = Today();
			
			if ((ok) && (((dtb = NotifyContactBirthday(hContact, today, commonData.daysInAdvance)) >= 0) || ((dab = NotifyMissedContactBirthday(hContact, today, commonData.daysAfter)) > 0)))
			{
				int age = GetContactAge(hContact);
				DBWriteContactSettingByte(hContact, "UserInfo", "Age", age);
				
				if ((bShouldCheckBirthdays) && (commonData.bUsePopups))
				{
					if (dtb >= 0)
					{
						bBirthdayFound = 1; //only set it if we're called from our CheckBirthdays service
						PopupNotifyBirthday(hContact, dtb, age);
					}
					else if (dab > 0)
					{
						PopupNotifyMissedBirthday(hContact, dab, age);
					}
				}
					
				if (bShouldCheckBirthdays)
				{
					if (dtb >= 0)
					{
						SoundNotifyBirthday(dtb);
					}
				}
					
				if ((bShouldCheckBirthdays) && (commonData.bUseDialog))
				{
					if (dtb >= 0)
					{
						DialogNotifyBirthday(hContact, dtb, age);
					}
					else if (dab > 0)
					{
						DialogNotifyMissedBirthday(hContact, dab, age);
					}
				}
				
				if ((caps > 0) && (commonData.bUseClistIcon)) //TODO
				{
					if (dtb >= 0)
					{
						ClistIconNotifyBirthday(hContact, dtb, commonData.clistIcon);
					}
				}
			}
			else{
				if (caps > 0) //TODO
				{ //clear the icon
					ClearClistIcon(hContact, commonData.clistIcon);
				}
			}
		}
		
	return 0;
}
Example #11
0
int CSingleUser::OnRespone_ReqQryTrade(CTdxApi* pApi, RequestRespone_STRUCT* pRespone)
{
	ReqQueryData_STRUCT* pQuery = (ReqQueryData_STRUCT*)pRespone->pContent;

	if (pRespone->pErr)
	{
		ErrorField* pField = (ErrorField*)m_msgQueue->new_block(sizeof(ErrorField));

		pField->RawErrorID = pRespone->pErr->ErrCode;
		strcpy(pField->Text, pRespone->pErr->ErrInfo);
		strcpy(pField->Source, "OnRespone_ReqQryTrade");

		m_msgQueue->Input_NoCopy(ResponeType::ResponeType_OnRtnError, m_msgQueue, m_pClass, 0, 0, pField, sizeof(ErrorField), nullptr, 0, nullptr, 0);
	}

	CJLB_STRUCT** ppRS = nullptr;
	CharTable2CJLB(pRespone->ppFieldInfo, pRespone->ppResults, &ppRS, pRespone->Client);

	// 操作前清空,按说之前已经清空过一次了
	m_NewTradeList.clear();

	if (ppRS)
	{
		// 利用成交编号的大小来判断正反序
		if (!m_TradeListReverse)
		{
			int count = GetCountStructs((void**)ppRS);
			if (count > 1)
			{
				// 转成数字的比较,是否会有非数字的情况出现?
				long CJBH0 = atol(ppRS[0]->CJBH);
				long CJBH1 = atol(ppRS[count - 1]->CJBH);
				if (CJBH0 > CJBH1)
				{
					m_TradeListReverse = true;
				}
			}
		}

		int i = 0;
		while (ppRS[i])
		{
			// 有部分券商,撤单也计成交了,真无语了,需要过滤
			if (ppRS[i]->CJSL_ <= 0)
			{
				++i;
				continue;
			}

			TradeField* pField = (TradeField*)m_msgQueue->new_block(sizeof(TradeField));

			CJLB_2_TradeField(ppRS[i], pField);
			pField->Date = ppRS[i]->CJRQ_ == 0 ? Today(0) : ppRS[i]->CJRQ_;//日期为0,重新赋值

			if (m_TradeListReverse)
			{
				// 华泰查出来的表后生成的排第一,所以要处理一下
				m_NewTradeList.push_front(pField);
			}
			else
			{
				m_NewTradeList.push_back(pField);
			}

			++i;
		}
	}

	// 新查出来的反而少了,华泰有合并成交的情况,这种如何处理?
	// 对同ID的需要累加,有发现累加不对应的,应当处理
	// 同样条数的,也有可能其中的有变化,如何处理?
	bool bTryMerge = false;
	int OldTradeListCount = m_OldTradeList.size();
	int NewTradeListCount = m_NewTradeList.size();

	if (NewTradeListCount < OldTradeListCount)
	{
		// 行数变少了,应当是合并了
		bTryMerge = true;
	}
	else if (OldTradeListCount == 0)
	{
		// 如果上一次的为空,不管这次查出来的是合并还是没有合并,都没有关系,当成没合并处理即可
	}
	else if (NewTradeListCount == OldTradeListCount)
	{
		// 行数不变,但有可能是其中的一条部分成交的更新,所以检查一下

		double OldQty = GetTradeListQty(m_OldTradeList, m_OldTradeList.size());
		double NewQty = GetTradeListQty(m_NewTradeList, m_NewTradeList.size());
		if (NewQty != OldQty)
		{
			// 同样长度成交量发生了变化,可能是合并的列表其中一个新成交了
			bTryMerge = true;
		}
	}
	else
	{
		// 行数变多了,只要其中上次的部分有变化就需要检查一下
		double OldQty = GetTradeListQty(m_OldTradeList, m_OldTradeList.size());
		double NewQty = GetTradeListQty(m_NewTradeList, m_NewTradeList.size());
		if (NewQty != OldQty)
		{
			bTryMerge = true;
		}
	}

	if (bTryMerge)
	{
		// 合并列表的处理方法
		// 如果上次是合并,这次就没有必要再生成一次了
		if (m_OldTradeMap.size() == 0 || !m_LastIsMerge)
		{
			for (unordered_map<string, TradeField*>::iterator it = m_OldTradeMap.begin(); it != m_OldTradeMap.end(); ++it)
			{
				TradeField* pField = it->second;
				delete[] pField;
			}
			m_OldTradeMap.clear();

			TradeList2TradeMap(m_OldTradeList, m_OldTradeMap);
		}
		TradeList2TradeMap(m_NewTradeList, m_NewTradeMap);
		CompareTradeMapAndEmit(m_OldTradeMap, m_NewTradeMap);

		// 交换
		for (unordered_map<string, TradeField*>::iterator it = m_OldTradeMap.begin(); it != m_OldTradeMap.end(); ++it)
		{
			TradeField* pField = it->second;
			delete[] pField;
		}
		m_OldTradeMap.clear();
		m_OldTradeMap = m_NewTradeMap;
		m_NewTradeMap.clear();
		m_LastIsMerge = true;
	}
	else
	{
		// 普通的处理方法
		CompareTradeListAndEmit(m_OldTradeList, m_NewTradeList);
		m_LastIsMerge = false;
	}

	if (pQuery->bAll)
	{
		int i = 0;
		int count = m_NewTradeList.size();
		for (list<TradeField*>::iterator it = m_NewTradeList.begin(); it != m_NewTradeList.end(); ++it)
		{
			TradeField* pField = *it;
			m_msgQueue->Input_Copy(ResponeType::ResponeType_OnRspQryTrade, m_msgQueue, m_pClass, i == count - 1, 0, pField, sizeof(TradeField), nullptr, 0, nullptr, 0);
			++i;
		}
	}

	// 将老数据清理,防止内存泄漏
	for (list<TradeField*>::iterator it = m_OldTradeList.begin(); it != m_OldTradeList.end(); ++it)
	{
		TradeField* pField = *it;
		m_msgQueue->delete_block(pField);
	}

	// 做交换
	m_OldTradeList.clear();
	m_OldTradeList = m_NewTradeList;
	m_NewTradeList.clear();

	return 0;
}
Example #12
0
int CSingleUser::OnRespone_ReqQryOrder(CTdxApi* pApi, RequestRespone_STRUCT* pRespone)
{
	ReqQueryData_STRUCT* pQuery = (ReqQueryData_STRUCT*)pRespone->pContent;

	if (pRespone->pErr)
	{
		ErrorField* pField = (ErrorField*)m_msgQueue->new_block(sizeof(ErrorField));

		pField->RawErrorID = pRespone->pErr->ErrCode;
		strcpy(pField->Text, pRespone->pErr->ErrInfo);
		strcpy(pField->Source, "OnRespone_ReqQryOrder");

		m_msgQueue->Input_NoCopy(ResponeType::ResponeType_OnRtnError, m_msgQueue, m_pClass, 0, 0, pField, sizeof(ErrorField), nullptr, 0, nullptr, 0);
	}

	WTLB_STRUCT** ppRS = nullptr;
	CharTable2WTLB(pRespone->ppFieldInfo, pRespone->ppResults, &ppRS, pRespone->Client);

	// 操作前清空,按说之前已经清空过一次了
	m_NewOrderList.clear();

	// 有未完成的,标记为true
	bool IsDone = true;
	// 有未申报的,标记为true
	bool IsNotSent = false;
	// 有更新的
	bool IsUpdated = false;

	if (ppRS)
	{
		int i = 0;
		while (ppRS[i])
		{
			// 将撤单委托过滤
			if (ppRS[i]->MMBZ_ != MMBZ_Cancel && ppRS[i]->MMBZ_ != MMBZ_Buy_Cancel && ppRS[i]->MMBZ_ != MMBZ_Sell_Cancel)
			{
				// 需要将它输入到一个地方用于计算,这个是临时的,需要删除
				OrderField* pField = (OrderField*)m_msgQueue->new_block(sizeof(OrderField));

				WTLB_2_OrderField_0(ppRS[i], pField);
				CreateID(pField->ID, ppRS[i]->WTRQ, ppRS[i]->GDDM, ppRS[i]->WTBH);
				pField->Date = ppRS[i]->WTRQ_ == 0 ? Today(0) : ppRS[i]->WTRQ_;//日期为0,重新赋值

				m_NewOrderList.push_back(pField);

				if (!ZTSM_IsDone(ppRS[i]->ZTSM_))
				{
					IsDone = false;
				}
				if (ZTSM_IsNotSent(ppRS[i]->ZTSM_))
				{
					IsNotSent = true;
				}

				// 需要将其保存起来,是只保存一次,还是每次都更新呢?个人认为只保存一次即可,反正是用来撤单的
				unordered_map<string, WTLB_STRUCT*>::iterator it = m_pApi->m_id_api_order.find(pField->ID);
				if (it == m_pApi->m_id_api_order.end())
				{
					WTLB_STRUCT* pWTField = (WTLB_STRUCT*)m_msgQueue->new_block(sizeof(WTLB_STRUCT));
					memcpy(pWTField, ppRS[i], sizeof(WTLB_STRUCT));
					m_pApi->m_id_api_order.insert(pair<string, WTLB_STRUCT*>(pField->ID, pWTField));
				}
			}
			++i;
		}
	}

	// 委托列表
	// 1.新增的都需要输出
	// 2.老的看是否有变化
	++m_OrderNotUpdateCount;

	int i = 0;
	list<OrderField*>::iterator it2 = m_OldOrderList.begin();
	for (list<OrderField*>::iterator it = m_NewOrderList.begin(); it != m_NewOrderList.end(); ++it)
	{
		OrderField* pField = *it;

		bool bUpdate = false;
		if (i >= m_OldOrderList.size())
		{
			bUpdate = true;
		}
		else
		{
			// 相同位置的部分
			OrderField* pOldField = *it2;
			if (pOldField->LeavesQty != pField->LeavesQty || pOldField->Status != pField->Status)
			{
				bUpdate = true;
			}
		}

		if (bUpdate)
		{
			IsUpdated = true;
			m_OrderNotUpdateCount = 0;

			// 如果能找到下单时的委托,就修改后发出来
			unordered_map<string, OrderField*>::iterator it = m_pApi->m_id_platform_order.find(pField->ID);
			if (it == m_pApi->m_id_platform_order.end())
			{
				// 因为上次生成的可能在后期删了,所以要复制一份
				OrderField* pField_ = (OrderField*)m_msgQueue->new_block(sizeof(OrderField));
				memcpy(pField_, pField, sizeof(OrderField));

				m_pApi->m_id_platform_order.insert(pair<string, OrderField*>(pField_->ID, pField_));
			}
			else
			{
				OrderField* pField_ = it->second;
				memcpy(pField_, pField, sizeof(OrderField));
			}

			m_msgQueue->Input_Copy(ResponeType::ResponeType_OnRtnOrder, m_msgQueue, m_pClass, 0, 0, pField, sizeof(OrderField), nullptr, 0, nullptr, 0);
		}

		// 前一个可能为空,移动到下一个时需要注意
		if (it2 != m_OldOrderList.end())
		{
			++it2;
		}

		++i;
	}

	if (pQuery->bAll)
	{
		int i = 0;
		int count = m_NewOrderList.size();
		for (list<OrderField*>::iterator it = m_NewOrderList.begin(); it != m_NewOrderList.end(); ++it)
		{
			OrderField* pField = *it;
			m_msgQueue->Input_Copy(ResponeType::ResponeType_OnRspQryOrder, m_msgQueue, m_pClass, i == count - 1, 0, pField, sizeof(OrderField), nullptr, 0, nullptr, 0);
			++i;
		}
	}

	// 将老数据清理,防止内存泄漏
	for (list<OrderField*>::iterator it = m_OldOrderList.begin(); it != m_OldOrderList.end(); ++it)
	{
		OrderField* pField = *it;
		m_msgQueue->delete_block(pField);
	}

	// 做交换
	m_OldOrderList.clear();
	m_OldOrderList = m_NewOrderList;
	m_NewOrderList.clear();

	double _queryTime = 0;
	if (!IsDone)
	{
		if (!IsUpdated)
		{
			// 没有更新,是否要慢点查
			_queryTime = 0.5 * QUERY_TIME_MAX + QUERY_TIME_MIN;
		}

		// 有没有完成的,需要定时查询
		if (IsNotSent)
		{
			// 有没申报的,是否没在交易时间?慢点查
			_queryTime = 0.5 * QUERY_TIME_MAX + QUERY_TIME_MIN;
		}
		else
		{
			// 可能是交易时间了,是否需要考虑
			_queryTime = 2 * QUERY_TIME_MIN;
			// 可能有些挂单一天都不会成交,挂在这一直导致查太多,加一下查询计数
			if (m_OrderNotUpdateCount >= 3)
			{
				_queryTime = 0.5 * QUERY_TIME_MAX + QUERY_TIME_MIN;
			}
		}
	}
	else
	{
		// 全完成了,可以不查或慢查
		_queryTime = 5 * QUERY_TIME_MAX;
	}

	m_QueryOrderTime = time(nullptr) + _queryTime;
	OutputQueryTime(m_QueryOrderTime, _queryTime, "NextQueryOrder_QueryOrder");

	// 决定成交查询间隔
	if (IsUpdated)
	{
		// 委托可能是撤单,也有可能是成交了,赶紧查一下
		_queryTime = 0;
		m_QueryTradeTime = time(nullptr) + _queryTime;
		OutputQueryTime(m_QueryTradeTime, _queryTime, "NextQueryTrade_QueryOrder");
	}
	else
	{
		// 委托没有变化,那成交就没有必要查那么快了
		_queryTime = 5 * QUERY_TIME_MAX;
		m_QueryTradeTime = time(nullptr) + _queryTime;
		OutputQueryTime(m_QueryTradeTime, _queryTime, "NextQueryTrade_QueryOrder");
	}

	return 0;
}
//---------------------------------------------------------------------------
__fastcall TEAddForm::TEAddForm(TComponent* Owner)
        : TForm(Owner)
{
        DateTimePicker1->Date=Today(); // Установка у DateTimePicker'a текущей даты.
}
Example #14
0
 double ForwardRate::FwdRate(const Utilities::Date::MyDate &start, const Utilities::Date::MyDate &end) const
 {
     return FwdRate(start.Diff(Today()), end.Diff(Today()));
 }