Страница 2 из 12
Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем
Добавлено: 09 ноя 2017, 15:41
Den
попробую сделать , надеюсь вы поправите ошибки
Хотя не уверен конечно. что у меня это вообще получится - сделать такую оболочку, в которую можно было бы подставлять свой MY.индикатор и получать сигналы индикатора из вышестоящего ТФ в нижестоящем
Так-то необходимость в ней есть давно и не мне одному это нужно судя по интересу к этой оболочке:)
Вот к примеру BarFrame не имеет такой возможности
Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем
Добавлено: 09 ноя 2017, 21:41
Den
Евгений, Алексей, смотрите вроде как все просто. Разве не так?
Код: Выделить всё
function Initialize()
{
IndicatorName = "FRACTALS_II";
PriceStudy = true;
AddInput("Input", Inputs.Candle);
AddSeries("UpFractal", DrawAs.Custom, Color.Red);
AddSeries("DownFractal", DrawAs.Custom, Color.Green);
//
AddParameter("TypeOfPeriod", 1); // 0 - Seconds, 1 - Minutes, 2 - Hours, 3 - Day, 4 - Week, 5 - Month
AddParameter("PeriodLength", 5); // Period length for period types 0, 1, 2
AddParameter("VerticalShift", 0.0); // Vertical shift of the arrows
//
AddGlobalVariable("Init", Types.Boolean, false);
AddGlobalVariable("Check", Types.Boolean, true);
AddGlobalVariable("PrevInd", Types.Int, 0);
AddGlobalVariable("IsNewBar", Types.Boolean, false);
AddGlobalVariable("GlVar", Types.Int, -1);
//
AddGlobalVariable("HighSeries", Types.DoubleList);
AddGlobalVariable("HighIndSeries", Types.IntList);
AddGlobalVariable("LowSeries", Types.DoubleList);
AddGlobalVariable("LowIndSeries", Types.IntList);
AddGlobalVariable("CircleInd", Types.Int, 0);
}
function Evaluate()
{
var lastLVal = MY.индикатор(Input, 0, 0, 0).GetLastValues ("L", 1)[0];
var lastHVal = MY.индикатор(Input, 0, 0, 0).GetLastValues ("H", 1)[0];
if(!Init)
{
if(CurrentIndex < 15 || Check == false) return;
if(!(TypeOfPeriod == 0 || TypeOfPeriod == 1 || TypeOfPeriod == 2 || TypeOfPeriod == 3 || TypeOfPeriod == 4 || TypeOfPeriod == 5))
{
ShowMessage("FractalsMTF: Wrong period type value! Do the correction and proceed...");
Check = false;
return;
}
if(TypeOfPeriod == 0 || TypeOfPeriod == 1)
{
if(!(PeriodLength == 1 || PeriodLength == 2 || PeriodLength == 3 || PeriodLength == 4 || PeriodLength == 5 || PeriodLength == 6 ||
PeriodLength == 10 || PeriodLength == 12 || PeriodLength == 15 || PeriodLength == 20 || PeriodLength == 30))
{
ShowMessage("FractalsMTF: Wrong period length value! Do the correction and proceed...");
Check = false;
return;
}
}
else if(TypeOfPeriod == 2)
{
if(!(PeriodLength == 1 || PeriodLength == 2 || PeriodLength == 3 || PeriodLength == 4 || PeriodLength == 6 || PeriodLength == 8 || PeriodLength == 12))
{
ShowMessage("FractalsMTF: Wrong period length value! Do the correction and proceed...");
Check = false;
return;
}
}
int interval = Int32.MaxValue;
for(int i = 0; i > -15; i--)
{
int checkingInterval = (int)((BarDate(i) + BarTime(i)) - (BarDate(i-1) + BarTime(i-1))).TotalSeconds;
if(interval > checkingInterval) interval = checkingInterval;
}
if(TypeOfPeriod == 0)
{
if((PeriodLength % interval != 0 && PeriodLength >= interval) || PeriodLength < interval)
{
Check = false;
return;
}
}
else if(TypeOfPeriod == 1 && interval > 30)
{
interval = interval / 60;
if((PeriodLength % interval != 0 && PeriodLength >= interval) || PeriodLength < interval)
{
Check = false;
return;
}
}
else if(TypeOfPeriod == 2 && interval > 1800)
{
interval = interval / 3600;
if((PeriodLength % interval != 0 && PeriodLength >= interval) || PeriodLength < interval)
{
Check = false;
return;
}
}
else if(TypeOfPeriod == 3 && interval > 86400)
{
Check = false;
return;
}
else if(TypeOfPeriod == 4 && interval > 604800)
{
Check = false;
return;
}
for(int i = 0; i < 5; i++)
{
HighSeries.Add(Double.MaxValue);
HighIndSeries.Add(0);
LowSeries.Add(Double.MinValue);
LowIndSeries.Add(0);
}
VerticalShift = Math.Abs(VerticalShift);
Init = true;
}
else if(PrevInd != CurrentIndex)
{
if(HighSeries[CircleInd] <= Input.High[1] + VerticalShift)
{
HighSeries[CircleInd] = Input.High[1] + VerticalShift;
HighIndSeries[CircleInd] = PrevInd;
}
if(LowSeries[CircleInd] >= Input.Low[1] - VerticalShift)
{
LowSeries[CircleInd] = Input.Low[1] - VerticalShift;
LowIndSeries[CircleInd] = PrevInd;
}
DateTime BarDateTime = BarDate() + BarTime();
switch ((int)TypeOfPeriod)
{
case 0:
if(GlVar != (BarDateTime.Second / PeriodLength))
{
IsNewBar = true;
GlVar = (BarDateTime.Second / PeriodLength);
}
else
IsNewBar = false;
break;
case 1:
if(GlVar != (BarDateTime.Minute / PeriodLength))
{
IsNewBar = true;
GlVar = (BarDateTime.Minute / PeriodLength);
}
else
IsNewBar = false;
break;
case 2:
if(GlVar != (BarDateTime.Hour / PeriodLength))
{
IsNewBar = true;
GlVar = (BarDateTime.Hour / PeriodLength);
}
else
IsNewBar = false;
break;
case 3:
if(GlVar != BarDateTime.DayOfYear)
{
IsNewBar = true;
GlVar = BarDateTime.DayOfYear;
}
else
IsNewBar = false;
break;
case 4:
int weekNum = System.Globalization.CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(BarDateTime, 0, DayOfWeek.Monday);
if(GlVar != weekNum)
{
IsNewBar = true;
GlVar = weekNum;
}
else
IsNewBar = false;
break;
case 5:
if(GlVar != BarDateTime.Month)
{
IsNewBar = true;
GlVar = BarDateTime.Month;
}
else
IsNewBar = false;
break;
}
if(IsNewBar)
{
int ind = (CircleInd + 8) % 5;
if(HighSeries[ind] >= HighSeries[(CircleInd + 6) % 5] && HighSeries[ind] >= HighSeries[(CircleInd + 7) % 5] &&
HighSeries[ind] > HighSeries[(CircleInd + 9) % 5] && HighSeries[ind] > HighSeries[(CircleInd + 5) % 5])
{
UpFractal[HighIndSeries[ind] - CurrentIndex] = HighSeries[ind];
}
if(LowSeries[ind] <= LowSeries[(CircleInd + 6) % 5] && LowSeries[ind] <= LowSeries[(CircleInd + 7) % 5] &&
LowSeries[ind] < LowSeries[(CircleInd + 9) % 5] && LowSeries[ind] < LowSeries[(CircleInd + 5) % 5])
{
DownFractal[LowIndSeries[ind] - CurrentIndex] = LowSeries[ind];
}
if(++CircleInd > 4) CircleInd = 0;
HighSeries[CircleInd] = MY.индикатор(Input, 0, 0, 0).GetLastValues ("H", 1)[0].Y + VerticalShift;
HighIndSeries[CircleInd] = CurrentIndex;
LowSeries[CircleInd] = MY.индикатор(Input, 0, 0, 0).GetLastValues ("L", 1)[0].Y - VerticalShift;
LowIndSeries[CircleInd] = CurrentIndex;
}
UpFractal.DrawArrowDown(Color.Red, LineStyles.Solid, 10, Color.Red, 10);
DownFractal.DrawArrowUp(Color.Green, LineStyles.Solid, 10, Color.Green, 10);
PrevInd = CurrentIndex;
}
}
Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем
Добавлено: 09 ноя 2017, 21:46
Den
без FRACTALS_II, просто MY.индикатор на S3
Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем
Добавлено: 09 ноя 2017, 21:47
Den
MY.индикатор вставлен в FRACTALS_II
MY. не фрактальный
Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем
Добавлено: 23 ноя 2017, 22:42
Владимир Валерьевич
Одно время пользовался пользовался вот таким макаром:
на старшим ТФ расчитывал инд-р и сохранял в файле
Код: Выделить всё
function Initialize()
//индикатор НЕ формируется на текущем баре а вычисляется на предыдущем
{IndicatorName = "FrChImp";
PriceStudy = true; AddInput("Input", Inputs.Candle);
AddSeries("UpMd", DrawAs.Custom, Color.Gray); AddSeries("LwMd", DrawAs.Custom, Color.Gray);
AddParameter("FileName", 0);
}
function Evaluate()
{
// если есть фрактал вниз
if ( (Input.Low[-3]>Input.Low[-1]) && (Input.Low[-2]>Input.Low[-1]) ) LwMd[-1]=Input.Low[-1];
// если есть фрактал вверх
if ( (Input.High[-3]<Input.High[-1]) && (Input.High[-2]<Input.High[-1]) ) UpMd[-1]=Input.High[-1];
LwMd[0]=LwMd[-1]; UpMd[0]=UpMd[-1];
UpMd.DrawLine(Color.Brown, Line.Dot, 1); LwMd.DrawLine(Color.Teal, Line.Dot, 1);
//if ( MaxIndex != LastBarIndex)
//{
string fn="a"; if (FileName!=0) fn=@"D:\ADirect\Buf\"+Convert.ToString(FileName)+"B.txt";
string path = fn;
using (System.IO.StreamWriter sw = System.IO.File.CreateText(path))
{sw.WriteLine(UpMd);sw.WriteLine(LwMd);
sw.Close(); sw.Dispose();
}
//LastBarIndex = CurrentIndex; //запоминаем индекс текущего бара
//}
}
на младшем ТФ считывал значения и выводил на график
Код: Выделить всё
function Initialize()
{
// Область определения параметров индикатора
// Обязательные параметры:
IndicatorName = "FrChExp"; // Задайте название индикатора и сохраните с данным именем
PriceStudy = true; // Рисовать в области цены (true – да, false – нет)
AddInput("Input", Inputs.Candle); // Input - входной ряд (Inputs.Price) или свечи (Inputs.Candle)
AddSeries("P1", DrawAs.Custom, Color.Gray); AddSeries("P2", DrawAs.Custom, Color.Gray);
AddGlobalVariable("LastBarIndex", Types.Int, 0);
AddParameter("FileName", 11);
}
function Evaluate()
{ string fn="a"; if (FileName!=0) fn=@"D:\ADirect\Buf\"+Convert.ToString(FileName)+"B.txt";
string path = fn;
using (System.IO.StreamReader sr = System.IO.File.OpenText(path))
{ string s = "";
s = sr.ReadLine(); P1=Convert.ToDouble(s); s = sr.ReadLine(); P2=Convert.ToDouble(s);
sr.Close(); sr.Dispose();
}
P1.DrawLine(Color.Green,Line.DashSmall, 1); P2.DrawLine(Color.Red, Line.DashSmall, 1);
}
Выглядело это так:
Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем
Добавлено: 23 ноя 2017, 22:50
Владимир Валерьевич
Костыли конечно, зато просто.
Только есть большие недостатки:
значения на малом ТФ актуальны только на последнем баре старшего ТФ
для каждого инструмента надо открывать два окна
не работает с роботами
...
может кому пригодится в качестве идеи
Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем
Добавлено: 24 ноя 2017, 03:47
Den
Смысл всех этих движений - обойти существующий пока что запрет на исполнение внутри бара.
Например,чтобы запустить робота на секундах, который будет получать сигналы серий из старшего ТФ.
Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем
Добавлено: 24 ноя 2017, 12:17
Den
Индикатор , который чуть подправлен выше все равно выдает с фрактальной задержкой, хотя мой индикатор выставляет сигналы без задержки (на линии LAST)
Тут необходимо то, что писал Евгений
Передавать данные, в т.ч. и значения серий индикаторов, между ТФ можно с помощью WriteData, ReadData.Просто в коде чтения нужно подправить код, например:
Код: Выделить всё
var FileName = String.Format("{0}-{1}-{2}-{3}-{4}-{5}",
BarDate().Year, BarDate().Month, BarDate().Day, BarTime().Hours, BarTime().Minutes, BarTime().Seconds);
заменить на
Код: Выделить всё
var FileName = String.Format("{0}-{1}-{2}-{3}-{4}-{5}",
BarDate().Year, BarDate().Month, BarDate().Day, BarTime().Hours, 0, 0);
в итоге при таком изменении ReadData, чтение из слота данных будет производится только часового ТФ, хотя ТФ рабочий может быть, например, минутный.
Запишу как-нибудь видео-инструкцию как это делать.
Евгений, так может напишете оболочку для того,чтобы читались серии MY.индикатора старшего ТФ при рабочем младшем?
Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем
Добавлено: 24 ноя 2017, 15:31
evge
Сделал видео-пример.
Получаем от часового таймфрейма EMA и SMA (для примера, можно что угодно) и выводим на 5 минутном таймфрейме.
неудобство одно, если вдруг сменили параметры для наших индикаторов, то историю сохраненную в папку DataSlot надо почистить, т.к. перезапись данных там не производится, заполнится она так же быстро. Подвигали график или он изменился и данные опять будут, уже с новыми параметрами.
Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем
Добавлено: 24 ноя 2017, 15:44
evge