Попрошу помощи, тк уже 2ой день бьюсь... Это я пример переделывал и вот что получилось, но скрипт не работает, думаю где то ошибка с подключением (тк он выводит подключение.. и все.. выходит)
мне кажется все верно, наверняка чтот с терминалами у меня, тк на 2ом счету даже вручную не открывает по RIZ1
Цитата:namespace SampleConsole
{
using System;
using System.Linq;
using System.Threading;
using Ecng.Common;
using StockSharp.BusinessEntities;
using StockSharp.Quik;
using StockSharp.Algo;
class Program
{
private static Security _instrument1;
private static Security _instrument2;
private static Portfolio _portfolio1;
private static Portfolio _portfolio2;
private static MarketDepth _depth1;
private static MarketDepth _depth2;
static void Main()
{
try
{
// для теста выбираем бумагу Лукойл
const string secCode = "RIZ1";
var path1 = @"D:\FinamJunior\info.exe";
var account1 = "SPBFUT00O88";
var path2 = @"D:\FinamJunior1\info.exe";
var account2 = "SPBFUT00P53";
using (var waitHandle = new AutoResetEvent(false))
{
// создаем шлюз к Quik-у
using (var trader1 = new QuikTrader { Path = path1, DdeServer = "quik1" })
using (var trader2 = new QuikTrader { Path = path2, DdeServer = "quik2", DllName = @"TRANS2QUIK_2.dll" })
{
var portfoliosWait = new ManualResetEvent(false);
var connect1 = 0;
var connect2 = 0;
trader1.Connected += () =>
{
Console.WriteLine("Подключение 1 было произведено успешно.");
connect1 = 1;
// извещаем об успешном соединени
if(connect1==1 && connect2==1)
portfoliosWait.Set();
};
trader2.Connected += () =>
{
Console.WriteLine("Подключение 2 было произведено успешно.");
connect1 = 2;
// извещаем об успешном соединени
if (connect1 == 1 && connect2 == 1)
portfoliosWait.Set();
};
Console.WriteLine("Производим подключение...");
trader1.Connect();
trader2.Connect();
// дожидаемся события об успешном соединении
//waitHandle.WaitOne();
Console.WriteLine("Дожидаемся появления инструментов и портфелей...");
portfoliosWait.WaitOne();
trader1.NewPortfolios += portfolios =>
{
if (_portfolio1 == null)
{
// находим Лукойл и присваиваем ее переменной lkoh
_portfolio1 = portfolios.FirstOrDefault(p => p.Name == account1);
if (_portfolio1 != null)
{
Console.WriteLine("Портфель {0} появился.", account1);
// если инструмент и стакан уже появились,
// то извещаем об этом основной поток для выставления заявки
if (_instrument1 != null && _depth1 != null && _instrument2 != null && _depth2 != null && _portfolio2 != null)
waitHandle.Set();
}
}
};
trader2.NewPortfolios += portfolios =>
{
if (_portfolio2 == null)
{
// находим Лукойл и присваиваем ее переменной lkoh
_portfolio2 = portfolios.FirstOrDefault(p => p.Name == account2);
if (_portfolio2 != null)
{
Console.WriteLine("Портфель {0} появился.", account2);
// если инструмент и стакан уже появились,
// то извещаем об этом основной поток для выставления заявки
if (_instrument1 != null && _depth1 != null && _instrument2 != null && _depth2 != null && _portfolio1 != null)
waitHandle.Set();
}
}
};
// подписываемся на событие появление инструментов
trader1.NewSecurities += securities =>
{
if (_instrument1 == null)
{
// находим Лукойл и присваиваем ее переменной lkoh
_instrument1 = securities.FirstOrDefault(sec => sec.Code == secCode);
if (_instrument1 != null)
{
Console.WriteLine("Инструмент Лукойл появился.");
// запускаем экспорт стакана
trader1.RegisterQuotes(_instrument1);
if (_portfolio1 != null && _depth1 != null && _portfolio2 != null && _depth2 != null && _instrument2 != null)
waitHandle.Set();
}
}
};
trader2.NewSecurities += securities =>
{
if (_instrument2 == null)
{
// находим Лукойл и присваиваем ее переменной lkoh
_instrument2 = securities.FirstOrDefault(sec => sec.Code == secCode);
if (_instrument2 != null)
{
Console.WriteLine("Инструмент Лукойл появился.");
// запускаем экспорт стакана
trader2.RegisterQuotes(_instrument2);
if (_portfolio1 != null && _depth1 != null && _portfolio2 != null && _depth2 != null && _instrument1 != null)
waitHandle.Set();
}
}
};
// подписываемся на событие обновления стакана
trader1.QuotesChanged += depths =>
{
if (_depth1 == null && _instrument1 != null)
{
_depth1 = depths.FirstOrDefault(d => d.Security == _instrument1);
if (_depth1 != null)
{
Console.WriteLine("Стакан Лукойла появился.");
// если портфель и инструмент уже появился, то извещаем об этом основной поток для выставления заявки
if (_portfolio1 != null && _instrument1 != null && _portfolio2 != null && _instrument2 != null && _depth2 != null)
waitHandle.Set();
}
}
};
trader2.QuotesChanged += depths =>
{
if (_depth2 == null && _instrument2 != null)
{
_depth2 = depths.FirstOrDefault(d => d.Security == _instrument2);
if (_depth2 != null)
{
Console.WriteLine("Стакан Лукойла появился.");
// если портфель и инструмент уже появился, то извещаем об этом основной поток для выставления заявки
if (_portfolio1 != null && _instrument1 != null && _portfolio2 != null && _instrument2 != null && _depth1 != null)
waitHandle.Set();
}
}
};
trader1.StartExport(trader1.SecuritiesTable, trader1.MyTradesTable, trader1.EquityPositionsTable,
trader1.EquityPortfoliosTable, trader1.OrdersTable);
trader2.StartExport(trader2.SecuritiesTable, trader2.MyTradesTable, trader2.EquityPositionsTable,
trader2.EquityPortfoliosTable, trader2.OrdersTable);
// дожидаемся появления портфеля и инструмента
waitHandle.WaitOne();
// 0.1% от изменения цены
const decimal delta = 0.001m;
// запоминаем первоначальное значение середины спреда
var firstMid = _instrument1.BestPair.SpreadPrice / 2;
if (_instrument1.BestBid == null)
throw new Exception("Нет лучшего бида для котировки.");
Console.WriteLine("Первоначальное значение середины спреда {0:0.##}", _instrument1.BestBid.Price + firstMid);
while (true)
{
var mid = _instrument1.BestPair.SpreadPrice / 2;
// если спред вышел за пределы нашего диапазона
if (
((firstMid + firstMid * delta) <= mid) ||
((firstMid - firstMid * delta) >= mid)
)
{
var order1 = new Order
{
Portfolio = _portfolio1,
Price = _instrument1.ShrinkPrice(_instrument1.BestBid.Price + mid),
Security = _instrument1,
Volume = 1,
Direction = OrderDirections.Buy,
};
trader1.RegisterOrder(order1);
Console.WriteLine("Заявка {0} зарегистрирована.", order1.Id);
var order2 = new Order
{
Portfolio = _portfolio2,
Price = _instrument2.ShrinkPrice(_instrument2.BestAsk.Price + mid),
Security = _instrument2,
Volume = 1,
Direction = OrderDirections.Sell,
};
trader2.RegisterOrder(order2);
Console.WriteLine("Заявка {0} зарегистрирована.", order2.Id);
break;
}
else
//Console.WriteLine("Текущее значение середины спреда {0:0.##}", _instrument.BestBid.Price + mid);
// ждем 1 секунду
Thread.Sleep(1000);
}
// останавливаем экспорт по DDE
trader2.StopExport(trader2.SecuritiesTable, trader2.MyTradesTable, trader2.EquityPositionsTable,
trader2.EquityPortfoliosTable, trader2.OrdersTable);
trader1.StopExport(trader1.SecuritiesTable, trader1.MyTradesTable, trader1.EquityPositionsTable,
trader1.EquityPortfoliosTable, trader1.OrdersTable);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
}