Идея в следующем!
0. Создать на диске
C:\temp\AD\ папку
data1 и
data21. Необходимо открыть 2 окна графика разных инструментов с одинаковым таймфреймом.
2. На каждом графике открыть по одному индикатору
(разному!!!) пишущему данные графика в файлы. Это два индикатора
WriteData1 и
WriteData23. На первом графике добавить ещё один индикатор-пример
ReadDataIndicator для демонстрации чтения данных из файлов и рисования ShadowSerie свечек, поверх текущего графика.
В примере читаются обе папки данных, но выводится только данные от второго индикатора. Ничего не мешает делать любые расчеты с массивом Bar1 и Bar2, где хранятся данные в формате
индекс в массиве - описание
0 - Open
1 - High
2 - Low
3 - Close
4 - Volume
5 - VolumeBid
6 - VolumeAsk
7 - OpenInterest
В данном примере вообще запись и чтение Data1 в Bar1[] избыточное, т.е. можно обойтись просто данными от серии Input текущего графика и его инструмента + запись данных в файлы от второго графика индикатором WriteData2 для их последующего чтения в первом графике. Но если вдруг надо писать от разных графиков данные в папки, а обработку проводить в третьем графике, то такая возможность уже требуется \ пригодится. Тут главное идея и пример реализации чтения этих данных. Либо придумать самостоятельно собственный формат хранения и их считывания.
Код индикаторовКод: Выделить всё
function Initialize()
{
IndicatorName = "WriteData1";
PriceStudy = true;
AddInput("I", Inputs.Candle);
AddSeries("A");
}
function Evaluate()
{
string Path = "C:\\temp\\AD\\data1\\";
string FileName = String.Format("{0}-{1}-{2}-{3}-{4}-{5}",
BarDate().Year, BarDate().Month, BarDate().Day, BarTime().Hours, BarTime().Minutes, BarTime().Seconds);
string URL = Path + FileName;
ClearFile(URL);
WriteLine(URL, String.Format("{0};{1};{2};{3};{4};{5};{6};{7}", I.Open[0], I.High[0], I.Low[0], I.Close[0], I.Volume[0], I.VolumeBid[0], I.VolumeAsk[0], I.OpenInterest[0]));
}
Код: Выделить всё
function Initialize()
{
IndicatorName = "WriteData2";
PriceStudy = true;
AddInput("I", Inputs.Candle);
AddSeries("A");
}
function Evaluate()
{
string Path = "C:\\temp\\AD\\data2\\";
string FileName = String.Format("{0}-{1}-{2}-{3}-{4}-{5}",
BarDate().Year, BarDate().Month, BarDate().Day, BarTime().Hours, BarTime().Minutes, BarTime().Seconds);
string URL = Path + FileName;
ClearFile(URL);
WriteLine(URL, String.Format("{0};{1};{2};{3};{4};{5};{6};{7}", I.Open[0], I.High[0], I.Low[0], I.Close[0], I.Volume[0], I.VolumeBid[0], I.VolumeAsk[0], I.OpenInterest[0]));
}
Код: Выделить всё
function Initialize()
{
IndicatorName = "ReadDataIndicator";
PriceStudy = true;
AddInput("I", Inputs.Candle);
AddShadowSeries("Open", DrawAs.Custom, Color.Green, 100);
AddShadowSeries("High", DrawAs.Custom, Color.Black, 100);
AddShadowSeries("Low", DrawAs.Custom, Color.Black, 100);
AddShadowSeries("Close", DrawAs.Custom, Color.Red, 100);
}
function Evaluate()
{
var Path1 = "C:\\temp\\AD\\data1\\";
var Path2 = "C:\\temp\\AD\\data2\\";
var FileName = String.Format("{0}-{1}-{2}-{3}-{4}-{5}",
BarDate().Year, BarDate().Month, BarDate().Day, BarTime().Hours, BarTime().Minutes, BarTime().Seconds);
var URL1 = Path1 + FileName;
var URL2 = Path2 + FileName;
string S1 = "";
if (System.IO.File.Exists(URL1))
{
System.IO.StreamReader output1 = new System.IO.StreamReader(URL1);
while (!output1.EndOfStream)
{
S1 += output1.ReadLine();
}
output1.Close();
}
string S2 = "";
if (System.IO.File.Exists(URL2))
{
System.IO.StreamReader output2 = new System.IO.StreamReader(URL2);
while (!output2.EndOfStream)
{
S2 += output2.ReadLine();
}
output2.Close();
}
string[] Bar1 = S1.Split(';');
string[] Bar2 = S2.Split(';');
if (Bar1.Count() > 3 && Bar2.Count() > 3)
{
Open = double.Parse(Bar2[0]);
High = double.Parse(Bar2[1]);
Low = double.Parse(Bar2[2]);
Close = double.Parse(Bar2[3]);
if (Close > Open)
{
Open.DrawHistogram(Close);
High.DrawVertical(Close);
Low.DrawVertical(Open);
}
else
{
if (Close[0] == Open[0]) Close.DrawDash(Colors["High"], LineStyles.Solid, 1,0);
else Close.DrawHistogram(Open);
High.DrawVertical(Open);
Low.DrawVertical(Close);
}
} // count > 3
}