Пользовательские индикаторы > FractalsMTF - отображение фракталов старшего таймфрейма на младшем
Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем
попробую сделать , надеюсь вы поправите ошибки
Хотя не уверен конечно. что у меня это вообще получится - сделать такую оболочку, в которую можно было бы подставлять свой MY.индикатор и получать сигналы индикатора из вышестоящего ТФ в нижестоящем
Так-то необходимость в ней есть давно и не мне одному это нужно судя по интересу к этой оболочке:)
Вот к примеру BarFrame не имеет такой возможности
Хотя не уверен конечно. что у меня это вообще получится - сделать такую оболочку, в которую можно было бы подставлять свой MY.индикатор и получать сигналы индикатора из вышестоящего ТФ в нижестоящем
Так-то необходимость в ней есть давно и не мне одному это нужно судя по интересу к этой оболочке:)
Вот к примеру BarFrame не имеет такой возможности
Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем
Евгений, Алексей, смотрите вроде как все просто. Разве не так?
Код: Выделить всё
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;
}
}
Последний раз редактировалось Den 09 ноя 2017, 22:01, всего редактировалось 1 раз.
Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем
без FRACTALS_II, просто MY.индикатор на S3
Последний раз редактировалось Den 09 ноя 2017, 22:05, всего редактировалось 3 раза.
Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем
MY.индикатор вставлен в FRACTALS_II
MY. не фрактальный
MY. не фрактальный
-
- Сообщения: 36
- Зарегистрирован: 27 мар 2016, 22:16
- Благодарил (а): 9 раз
Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем
Одно время пользовался пользовался вот таким макаром:
на старшим ТФ расчитывал инд-р и сохранял в файле
на младшем ТФ считывал значения и выводил на график
Выглядело это так:
на старшим ТФ расчитывал инд-р и сохранял в файле
Код: Выделить всё
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);
}
Выглядело это так:
-
- Сообщения: 36
- Зарегистрирован: 27 мар 2016, 22:16
- Благодарил (а): 9 раз
Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем
Костыли конечно, зато просто.
Только есть большие недостатки:
значения на малом ТФ актуальны только на последнем баре старшего ТФ
для каждого инструмента надо открывать два окна
не работает с роботами
...
может кому пригодится в качестве идеи
Только есть большие недостатки:
значения на малом ТФ актуальны только на последнем баре старшего ТФ
для каждого инструмента надо открывать два окна
не работает с роботами
...
может кому пригодится в качестве идеи
Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем
Смысл всех этих движений - обойти существующий пока что запрет на исполнение внутри бара.
Например,чтобы запустить робота на секундах, который будет получать сигналы серий из старшего ТФ.
Например,чтобы запустить робота на секундах, который будет получать сигналы серий из старшего ТФ.
Последний раз редактировалось Den 24 ноя 2017, 14:18, всего редактировалось 1 раз.
Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем
Индикатор , который чуть подправлен выше все равно выдает с фрактальной задержкой, хотя мой индикатор выставляет сигналы без задержки (на линии LAST)
Тут необходимо то, что писал Евгений
заменить на
Евгений, так может напишете оболочку для того,чтобы читались серии MY.индикатора старшего ТФ при рабочем младшем?
Тут необходимо то, что писал Евгений
Передавать данные, в т.ч. и значения серий индикаторов, между ТФ можно с помощью 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.индикатора старшего ТФ при рабочем младшем?
- evge
- Администратор
- Сообщения: 1811
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем
Сделал видео-пример.
Получаем от часового таймфрейма EMA и SMA (для примера, можно что угодно) и выводим на 5 минутном таймфрейме.
неудобство одно, если вдруг сменили параметры для наших индикаторов, то историю сохраненную в папку DataSlot надо почистить, т.к. перезапись данных там не производится, заполнится она так же быстро. Подвигали график или он изменился и данные опять будут, уже с новыми параметрами.
Получаем от часового таймфрейма EMA и SMA (для примера, можно что угодно) и выводим на 5 минутном таймфрейме.
phpBB [media]
неудобство одно, если вдруг сменили параметры для наших индикаторов, то историю сохраненную в папку DataSlot надо почистить, т.к. перезапись данных там не производится, заполнится она так же быстро. Подвигали график или он изменился и данные опять будут, уже с новыми параметрами.
никогда такого не было и вот опять
- evge
- Администратор
- Сообщения: 1811
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем
Индикаторы из видео
никогда такого не было и вот опять
Вернуться в «Пользовательские индикаторы»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 9 гостей