*/ REBCHR *OS_Form_Error(int errnum, REBCHR *str, int len) /* ** Translate OS error into a string. The str is the string ** buffer and the len is the length of the buffer. ** ***********************************************************************/ { LPVOID lpMsgBuf; int ok; if (!errnum) errnum = GetLastError(); ok = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errnum, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL); len--; // termination if (!ok) COPY_STR(str, TEXT("unknown error"), len); else { COPY_STR(str, lpMsgBuf, len); len = (int)LEN_STR(str); if (str[len-2] == '\r' && str[len-1] == '\n') str[len-2] = 0; // trim CRLF LocalFree(lpMsgBuf); } return str; }
//must after css_load_ini_file int css_get_env(char* secName, char* keyName, char* defaultValue, char** value) { int i = 0, j = 0; char* v = NULL; if (strlen(secName) > 0 && strlen(keyName) > 0) { for (; i < css_config_count; i++) { if (0 == strcmp(secName, m_css_config[i].setctionName)) { for (j = 0; j < m_css_config[i].keyCount; j++) { if (0 == strcmp(keyName, m_css_config[i].config[j].keyName)) { COPY_STR(v, m_css_config[i].config[j].value); (*value) = v; return 0; } } } } // printf("not find,section:%s key:%s \n", secName, keyName); COPY_STR(v, defaultValue); (*value) = v; return 1; } else { printf("secName or keyName error!! \n"); return -1; } }
//+------------------------------------------------------------------+ //| Connecting to server | //+------------------------------------------------------------------+ int CSourceInterface::Connect(LPCSTR server,LPCSTR login,LPCSTR password) { unsigned int addr; struct sockaddr_in srv; struct hostent *hp; char *cp,ip[128]; int port=2222; //---- checks m_loginflag=FALSE; if(server==NULL || login==NULL || password==NULL) return(FALSE); //---- save data for future use COPY_STR(m_server,server); COPY_STR(ip,m_server); COPY_STR(m_login,login); COPY_STR(m_password,password); if((cp=strstr(ip,":"))!=NULL) { port=atoi(cp+1); *cp=0; } //---- close connection Close(); //---- create a socket of a server for work with the dataflow if((m_socket=socket(AF_INET, SOCK_STREAM,0))==INVALID_SOCKET) { ExtLogger.Out("Connect: socket error"); return(FALSE); } //---- ZeroMemory(&srv,sizeof(srv)); if((addr=inet_addr(ip))==INADDR_NONE) { if((hp=gethostbyname(ip))==NULL) { Close(); ExtLogger.Out("Connect: gethostbyname failed %s",ip); return(FALSE); } srv.sin_addr.s_addr=*((unsigned long*)hp->h_addr); } else srv.sin_addr.s_addr=addr; srv.sin_family=AF_INET; srv.sin_port=htons(port); //---- connect to server if(connect(m_socket,(struct sockaddr*)&srv,sizeof(srv))!=0) { Close(); ExtLogger.Out("Connect: failed %s",m_server); return(FALSE); } ExtLogger.Out("Connect: successful to %s",m_server); //---- загрузим базу синтетических инструментов m_syntetics.Load(); //---- return(TRUE); }
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CProcessor::OnFXIResponse(Response *resp) { SLTPOrderRequest req = { 0 }; if (resp->status == OrderSLExecuted || resp->status == OrderTPExecuted) if (ExtProcessor.m_orderRequests.Dequeue(resp->requestId, &req)) { CharString str; str.Printf(FALSE, "FXI response on SL-TP order %d, price=%g", req.orderId, resp->price); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray()); // модифицировать ордер - активировать его TradeRecord order = { 0 }; if (ExtServer->OrdersGet(req.orderId, &order)) { UserInfo user = {0}; user.login = ExtProcessor.m_manager; COPY_STR(user.name, "Virtual Dealer"); COPY_STR(user.ip, "VirtualDealer"); order.close_price = resp->price; str.Printf(FALSE, "FXI response order detail: login=%d, volume=%d", order.login, order.volume); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray()); UserInfo us; if (GetUserInfo(order.login, &us)) { #pragma pack(push,1) TradeTransInfo tti; memset(&tti, 0, sizeof(tti)); tti.cmd = order.cmd; strcpy(tti.symbol, order.symbol); tti.volume = order.volume; tti.price = resp->price; tti.type = TT_ORDER_MK_CLOSE; tti.order = order.order; if (ExtServer->OrdersClose(&tti, &us) == FALSE) ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "OrdersClose failed"); else ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "OrdersClose OK"); #pragma pack(pop) } else ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "GetUserInfo failed"); } return TRUE; } return FALSE; }
//+------------------------------------------------------------------+ //| Read ticks data | //+------------------------------------------------------------------+ bool CSourceInterface::ReadTicks(LPSTR ticks,FeedData *inf) { char *cp; //---- checks if(ticks==NULL || inf==NULL || inf->ticks_count>=COUNTOF(inf->ticks)) return(FALSE); //---- read prices, string like: USDJPY 0 1.0106 1.0099 //---- define symbol if((cp=astrstr(ticks," "))==NULL) return(TRUE); *cp=0; COPY_STR(inf->ticks[inf->ticks_count].symbol,m_buffer); //---- check for time char *np=cp+1; int params=1; while(*np!=0) { if(*np==' ') params++; np++; } if(params>2) cp=strstr(cp+1," "); // skip [time] parameter //---- define prices inf->ticks[inf->ticks_count].bid=atof(cp+1); if((cp=strstr(cp+1," "))==NULL) return(TRUE); inf->ticks[inf->ticks_count].ask=atof(cp+1); //---- check prices if(inf->ticks[inf->ticks_count].bid<=0 || inf->ticks[inf->ticks_count].ask<=0 || inf->ticks[inf->ticks_count].bid>inf->ticks[inf->ticks_count].ask) { _snprintf(inf->result_string,sizeof(inf->result_string)-1,"Read: invalid bid/ask '%s'",inf->ticks[inf->ticks_count].symbol); ExtLogger.Out("%s",inf->result_string); return(FALSE); } inf->ticks_count++; //---- return succesful result return(TRUE); }
void response_user_login(player_ptr pp, remote_t pconn, msg_user_login_ret& msg) { msg.gold_ = pp->gold_; msg.game_gold_ = pp->gold_game_; msg.game_gold_free_ = pp->gold_free_; msg.iid_ = pp->iid_; msg.vip_level_ = pp->vip_level_; msg.sequence_ = pp->seq_; COPY_STR(msg.idcard_, pp->idnumber_.c_str()); COPY_STR(msg.phone, pp->mobile_.c_str()); msg.phone_verified_ = pp->mobile_v_; COPY_STR(msg.email_, pp->email_.c_str()); msg.email_verified_ = pp->email_v_; msg.age_ = pp->age_; msg.gender_ = pp->gender_; msg.level_ = pp->level_; msg.byear_ = pp->byear_; msg.bmonth_ = pp->bmonth_; msg.region1_ = pp->region1_; msg.region2_ = pp->region2_; msg.region3_ = pp->region3_; msg.bday_ = pp->bday_; COPY_STR(msg.address_, pp->address_.c_str()); COPY_STR(msg.nickname_, pp->nickname_.c_str()); COPY_STR(msg.uid_, pp->uid_.c_str()); COPY_STR(msg.token_, pp->token_.c_str()); send_msg(pconn, msg); }
//+------------------------------------------------------------------+ //| Get float by name | //+------------------------------------------------------------------+ int CConfiguration::GetFloat(const int pos,const char *name,double *value,const char *defvalue) { PluginCfg cfg={0}; //---- checks if(name==NULL || value==NULL) return(FALSE); //---- try get parameter if(Get(name,&cfg,pos)==FALSE) { //---- prepare new parameter COPY_STR(cfg.name,name); if(defvalue!=NULL) COPY_STR(cfg.value,defvalue); //---- add if(Add(pos,&cfg)==FALSE) return(FALSE); } //---- receive value *value=atof(cfg.value); //---- return ok return(TRUE); }
//+------------------------------------------------------------------+ //| Get string by name | //+------------------------------------------------------------------+ int CConfiguration::GetString(const int pos,const char *name,char *value,const int size,const char *defvalue) { PluginCfg cfg={0}; //---- checks if(name==NULL || value==NULL || size<0) return(FALSE); //---- try get parameter if(Get(name,&cfg,pos)==FALSE) { //---- prepare new parameter COPY_STR(cfg.name,name); if(defvalue!=NULL) COPY_STR(cfg.value,defvalue); //---- add if(Add(pos,&cfg)==FALSE) return(FALSE); } //---- receive string strncpy(value,cfg.value,size); //---- return ok return(TRUE); }
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CProcessor::Process(void) { int i; UserInfo user = {0}; ConGroup group = {0}; double prices[2]; Request *req; user.login = m_manager; COPY_STR(user.name, PROGRAM_TITLE); COPY_STR(user.ip, PROGRAM_TITLE); while(m_stop_flag == FALSE) { // ждем пока что-нибудь появится if (m_requests_total == 0) { Sleep(100); continue; } // обязательно в локе m_sync.Lock(); // идем по реквестам for (i = 0, req = m_requests; i < m_requests_total; i++, req++) { if (!ProcessSingleRequest(req)) { // удаляем нафиг if (i < m_requests_total - 1) memmove(req, req + 1, sizeof(Request) * (m_requests_total - i - 1)); // коррекция индексов m_requests_total--; i--; req--; } } // разлочим m_sync.Unlock(); // поспим Sleep(100); } }
int CProcessor::ConfirmPendingRequest(RequestInfo *request) { UserInfo user = {0}; ConGroup group = {0}; double prices[2]; user.login = m_manager; COPY_STR(user.name, "Virtual Dealer"); COPY_STR(user.ip, "VirtualDealer"); ExtServer->GroupsGet(request->group, &group); // получим текущие цены для группы и установки символа if (ExtServer->HistoryPricesGroup(request->trade.symbol, &group, prices) != RET_OK) { ExtServer->RequestsReset(request->id, &user, DC_RESETED); return FALSE; } ExtServer->RequestsConfirm(request->id, &user, prices); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "отложенный ордер подтвержден"); }
void test_css_util_stringx() { char *str; assert(1 == str_contains("hello word","wor")); assert(0 == str_contains("hello word","worw")); assert(2 == str_index_of("hello word","ll")); assert(-1 == str_index_of("hello word","lldd")); COPY_STR(str,"2abc123"); str_to_upper(str); assert(strcmp(str,"2ABC123") == 0); str_to_lower(str); assert(strcmp(str,"2abc123") == 0); }
*/ DEVICE_CMD Read_Clipboard(REBREQ *req) /* ***********************************************************************/ { HANDLE data; REBUNI *cp; REBUNI *bin; REBINT len; req->actual = 0; // If there is no clipboard data: if (!IsClipboardFormatAvailable(CF_UNICODETEXT)) { req->error = 10; return DR_ERROR; } if (!OpenClipboard(NULL)) { req->error = 20; return DR_ERROR; } // Read the UTF-8 data: if ((data = GetClipboardData(CF_UNICODETEXT)) == NULL) { CloseClipboard(); req->error = 30; return DR_ERROR; } cp = GlobalLock(data); if (!cp) { GlobalUnlock(data); CloseClipboard(); req->error = 40; return DR_ERROR; } len = LEN_STR(cp); // wide chars bin = OS_Make((len+1) * sizeof(REBCHR)); COPY_STR(bin, cp, len); GlobalUnlock(data); CloseClipboard(); SET_FLAG(req->flags, RRF_WIDE); req->data = (REBYTE *)bin; req->actual = len * sizeof(REBCHR); return DR_DONE; }
int readLine(FILE* file, char** outStr) { char buf[BUFSIZ]; int i = 0; buf[i] = fgetc(file); if (is_eof(buf[i])) { return -1; } while (!is_eof(buf[i]) && !is_newline(buf[i])) { i++; buf[i] = fgetc(file); } buf[i] = '\0'; COPY_STR((*outStr), buf); return i; }
int handle_pending_logins() { while (pending_login_users_.size() > 0) { player_ptr pp; if(!pending_login_users_.pop_front(pp)) break; auto itp = online_players.find(pp->uid_); if (itp == online_players.end() ){ online_players.insert(std::make_pair(pp->uid_, pp)); } //如果用户已在线 else{ msg_same_account_login msg; auto conn = itp->second->from_socket_.lock(); if (conn == pp->from_socket_.lock()){ return error_success; } if(conn.get()) send_msg(conn, msg, true); replace_map_v(online_players, std::make_pair(pp->uid_, pp)); } auto pconn = pp->from_socket_.lock(); if (pconn.get()){ pconn->is_login_ = false; send_all_game_to_player(pconn); msg_user_login_ret msg; response_user_login(pp, pconn, msg); msg_user_image msg_headpic; COPY_STR(msg_headpic.uid_, pp->uid_.c_str()); send_image(msg_headpic, pp->head_ico_, pconn); } } return 0; }
*/ static void Insert_Command_Arg(REBCHR *cmd, REBCHR *arg, REBINT limit) /* ** Insert an argument into a command line at the %1 position, ** or at the end if there is no %1. (An INSERT action.) ** Do not exceed the specified limit length. ** ** Too bad std Clib does not provide INSERT or REPLACE functions. ** ***********************************************************************/ { #define HOLD_SIZE 2000 REBCHR *spot; REBCHR hold[HOLD_SIZE+4]; if ((REBINT)LEN_STR(cmd) >= limit) return; // invalid case, ignore it. // Find %1: spot = FIND_STR(cmd, TEXT("%1")); if (spot) { // Save rest of cmd line (such as end quote, -flags, etc.) COPY_STR(hold, spot+2, HOLD_SIZE); // Terminate at the arg location: spot[0] = 0; // Insert the arg: JOIN_STR(spot, arg, limit - LEN_STR(cmd) - 1); // Add back the rest of cmd: JOIN_STR(spot, hold, limit - LEN_STR(cmd) - 1); } else { JOIN_STR(cmd, TEXT(" "), 1); JOIN_STR(cmd, arg, limit - LEN_STR(cmd) - 1); } }
//+------------------------------------------------------------------+ //| Read news data | //+------------------------------------------------------------------+ bool CSourceInterface::ReadNews(FeedData *inf) { NewsTopic news; //---- checks if(inf==NULL) return(FALSE); if(inf->body==NULL) return(FALSE); //---- read if(DataParseData((char*)&news,sizeof(NewsTopic))!=TRUE) { COPY_STR(inf->result_string,"connection lost"); ExtLogger.Out("Read: %s",inf->result_string); return(FALSE); } //---- put restrictions news.topic[sizeof(news.topic)-1]=0; news.keywords[sizeof(news.keywords)-1]=0; news.time[sizeof(news.time)-1]=0; //---- copy news to the buffer COPY_STR(inf->subject ,news.topic); COPY_STR(inf->category ,news.keywords); COPY_STR(inf->news_time,news.time); //---- news have not body? if(news.len==0) { inf->body[0]=0; inf->body_len=0; return(TRUE); } //---- check for maximum body length if(news.len<0 || news.len>inf->body_maxlen) { COPY_STR(inf->result_string,"too long news body"); ExtLogger.Out("Read: %s",inf->result_string); return(FALSE); } //---- read news body if(DataParseData(inf->body,news.len)!=TRUE) { COPY_STR(inf->result_string,"connection lost"); ExtLogger.Out("Read: %s",inf->result_string); return(FALSE); } inf->body_len=news.len; inf->body[news.len]=0; //---- succesful return(TRUE); }
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CProcessor::StopoutsApply(const UserInfo *user, const ConGroup *group, const char *comment) { Out(CmdOK, "CProcessor::StopoutsApply - Applying stopout for user [%d]", user->login); TradeRecord *trades,*trade; int total, i; ConSymbol symbol = {0}; TradeTransInfo trans = {0}; time_t currtime; char stopout[64] = "[stopout]"; const char *cp; // check if (user == NULL || group == NULL || comment == NULL) { Out(CmdOK, "CProcessor::StopoutsApply - check failed"); return RET_OK; } // lock m_sync.Lock(); // check user group if (CheckGroup(m_groups, group->group) == FALSE) { Out(CmdOK, "CProcessor::StopoutsApply - group check failed"); m_sync.Unlock(); return(RET_OK); } // receive all opened trades for user if ((trades = ExtServer->OrdersGetOpen(user, &total)) == NULL) { Out(CmdOK, "CProcessor::StopoutsApply - no open trade"); return RET_OK; } // get current server time currtime = ExtServer->TradeTime(); // prepare comment about stopout if ((cp = strrchr(comment, '[')) != NULL) COPY_STR(stopout, cp); // output to server log Out(CmdOK, "'%d': close all orders due stop out %s", user->login, stopout); // go trough trades for (i = 0, trade = trades; i < total; i++, trade++) { // it is opened trade if (trade->cmd > OP_SELL) continue; // check symbol - зачем? // if (CheckGroup(m_symbols, trade->symbol) == FALSE) continue; // check volume - зачем? // if (m_max_volume != 0 && trade->volume > m_max_volume) continue; // receive symbol information if (ExtServer->SymbolsGet(trade->symbol, &symbol) == FALSE) { Out(CmdAtt, "stopout: receiving information for %s symbol failed", trade->symbol); continue; } // check trade session for symbol if (ExtServer->TradesCheckSessions(&symbol, currtime) == FALSE) continue; // prepare transaction trans.order = trade->order; trans.price = trade->close_price; trans.volume = trade->volume; trans.type = TT_ORDER_MK_CLOSE; // ! // prepare comment if (trade->comment[0] != 0) { COPY_STR(trans.comment, trade->comment); if (strstr(trans.comment, stopout) == NULL) _snprintf(trans.comment, sizeof(trans.comment) - 1, "%s %s", trans.comment, "[stopout FXI]"); } else COPY_STR(trans.comment, stopout); // отправить запрос на закрытие позиции на сервер // создать запрос RequestInfo inf = { 0 }; memcpy(&(inf.trade), &trans, sizeof(TradeTransInfo)); inf.login = user->login; inf.id = trade->order; // startStopoutRequestId++; // !! memcpy(&inf.group, &group->group, sizeof(inf.group)); memcpy(&inf.trade.symbol, &trade->symbol, sizeof(trade->symbol)); // добавить в очередь Add(&inf, TRUE); } m_sync.Unlock(); // free memory HEAP_FREE(trades); // сервер больше не процессит стопаут return RET_OK_NONE; }
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CConfiguration::Load(const char *filename) { CStringFile file; char buffer[256],*start,*cp; PluginCfg cfg={0},*temp; //---- checks if(filename==NULL) return(FALSE); //---- lock m_sync.Lock(); //---- set all to zero m_filename[0]=0; m_cfgs_total=0; //---- delete index if(m_cfgs_index!=NULL) { delete[] m_cfgs_index; m_cfgs_index=NULL; } //---- store filename COPY_STR(m_filename,filename); //---- open file if(!file.Open(m_filename,GENERIC_READ,OPEN_ALWAYS)) { m_sync.Unlock(); return(FALSE); } //---- reading configuration while(file.GetNextLine(buffer,sizeof(buffer)-1)>0) { //---- skip empty lines if(buffer[0]==';' || buffer[0]==0) continue; //---- terminate string TERMINATE_STR(buffer); //---- skip whitespaces start=buffer; while(*start==' ') start++; //---- find = and terminate by it if((cp=strstr(start,"="))==NULL) continue; *cp=0; //---- get parameter name COPY_STR(cfg.name,start); //---- skip whitspaces start=cp+1; while(*start==' ') start++; //---- receive parameter value COPY_STR(cfg.value,start); //---- set order cfg.reserved[0]=m_cfgs_total+1; //---- check space if(m_cfgs==NULL || m_cfgs_total>=m_cfgs_max) { //---- allocate new buffer if((temp=new PluginCfg[m_cfgs_total+1024])==NULL) { m_sync.Unlock(); return(FALSE); } //---- copy all from old buffer to new buffer and delete old if(m_cfgs!=NULL) { memcpy(temp,m_cfgs,sizeof(PluginCfg)*m_cfgs_total); delete[] m_cfgs; } //---- set new buffer m_cfgs =temp; m_cfgs_max=m_cfgs_total+1024; } //---- add parameter memcpy(&m_cfgs[m_cfgs_total++],&cfg,sizeof(PluginCfg)); } //---- sort parameters by name qsort(m_cfgs,m_cfgs_total,sizeof(PluginCfg),SortByName); //---- close file file.Close(); //---- unlock and return ok m_sync.Unlock(); return(TRUE); }
int task_on_5sec::routine() { glb_log.write_log("game is running ok, this time msg recved:%d, handled:%d, remain sending data: %d", msg_recved, msg_handled, unsended_data); msg_handled = 0; msg_recved = 0; unsended_data = 0; load_all_games(); //账号服务器,加载所有在线服务器列表,做动态平衡, //10秒内更新过的服务器才算 std::string sql = "select public_ip, port, name, online_user, gameid from system_server_auto_balance where unix_timestamp(update_time) > (unix_timestamp() - 10)"; Query q(*db_); if(q.get_result(sql)){ channel_servers.clear(); while (q.fetch_row()) { channel_server srv; srv.ip_ = q.getstr(); srv.port_ = q.getval(); srv.online_ = q.getval(); std::string ids = q.getstr(); split_str(ids.c_str(), ids.length(), ",", srv.game_ids_, true); if (srv.game_ids_.empty()){ srv.game_ids_.push_back(-1); } channel_servers.push_back(srv); } } { std::string sql = "select rowid, uid, itemid from user_item_changes order by rowid asc"; Query q(*db_); if(q.get_result(sql) && q.fetch_row()){ std::vector<__int64> v; do{ __int64 rowid = q.getbigint(); std::string uid = q.getstr(); //如果用户存在,则更新 if (get_player(uid).get()){ int itemid = q.getval(); sync_user_item(uid, itemid); v.push_back(rowid); } if (v.size() > 100) { Query q2(*db_); std::string rowids = combin_str(v, ",", false); sql = "delete from user_item_changes where rowid in(" + rowids + ")"; q2.execute(sql); v.clear(); } } while (q.fetch_row()); if (v.size() > 0) { Query q2(*db_); std::string rowids = combin_str(v, ",", false); sql = "delete from user_item_changes where rowid in(" + rowids + ")"; q2.execute(sql); } } } { std::string sql = "select rowid, uid, matchid, matchins, register_count, ip, port from setting_match_notify order by rowid asc"; Query q(*db_); if(q.get_result(sql) && q.fetch_row()){ std::vector<__int64> v; do{ __int64 rowid = q.getbigint(); std::string uid = q.getstr(); //如果用户存在,则通知比赛开始. player_ptr pp = get_player(uid); if (pp.get()){ msg_confirm_join_game_deliver msg; msg.match_id_ = q.getval(); COPY_STR(msg.ins_id_, q.getstr()); msg.register_count_ = q.getval(); COPY_STR(msg.ip_, q.getstr()); msg.port_ = q.getval(); auto pcnn = pp->from_socket_.lock(); if (pcnn.get()){ send_msg(pp->from_socket_.lock(), msg); } v.push_back(rowid); } if (v.size() > 100) { Query q2(*db_); std::string rowids = combin_str(v, ",", false); sql = "delete from setting_match_notify where rowid in(" + rowids + ")"; q2.execute(sql); v.clear(); } } while (q.fetch_row()); if (v.size() > 0) { Query q2(*db_); std::string rowids = combin_str(v, ",", false); sql = "delete from setting_match_notify where rowid in(" + rowids + ")"; q2.execute(sql); } } } return task_info::routine_ret_continue; }
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CProcessor::Add(RequestInfo *request, int isStopout) { Request *temp; UINT id; Request req = {0}; static int uid = 1; if (request == NULL) return(FALSE); // проверки - кто управляет счетом if (m_delay == 0 || CheckGroup(m_groups, request->group) == FALSE) return (TRUE); // лог char reqTypeStr[64]; char reqCmdStr[64]; FormatCommand(request->trade.cmd, reqCmdStr); FormatRequestType(request->trade.type, reqTypeStr); CharString str; str.Printf(FALSE, "CProcessor::Add(тип [%s], cmd [%s])", reqTypeStr, reqCmdStr); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray()); m_sync.Lock(); //---- если место для запросов нет выделим if(m_requests == NULL) { if((m_requests = new Request[256]) == NULL) { m_sync.Unlock(); return (FALSE); } m_requests_max = 256; m_requests_total = 0; } //---- посмотрим может надо перевыделить if (m_requests_total >= m_requests_max) { if((temp = new Request[m_requests_max + 256]) == NULL) { m_sync.Unlock(); return(FALSE); } //---- скопируем старое memcpy(temp, m_requests, sizeof(Request) * m_requests_total); //---- удалим уже не нужное delete m_requests; m_requests = temp; m_requests_max += 256; } //---- вставляем запрос m_requests[m_requests_total].isStopout = isStopout; m_requests[m_requests_total].isPending = FALSE; m_requests[m_requests_total].id = request->id; m_requests[m_requests_total].time = GetTickCount(); m_requests[m_requests_total].sent = FALSE; m_requests[m_requests_total].login = request->login; memcpy(&m_requests[m_requests_total].trans, &request->trade, sizeof(TradeTransInfo)); COPY_STR(m_requests[m_requests_total].group, request->group); m_requests_total++; //---- запускаем поток if (m_thread == NULL) if ((m_thread = (HANDLE)_beginthreadex(NULL, 256000, ThreadFunction, this, 0, &id))==NULL) { m_sync.Unlock(); return(FALSE); } m_sync.Unlock(); return(TRUE); }
int load_all_games() { all_games.clear(); std::string sql = "SELECT `id`,`tech_type`,\ `dir`, `exe`, `update_url`, `help_url`,\ `game_name`, `thumbnail`, `solution`, `no_embed`, `catalog` \ FROM `setting_game_list`"; Query q(*db_); if (!q.get_result(sql)) return error_sql_execute_error; while (q.fetch_row()) { gamei_ptr pgame(new game_info); pgame->id_ = q.getval(); pgame->type_ = q.getval(); COPY_STR(pgame->dir_, q.getstr()); COPY_STR(pgame->exe_, q.getstr()); COPY_STR(pgame->update_url_, q.getstr()); COPY_STR(pgame->help_url_, q.getstr()); COPY_STR(pgame->game_name_, q.getstr()); COPY_STR(pgame->thumbnail_, q.getstr()); COPY_STR(pgame->solution_, q.getstr()); pgame->no_embed_ = q.getval(); COPY_STR(pgame->catalog_, q.getstr()); all_games.insert(std::make_pair(pgame->id_, pgame)); } q.free_result(); sql = "SELECT `gameid`, `roomid`, `room_name`,\ `room_desc`, `thumbnail`, `srvip`, `srvport`, `require` \ FROM `setting_game_room_info`"; if (!q.get_result(sql)) return error_sql_execute_error; while (q.fetch_row()) { game_room_inf inf; inf.game_id_ = q.getval(); inf.room_id_ = q.getval(); COPY_STR(inf.room_name_, q.getstr()); COPY_STR(inf.room_desc_, q.getstr()); COPY_STR(inf.thumbnail_, q.getstr()); COPY_STR(inf.ip_, q.getstr()); inf.port_ = q.getval(); COPY_STR(inf.require_, q.getstr()); if (all_games.find(inf.game_id_) != all_games.end()){ all_games[inf.game_id_]->rooms_.push_back(inf); } } q.free_result(); return error_success; }
int CProcessor::Add(const UserInfo *user, const ConGroup *group, const ConSymbol *symbol, const TradeRecord *pending, TradeRecord *trade) { Request *temp; UINT id; static int uid = 1; CharString str; if (pending == NULL || trade == NULL) return(FALSE); // проверки - кто управляет счетом if (m_delay == 0 || CheckGroup(m_groups, group->group) == FALSE) return (TRUE); double prices[2]; // получим текущие цены для группы и установки символа if (ExtServer->HistoryPricesGroup(symbol->symbol, group, prices) != RET_OK) { str.Printf(FALSE, "CProcessor::Add Pending (symbol [%s], group [%s]) failed", symbol->symbol, group->group); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray()); return FALSE; } m_sync.Lock(); // проверить - нет ли такого запроса в списке Request *reqTmp; if (m_requests != NULL) { int i = 0; for (reqTmp = m_requests; i < m_requests_total; i++, reqTmp++) { if (reqTmp->isPending) if (reqTmp->pendingId == pending->order) { ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "Отложенный ордер уже в списке"); m_sync.Unlock(); return (TRUE); } } } // лог /*char reqCmdStr[64]; FormatCommand(pending->cmd, reqCmdStr); str.Printf(FALSE, "CProcessor::Add Pending(order [%d], cmd [%s], req Id [%d])", pending->order, reqCmdStr, startPendingRequestId); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray());*/ //---- если место для запросов нет выделим if(m_requests == NULL) { if((m_requests = new Request[256]) == NULL) { m_sync.Unlock(); return (FALSE); } m_requests_max = 256; m_requests_total = 0; } //---- посмотрим может надо перевыделить if (m_requests_total >= m_requests_max) { if((temp = new Request[m_requests_max + 256]) == NULL) { m_sync.Unlock(); return(FALSE); } //---- скопируем старое memcpy(temp, m_requests, sizeof(Request) * m_requests_total); //---- удалим уже не нужное delete m_requests; m_requests = temp; m_requests_max += 256; } //---- вставляем запрос m_requests[m_requests_total].pendingId = pending->order; m_requests[m_requests_total].isPending = TRUE; m_requests[m_requests_total].id = startPendingRequestId++; m_requests[m_requests_total].time = GetTickCount(); m_requests[m_requests_total].sent = FALSE; m_requests[m_requests_total].login = user->login; memcpy(&m_requests[m_requests_total].trans, pending, sizeof(TradeTransInfo)); m_requests[m_requests_total].trans.volume = trade->volume; Out(CmdOK, "Pending order %d added of volume %d", m_requests[m_requests_total].id, trade->volume); COPY_STR(m_requests[m_requests_total].group, group->group); // поправить команду char origTradeCmd[32], newTradeCmd[32]; FormatCommand(m_requests[m_requests_total].trans.cmd, origTradeCmd); int pendCmd = trade->cmd; //m_requests[m_requests_total].trans.cmd; pendCmd = (pendCmd == OP_BUY_LIMIT || pendCmd == OP_BUY_STOP) ? OP_BUY : (pendCmd == OP_SELL_LIMIT || pendCmd == OP_SELL_STOP) ? OP_SELL : pendCmd; m_requests[m_requests_total].trans.cmd = pendCmd; FormatCommand(m_requests[m_requests_total].trans.cmd, newTradeCmd); m_requests[m_requests_total].trans.type = TT_ORDER_MK_OPEN; m_requests[m_requests_total].trans.price = pendCmd == OP_BUY ? prices[1] : prices[0]; strcpy(m_requests[m_requests_total].trans.symbol, symbol->symbol); m_requests[m_requests_total].trans.order = pending->order; str.Printf(FALSE, "Отложенный ордер %d добавлен, всего %d (%s, теперь %s)", pending->order, m_requests_total, origTradeCmd, newTradeCmd); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray()); m_requests_total++; //---- запускаем поток if (m_thread == NULL) if ((m_thread = (HANDLE)_beginthreadex(NULL, 256000, ThreadFunction, this, 0, &id))==NULL) { m_sync.Unlock(); return(FALSE); } m_sync.Unlock(); return(TRUE); }
int handle_get_verify_code(msg_get_verify_code* pverify) { std::string sql = "call random_select_verify_code(8);"; Database& db = *db_; Query q(db); if (!q.get_result(sql)){ return error_success; } vector<vector<char>> anwsers; vector<char> image, image2, tmp_iamge; msg_verify_code msg; int rows = q.num_rows(); int ans = rand_r(rows - 1); int i = 0; //混淆答案 while (q.fetch_row()) { if (i == ans){ COPY_STR(msg.question_, q.getstr()); q.getblob("image", image); q.getblob("image2", image2); } else{ q.getstr(); tmp_iamge.clear(); q.getblob("image", tmp_iamge); if (!tmp_iamge.empty()){ anwsers.push_back(tmp_iamge); } tmp_iamge.clear(); q.getblob("image2", tmp_iamge); if (!tmp_iamge.empty()){ anwsers.push_back(tmp_iamge); } } i++; } send_msg(pverify->from_sock_, msg); std::random_shuffle(anwsers.begin(), anwsers.end()); int index = -1; if (!image.empty()){ index = rand_r(std::min<int>(7, anwsers.size() - 1)); anwsers.insert(anwsers.begin() + index, image); } int index2 = -1; if (!image2.empty()){ index2 = rand_r(std::min<int>(7, anwsers.size() - 1)); anwsers.insert(anwsers.begin() + index2, image2); //如果插在前一副图的前面,则前面一副图的index+1 if (index2 <= index){ index++; } } for (int i = 0; i < (int)anwsers.size() && i < 8; i++) { vector<char>& img = anwsers[i]; msg_image_data msg_img; msg_img.this_image_for_ = -2; send_image(msg_img, img, pverify->from_sock_); } std::string vc; if (index >= 0) vc += boost::lexical_cast<std::string>(index) + ","; if (index2 >= 0) vc += boost::lexical_cast<std::string>(index2) + ","; pverify->from_sock_->verify_code_.store(vc); return error_success; }
/* function to build XMLRPC buffer */ int xmlrpc_build_buffer(str *event_name, evi_reply_sock *sock, evi_params_t *params, xmlrpc_send_t ** msg) { int len, b_len; char *b, *p; evi_param_p param; if (params && (params->flags & XMLRPC_FLAG)) { LM_DBG("buffer already built\n"); return 0; } b_len = XMLRPC_DEFAULT_BUFFER_SIZE; b = xmlrpc_body_buf; #define COPY_STR(_s, _l) \ do { \ if ( (_l) > b_len ) { \ LM_ERR("buffer too small...\n");\ return -1; \ } \ memcpy( b, (_s), (_l) ); \ b_len -= (_l); \ b += (_l); \ } while (0) if (params) { for (param = params->first; param; param = param->next) { /* '<param>' */ COPY_STR(START_TAG(XMLRPC_PARAM), LENOF(START_TAG(XMLRPC_PARAM))); if (param->name.len && param->name.s) { if (xmlrpc_struct_on) { COPY_STR(START_TAG(XMLRPC_VALUE), LENOF(START_TAG(XMLRPC_VALUE)) - 1); COPY_STR(START_TAG(XMLRPC_STRUCT), LENOF(START_TAG(XMLRPC_STRUCT)) - 1); COPY_STR(START_TAG(XMLRPC_MEMBER), LENOF(START_TAG(XMLRPC_MEMBER))); } LM_DBG("adding parameter %.*s\n", param->name.len, param->name.s); /* <name> */ COPY_STR(START_TAG(XMLRPC_ATTR), LENOF(START_TAG(XMLRPC_ATTR)) - 1); /* parameter name */ COPY_STR(param->name.s, param->name.len); /* </name> */ COPY_STR(END_TAG(XMLRPC_ATTR), LENOF(END_TAG(XMLRPC_ATTR))); } /* <value> */ COPY_STR(START_TAG(XMLRPC_VALUE), LENOF(START_TAG(XMLRPC_VALUE)) - 1); if (param->flags & EVI_INT_VAL) { /* <int> */ COPY_STR(START_TAG(XMLRPC_INT), LENOF(START_TAG(XMLRPC_INT)) - 1); /* convert int */ p = int2str(param->val.n, &len); if (!p) { LM_ERR("cannot convert int parameter\n"); return -1; } /* integer parameter */ COPY_STR(p, len); /* </int> */ COPY_STR(END_TAG(XMLRPC_INT), LENOF(END_TAG(XMLRPC_INT)) - 1); } else { /* <string> */ COPY_STR(START_TAG(XMLRPC_STRING), LENOF(START_TAG(XMLRPC_STRING)) - 1); /* string parameter */ COPY_STR(param->val.s.s, param->val.s.len); /* </string> */ COPY_STR(END_TAG(XMLRPC_STRING), LENOF(END_TAG(XMLRPC_STRING)) - 1); } COPY_STR(END_TAG(XMLRPC_VALUE), LENOF(END_TAG(XMLRPC_VALUE))); if (param->name.len && param->name.s && xmlrpc_struct_on) { COPY_STR(END_TAG(XMLRPC_MEMBER), LENOF(END_TAG(XMLRPC_MEMBER)) - 1); COPY_STR(END_TAG(XMLRPC_STRUCT), LENOF(END_TAG(XMLRPC_STRUCT)) - 1); COPY_STR(END_TAG(XMLRPC_VALUE), LENOF(END_TAG(XMLRPC_VALUE))); } COPY_STR(END_TAG(XMLRPC_PARAM), LENOF(END_TAG(XMLRPC_PARAM))); } } #undef COPY_STR len = XMLRPC_DEFAULT_BUFFER_SIZE - b_len; *msg = xmlrpc_build_send_t(sock, xmlrpc_body_buf, len, event_name); if (!*msg) { LM_ERR("cannot build send msg\n"); return -1; } if (params) params->flags |= XMLRPC_FLAG; return 0; }
int msg_get_banker_ranking::handle_this() { if(the_service.riches.get()) { player_ptr p = from_sock_->the_client_.lock(); if(p.get()) { logic_ptr pgame = p->get_game(); //长度大于1进行排序 if(the_service.riches->list.size() > 0) { vector<riche_info> riche_vector; std::map<std::string, riche_info>::iterator it; for(it = the_service.riches->list.begin(); it != the_service.riches->list.end();++it) { if(it->second.val_ > 0){ riche_vector.push_back(it->second); } } sort(riche_vector.begin(), riche_vector.end(), greater<riche_info>()); int length = riche_vector.size() > 10 ? 10 : riche_vector.size(); int type = 0; for (int i = 0; i != length; ++i) { /*player_ptr pp = the_service.get_player(score_vec[i].first); if(!pp.get()){ for(int j = 0; j < pgame->bots_.size(); j++) { player_ptr b = pgame->bots_[j]; if(b->uid_ == score_vec[i].first) { pp = b; break; } } }*/ riche_info _r = riche_vector[i]; //if(_r != nullptr) //{ msg_banker_ranking_ret msg; COPY_STR(msg.uname_, _r.uname_.c_str()); msg.rank_val = _r.val_; msg.idx = i+1; if(i == 0){ type = 1; if(i == (length - 1)){ type = 3; } }else{ type = (i == length - 1) ? 0 : 2; } msg.type = type; p->send_msg_to_client(msg); //} } } } } return ERROR_SUCCESS_0; }
void qq_buddy_copy(QQBuddy *from, QQBuddy *to) { if(from == NULL || to == NULL){ return; } #define COPY_STR(x) qq_buddy_set(to, #x, from -> x -> str) COPY_STR(uin); COPY_STR(qqnumber); COPY_STR(status); COPY_STR(nick); COPY_STR(markname); COPY_STR(country); COPY_STR(city); COPY_STR(province); COPY_STR(gender); COPY_STR(face); COPY_STR(flag); COPY_STR(phone); COPY_STR(mobile); COPY_STR(email); COPY_STR(college); COPY_STR(occupation); COPY_STR(personal); COPY_STR(homepage); COPY_STR(lnick); #undef COPY_STR #define COPY_INT(x) to -> x = from -> x COPY_INT(vip_info); COPY_INT(blood); COPY_INT(shengxiao); COPY_INT(constel); COPY_INT(allow); COPY_INT(client_type); COPY_INT(birthday.year); COPY_INT(birthday.month); COPY_INT(birthday.day); COPY_INT(cate_index); #undef COPY_INT }
/* returns: FALSE - request should be deleted, TRUE - keep request */ int CProcessor::ProcessSingleRequest(Request *req) { UserInfo user = {0}; ConGroup group = {0}; double prices[2]; CharString str, strMsg; char strCmd[64], strType[64]; user.login = m_manager; COPY_STR(user.name, "Virtual Dealer"); COPY_STR(user.ip, "VirtualDealer"); ExtServer->GroupsGet(req->group, &group); // получим текущие цены для группы и установки символа if (ExtServer->HistoryPricesGroup(req->trans.symbol, &group, prices) != RET_OK) { ExtServer->RequestsReset(req->id, &user, DC_RESETED); str.Printf(FALSE, "ProcessSingleRequest: HistoryPricesGroup (symbol [%s], group [%s]) failed", req->trans.symbol, req->group); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray()); return FALSE; } // если это запрос на открытие позы... if (req->trans.type == TT_ORDER_IE_OPEN || req->trans.type == TT_ORDER_IE_CLOSE || req->trans.type == TT_ORDER_MK_OPEN || req->trans.type == TT_ORDER_MK_CLOSE) { // запрос был отправлен, ответа нет - таймаут if (req->sent && (GetTickCount() > req->time + m_waitForFXIReply)) { str.Printf(FALSE, "Таймаут для запроса %d (нет ответа от сервера FXI)", req->id); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray()); // !! добавить открытие сделки (отложенное) ExtServer->RequestsRequote(req->id, &user, prices, FALSE); return FALSE; } // запрос к FXI еще не был отправлен - отправить if (!req->sent) { ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "Отправка UDP"); CharString reqStr; reqStr.Printf(FALSE, "requestId=%d;group=%s;time=%d;login=%d;", req->id, req->group, req->time, req->login); reqStr.Printf(TRUE, "type=%s;side=%d;order=%d;orderby=%d;price=%g;symbol=%s;volume=%d;tp=%g;sl=%g;slippage=%d;pending=%d;stopout=%d", req->trans.type == TT_ORDER_IE_OPEN || req->trans.type == TT_ORDER_MK_OPEN ? "OPEN" : "CLOSE", req->trans.cmd == OP_BUY || req->trans.cmd == OP_BUY_LIMIT || req->trans.cmd == OP_BUY_STOP ? FXI_OP_BUY : FXI_OP_SELL, req->trans.order, req->trans.orderby, req->trans.price, req->trans.symbol, req->trans.volume, req->trans.tp, req->trans.sl, req->trans.ie_deviation, req->isPending, req->isStopout); FormatCommand(req->trans.cmd, strCmd); FormatRequestType(req->trans.type, strType); str.Printf(FALSE, "Отправка запроса FXI [%s] типа [%s] по цене [%g], ордер [%d]", strCmd, strType, req->trans.price, req->trans.order); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray()); m_sender->SendTo(&reqStr, m_sendHost, m_sendPort); req->sent = TRUE; ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "Отправка UDP::OK"); return TRUE; } Response resp = { 0 }; int requestId = req->trans.type == TT_ORDER_MK_CLOSE || req->trans.type == TT_ORDER_IE_CLOSE ? req->trans.order : req->id; int respFound = extQueue->FindAndDequeue(requestId, &resp); if (!respFound) return TRUE; // получен ответ от FXI ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "Обработка ответа FXI"); // обработан успешно if (resp.status == RequestCompleted) { strMsg.Printf(FALSE, "Запрос (%d) подтвержден по цене (%g), сейчас цена (%g)", req->id, req->trans.cmd == OP_BUY ? prices[1] : prices[0], resp.price); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, strMsg.ToArray()); double newPrices[2] = { resp.price, resp.price }; req->trans.price = resp.price; // отложенный ордер if (resp.isPendingActivate) { ActivatePendingOrder(&resp); return FALSE; } // обработка ответа на закрытие (стопаут) if (resp.isStopoutReply) { ClosePositionStopout(&resp, req); return FALSE; } // обычный ордер // подтвердить запрос if (ExtServer->RequestsConfirm(req->id, &user, newPrices) == RET_OK) { // если запрос на открытие... if (req->trans.type == TT_ORDER_IE_OPEN || req->trans.type == TT_ORDER_MK_OPEN) // сохранить подтвержденный запрос (потом ассоциировать его с открывшейся // позицией) extPendingRequestQueue.AddRequest(resp.requestId, req->login, req->trans.cmd, req->trans.symbol, req->trans.volume, resp.price); } else { // сделка открыта у брокера, но не открылась в МТ4 } return FALSE; } // обработан с ошибкой if (resp.status == RequestFailed) { ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "Запрос не подтвержден (отрицательная квитанция)"); ExtServer->RequestsReset(req->id, &user, DC_RESETED); return FALSE; } // прочие возвраты strMsg.Printf(FALSE, "Запрос: код ответа [%d]", resp.status); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, strMsg.ToArray()); return FALSE; } // if (req->trans.type == TT_ORDER_IE_OPEN ... // запрос цены, не более if (req->trans.type == TT_PRICES_GET) { ExtServer->RequestsPrices(req->id, &user, prices, FALSE); return FALSE; } if (req->trans.type == TT_ORDER_DELETE) { ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "Удаление отложенного ордера"); ExtServer->RequestsConfirm(req->id, &user, prices); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "Отложенный ордер удален"); return FALSE; } // остальные запросы подтверждаем ExtServer->RequestsConfirm(req->id, &user, prices); return FALSE; }
//+------------------------------------------------------------------+ //| Активировать отложенный ордер (пришла положительная квитанция) | //+------------------------------------------------------------------+ int CProcessor::ActivatePendingOrder(Response *resp) { // получим ордер TradeRecord trade = { 0 }; TradeRecord new_trade = { 0 }; if (ExtServer->OrdersGet(resp->pendingOrderId, &trade) == FALSE) { ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "ActivatePendingOrder - OrdersGet = FALSE"); // проверим может это уже не отложенный ордер if (trade.cmd <= OP_SELL || trade.cmd >= OP_BALANCE) { ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "ActivatePendingOrder - OrdersGet = FALSE (not pending)"); return 0; } return 101; // ошибка - ордер не найден } // получим символ ConSymbol symbol = { 0 }; ExtServer->SymbolsGet(trade.symbol, &symbol); // и пользователя UserInfo userInfo = { 0 }; GetUserInfoByLogin(trade.login, &userInfo); double prices[2] = { symbol.ask_tickvalue, symbol.bid_tickvalue }; // проверим, возможно открывать новых позиций нельзя if (symbol.trade == TRADE_CLOSE) { // готовим описание memcpy(&new_trade, &trade, sizeof(TradeRecord)); new_trade.close_time = ExtServer->TradeTime(); new_trade.close_price = (trade.cmd == OP_BUY_LIMIT || trade.cmd == OP_BUY_STOP) ? symbol.ask_tickvalue : symbol.bid_tickvalue; new_trade.profit = 0; new_trade.storage = 0; new_trade.expiration = 0; new_trade.taxes = 0; COPY_STR(new_trade.comment, "deleted [close only]"); // удаляем if (ExtServer->OrdersUpdate(&new_trade, &userInfo, UPDATE_CLOSE) == FALSE) { ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "ActivatePendingOrder - TRADE_CLOSE error"); return 102; } ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "ActivatePendingOrder - TRADE_CLOSE"); return 0; } // проверка маржевых требований TradeTransInfo trans = {0}; // готовим описание новой транзакции для проверки маржи клиента COPY_STR(trans.symbol, trade.symbol); trans.cmd = (trade.cmd == OP_BUY_LIMIT || trade.cmd == OP_BUY_STOP) ? OP_BUY : OP_SELL; trans.volume = trade.volume; trans.price = trade.open_price; trans.sl = trade.sl; trans.tp = trade.tp; // получим состояние маржи double profit, freemargin, prevmargin, margin; ConGroup groupInfo = { 0 }; ExtServer->GroupsGet(userInfo.group, &groupInfo); margin = ExtServer->TradesMarginCheck(&userInfo, &trans, &profit, &freemargin, &prevmargin); // проверим ее if ((freemargin + groupInfo.credit) < 0 && (symbol.margin_hedged_strong != FALSE || prevmargin <= margin)) { // готовим описание memcpy(&new_trade, &trade, sizeof(TradeRecord)); new_trade.close_time = ExtServer->TradeTime(); new_trade.close_price = (trade.cmd == OP_BUY_LIMIT || trade.cmd == OP_BUY_STOP) ? prices[1] : prices[0]; new_trade.profit = 0; new_trade.storage = 0; new_trade.expiration = 0; new_trade.taxes = 0; COPY_STR(new_trade.comment, "deleted [no money]"); // удаляем if (ExtServer->OrdersUpdate(&new_trade, &userInfo, UPDATE_CLOSE) == FALSE) { ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "ActivatePendingOrder - margin close error"); return 103; } ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "ActivatePendingOrder - margin close"); return 0; } // активировать // готовим новый ордер memcpy(&new_trade, &trade, sizeof(TradeRecord)); new_trade.cmd = (trade.cmd == OP_BUY_LIMIT || trade.cmd == OP_BUY_STOP) ? OP_BUY : OP_SELL; new_trade.open_time = ExtServer->TradeTime(); new_trade.close_price = (new_trade.cmd == OP_BUY) ? prices[0] : prices[1]; new_trade.profit = 0; new_trade.storage = 0; new_trade.expiration = 0; new_trade.taxes = 0; new_trade.open_price = resp->price; // начисляем комиссию ExtServer->TradesCommission(&new_trade, groupInfo.group, &symbol); // подсчитаем профиты ExtServer->TradesCalcProfit(groupInfo.group, &new_trade); // вычисляем курсы конвертации new_trade.conv_rates[0] = ExtServer->TradesCalcConvertation(groupInfo.group, FALSE, new_trade.open_price, &symbol); new_trade.margin_rate = ExtServer->TradesCalcConvertation(groupInfo.group, TRUE, new_trade.open_price, &symbol); // активируем новый ордер if (ExtServer->OrdersUpdate(&new_trade, &userInfo, UPDATE_ACTIVATE) == FALSE) { ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "ActivatePendingOrder - activate error"); return 104; } ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "ActivatePendingOrder - OK"); return 0; }
//+------------------------------------------------------------------+ //| Main data reading function | //+------------------------------------------------------------------+ int CSourceInterface::Read(FeedData *inf) { DWORD ctm; //---- check if(inf==NULL || m_buffer==NULL) return(FALSE); inf->ticks_count=0; //---- есть синтетические инструменты? if(m_syntetics.GetTicks(inf)!=FALSE) return(TRUE); //---- is connection opened? if(m_socket==INVALID_SOCKET) { //---- try connect if(Connect(m_server,m_login,m_password)==FALSE) { _snprintf(inf->result_string,sizeof(inf->result_string)-1,"no connection %s",m_server); inf->result=FALSE; return(FALSE); } //if(Login(inf)==FALSE) return(FALSE); } //---- is login succesful? //if(m_loginflag==FALSE) //if(Login(inf)==FALSE) return(FALSE); //---- read data while(m_socket!=INVALID_SOCKET) { //---- send ping every minute ctm=GetTickCount(); if(ctm<m_lasttime) m_lasttime=ctm-1000; // проверка перехода через 49 дней if((ctm-m_lasttime)>60000) { //---- заодно загрузим базу синтетических инструментов m_syntetics.Load(); //---- m_lasttime=ctm; if(SendString("> Ping\r\n")==FALSE) { strcpy(inf->result_string,"ping failed"); ExtLogger.Out("Read: %s",inf->result_string); return(FALSE); } } //---- check data if(DataRead()==FALSE) { COPY_STR(inf->result_string,"connection lost"); ExtLogger.Out("Read: %s",inf->result_string); return(FALSE); } //---- parse while we can read strings while(DataParseLine(m_buffer,BUFFER_SIZE-1)) { //---- it is news? if(memcmp(m_buffer,"< News",6)==0) return ReadNews(inf); //---- skip service information if(m_buffer[0]=='<' || m_buffer[0]=='>') continue; //---- parse ticks if(ReadTicks(m_buffer,inf)==FALSE) return(FALSE); //---- check free space for new account if(inf->ticks_count<COUNTOF(inf->ticks)) continue; //---- break parsing break; } //---- check ticks if(inf->ticks_count>0) { //---- update syntetics m_syntetics.AddQuotes(inf); //---- return data to server return(TRUE); } //---- Sleep(10); } //---- some error return(TRUE); }