using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text;
using System.Timers;
using System.Threading;
using XlDde;namespace ConsoleApplication2
{
class Program
{
const string service = «myDDE»;
const string candleSPOT = «SPOT»;
static void Main(string[] args)
{
using (XlDdeServer server = new XlDdeServer(service))
{
server.AddChannel(candleSPOT, new SPOTChannel());
server.Register();Console.WriteLine(«DDE server ready. Press Enter to exit.\n\n»);
Console.ReadLine();
}
}
}
// **********************************************************************
// * Классы DDE каналов с обработчиками данных *
// **********************************************************************
class SPOTChannel: XlDdeChannel
{
//static int time2 = 1000;
static int em = 7;
static int m = 1200;
static int[] NM = new int[em];
static int NMM = 0;
static int LastMinute = 0;
static int mm = 1638400;
static double[] Price_trade = new double[mm];
string[] EM_trade = new string[mm];
static int[] Time_trade_I = new int[mm];
static int[] Volume_trade = new int[mm];
static int[,] Time = new int[em,m];
static double[,] O = new double[em,m];
static double[,] H = new double[em,m];
static double[,] L = new double[em,m];
static double[,] C = new double[em,m];
static double[,] V = new double[em,m];
protected override void ProcessTable(XlTable xt)
{
//int time3 = 1000;
int[] nach = new int[em];
int nach1 = 0;
int i = 0;
int j = 0;
int s = 0;
int curHour = 0;
int curMin = 0;
int curDay = 0;
int curSec = 0;
int curDay_1 = 0;
string name;
string[] bf;
string[] EM = new string[em];
DateTime moment;
string[] Time_trade = new string[mm];name = @«D:\Day2\Tiker_1.txt»;
try
{
StreamReader g = new StreamReader(name);while ((name = g.ReadLine()) != null)
{
bf = name.Split(',');
for (i = 0; i < em; i++) EM[i] = Convert.ToString(bf[i]);}
g.Close();
}
catch (FileNotFoundException e)
{
Console.WriteLine(e.Message);
Console.WriteLine(«Проверьте правильность имени файла!!!»);
}catch (Exception e)
{
Console.WriteLine(«Ошибка:» + e.Message);
}
for (int row = 0; row < xt.Rows; row++)
{
for (int col = 0; col < xt.Columns; col++)
{
xt.ReadValue();
if (col == 0) Time_trade[row] = xt.StringValue;
if (col == 1) EM_trade[NMM] = xt.StringValue;
if (col == 2) Price_trade[NMM] = xt.FloatValue;
if (col == 3) Volume_trade[NMM] = xt.FloatValue;
moment = Convert.ToDateTime(Time_trade[row]);
int Hour = moment.Hour; int M = moment.Minute; int S = moment.Second;
Time_trade_I[NMM] = Hour * 100 + M;
}curHour = DateTime.Now.Hour;
curMin = DateTime.Now.Minute;
curDay = curHour * 100 + curMin;
if (curDay < 1900) { if (Time_trade_I[LastMinute] == 1839 && (Time_trade_I[LastMinute] != Time_trade_I[NMM]) && s == 1) { LastMinute = NMM; for (i = 0; i < em; i++) NM[i]++; s = 0; } }
if ((Time_trade_I[LastMinute] != Time_trade_I[NMM]) && (NMM != LastMinute))
{for (j = 0; j < em; j++)
{ Time[j, NM[j]] = Time_trade_I[LastMinute]; C[j, NM[j]] = 0; H[j, NM[j]] = 0; L[j, NM[j]] = 1000000; O[j, NM[j]] = 0; V[j,NM[j]]=0;}
for (i = LastMinute; i < NMM; i++)
{for (j = 0; j < em; j++)
{if (EM[j] == EM_trade[i])
{
if (O[j, NM[j]] == 0) { O[j, NM[j]] = Price_trade[i]; H[j, NM[j]] = Price_trade[i]; L[j, NM[j]] = Price_trade[i]; C[j, NM[j]] = Price_trade[i]; V[j,NM[j]]=Volume_trade[i];}else { H[j, NM[j]] = Math.Max(H[j, NM[j]], Price_trade[i]); L[j, NM[j]] = Math.Min(L[j, NM[j]], Price_trade[i]); C[j, NM[j]] = Price_trade[i]; V[j,NM[j]]+=Volume_trade[i];}
}}
}for (j = 0; j < em; j++) { if (O[j, NM[j]] != 0) NM[j]++; }
LastMinute = NMM;curHour = DateTime.Now.Hour;
curMin = DateTime.Now.Minute;
curDay = curHour * 100 + curMin;if (curMin == 0) curDay = (curHour — 1) * 100 + 60;
for (j = 0; j < em; j++)
{
nach1 = 0;
for (i = 1; i < NM[j]; i++) { if (Time[j,i] < Time[j,i — 1]) nach1 = i; }if (curDay < 1849) { if (Time[j, nach1] == 959) nach[j] = nach1 + 1; else nach[j] = nach1; }
if (Time[j,NM[j] — 1] + 1 >= curDay || Time[j,NM[j] — 1] + 1 == 1400)
{
Console.WriteLine("{0,6},{1,6},{2,6},{3,6},{4,6},{5,6},{6,6},{7,6}", EM[j], Time[j,NM[j] — 1] * 100, O[j,NM[j] — 1], H[j,NM[j] — 1], L[j,NM[j] — 1], C[j,NM[j] — 1], Time[j,NM[j] — 1] + 1, curDay);
// Вдогонку напишем информацию о состоянии каналаConsole.WriteLine("\nSPOT IsConnected: {0}, Data received: {1}\n", this.IsConnected, this.DataReceived);
}
}
}curHour = DateTime.Now.Hour;
curMin = DateTime.Now.Minute;
curSec = DateTime.Now.Second;curDay = curHour * 100 + curMin;
curDay_1 = curHour * 10000 + curMin * 100 + curSec;if (curDay < 1900)
{if (Time_trade_I[LastMinute] == 1839 && curDay < 1842 && curDay_1 > 183855)
{
for (j = 0; j < em; j++)
{ Time[j, NM[j]] = Time_trade_I[LastMinute]; C[j, NM[j]] = 0; H[j, NM[j]] = 0; L[j, NM[j]] = 1000000; O[j, NM[j]] = 0; V[j,NM[j]]=0; }
for (i = LastMinute; i < NMM; i++)
{for (j = 0; j < em; j++)
{if (EM[j] == EM_trade[i])
{
if (O[j, NM[j]] == 0) { O[j, NM[j]] = Price_trade[i]; H[j, NM[j]] = Price_trade[i]; L[j, NM[j]] = Price_trade[i]; C[j, NM[j]] = Price_trade[i]; V[j,NM[j]]=Volume_trade[i];}else { H[j, NM[j]] = Math.Max(H[j, NM[j]], Price_trade[i]); L[j, NM[j]] = Math.Min(L[j, NM[j]], Price_trade[i]); C[j, NM[j]] = Price_trade[i]; V[j,NM[j]]+=Volume_trade[i];}
}}
}
s = 1; Thread.Sleep(100);
}
}
NMM++;
}curHour = DateTime.Now.Hour;
curMin = DateTime.Now.Minute;
curDay = curHour * 100 + curMin;
if (curDay < 1843 && curDay > 1839)
{
for (j = 0; j < em; j++)
{nach1 = 0;
for (i = 1; i < NM[j]; i++) { if (Time[j, i] < Time[j, i — 1]) nach1 = i; }
if (curDay < 1849) { if (Time[j, nach1] == 959) nach[j] = nach1 + 1; else nach[j] = nach1; }
Console.WriteLine("{0,6},{1,6},{2,6},{3,6},{4,6},{5,6},{6,6},{7,6}", EM[j], Time[j, NM[j]] * 100, O[j, NM[j]], H[j, NM[j]], L[j, NM[j]], C[j, NM[j]], Time[j, NM[j]] + 1, curDay);
// Вдогонку напишем информацию о состоянии каналаConsole.WriteLine("\nSPOT IsConnected1: {0}, Data received: {1}\n", this.IsConnected, this.DataReceived);
}
Thread.Sleep(100);
}
}
}
// **********************************************************************
}
local quantity = 100
local ind = «SiZ»
IsRun = false
begin = false
function main()
IsRun = true
r=false
begin = true
while begin do
n = getNumCandles(ind)--кол-во свечек, где ind = идентификатор графика
t, res, _ = getCandlesByIndex (ind, 0, n — quantity, quantity)--получить последние n свечей (для справки)
if res > 0 then
r=wind.Test(t)
begin = false
end
sleep(2000)
end
while IsRun do
sleep(2000)
end
end
А в проге в функции Test забираете из стека таблицу со свечками.
>В моей программе минутка появляется только после появления в таблице всех сделок,
> сделки из следующей минуты хотя бы по одному из выбранных эмитентов.
На сколько я помню, этот кейс уже разбирался на форуме квика.
«Все сделки» тоже могут приходить не подряд. Это особенность рассылки информации биржей, так что смысла городить нет.
— разобраться с DDE сервером Морошкина на С#;
— написать формирование таблиц минуток в QPILE с графиков.
На изучение синтаксиса LUA меня уже не хватило, хотя бы потому, что мои системы уже перенесены из Excel в C#. И помимо изучения LUA, еще и разбираться в связках LUA->С# или LUA->MySQL… Нет, это выше моих сил. Поэтому про функционал LUA ничего сказать не могу. Мои претензии были к функции GET_CANDLE из QPILE.
Для информации (не уверен, что захотите этим заняться): На сегодняшний день необходимость использования DDE сервера у меня отпала. Нашел проект с открытым кодом QuikSharp, и тоже перевел всех роботов на C#. DDE сервер поднимать не нужно, Держать открытые таблицы в квике тоже не нужно.