Exemple #1
0
*/	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;
}
Exemple #2
0
//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;
	}

}
Exemple #3
0
//+------------------------------------------------------------------+
//| 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);
  }
Exemple #4
0
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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;
}
Exemple #5
0
//+------------------------------------------------------------------+
//| 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);
  }
Exemple #6
0
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);
  }
Exemple #9
0
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
    }
}
Exemple #10
0
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, "отложенный ордер подтвержден");
}
Exemple #11
0
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);
}
Exemple #12
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;
}
Exemple #13
0
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;
}
Exemple #14
0
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;
}
Exemple #15
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);
	}
}
Exemple #16
0
//+------------------------------------------------------------------+
//| 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);
  }
Exemple #17
0
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
  }
Exemple #19
0
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;
}
Exemple #20
0
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
}
Exemple #21
0
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;
}
Exemple #22
0
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);
}
Exemple #23
0
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;
}
Exemple #24
0
/* 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;
}
Exemple #25
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;
}
Exemple #26
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 
}
Exemple #27
0
/*
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;
}
Exemple #28
0
//+------------------------------------------------------------------+
//| Активировать отложенный ордер (пришла положительная квитанция)   |
//+------------------------------------------------------------------+
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;
}
Exemple #29
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);
  }