Files

278 lines
8.2 KiB
C#
Raw Permalink Normal View History

2014-10-31 09:05:52 +02:00
using System;
using System.Collections.Generic;
using log4net;
2014-10-31 09:05:52 +02:00
namespace MTApiService
{
public class MtAdapter
2014-10-31 09:05:52 +02:00
{
#region Fields
private const string LogProfileName = "MtApiService";
private static readonly ILog Log = LogManager.GetLogger(typeof(MtAdapter));
private static readonly MtAdapter Instance = new MtAdapter();
2014-10-31 09:05:52 +02:00
private readonly Dictionary<int, MtServer> _servers = new Dictionary<int, MtServer>();
private readonly Dictionary<int, MtExpert> _experts = new Dictionary<int, MtExpert>();
#endregion
#region Init Instance
2014-10-31 09:05:52 +02:00
private MtAdapter()
{
LogConfigurator.Setup(LogProfileName);
2014-10-31 09:05:52 +02:00
}
static MtAdapter()
{
}
2014-10-31 09:05:52 +02:00
public static MtAdapter GetInstance()
2014-10-31 09:05:52 +02:00
{
return Instance;
2014-10-31 09:05:52 +02:00
}
#endregion
#region Public Methods
public void InitExpert(int expertHandle, int port, string symbol, double bid, double ask, IMetaTraderHandler mtHandler)
2014-10-31 09:05:52 +02:00
{
if (mtHandler == null)
throw new ArgumentNullException(nameof(mtHandler));
Log.InfoFormat("InitExpert: begin. symbol = {0}, expertHandle = {1}, port = {2}", symbol, expertHandle, port);
2014-10-31 09:05:52 +02:00
MtServer server;
lock (_servers)
2014-10-31 09:05:52 +02:00
{
if (_servers.ContainsKey(port))
2014-10-31 09:05:52 +02:00
{
server = _servers[port];
2014-10-31 09:05:52 +02:00
}
else
{
server = new MtServer(port);
server.Stopped += server_Stopped;
_servers[port] = server;
2014-10-31 09:05:52 +02:00
server.Start();
}
}
var expert = new MtExpert(expertHandle, new MtQuote { Instrument = symbol, Bid = bid, Ask = ask, ExpertHandle = expertHandle }, mtHandler);
2014-10-31 09:05:52 +02:00
lock (_experts)
2014-10-31 09:05:52 +02:00
{
_experts[expert.Handle] = expert;
2014-10-31 09:05:52 +02:00
}
server.AddExpert(expert);
Log.Info("InitExpert: end");
2014-10-31 09:05:52 +02:00
}
public void DeinitExpert(int expertHandle)
{
2016-10-12 17:01:22 +03:00
Log.InfoFormat("DeinitExpert: begin. expertHandle = {0}", expertHandle);
2014-10-31 09:05:52 +02:00
MtExpert expert = null;
lock (_experts)
2014-10-31 09:05:52 +02:00
{
if (_experts.ContainsKey(expertHandle))
2014-10-31 09:05:52 +02:00
{
expert = _experts[expertHandle];
_experts.Remove(expertHandle);
2014-10-31 09:05:52 +02:00
}
}
if (expert != null)
{
expert.Deinit();
}
else
{
Log.WarnFormat("DeinitExpert: expert with id {0} has not been found.", expertHandle);
}
Log.Info("DeinitExpert: end");
2014-10-31 09:05:52 +02:00
}
public void SendQuote(int expertHandle, string symbol, double bid, double ask)
{
Log.DebugFormat("SendQuote: begin. symbol = {0}, bid = {1}, ask = {2}", symbol, bid, ask);
2014-10-31 09:05:52 +02:00
MtExpert expert;
lock (_experts)
2014-10-31 09:05:52 +02:00
{
expert = _experts[expertHandle];
2014-10-31 09:05:52 +02:00
}
if (expert != null)
{
expert.Quote = new MtQuote { Instrument = symbol, Bid = bid, Ask = ask, ExpertHandle = expertHandle };
2014-10-31 09:05:52 +02:00
}
else
{
Log.WarnFormat("SendQuote: expert with id {0} has not been found.", expertHandle);
}
2014-10-31 09:05:52 +02:00
Log.Debug("SendQuote: end");
2014-10-31 09:05:52 +02:00
}
public void SendEvent(int expertHandle, int eventType, string payload)
{
Log.DebugFormat("SendEvent: begin. eventType = {0}, payload = {1}", eventType, payload);
MtExpert expert;
lock (_experts)
{
expert = _experts[expertHandle];
}
if (expert != null)
{
expert.SendEvent(new MtEvent { EventType = eventType, Payload = payload, ExpertHandle = expertHandle });
}
else
{
Log.WarnFormat("SendEvent: expert with id {0} has not been found.", expertHandle);
}
Log.Debug("SendEvent: end");
}
2014-10-31 09:05:52 +02:00
public void SendResponse(int expertHandle, MtResponse response)
{
Log.DebugFormat("SendResponse: begin. id = {0}, response = {1}", expertHandle, response);
2014-10-31 09:05:52 +02:00
MtExpert expert;
lock (_experts)
2014-10-31 09:05:52 +02:00
{
expert = _experts[expertHandle];
2014-10-31 09:05:52 +02:00
}
if (expert != null)
{
expert.SendResponse(response);
}
else
{
Log.WarnFormat("SendResponse: expert with id {0} has not been found.", expertHandle);
}
2014-10-31 09:05:52 +02:00
Log.Debug("SendResponse: end");
2014-10-31 09:05:52 +02:00
}
public int GetCommandType(int expertHandle)
{
Log.DebugFormat("GetCommandType: begin. expertHandle = {0}", expertHandle);
2014-10-31 09:05:52 +02:00
MtExpert expert;
lock (_experts)
{
expert = _experts[expertHandle];
}
if (expert == null)
2014-10-31 09:05:52 +02:00
{
Log.WarnFormat("GetCommandType: expert with id {0} has not been found.", expertHandle);
2014-10-31 09:05:52 +02:00
}
var retval = expert?.GetCommandType() ?? 0;
Log.DebugFormat("GetCommandType: end. retval = {0}", retval);
return retval;
2014-10-31 09:05:52 +02:00
}
public object GetCommandParameter(int expertHandle, int index)
{
Log.DebugFormat("GetCommandParameter: begin. expertHandle = {0}, index = {1}", expertHandle, index);
2014-10-31 09:05:52 +02:00
MtExpert expert;
lock (_experts)
2014-10-31 09:05:52 +02:00
{
expert = _experts[expertHandle];
2014-10-31 09:05:52 +02:00
}
if (expert == null)
{
Log.WarnFormat("GetCommandParameter: expert with id {0} has not been found.", expertHandle);
}
var retval = expert?.GetCommandParameter(index);
Log.DebugFormat("GetCommandParameter: end. retval = {0}", retval);
return retval;
2014-10-31 09:05:52 +02:00
}
public object GetNamedParameter(int expertHandle, string name)
{
Log.DebugFormat("GetNamedParameter: begin. expertHandle = {0}, name = {1}", expertHandle, name);
MtExpert expert;
lock (_experts)
{
expert = _experts[expertHandle];
}
if (expert == null)
{
Log.WarnFormat("GetNamedParameter: expert with id {0} has not been found.", expertHandle);
}
var retval = expert?.GetNamedParameter(name);
Log.DebugFormat("GetNamedParameter: end. retval = {0}", retval);
return retval;
}
public bool ContainsNamedParameter(int expertHandle, string name)
{
Log.DebugFormat("ContainsNamedParameter: begin. expertHandle = {0}, name = {1}", expertHandle, name);
MtExpert expert;
lock (_experts)
{
expert = _experts[expertHandle];
}
if (expert == null)
{
Log.WarnFormat("ContainsNamedParameter: expert with id {0} has not been found.", expertHandle);
}
bool retval = expert != null ? expert.ContainsNamedParameter(name) : false;
Log.DebugFormat("ContainsNamedParameter: end. retval = {0}", retval);
return retval;
}
2014-10-31 09:05:52 +02:00
#endregion
#region Private Methods
private void server_Stopped(object sender, EventArgs e)
{
var server = (MtServer)sender;
2014-10-31 09:05:52 +02:00
server.Stopped -= server_Stopped;
var port = server.Port;
Log.InfoFormat("server_Stopped: port = {0}", port);
lock (_servers)
2014-10-31 09:05:52 +02:00
{
if (_servers.ContainsKey(port))
2014-10-31 09:05:52 +02:00
{
_servers.Remove(port);
2014-10-31 09:05:52 +02:00
}
}
}
#endregion
}
}