static string ProtoMessageToString(ProtoMessage msg)
        {
            if (!msg.payloadSpecified)
                return "ERROR in ProtoMessage: Corrupted execution event, no payload found";
            var _str = "ProtoMessage{";
            switch ((ProtoPayloadType)msg.payloadType)
            {
                case ProtoPayloadType.PROTO_MESSAGE:
                    var _msg = Utils.Deserialize<ProtoMessage>(msg.payload);
                    _str += ProtoMessageToString(_msg);
                    break;
                case ProtoPayloadType.PING_REQ:
                    var _ping_req = Utils.Deserialize<ProtoPingReq>(msg.payload);
                    _str += "PingRequest{timestamp:" + _ping_req.timestamp.ToString() + "}";
                    break;
                case ProtoPayloadType.PING_RES:
                    var _ping_res = Utils.Deserialize<ProtoPingRes>(msg.payload);
                    _str += "PingResponse{timestamp:" + _ping_res.timestamp + "}";
                    break;
                case ProtoPayloadType.HEARTBEAT_EVENT:
                    var _hb = Utils.Deserialize<ProtoHeartbeatEvent>(msg.payload);
                    _str += "Heartbeat";
                    break;
                case ProtoPayloadType.ERROR_RES:
                    var _err = Utils.Deserialize<ProtoErrorRes>(msg.payload);
                    _str += "ErrorResponse{errorCode:" + _err.errorCode + (_err.descriptionSpecified ? ", description:" + _err.description : "") + "}";
                    break;
                default:
                    _str += OpenApiMessageToString(msg);
                    break;
            }
			_str += (msg.clientMsgIdSpecified ? ", clientMsgId:" + msg.clientMsgId : "") + (msg.payloadSpecified ? ", payloadString:" + msg.payload : "") + "}";

            return _str;
        }
        public ProtoMessage CreateMessage(uint payloadType, byte[] payload = null, string clientMsgId = null)
        {
            var protoMsg = new ProtoMessage();
            protoMsg.payloadType = payloadType;
            if (payload != null)
                protoMsg.payload = payload;
            if (clientMsgId != null)
                protoMsg.clientMsgId = clientMsgId;

            return protoMsg;
        }
        static string OpenApiMessageToString(ProtoMessage msg)
        {
            switch ((ProtoOAPayloadType)msg.payloadType)
            {
                case ProtoOAPayloadType.OA_AUTH_REQ:
                    var _auth_req = Utils.Deserialize<ProtoOAAuthReq>(msg.payload);
                    return "AuthRequest{clientId:" + _auth_req.clientId + ", clientSecret:" + _auth_req.clientSecret + "}";
                case ProtoOAPayloadType.OA_AUTH_RES:
                    return "AuthResponse";
                case ProtoOAPayloadType.OA_GET_SUBSCRIBED_ACCOUNTS_REQ:
                    return "GetSubscribedAccountsRequest";
                case ProtoOAPayloadType.OA_GET_SUBSCRIBED_ACCOUNTS_RES:
                    var _subscr_res = Utils.Deserialize<ProtoOAGetSubscribedAccountsRes>(msg.payload);
                    var _subscr_res_str = "GetSubscribedAccountsResponse{";
					var _subscr_count = _subscr_res.accountId.Count;
                    foreach (var accountId in _subscr_res.accountId)
                        _subscr_res_str += "accountId:" + accountId.ToString() + (--_subscr_count == 0 ? "" : ", ");
                    return _subscr_res_str + "}";
                case ProtoOAPayloadType.OA_SUBSCRIBE_FOR_TRADING_EVENTS_REQ:
                    var _subscr_req = Utils.Deserialize<ProtoOASubscribeForTradingEventsReq>(msg.payload);
                    return "SubscrbeTradingEventsRequest{accountId:" + _subscr_req.accountId.ToString() + ", accessToken:" + _subscr_req.accessToken + "}";
                case ProtoOAPayloadType.OA_SUBSCRIBE_FOR_TRADING_EVENTS_RES:
                    return "SubscrbeTradingEventsResponse";
                case ProtoOAPayloadType.OA_UNSUBSCRIBE_FROM_TRADING_EVENTS_REQ:
                    var _unsubscr_req = Utils.Deserialize<ProtoOAUnsubscribeFromTradingEventsReq>(msg.payload);
                    return "UnsubscrbeTradingEventsRequest{accountId:" + _unsubscr_req.accountId + "}";
                case ProtoOAPayloadType.OA_UNSUBSCRIBE_FROM_TRADING_EVENTS_RES:
                    return "UnsubscrbeTradingEventsResponse";
                case ProtoOAPayloadType.OA_EXECUTION_EVENT:
                    return OpenApiExecEventsToString(msg);
                case ProtoOAPayloadType.OA_CANCEL_ORDER_REQ:
                    return "CancelOrderRequest{}";
                case ProtoOAPayloadType.OA_CREATE_ORDER_REQ:
                    return "CreateOrderRequest{}";
                case ProtoOAPayloadType.OA_CLOSE_POSITION_REQ:
                    return "ClosePositionRequest{}";
                case ProtoOAPayloadType.OA_AMEND_ORDER_REQ:
                    return "AmendOrderRequest{}";
                case ProtoOAPayloadType.OA_AMEND_POSITION_SL_TP_REQ:
                    return "AmendPositionRequest{}";
                case ProtoOAPayloadType.OA_SUBSCRIBE_FOR_SPOTS_REQ:
                    return "SubscribeForSpotsRequest{}";
                case ProtoOAPayloadType.OA_SUBSCRIBE_FOR_SPOTS_RES:
                    return "SubscribeForSpotsResponse{}";
                case ProtoOAPayloadType.OA_UNSUBSCRIBE_FROM_SPOTS_REQ:
                    return "UnsubscribeFromSpotsRequest{}";
                case ProtoOAPayloadType.OA_UNSUBSCRIBE_FROM_SPOTS_RES:
                    return "UnsubscribeFromSpotsResponse{}";
                case ProtoOAPayloadType.OA_GET_SPOT_SUBSCRIPTION_REQ:
                    return "GetSpotSubscriptionRequest{}";
                case ProtoOAPayloadType.OA_GET_SPOT_SUBSCRIPTION_RES:
                    return "GetSpotSubscriptionResponse{}";
                case ProtoOAPayloadType.OA_GET_ALL_SPOT_SUBSCRIPTIONS_REQ:
                    return "GetAllSpotSubscriptionsRequest{}";
                case ProtoOAPayloadType.OA_GET_ALL_SPOT_SUBSCRIPTIONS_RES:
                    String _all_str = "GetAllSpotSubscriptionsResponse{";
                     ProtoOAGetAllSpotSubscriptionsRes _all_res = Utils.Deserialize<ProtoOAGetAllSpotSubscriptionsRes>(msg.payload);
                     _all_str += "subscriptions=[";
                     foreach (ProtoOASpotSubscription subscription in _all_res.spotSubscriptions) {
                        _all_str += "{AccountId=" + subscription.accountId + ", SubscriptionId=" + subscription.subscriptionId + ", SymbolNamesList=[";
                        foreach (String symbolName in subscription.symbolNames) {
                            _all_str += symbolName + ", ";
                        }
                        _all_str += "]}, ";
                        }
                    _all_str += "]}";
                    return _all_str;
                case ProtoOAPayloadType.OA_SPOT_EVENT:
                    var _spot_event = Utils.Deserialize<ProtoOASpotEvent>(msg.payload);
                    return "SpotEvent{subscriptionId:" + _spot_event.subscriptionId + ", symbolName:" + _spot_event.symbolName + 
					", bidPrice:" + (_spot_event.bidPriceSpecified ? _spot_event.bidPrice.ToString() : "       ") + 
					", askPrice:" + (_spot_event.askPriceSpecified ? _spot_event.askPrice.ToString() : "       ") + "}";
                default:
                    return "unknown";
            }
        }
 static public string ToString(ProtoMessage msg)
 {
     return ProtoMessageToString(msg);
 }
        static string OpenApiExecEventsToString(ProtoMessage msg)
        {
            if ((ProtoOAPayloadType)msg.payloadType != ProtoOAPayloadType.OA_EXECUTION_EVENT)
                return "ERROR in OpenApiExecutionEvents: Wrong message type";

            if (!msg.payloadSpecified)
                return "ERROR in OpenApiExecutionEvents: Corrupted execution event, no payload found";

            var _msg = Utils.Deserialize<ProtoOAExecutionEvent>(msg.payload);
            var _str = OpenApiExecutionTypeToString(_msg.executionType) + "{" +
                OpenApiOrderToString(_msg.order) +
                ", " + OpenApiPositionToString(_msg.position) +
                (_msg.reasonCodeSpecified ? ", reasonCode:" + _msg.reasonCode : "");

            return _str + "}";
        }