// timer thread
		static void Timer (OpenApiMessagesFactory msgFactory, Queue messagesQueue)
		{
			isShutdown = false;
			while (!isShutdown) {
				Thread.Sleep (1000);

				if (DateTime.Now > lastSentMsgTimestamp) {
					SendPingRequest (msgFactory, messagesQueue);
				}
			}
		}
		static void SendSubscribeForSpotsRequest (OpenApiMessagesFactory msgFactory, Queue writeQueue)
		{
			var _msg = msgFactory.CreateSubscribeForSpotsRequest (testAccountId, testAccessToken, "EURUSD", clientMsgId);
			if (isDebugIsOn)
				Console.WriteLine ("SendSubscribeForSpotsRequest() Message to be send:\n{0}", OpenApiMessagesPresentation.ToString (_msg));
			writeQueue.Enqueue (Utils.Serialize (_msg));
		}
		static void NotImplementedCommand (OpenApiMessagesFactory msgFactory, Queue writeQueue)
		{
			Console.WriteLine ("Action is NOT IMPLEMENTED!");
		}
		static void SendStopOrderRequest (OpenApiMessagesFactory msgFactory, Queue writeQueue)
		{
			var _msg = msgFactory.CreateStopOrderRequest (testAccountId, testAccessToken, "EURUSD", ProtoTradeSide.BUY, 1000000, 0.2, clientMsgId);
			if (isDebugIsOn)
				Console.WriteLine ("SendStopOrderRequest() Message to be send:\n{0}", OpenApiMessagesPresentation.ToString (_msg));
			writeQueue.Enqueue (Utils.Serialize (_msg));
		}
		static void SendClosePositionRequest (OpenApiMessagesFactory msgFactory, Queue writeQueue)
		{
			var _msg = msgFactory.CreateClosePositionRequest (testAccountId, testAccessToken, testPositionId, testVolume, clientMsgId);
			if (isDebugIsOn)
				Console.WriteLine ("SendClosePositionRequest() Message to be send:\n{0}", OpenApiMessagesPresentation.ToString (_msg));
			writeQueue.Enqueue (Utils.Serialize (_msg));
		}
		static void SendGetAllSubscriptionsForSpotEventsRequest (OpenApiMessagesFactory msgFactory, Queue writeQueue)
		{
			var _msg = msgFactory.CreateGetAllSpotSubscriptionsRequest ();
			if (isDebugIsOn)
				Console.WriteLine ("SendGetAllSubscriptionsForSpotEventsRequest() Message to be send:\n{0}", OpenApiMessagesPresentation.ToString (_msg));
			writeQueue.Enqueue (Utils.Serialize (_msg));
		}
		static void SetClientMessageId (OpenApiMessagesFactory msgFactory, Queue writeQueue)
		{
			if (isDebugIsOn)
				Console.WriteLine ("SetClientMessageId() Current message ID:\"{0}\"", (clientMsgId == null ? "null" : clientMsgId));
			if (clientMsgId != null) {
				clientMsgId = null;
			} else {
				clientMsgId = "customClientMessageID";
			}
			if (isDebugIsOn)
				Console.WriteLine ("SetClientMessageId() New message ID:\"{0}\"", (clientMsgId == null ? "null" : clientMsgId));
		}
		static void SendSubscribeForTradingEventsRequest (OpenApiMessagesFactory msgFactory, Queue writeQueue)
		{
			SendSubscribeForTradingEventsRequest (testAccountId, msgFactory, writeQueue);
		}
		static void SendUnsubscribeForTradingEventsRequest (OpenApiMessagesFactory msgFactory, Queue writeQueue)
		{
			var _msg = msgFactory.CreateUnsubscribeForTradingEventsRequest (testAccountId);
			if (isDebugIsOn)
				Console.WriteLine ("SendUnsubscribeForTradingEventsRequest() Message to be send:\n{0}", OpenApiMessagesPresentation.ToString (_msg));
			writeQueue.Enqueue (Utils.Serialize (_msg));
		}
		static void SendAuthorizationRequest (OpenApiMessagesFactory msgFactory, Queue writeQueue)
		{
			var _msg = msgFactory.CreateAuthorizationRequest (clientPublicId, clientSecret);
			if (isDebugIsOn)
				Console.WriteLine ("SendAuthorizationRequest() Message to be send:\n{0}", OpenApiMessagesPresentation.ToString (_msg));
			writeQueue.Enqueue (Utils.Serialize (_msg));
		}
		static void SendHeartbeatEvent (OpenApiMessagesFactory msgFactory, Queue writeQueue)
		{
			var _msg = msgFactory.CreateHeartbeatEvent ();
			if (isDebugIsOn)
				Console.WriteLine ("SendHeartbeatEvent() Message to be send:\n{0}", OpenApiMessagesPresentation.ToString (_msg));
			writeQueue.Enqueue (Utils.Serialize (_msg));
		}
		static void SendPingRequest (OpenApiMessagesFactory msgFactory, Queue writeQueue)
		{
			var _msg = msgFactory.CreatePingRequest ((ulong)DateTime.Now.Ticks);
			if (isDebugIsOn)
				Console.WriteLine ("SendPingRequest() Message to be send:\n{0}", OpenApiMessagesPresentation.ToString (_msg));
			writeQueue.Enqueue (Utils.Serialize (_msg));
		}
		static void ProcessIncomingDataStream (OpenApiMessagesFactory msgFactory, byte[] rawData)
		{
			var _msg = msgFactory.GetMessage (rawData);
			if (isDebugIsOn)
				Console.WriteLine ("ProcessIncomingDataStream() Message received:\n{0}", OpenApiMessagesPresentation.ToString (_msg));

			if (!_msg.payloadSpecified) {
				return;
			}

			switch (_msg.payloadType) {
			case (int)ProtoPayloadType.HEARTBEAT_EVENT:
				break;
			case (int)ProtoOAPayloadType.OA_EXECUTION_EVENT:
				var _payload_msg = msgFactory.GetExecutionEvent (rawData);
				if (_payload_msg.position != null) {
					testPositionId = _payload_msg.position.positionId;
				}

				break;
			default:
				break;
			}
			;
		}
		// incoming data processing thread
		static void IncomingDataProcessing (OpenApiMessagesFactory msgFactory, Queue messagesQueue)
		{
			isShutdown = false;
			while (!isShutdown) {
				Thread.Sleep (0);

				if (messagesQueue.Count <= 0)
					continue;

				byte[] _message = (byte[])messagesQueue.Dequeue ();
				ProcessIncomingDataStream (msgFactory, _message);
			}
		}