Всем доброго времени суток!
Ради интереса и для обмена опытом написания роботов/приводов под Stock# решил открыть небольшую темку на форуме. Сюда выложу некоторые процедуры и функции, которые использую в своем приводе. Возможно, кто-то почерпнет для себя нечто интересное или готов предложить свои варианты. Программирую на C# не так давно, поэтому код не претендует на нобелевскую премию...
1) Процедура для запска Квика с последующей автризацией StartQuikConnection()
2) Функция для проверки настроек таблиц
Код
#region QUIK CONNECTION
public static Ecng.Trading.Quik.QuikTrader Trader;
private static Ecng.Trading.Algo.Strategies.StrategyManager StrategyManager;
public delegate void Connected_EventHandler(Boolean IsOK);
public static event Connected_EventHandler Connected;
public static Boolean IsTraderConnected
{
get
{
if (Trader == null || !Trader.IsConnected)
{
return false;
}
else
{
return true;
}
}
}
private static System.Threading.AutoResetEvent _OnTerminalConnectedWaitHandle;
public static void StartQuikConnection()
{
if (IsTraderConnected)
{
Globals.Сообщить("Подключение уже активно!", Globals.СтатусСообщения.Инфо);
}
else
{
//System.Threading.ManualResetEvent waitHandle_ЗапускТерминала = new System.Threading.ManualResetEvent(false);
if (!StartTerminal())
{ return; }
//waitHandle_ЗапускТерминала.WaitOne(60000);
/////////////////////////////////////////////////
try
{
if (!IsTraderConnected)
{
_OnTerminalConnectedWaitHandle = new System.Threading.AutoResetEvent(false);
if (Trader == null) //Если null, регистрируем новый trader
{
Trader = new Ecng.Trading.Quik.QuikTrader(_QuikPath);
Trader.IsAsyncMode = false;
Trader.ConnectionError += OnTraderConnectionError;
//подписываемся на событие успешного подключения
//все действия необходимо производить только после подключения
Trader.Connected += OnTraderConnected;
Trader.Connect();
}
else
{
Trader.Reconnect();
}
_OnTerminalConnectedWaitHandle.WaitOne(10000);
}
}
catch (Exception e)
{
OnConnect(false);
if (Trader != null)
{
Trader.Dispose();
Trader = null;
}
MessageBox.Show("Ошибка при подключении к Quik: " + '\n' + e.Message, "Подключение к QUIK!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private static Boolean StartTerminal()
{
try
{
Ecng.Trading.Quik.QuikTerminal terminal = QuikTerminal.DefaultTerminal;
if (terminal == null || !terminal.IsConnected)
{
Globals.Состояние("Подключение к Quik...");
terminal = QuikTerminal.Get(_QuikPath);
if (!terminal.IsLaunched)
{
Globals.Сообщить("Запускаем Quik <" + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss") + ">", Globals.СтатусСообщения.Инфо);
terminal.Launch();
Globals.Сообщить("Quik запущен <" + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss") + ">", Globals.СтатусСообщения.Инфо);
}
}
else
{
Globals.Сообщить("Найден запущенный Quik", Globals.СтатусСообщения.Инфо);
}
if (terminal == null)
{
return false;
}
if (!terminal.IsConnected)
{
terminal.Login(_QuikLogin, _QuikPassword);
Globals.Сообщить("Авторизация произведена", Globals.СтатусСообщения.Инфо);
}
Globals.Состояние("");
return true;
}
catch (Exception e)
{
Globals.Состояние("");
Globals.Сообщить("Ошибка запуска QUIK: " + e.Message, Globals.СтатусСообщения.Важное);
return false;
}
}
private static void OnConnect(Boolean IsOK)
{
if (Connected != null) Connected(IsOK);
}
public static Boolean CheckDDE()
{
StartQuikConnection();
if (IsTraderConnected)
{
return CheckDDE_OnConnected();
}
else
{
return false;
}
}
private static Boolean CheckDDE_OnConnected()
{
Boolean _resault = true;
Trader.ProcessDataError += OnTraderProcessDataError;
try
{
var _errors = Trader.Terminal.GetTableSettings();
foreach (var _err in _errors)
{
Globals.СтатусСообщения _статус = Globals.СтатусСообщения.Обычное;
if (_err.IsCritical)
{
_статус = Globals.СтатусСообщения.Важное;
_resault = false;
}
Globals.Сообщить(_err.Error.Message, _статус);
}
}
catch
{
_resault = false;
}
finally
{
Trader.ProcessDataError -= OnTraderProcessDataError;
}
return _resault;
}
#region STATIC ОБРАБОТЧИНИК СОБЫТИЙ
private static void OnTraderConnected()
{
_OnTerminalConnectedWaitHandle.Set();
Globals.Сообщить("Подключение было произведено успешно!", Globals.СтатусСообщения.Инфо);
OnConnect(true);
}
private static void OnTraderConnectionError(Exception e)
{
Globals.Сообщить("Ошибка при подключении к Quik: " + e.Message, Globals.СтатусСообщения.Важное);
OnConnect(false);
}
private static void OnTraderProcessDataError(Exception e)
{
Globals.Сообщить("Ошибка при получении/обработке данных с сервера Quik: " + e.Message, Globals.СтатусСообщения.Важное);
}