Пользовательские индикаторы > FractalsMTF - отображение фракталов старшего таймфрейма на младшем

Дополнительные индикаторы от пользователей Альфа-Директ 4. Готовые решения от пользователей.
Аватара пользователя
Den
Сообщения: 345
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 14 раз
Поблагодарили: 4 раза

Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем

Непрочитанное сообщение Den » 09 ноя 2017, 15:41

попробую сделать , надеюсь вы поправите ошибки :)

Хотя не уверен конечно. что у меня это вообще получится - сделать такую оболочку, в которую можно было бы подставлять свой MY.индикатор и получать сигналы индикатора из вышестоящего ТФ в нижестоящем

Так-то необходимость в ней есть давно и не мне одному это нужно судя по интересу к этой оболочке:)

Вот к примеру BarFrame не имеет такой возможности

Аватара пользователя
Den
Сообщения: 345
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 14 раз
Поблагодарили: 4 раза

Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем

Непрочитанное сообщение Den » 09 ноя 2017, 21:41

Евгений, Алексей, смотрите вроде как все просто. Разве не так?

Код: Выделить всё

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 раз.

Аватара пользователя
Den
Сообщения: 345
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 14 раз
Поблагодарили: 4 раза

Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем

Непрочитанное сообщение Den » 09 ноя 2017, 21:46

без FRACTALS_II, просто MY.индикатор на S3
Вложения
FRACTALS.png
Последний раз редактировалось Den 09 ноя 2017, 22:05, всего редактировалось 3 раза.

Аватара пользователя
Den
Сообщения: 345
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 14 раз
Поблагодарили: 4 раза

Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем

Непрочитанное сообщение Den » 09 ноя 2017, 21:47

MY.индикатор вставлен в FRACTALS_II
MY. не фрактальный
Вложения
FRACTALS_II.png

Владимир Валерьевич
Сообщения: 36
Зарегистрирован: 27 мар 2016, 22:16
Благодарил (а): 9 раз

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);
}


Выглядело это так:
111.jpg

Владимир Валерьевич
Сообщения: 36
Зарегистрирован: 27 мар 2016, 22:16
Благодарил (а): 9 раз

Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем

Непрочитанное сообщение Владимир Валерьевич » 23 ноя 2017, 22:50

Костыли конечно, зато просто.
Только есть большие недостатки:
значения на малом ТФ актуальны только на последнем баре старшего ТФ
для каждого инструмента надо открывать два окна
не работает с роботами :(
...
может кому пригодится в качестве идеи

Аватара пользователя
Den
Сообщения: 345
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 14 раз
Поблагодарили: 4 раза

Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем

Непрочитанное сообщение Den » 24 ноя 2017, 03:47

Смысл всех этих движений - обойти существующий пока что запрет на исполнение внутри бара.
Например,чтобы запустить робота на секундах, который будет получать сигналы серий из старшего ТФ.
Последний раз редактировалось Den 24 ноя 2017, 14:18, всего редактировалось 1 раз.

Аватара пользователя
Den
Сообщения: 345
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 14 раз
Поблагодарили: 4 раза

Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем

Непрочитанное сообщение Den » 24 ноя 2017, 12:17

Индикатор , который чуть подправлен выше все равно выдает с фрактальной задержкой, хотя мой индикатор выставляет сигналы без задержки (на линии 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.индикатора старшего ТФ при рабочем младшем?

Аватара пользователя
evge
Администратор
Сообщения: 1652
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 303 раза
Контактная информация:

Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем

Непрочитанное сообщение evge » 24 ноя 2017, 15:31

Сделал видео-пример.

Получаем от часового таймфрейма EMA и SMA (для примера, можно что угодно) и выводим на 5 минутном таймфрейме.

phpBB [media]


неудобство одно, если вдруг сменили параметры для наших индикаторов, то историю сохраненную в папку DataSlot надо почистить, т.к. перезапись данных там не производится, заполнится она так же быстро. Подвигали график или он изменился и данные опять будут, уже с новыми параметрами.
никогда такого не было и вот опять

Аватара пользователя
evge
Администратор
Сообщения: 1652
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 303 раза
Контактная информация:

Re: FractalsMTF - отображение фракталов старшего таймфрейма на младшем

Непрочитанное сообщение evge » 24 ноя 2017, 15:44

Индикаторы из видео

никогда такого не было и вот опять


Вернуться в «Пользовательские индикаторы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость