Как наложить индикатор Level Sensor на Ticks?

 
Есть Ticks2,который рисует тиковый график и есть Level Sensor,который рисует профиль рынка.

Хочу чтоб Level Sensor брал данные для построения с тикового графика. Посоветуйте как скрестить эти индюки...
Вот их коды:
//+------------------------------------------------------------------+
//|                                                        Ticks.mq4 |
//|                                                       MetaQuotes |
//|                    http://www.alpari-idc.ru/ru/experts/articles/ |
//+------------------------------------------------------------------+
#property copyright "Rosh"
#property link      "http://www.alpari-idc.ru/ru/experts/articles/"
 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Navy
//---- buffers
extern int MaxDrawTicks=500;
double ExtMapBuffer1[];
int myBars;
int tickCounter;
int delimeterCounter;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0, ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   Print("Обнуляем тики");
   for (int i=Bars-1;i>=0;i--) ExtMapBuffer1[i]=0.0;
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| сдвинем массив                                                   |
//+------------------------------------------------------------------+
void SetDelimeter()
  {
//----
   string delimeterDate=TimeToStr(Time[0]);
   if (myBars!=0)
      {
      Print("Ставим разделитель");      
      int handle=WindowFind("Ticks-2");
      if(!ObjectCreate(delimeterDate,OBJ_VLINE,handle,Time[0],0))
         {
         Alert("Недачная попытка создания разделителя в окне ",
         handle," по времени ",TimeToStr(CurTime()));
         Print("Ошибка №",GetLastError(),", имя разделителя ",delimeterDate);
         }
      else 
         {
         ObjectSet(delimeterDate,OBJPROP_COLOR,DarkGreen);
         ObjectSet(delimeterDate,OBJPROP_STYLE,STYLE_DASHDOT);
         ObjectsRedraw();
         }
      }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| сдвинем массив                                                   |
//+------------------------------------------------------------------+
void ShiftArray()
  {
//----
   int V_lines;
   string delimeterName;
   datetime firstTime;
   int BarFirstTime;
   
   if (tickCounter>2*MaxDrawTicks)
      {
      for (int i=tickCounter;i>=MaxDrawTicks;i--) ExtMapBuffer1[i]=0.0;
      tickCounter=MaxDrawTicks;
      }
   for(int cnt=tickCounter;cnt>0;cnt--)
      {
      ExtMapBuffer1[cnt]=ExtMapBuffer1[cnt-1];
      }
   V_lines=ObjectsTotal();
   for (int z=0;z<V_lines;z++)
      {
      delimeterName=ObjectName(z); 
      if (ObjectFind(delimeterName)!=-1)
         {
         if (ObjectType(delimeterName)==OBJ_VLINE) 
            {
            firstTime=ObjectGet(delimeterName,OBJPROP_TIME1);
            BarFirstTime=iBarShift(NULL,0,firstTime);
            if (BarFirstTime>MaxDrawTicks) ObjectDelete(delimeterName);// разделитель ушел дальше
            else                                                       // чем  MaxDrawTicks
               {  // если удалять не нужно - двигаем          
               firstTime=Time[BarFirstTime+1];
               ObjectSet(delimeterName,OBJPROP_TIME1,firstTime); 
               }
            }
         }       
      }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| признак нового бара                                              |
//+------------------------------------------------------------------+
bool isNewBar()
  {
//----
   bool res=false;
   if (myBars!=Bars)
      {
      res=true;
      myBars=Bars;
      }   
//----
   return(res);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
//----
   if (isNewBar())
      {
      // установить разделитель
      tickCounter++;
      SetDelimeter();
      ExtMapBuffer1[0]=Bid;      
      }
   else
      
      {
      tickCounter++;
      ShiftArray();
      ExtMapBuffer1[0]=Bid;      
         int handleTicks=WindowFind("Ticks-2");// ищем окно индикатора 
   if (handleTicks!=-1)
      {
      if (ObjectFind("bidLINE")!=-1) // нашли горизонтальную линию с именем bidLINE
         {
         if (ObjectType("bidLINE")==OBJ_HLINE) ObjectSet("bidLINE",OBJPROP_PRICE1,Bid); 
         }
      else //не нашли горизонтальную линию с именем bidLINE , создадим eё
         {
         if(!ObjectCreate("bidLINE",OBJ_HLINE,handleTicks,0,Bid))
            {
            Alert("Недачная попытка создания линии Bid в окне ",
            handleTicks," по цене ",Bid);
            Print("Ошибка №",GetLastError());
            }
         else 
            {
            ObjectSet("bidLINE",OBJPROP_COLOR,Gray);
            ObjectSet("bidLINE",OBJPROP_STYLE,STYLE_SOLID);
            ObjectsRedraw();
            }
         }   
      }
 
      }      
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                 Level Sensor.mq4 |
//|                                          Copyright © 2005, Sfen. |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Sfen"
#property indicator_chart_window
// input parameters
extern int MAX_HISTORY = 500;
extern int STEP = 1;
//----
string OBJECT_PREFIX = "LEVELS";
int ObjectId = 0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double CSH(int shift)
  {
   return (MathMax(Open[shift], Close[shift]));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double CSL(int shift)
  {
   return (MathMin(Open[shift],Close[shift]));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string IntToStr(int X)
  {
    return (DoubleToStr(X, 0));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string ObGetUniqueName(string Prefix)
  {
   ObjectId++;
   return (Prefix+" "+IntToStr(ObjectId));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ObDeleteObjectsByPrefix(string Prefix)
  {
   int L = StringLen(Prefix);
   int i = 0; 
   while(i < ObjectsTotal())
     {
       string ObjName = ObjectName(i);
       if(StringSubstr(ObjName, 0, L) != Prefix) 
         { 
           i++; 
           continue;
         }
       ObjectDelete(ObjName);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   ObDeleteObjectsByPrefix(OBJECT_PREFIX);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   string S;
   ObDeleteObjectsByPrefix(OBJECT_PREFIX);
   double HH = 0;
   double LL = 1000000;
   int History = MathMin(Bars,MAX_HISTORY);
   int i, j, k;
   for(i = 1; i < History; i++)
     {
       HH = MathMax(HH, CSH(i));
       LL = MathMin(LL, CSL(i));
     }
   int NumberOfPoints = (HH - LL) / (1.0*Point*STEP) + 1;
   int Count[];
   ArrayResize(Count, NumberOfPoints);
   for(i = 0; i < NumberOfPoints; i++) 
       Count[i] = 0;
   for(i = 1; i < History; i++)
     {
       double C = CSL(i);
       while(C < CSH(i))
         {
           int Index = (C-LL) / (1.0*Point*STEP);
           Count[Index]++;    
           C += 1.0*Point*STEP;
         }
     }
   for(i = 0; i < NumberOfPoints; i++)
     {
       double StartX = Time[5];
       double StartY = LL + 1.0*Point*STEP*i;
       double EndX   = Time[5+Count[i]];
       double EndY   = StartY;
       string ObjName = ObGetUniqueName(OBJECT_PREFIX);
       ObjectDelete(ObjName);
       ObjectCreate(ObjName, OBJ_TREND, 0, StartX, StartY, EndX, EndY);
       ObjectSet(ObjName, OBJPROP_RAY, 0);
       ObjectSet(ObjName, OBJPROP_COLOR, Red);
     }
   return(0);
  }
//+------------------------------------------------------------------+
 
Извените , может не по теме...а можно ещё в индикаторе " Level Sensor " сдвинуть вправо отображение индикатора или ввести такую опцию. ..а то он накладывается на график и очень мешает в контроле за другими индикаторами...Заранее благодарен за помощь...
 
ITOGO писал (а):

Хочу чтоб Level Sensor брал данные для построения с тикового графика. Посоветуйте как скрестить эти индюки...
Вариант 1: Взять и скрестить.
Вариант 2: Заплатить программисту, и "случку" произведет он.
Вариант 3: Подождать, может быть найдется кто-то кому нечего делать.
 
Lord_Shadows:
Извените , может не по теме...а можно ещё в индикаторе " Level Sensor " сдвинуть вправо отображение индикатора или ввести такую опцию. ..а то он накладывается на график и очень мешает в контроле за другими индикаторами...Заранее благодарен за помощь...
можна добавить строчку:
ObjectCreate(ObjName, OBJ_TREND, 0, StartX, StartY, EndX, EndY);
       ObjectSet(ObjName, OBJPROP_RAY, 0);
       ObjectSet(ObjName, OBJPROP_COLOR, Red);
       ObjectSet(ObjName, OBJPROP_BACK, 1); 
индикатор будет рисоватся в фоновом режиме,то есть график и др.индикаторы будут всегда сверху...
 
Integer:
ITOGO писал (а):

Хочу чтоб Level Sensor брал данные для построения с тикового графика. Посоветуйте как скрестить эти индюки...
Вариант 1: Взять и скрестить.
Вариант 2: Заплатить программисту, и "случку" произведет он.
Вариант 3: Подождать, может быть найдется кто-то кому нечего делать.
спасибо за варианты,наверное после недельной медитации над этими кодами я постигну их суть и смогу скрестить:)
 
ITOGO  спасибо за помощь...так и впрямь лучше...вот бы ещё и сдвинуть его вправо от первого бара вот было бы очень удобно...Буду благодарен за помощь в этом.
 
Lord_Shadows:
ITOGO спасибо за помощь...так и впрямь лучше...вот бы ещё и сдвинуть его вправо от первого бара вот было бы очень удобно...Буду благодарен за помощь в этом.
Вот и сдвиг вправо.В свойствах индикатора параметр SDVIG,он указывает сдвиг в барах.

//+------------------------------------------------------------------+
//|                                                 Level Sensor.mq4 |
//|                                          Copyright © 2005, Sfen. |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Sfen"
#property indicator_chart_window
// input parameters
extern int MAX_HISTORY = 500;
extern int STEP = 1;
extern double SDVIG=18;
//----
string OBJECT_PREFIX = "LEVELS";
int ObjectId = 0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double CSH(int shift)
  {
   return (MathMax(Open[shift], Close[shift]));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double CSL(int shift)
  {
   return (MathMin(Open[shift],Close[shift]));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string IntToStr(int X)
  {
    return (DoubleToStr(X, 0));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string ObGetUniqueName(string Prefix)
  {
   ObjectId++;
   return (Prefix+" "+IntToStr(ObjectId));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ObDeleteObjectsByPrefix(string Prefix)
  {
   int L = StringLen(Prefix);
   int i = 0; 
   while(i < ObjectsTotal())
     {
       string ObjName = ObjectName(i);
       if(StringSubstr(ObjName, 0, L) != Prefix) 
         { 
           i++; 
           continue;
         }
       ObjectDelete(ObjName);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   ObDeleteObjectsByPrefix(OBJECT_PREFIX);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
  
   string S;
   ObDeleteObjectsByPrefix(OBJECT_PREFIX);
   double HH = 0;
   double LL = 1000000;
   int History = MathMin(Bars,MAX_HISTORY);
   int i, j, k;
   for(i = 1; i < History; i++)
     {
       HH = MathMax(HH, CSH(i));
       LL = MathMin(LL, CSL(i));
     }
   int NumberOfPoints = (HH - LL) / (1.0*Point*STEP) + 1;
   int Count[];
   ArrayResize(Count, NumberOfPoints);
   for(i = 0; i < NumberOfPoints; i++) 
       Count[i] = 0;
   for(i = 1; i < History; i++)
     {
       double C = CSL(i);
       while(C < CSH(i))
         {
           int Index = (C-LL) / (1.0*Point*STEP);
           Count[Index]++;    
           C += 1.0*Point*STEP;
         }
     }
   for(i = 0; i < NumberOfPoints; i++)
     {
       double StartX = Time[0]+SDVIG*Period()*60;
       double StartY = LL + 1.0*Point*STEP*i;
       double EndX   = (Time[0+Count[i]]+SDVIG*Period()*60);
       double EndY   = StartY;
       string ObjName = ObGetUniqueName(OBJECT_PREFIX);
       ObjectDelete(ObjName);
       ObjectCreate(ObjName, OBJ_TREND, 0, StartX, StartY, EndX, EndY);
       ObjectSet(ObjName, OBJPROP_RAY, 0);
       ObjectSet(ObjName, OBJPROP_COLOR, Red);
       ObjectSet(ObjName, OBJPROP_BACK, 1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
 
ITOGO

Класс , спасибо тебе за это усовершенствование...теперь не надо будет держать отдельно график под него а можно совмещать...Я вот тоже постигаю науку о построении своих индикаторов, но пока успехов не много...А такие как Integer  просто прикалываются над нами неумехами. Буду рад за тебя , если кто-то всё же совместит тиковый и Level Sensor и выложит сюда (у НИХ-то наверняка такое есть...ведь это самый верный способ оценивать рынок). ещё раз спасибо.
 
Lord_Shadows:
А такие как Integer просто прикалываются над нами неумехами.
Вы не совсем правильно поняли ситуацию! Integer просто концентрированно выразил абсолютно стандартную реакцию человека, читающего определённое время этот форум, на первый пост.
Просто ему было не лень написать эту шутку, которую вы не поняли ;o).

На самом деле одна ситуация когда человек что-то самостоятельно делает, но у него какая-то деталь не получается и он задаёт конкретный вопрос здесь на форуме по решению какой-то проблемы и как правило ему стараются помочь её решить. И совершенно другая ситуация когда кидаются коды индюков "для скрещивания" или ещё хлеще просто пишутся "словесные пожелания" того чего нужно человеку, а потом наступает недоумение автора в том что ему никто не хочет помочь. В этом смысле он под помощью подразумевает бесплатное выполнение отнюдь совсем не пятиминутной работы другим человеком. Просто поставьте себя на место людей, которые в состоянии её сделать, но не имеют бесконечного личного время чтобы просто так им раскидываться, не видя конечного смысла в этом (а в представленных индикаторах никто смысла пока что не разглядел). В таком случае перечитайте ещё раз 3й пункт:
Вариант 3: Подождать, может быть найдется кто-то кому нечего делать.
В некоторых случаях такое здесь тоже прокатывает. Остаётся всего лишь просто подождать.
 
solandr

Спасибо за разьяснение ситуации...И отдельное большое спасибо за помощь в моей ситуации.

p.s.   для    Integer  
 если я был не прав и  ваши ответы зависят от ситуации ...приношу свои извенения.
Причина обращения: