Полезные ссылки      Регистрация      Конец страницы
 Фильтр:
    Категория:   Метки:     содержит   
    Показать   Сортировка:  Дата  Публикатор  Заголовок  Категория  Показы  Голоса  Оценка
19.01.2018  19:49
Персональные данные

gliba
дистанционное обучение сотрудников
Дистанционное обучение персонала – единственный эффективный инструмент для массового обучения и оценки сотрудников. А как еще? Чтобы одновременно, да во всех представительствах компании, да без отрыва от производства, да с автоматической оценкой.

да чтобы в условиях «текучки» не перерасходовать бюджет. Водный туризм начался на втором курсе. Эсть такая речушка в Подмосковье - Нара. Дружки достали байдарки, и мы поплыли. Сначала Вова и еще двое чуваков сели в лодку и стали проверять балансировку. Неожиданно все они оказались в воде. Плывем дальше, я с Макароном. Навстречу коряга. Пока решали с какой стороны обплывать, напоролись, лодка набирает воды, мы плывем рядом и подтягиваем ее к берегу. Кое-как заклеились и дальше. Ночью было противно от холода. Одно спасало - сгущенка. Следующий день - Первомай. Погода все еще солнечная, но вечером уже прилетели белые мухи. Палаток не хватало. Народ с трудом понабился туда, как сельди в бочку. Я еще у костра. Гляжу, подруга Макарона, Анюта спать не идет. Говорит, не может в такой тесноте спать. Вдвоем сидим у костерка, понимаешь. Жалею, что на замацал ее. Как лох, говорю ей, поздно, пошли по палаткам. Эх, молодо-зелено! В целом, поход понравился, решили летом на Урал идти. На Урал поехали поездом, восемь орлов, четыре лодки. Стали в карты играть, кто выграет, тот маршрут заказывает. Мы с Бориской проиграли, но все равно пошли на Инзер - приток Белой. Речка 1б, оказалась мелководной. На мелководье подрали байдарки, тащили волоком, много клеились. У Вадика намокли турботики. Когда он их высушил у костра, то они сжались на два размера. На следующей стоянке мы посоветовали их разогреть в воде и растянут. Вадик довел их до кипения, а когда вынул из котла, то подошвы отвалились. По дороге оказались пещеры. Наша четверка пошла первой. Подходим к лазу, оттуда холодный ветер дует. Связались веревкой и поползли. Дорогу тускло освешал фонарик. Потом лаз раширился, начались громадные залы. Стали возврашаться назад, а дороги и нет. Вот тебе, бабушка, и юрьев день. Пропали жизни молодые во глубине башкирских руд. Отвязали меня и пустили на разведку. Иду, от летучих мышей уклоняусь, сбоку вижу что-то похожее на выход и вдруг захожу ребятам с тылу. Действительно, это был выход. Вылезаем на теплый воздух, очки у меня запотели, из лагеря кашей пахнет, лепота! Заново родились. Другая четверка, наученная нашим опытом, тянула за собой нитку. Ини обнаружили колодец. Для его изучения мы изготовили лестницу метров 30 длинной. На следуюший день пещерные похождения продолжились. По лестнице мы полезли в колодец. "Папа, не бросай меня в колоооооооо!" Лестница была сделана из капроновой веревки. Оказалось, что она тянется, как не знаю что. Чтобы переставить ногу, приходилось другую в колене тянут до уха. А перекладины скользкие и норовят выпасть из рук. Когда я спустился, то натерпелся такого страху! Полазили по узким лазам, словно в кишках у динозавра побывали. Обнаружили зал со сталагитами. Колкун достал топор и нарубил каждому по штуке, а себе - два, подружку порадовать. Выползли из пещеры ообессиленные. А утром одного сталагмита Колкун не досчитался, наверное, башкиры свистнули. Поплыли дальше. Поселок Инзер встретил приветливо, у шоферов отсосали бензина из бака для клейки лодок (меня чуть не стошнило при этом), заклеили лодки, Вадик купил новые ботинки, шодили в кино. Дальше гребли но-немножку, порогов не было, любовались закатами, одним словом, балдели. Колкун не выдержал и ушел в пешку. Пришлось мне грести одному. Подробно
Категория: обучение

2 / 0 / 0.0

Голосовать
Отзывы
28.10.2009  18:04
Персональные данные

gliba
Бетон, железобетон от компании ''Стройхолд МС+"
Самые выгодные предложения в Москве.

д Подробно
Категория: строительство, материалы, ремонт

2967 / 0 / 0.0

Голосовать
Отзывы
14.11.2008  13:50
Персональные данные

yura
Паевые фонды недвижимости
Финансовая компания "Передовые финансовые технологии "ПФТ" - УК ЗПИФН

д Подробно
Категория: недвижимость

2428 / 0 / 0.0

Голосовать
Отзывы
05.04.2008  01:45
Персональные данные

gliba
Сайт "Заокой.ру"
Заокский район Тульской области - это находка для тех, кто ценит природу и устал от напряженного ритма Москвы.

д Подробно
Категория: недвижимость   Метки: экология

3422 / 0 / 0.0

Голосовать
Отзывы
25.03.2008  02:28
Персональные данные

gliba
"Запах крови на Ибице"
Четыре дня назад Алекс прилетел из Парижа, через Барселону на средиземноморский остров Ибица. От своих погулявших по свету друзей он слышал разные отзывы, восхищенные и не очень, но все как один советовали - непременно побывать!

д Подробно
Категория: развлечения   Метки: женщины литература туризм

2266 / 24 / 4,5
Последний 09.07.2018
Голосовать
Отзывы
14.06.2007  13:06
Персональные данные

Высотно-ремонтная бригада - АльпМастер
Альпинисты выполнят высотные работы.

д Подробно
Категория: реклама

2844 / 1 / 5
Последний 27.02.2008
Голосовать
Отзывы
07.06.2007  03:37
Персональные данные

gliba
Международные и межнациональные тренинги и образовательные программы
Чтобы узнать как OCS, Inc. может вам помочь создать международные образовательные программы и организовать стажировку по всему миру...

д Подробно
Категория: обучение

3227 / 0 / 0.0

Голосовать
Отзывы
05.06.2007  01:01
Персональные данные

artemida
Дорога к Храму
Вообще у церковных людей есть такое выражение: "рвение не по разуму".

д Подробно
Категория: развлечения

2951 / 0 / 0.0

Голосовать
Отзывы
28.05.2007  20:29
Персональные данные

gliba
Загадки ПВО
Фивмиу-Кевмиу...

#include "stdafx.h" #ifdef _MSC_VER #pragma warning( disable : 4503 4355 4786 ) #else #include "config.h" #endif #include "../../include/quickfix/Session.h" #include "tradeclient_mfcDlg.h" #include "Application.h" #include "TUtil.h" using namespace OBRBank; using namespace std; //mfc возможно влияет, use database; команда перестала работать /* order new - создаем новый TradeEvent update - используем текущий TradeEvent, cancel - создаем новый TradeEvent у всех один iord_orig */ /* на каждый активный алгоритм не более одной заявки в vrcPara */ //Application methods void Application::addQueryToVector(char * squery) { string * ss = new string(squery); vecErr.push_back(ss); } //overwrite "retry.log" file void Application::log_retry(char * query) { FILE *fp; i_err = fopen_s(&fp, "retry.log", "w+"); fprintf(fp, "%s", query); fclose(fp); } //read all from "retry.log" file void Application::read_retry(char * query, UINT nmax) { FILE * fp; i_err = fopen_s(&fp, "retry.log", "r"); if (fp == NULL) { TUtil::log2file("retry.log", "NOT FOUND"); return; } while (!feof(fp)) { char q[4096]; if (fgets(q, 4096, fp) != NULL) { if (strlen(query) + strlen(q) < nmax) strcat(query, q); else TUtil::log2file(q, "LOST"); } } fclose(fp); } bool Application::CHECK(SQLRETURN rc, char * msg, bool printSucceededMsg, bool quit, bool bLogg) { if (SQL_SUCCEEDED(rc)) { if (printSucceededMsg) printf("%s succeeded ", msg); return true; } else { if (bLogg) TUtil::log2file(msg, "ERROR", rc); if (quit) Termination("termination from CHECK"); //FatalAppExitA( 0, msg ) ; return false; } } void Application::status(SQLSMALLINT handleType, SQLHANDLE theHandle, int line, bool quit) { SQLCHAR sqlState[6]; SQLINTEGER nativeError; SQLCHAR msgStr[256]; SQLSMALLINT overBy; // the number of characters that msgStr buffer was TOO SHORT.. // http://msdn.microsoft.com/en-us/library/ms716256(VS.85).aspx // This must be the WEIRDEST ERROR REPORTING FUNCTION I've EVER seen. // It requires 8 parameters, and its actually pretty .. silly // about the amount of state information it expects YOU to keep track of. // It isn't so much a "GetLastError()" function // as it is a "GetMeStatus( something very, very specific )" function. SQLRETURN retCode; for (int i = 1; i < 20; i++) { retCode = SQLGetDiagRecA( handleType, // the type of object you're checking the status of theHandle, // handle to the actual object you want the status of i, // WHICH status message you want. The "Comments" section at the // bottom of http://msdn.microsoft.com/en-us/library/ms716256(VS.85).aspx // seems to explain this part well. sqlState, // OUT: gives back 5 characters (the HY*** style error code) &nativeError,// numerical error number msgStr, // buffer to store the DESCRIPTION OF THE ERROR. // This is the MOST important one, I suppose 255, // the number of characters in msgStr, so that // the function doesn't do a buffer overrun in case it // has A LOT to tell you &overBy // again in case the function has A LOT to tell you, // the 255 character size buffer we passed might not be large // enough to hold the entire error message. If that happens // the error message will truncate and the 'overBy' variable // will have a value > 0 (it will measure number of characters // that you 'missed seeing' in the error message). ); if (CHECK(retCode, "SQLGetDiagRecA", false, quit)) { printf("LINE %d: [%s][%d] %s ", line, sqlState, nativeError, msgStr); } else { // Stop looping when retCode comes back // as a failure, because it means there are // no more messages to tell you break; } } } void Application::sqlAllocResources(bool quit) { sqlFreeResources(); bool bSucc = false; char squery[4096]; SQLRETURN retCode; retCode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv); bSucc = CHECK(retCode, "allocate environment handle", false, quit); if (bSucc) { retCode = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); bSucc = CHECK(retCode, "setting the environment attribute setting to ODBC version 3", false, quit); if (bSucc) { bSucc = CHECK(SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hConn), "allocate handle", false, quit); if (bSucc) { retCode = SQLConnectA( hConn, (SQLCHAR*)dsnName, SQL_NTS, // the DSN name is a NULL TERMINATED STRING, so "count it yourself" (SQLCHAR*)userid, SQL_NTS, // userid is a null-terminated string (SQLCHAR*)password, SQL_NTS // password is a null terminated string ); bSucc = CHECK(retCode, "Error in connect to database", false, quit); if ( !bSucc ) { status(SQL_HANDLE_DBC, hConn, __LINE__, quit); } else { bSucc = CHECK(SQLAllocHandle(SQL_HANDLE_STMT, hConn, &hStmt), "allocate handle for statement", false, quit); if (strlen(database) > 0 && bSucc) { sprintf(squery, "use %s;", database); execQuery(squery); } } } } } if (!bSucc) sqlFreeResources(); } void Application::sqlFreeResources() { if (hStmt) SQLFreeHandle(SQL_HANDLE_STMT, hStmt); if (hConn) SQLFreeHandle(SQL_HANDLE_DBC, hConn); if (hEnv) SQLFreeHandle(SQL_HANDLE_ENV, hEnv); hStmt = 0; hConn = 0; hEnv = 0; }; void Application::Termination(char * mes, bool bExit) { m_bReady = false; //save to retry string s_err; UINT i; for (i = 0; i < vecErr.size(); i++) { if (vecErr[i] == NULL) continue; s_err += *vecErr[i]; s_err += " "; delete vecErr[i]; vecErr[i] = NULL; } log_retry((char*)s_err.c_str()); for (i = 0; i < vecOrderbook.size(); i++) { if (vecOrderbook[i] == NULL) continue; delete vecOrderbook[i]; vecOrderbook[i] = NULL; } for (i = 0; i < vecPara.size(); i++) { if (vecPara[i] == NULL) continue; delete vecPara[i]; vecPara[i] = NULL; } for (i = 0; i < vecParaArch.size(); i++) { if (vecParaArch[i] == NULL) continue; delete vecParaArch[i]; vecParaArch[i] = NULL; } for (i = 0; i < vecHist.size(); i++) { if (vecHist[i] == NULL) continue; delete vecHist[i]; vecHist[i] = NULL; } for (i = 0; i < vecAlgo.size(); i++) { if (vecAlgo[i] == NULL) continue; delete vecAlgo[i]; vecAlgo[i] = NULL; } for (i = 0; i < vecLU.size(); i++) { if (vecLU[i] == NULL) continue; delete vecLU[i]; vecLU[i] = NULL; } for (i = 0; i < vecCmd.size(); i++) { if (vecCmd[i] == NULL) continue; delete vecCmd[i]; vecCmd[i] = NULL; } TUtil::log2file(mes, "EXIT"); printf("Disconnected"); sqlFreeResources(); if (m_pDlg == NULL) { if (bExit) exit(0); } else { if (m_pDlg->GetSafeHwnd() != NULL) m_pDlg->PostMessageA(WM_MESSAGE_TERM, (WPARAM)0, (LPARAM)(new string(mes))); } }; bool Application::execQuery(char * query) { if (!m_bReady) return false; //have connection? if (!hStmt || !hConn || !hEnv) { //try to restore sqlAllocResources(false); if (!hStmt || !hConn || !hEnv) { iConnErr++; if (iConnErr >= iConnErrMax) { //??addQueryToVector(query); //add query to restore Termination("превышено допустимое число ошибок связи SQL Server"); return false; } } } bool bConnError = false; SQLRETURN sqlret = SQLExecDirectA(hStmt, (SQLCHAR *)query, SQL_NTS); SQLCHAR sqlstate[6], sql_message[SQL_MAX_MESSAGE_LENGTH + 1]; SQLINTEGER sqlnative; SQLSMALLINT sql_message_length = 0; SQLHSTMT hstmt = 0; if (sqlret) { SQLGetDiagRec( SQL_HANDLE_STMT, hStmt, 1, sqlstate, &sqlnative, sql_message, sizeof(sql_message), &sql_message_length); } bool bLogg = true; //true - логировать ошибки if (sql_message_length > 0 && strstr((char *)sql_message, (const char*)skip_err) != NULL) bLogg = false; if (sql_message_length > 0 && strstr((char *)sql_message, (const char*)conn_err) != NULL) { bConnError = true; iConnErr++; } if (sql_message_length > 0) { CHECK(sqlret, (char *)sql_message, false, false, bLogg); if (iConnErr >= iConnErrMax) { //??addQueryToVector(query); //add query to restore Termination("превышено допустимое число ошибок связи SQL Server"); return false; } } bool b = CHECK(sqlret, (char *)query, false, false, bLogg); if (b) iConnErr = 0; //reset number of connection errors if (bConnError) { sqlFreeResources(); } return b; } //retry failed queries if any void Application::checkErrors() { if (!m_bReady) return; stringstream ss; ss << "checkErrors " << vecErr.size() << ", " << systema << endl; SendToGui(ss.str()); while (vecErr.size() > 0) { char * sq = (char*)((*vecErr[0]).c_str()); bool b = execQuery(sq); if (!b) break; delete vecErr[0]; for (UINT i = 0; i < vecErr.size() - 1; i++) { vecErr[i] = vecErr[i + 1]; } vecErr[vecErr.size() - 1] = NULL; vecErr.pop_back(); } } int Application::strpos(char * haystack, char * needle) { int sleng = strlen(haystack); int nleng = strlen(needle); if (sleng == 0 || nleng == 0) return -1; for (int i = 0, j = 0; i 0) { bool b = execQuery("update [datastorage].[dbo].[otc_fx_trades] set[PROCDATE] = getdate() where otcid = 1"); } } } void Application::toAdmin(FIX::Message& message, const FIX::SessionID& sessionID) { FIX::MsgType msgtype; message.getHeader().getField(msgtype); if (msgtype.getValue() == "A") { SetConsoleTitle(systema); FIX::Dictionary dc = m_sets.get(sessionID); string usn, pwd; if (dc.has("USERNAME")) usn = dc.getString("USERNAME"); if (dc.has("PASSWORD")) { pwd = dc.getString("PASSWORD"); if (pwd == "*") pwd = " "; //MICEX } if (strlen(usn.c_str()) > 0) { FIX::Username _un(usn); message.setField(_un); } if (strlen(pwd.c_str()) > 0) { FIX::Password _pw(pwd); message.setField(_pw); } } stringstream ss; ss << "toAdmin OUT: " << message << ", cur. thread: " << std::this_thread::get_id() << endl; SendToGui(ss.str()); } void Application::fromApp( const FIX::Message& message, const FIX::SessionID& sessionID ) throw( FIX::FieldNotFound, FIX::IncorrectDataFormat, FIX::IncorrectTagValue, FIX::UnsupportedMessageType ) { crack(message, sessionID); FIX::MsgType msgtype; message.getHeader().getField(msgtype); if (msgtype.getValue() != "W" && msgtype.getValue() != "X") { stringstream ss; ss << "@IN (fromApp end): " << message << endl; SendToGui(ss.str()); } } void Application::toApp( FIX::Message& message, const FIX::SessionID& sessionID ) throw( FIX::DoNotSend ) { try { FIX::PossDupFlag possDupFlag; message.getHeader().getField( possDupFlag ); if ( possDupFlag ) throw FIX::DoNotSend(); } catch ( FIX::FieldNotFound& ) {} stringstream ss; ss << "#OUT (toApp end): " << message << endl; SendToGui(ss.str()); } //MOEX, ntpro, aggregator void Application::onMessage (const FIX44::ExecutionReport&er, const FIX::SessionID& sessionID) { FIX::Locker l(m_mutex); TUtil::log2file((char*)er.toString().c_str(), "RAW ExecutionReport1"); if (strcmp(systema, "moex") != 0 && strcmp(systema, "ntpro") != 0 && strcmp(systema, "aggregator") != 0) return; FIX::OrderID oredrid; er.get(oredrid); FIX::Currency curr; er.getIfSet(curr); FIX::ExecID execid; er.getIfSet(execid); FIX::ExecTransType transtype; //?? er.getIfSet(transtype); FIX::OrderQty quant; er.getIfSet(quant); FIX::OrdStatus aOrdStatus; er.getIfSet(aOrdStatus); FIX::ExecType aExecType; er.getIfSet(aExecType); FIX::Price price; er.getIfSet(price); FIX::Symbol symb; er.getIfSet(symb); FIX::Side aSide; er.getIfSet(aSide); FIX::FutSettDate fut; //?? er.getIfSet(fut); FIX::TradeDate trdt; er.getIfSet(trdt); FIX::LeavesQty aLeavesQty; er.getIfSet(aLeavesQty); FIX::ContractMultiplier cmult; er.getIfSet(cmult); FIX::Account acc; er.getIfSet(acc); FIX::CumQty cumq; er.getIfSet(cumq); FIX::AvgPx avg; er.getIfSet(avg); FIX::FutSettDate2 fut2; //?? er.getIfSet(fut2); FIX::OrderQty2 quant2; er.getIfSet(quant2); FIX::LastQty last_qty; er.getIfSet(last_qty); FIX::LastPx last_prx; er.getIfSet(last_prx); string price_2 = ""; //!! not defined in original Fix4.3 if (er.isSetField(640)) price_2 = er.getField(640); //Aggregator string trader = "", onbhcompid = "", onbhsubid = "", clientid = "", textid = "", senderSubId = "", real_rec_id = "", real_aggr_id = "", user_text = ""; if (er.isSetField(11201)) trader = er.getField(11201); if (er.getHeader().isSetField(115)) onbhcompid = er.getHeader().getField(115); if (er.getHeader().isSetField(116)) onbhsubid = er.getHeader().getField(116); if (er.isSetField(109)) clientid = er.getField(109); if (er.isSetField(58)) textid = er.getField(58); if (er.getHeader().isSetField(50)) senderSubId = er.getHeader().getField(50); //2016-06-10 if (er.isSetField(11205)) real_rec_id = er.getField(11205); if (er.isSetField(11206)) real_aggr_id = er.getField(11206); if (er.isSetField(11210)) user_text = er.getField(11210); FIX::ClOrdID clr; er.getIfSet(clr); stringstream ss; ss << "onMessage: " << sessionID << " oredrid: " << oredrid << " curr: " << curr << " execid: " << execid << " transtype: " << transtype << " quant: " << quant << " OrdStatus: " << aOrdStatus << " ExecType: " << aExecType << " price: " << price << " symbol: " << symb << " Side: " << aSide << " FutSettDate: " << fut << " TradeDate: " << trdt << " LeavesQty: " << aLeavesQty << " ContractMultiplier: " << cmult << " Account: " << acc << " CumQty: " << cumq << " AvgPx: " << avg << " FutSettDate2: " << fut2 << " quant2: " << quant2 << " ClOrdID: " << clr << endl; SendToGui(ss.str()); bool bBuy = aSide.getValue() == '1'; Para * pFound = NULL; int i = 0; char buf[330]; int iord = atoi(clr.getString().c_str() + 3); //char cstat = aOrdStatus.getString().c_str()[0]; char cstat = aExecType.getString().c_str()[0]; if (cstat == 'F') { //(Исполнена) for (i = vecPara.size() - 1; i >= 0; i--) { Para * p = vecPara[i]; TradeEvent * te = p->FindOrder(iord); if (te == NULL) continue; if (te->side == tradeevent_side::EV_SIDE_BUY) { GetSystemTime(&p->tm_buy_done); p->cumBuy = cumq.getValue(); p->prxBuyAvg = avg.getValue(); te->statusExec = 'F'; if (p->algo == para_algo::PARA_ALGO_BUY || p->algo == para_algo::PARA_ALGO_BUY_COND) { //primary order if (p->cumBuy < p->amount && p->WasCanceled(tradeevent_side::EV_SIDE_BUY) == false) { //partially filled - cancel this order TUtil::log2file("partially filled - cancel this order", "EXEC"); sprintf(buf, "OBR%d", iord); std::string os("buy"), oorig(buf); TradeEvent * te_cncl = p->AddEvent(iord, tradeevent_action::EV_ACT_CNCL, tradeevent_side::EV_SIDE_BUY, p->prxBuy, p->amount - p->cumBuy); te_cncl->iord_next = SetOrderCancel(trade_sender, p->symbolBuy, os, oorig, p->amount - p->cumBuy); te_cncl->iord = te_cncl->iord_next; te_cncl->iord_orig = te->iord_orig; } if (compliment_min <= last_qty.getValue()) { //make complimentary order int iOrderSell = GetClId(); GetSystemTime(&p->tm_sell_created); std::string oside("sell"), otype("Limit"), otime("GTC"); sprintf(buf, "COMPLIMENT init iOrderBuy %d, statusBuy %c, iOrderSell %d, statusSell 0, last_qty %f", iord, te->statusExec, iOrderSell, last_qty.getValue()); TUtil::log2file(buf, "EXEC"); p->AddEvent(iOrderSell, tradeevent_action::EV_ACT_NEW, tradeevent_side::EV_SIDE_SELL, p->prxSell, last_qty.getValue()); SetSingleOrder(trade_sender, p->symbolSell, oside, otype, otime, p->caSell, last_qty.getValue(), p->prxSell, p->m_pAlgo, iOrderSell); } else { sprintf(buf, "COMPLIMENT skipped, min %f, last_qty %f", compliment_min, last_qty.getValue()); TUtil::log2file(buf, "EXEC"); } } UpdatePosition(1, p->symbolBuy, last_prx.getValue(), last_qty.getValue()); pFound = p; break; } else { GetSystemTime(&p->tm_sell_done); p->cumSell = cumq.getValue(); p->prxSellAvg = avg.getValue(); te->statusExec = 'F'; if (p->algo == para_algo::PARA_ALGO_SELL || p->algo == para_algo::PARA_ALGO_SELL_COND) { //primary order if (p->cumSell < p->amount && p->WasCanceled(tradeevent_side::EV_SIDE_SELL) == false) { //partially filled - cancel this order TUtil::log2file("partially filled - cancel this order", "EXEC"); sprintf(buf, "OBR%d", iord); std::string os("sell"), oorig(buf); TradeEvent * te_cncl = p->AddEvent(iord, tradeevent_action::EV_ACT_CNCL, tradeevent_side::EV_SIDE_SELL, p->prxSell, p->amount - p->cumSell); te_cncl->iord_next = SetOrderCancel(trade_sender, p->symbolSell, os, oorig, p->amount - p->cumSell); te_cncl->iord = te_cncl->iord_next; te_cncl->iord_orig = te->iord_orig; } if (compliment_min <= last_qty.getValue()) { //make complimentary order int iOrderBuy = GetClId(); GetSystemTime(&p->tm_buy_created); std::string oside("buy"), otype("Limit"), otime("GTC"); sprintf(buf, "COMPLIMENT init iOrderBuy %d, statusBuy 0, iOrderSell %d, statusSell %c, last_qty %f", iOrderBuy, iord, te->statusExec, last_qty.getValue()); TUtil::log2file(buf, "EXEC"); p->AddEvent(iOrderBuy, tradeevent_action::EV_ACT_NEW, tradeevent_side::EV_SIDE_BUY, p->prxBuy, last_qty.getValue()); SetSingleOrder(trade_sender, p->symbolBuy, oside, otype, otime, p->caBuy, last_qty.getValue(), p->prxBuy, p->m_pAlgo, iOrderBuy); } else { sprintf(buf, "COMPLIMENT skipped, min %f, last_qty %f", compliment_min, last_qty.getValue()); TUtil::log2file(buf, "EXEC"); } } UpdatePosition(2, p->symbolSell, last_prx.getValue(), last_qty.getValue()); pFound = p; break; } } } else if (cstat == '0') { //0 - new for (i = vecPara.size() - 1; i >= 0; i--) { Para * p = vecPara[i]; TradeEvent * te = p->FindOrder(iord); if (te != NULL) { if (te->statusExec == 'z') te->statusExec = 'Z'; //cancel later SYSTEMTIME tm; GetSystemTime(&tm); if (te->side == tradeevent_side::EV_SIDE_BUY) { ms_total_buy += TUtil::diff_mili(tm, te->tm_created); n_total_buy++; } else { ms_total_sell += TUtil::diff_mili(tm, te->tm_created); n_total_sell++; } if ((n_total_sell + n_total_buy) % 20 == 1) { sprintf(buf, "delay set order BUY %d ms, order SELL %d ms", ms_total_buy / (n_total_buy > 0 ? n_total_buy : 1), ms_total_sell / (n_total_sell > 0 ? n_total_sell : 1)); TUtil::log2file(buf, "STAT"); } pFound = p; break; } } } else if (cstat == 'C') { //C – Expired for (i = vecPara.size() - 1; i >= 0; i--) { Para * p = vecPara[i]; TradeEvent * te = p->FindOrder(iord); if (te != NULL) { if (te->statusExec != 'F' && te->statusExec != 'C' && te->statusExec != '8' && te->statusExec != '4') te->statusExec = cstat; pFound = p; break; } } } else if (cstat == '8') { //8 - Rejected for (i = vecPara.size() - 1; i >= 0; i--) { Para * p = vecPara[i]; TradeEvent * te = p->FindOrder(iord); if (te != NULL) { if (te->statusExec != 'F' && te->statusExec != 'C' && te->statusExec != '8' && te->statusExec != '4') te->statusExec = cstat; pFound = p; break; } } if (pFound == NULL) { for (i = vecPara.size() - 1; i >= 0; i--) { Para * p = vecPara[i]; TradeEvent * te = p->FindOrderByNext(iord); if (te != NULL) { if (te->statusExec != 'F') { if (te->statusExec != 'F' && te->statusExec != 'C' && te->statusExec != '8' && te->statusExec != '4') te->statusExec = cstat; } pFound = p; break; } } } } else if (cstat == '4') { //canceled for (i = vecPara.size() - 1; i >= 0; i--) { Para * p = vecPara[i]; TradeEvent * te = p->FindOrderByNext(iord); if (te != NULL) { p->SetStatusByOrig(te->iord_orig, '4'); pFound = p; break; } } } else if (cstat == '5') { //replaced for (i = vecPara.size() - 1; i >= 0; i--) { Para * p = vecPara[i]; TradeEvent * te = p->FindOrderByNext(iord); if (te != NULL) { /* может возникнуть ситуация, делаем перестановку основного ордера, впотом происходит частичное исполнение, мы снимаем ордер, но раньше происходит UPDATE, CANCEL теряется, заявка на полную стоимость остается висеть! решение: при UPDATE проверяем был ли CANCEL, если да - делаем еще раз */ if (p->WasCanceled(bBuy ? tradeevent_side::EV_SIDE_BUY : tradeevent_side::EV_SIDE_SELL)) { //one more Cancel! TUtil::log2file("updated - send cancel again", "EXEC"); sprintf(buf, "OBR%d", iord); std::string os(bBuy ? "buy" : "sell"), oorig(buf); TradeEvent * te_cncl = p->AddEvent(iord, tradeevent_action::EV_ACT_CNCL, bBuy ? tradeevent_side::EV_SIDE_BUY : tradeevent_side::EV_SIDE_SELL, price.getValue(), quant.getValue()); te_cncl->iord_next = SetOrderCancel(trade_sender, p->symbolBuy, os, oorig, quant.getValue()); te_cncl->iord = te_cncl->iord_next; te_cncl->iord_orig = te->iord_orig; } if (te->statusExec != 'F' && te->statusExec != 'C' && te->statusExec != '8' && te->statusExec != '4') te->statusExec = (te->statusExec == 'z' || te->statusExec == 'Z') ? 'Z' : '0'; te->iord = iord; pFound = p; break; } } } if (i < 0) { sprintf(buf, "NOT FOUND"); TUtil::log2file(buf, "EXEC"); string snot(" сделка не найдена!!!"); SendToGui(snot); } if (pFound == NULL) return; CheckStop(pFound->m_pAlgo); /* char squery[4096]; sprintf(squery, "INSERT INTO [datastorage].[dbo].otc_ORDER ([system], [contragent], [Symbol], [BUYSELL], [PRICE], [QUANTITY], [PRICE_moex_bid], [PRICE_moex_ask], [PRICE_calc_bid], [PRICE_calc_ask], [PRICE_moex_bid_2], [PRICE_moex_ask_2], [PRICE_calc_bid_2], [PRICE_calc_ask_2], [status], [clid], [execid], vecpara_index ) VALUES('%s', '%s', '%s', '%s', %f, '%s', %f, %f, %f, %f, %f, %f, %f, %f, '%c', '%s', '%s', %d); ", systema, bBuy ? pFound->caBuy.c_str() : pFound->caSell.c_str(), symb.getValue().c_str(), bBuy ? "B" : "S", price.getValue(), quant.getString().c_str(), pFound->dMoexBid, pFound->dMoexAsk, pFound->dCalcBid, pFound->dCalcAsk, dMoexBid, dMoexAsk, dCalcBid, dCalcAsk, cstat, clr.getValue().c_str(), execid.getValue().c_str(), i); bool b = execQuery(squery); if (!b) { TUtil::log2file(squery, "query failed"); //add query to restore }*/ }  Подробно
Категория: обучение

2577 / 1 / 4
Последний 27.02.2008
Голосовать
Отзывы
05.06.2006  05:26
Персональные данные

gliba
Портал ВСЕОБУЧ
Все образование Москвы и регионов РФ.

весьма полезный ресурс Подробно
Категория: обучение

3384 / 0 / 0.0

Голосовать
Отзывы
27.04.2006  04:21
Персональные данные

gliba
Песни русского воскресения

в Подробно
Категория: новости

3185 / 0 / 0.0

Голосовать
Отзывы
 
Персональные данные

gliba
Приоритетные национальные проекты

в Подробно
Категория: промышленность и оборудование

2354 / 0 / 0.0

Голосовать
Отзывы

Всего:12; Показано: 1-12

Регистрация      Начало страницы