Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Как протестировать программу перед покупкой?
darkozoid
9
darkozoid 2013.02.17 20:10 

Доброй ночи товарищи. Подскажите пожалуйста:

Написал индикатор (ну попытался во всяком случае)

засунул его на график в тестере, а он, зараза, рисует все как надо, но только 1 раз, а потом не реагирует на новые свечи...

суть индюка простая, ищем фракталы и соединяем их линией... (учу mql) 

//--------------------------------------------------------------------
#property indicator_chart_window    // Индик. рисуется в основном окне
#property indicator_buffers 2       // Количество буферов
#property indicator_color1 Blue     // Цвет первой линии
#property indicator_color2 Red      // Цвет второй линии


double up[], dow[];             // Открытие индикаторных массивов
//--------------------------------------------------------------------
int init()                          // Специальная функция init()
  {
//--------------------------------------------------------------------

   //---- 2 распределенных буфера индикатора
    SetIndexBuffer(0,up);
    SetIndexStyle(0,DRAW_ARROW);
    SetIndexArrow(0,217);
    SetIndexLabel(0,"Fractal Up");
    SetIndexBuffer(1,dow);
    SetIndexStyle(1,DRAW_ARROW);
    SetIndexArrow(1,218);
    SetIndexLabel(1,"Fractal Down");
   //---- инициализация сделана
//--------------------------------------------------------------------
   return;                          // Выход из спец. ф-ии init()
  }
//--------------------------------------------------------------------
int start()                         // Специальная функция start()
  {
   int i,                           // Индекс бара
       Counted_bars;                // Количество просчитанных баров 
//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Количество просчитанных баров 
   i=Bars-Counted_bars-1;           // Индекс первого непосчитанного
   int ind1, ind2;
   while(i>=0)                      // Цикл по непосчитанным барам
     {
      if(High[i-2]>=High[i-1] && High[i-2]>High[i] && High[i-2]>High[i-3] && High[i-2]>High[i-4]){
      up[i-2]=High[i-2]+0.0005;
      ind1=i-2;
      }
      if(Low[i-2]<=Low[i-1] && Low[i-2]<Low[i] && Low[i-2]<Low[i-3] && Low[i-2]<Low[i-4]){
      dow[i-2]=Low[i-2]-0.0005;
      ind2=i-2;
      }
      i--;                          // Расчёт индекса следующего бара
     }
   datetime T1=Time[ind1];         // Определение 1 коорд времени
   datetime T2=Time[ind2];         // Определение 2 коорд времени
   if(ind1>ind2){ObjectCreate("ray",OBJ_TREND,0,T1,High[ind1],T2,Low[ind2]);}
   if(ind1<ind2){ObjectCreate("ray",OBJ_TREND,0,T2,Low[ind2],T1,High[ind1]);}
   ObjectSet(   "ray", OBJPROP_COLOR, Red);    // Цвет
   ObjectSet(   "ray", OBJPROP_RAY,   true);     // Луч
   ObjectSet(   "ray", OBJPROP_STYLE, STYLE_SOLID);// Стиль
   WindowRedraw();                     // Перерисовка изображения 
//--------------------------------------------------------------------
   return;                          // Выход из спец. ф-ии start()
  }
  int deinit()                           // Спец. функция deinit
   {
   ObjectDelete("ray");     // Удаление объекта
   return;                             // Выход из deinit()
   }
//--------------------------------------------------------------------
Alekseu Fedotov
723
Alekseu Fedotov 2013.02.17 20:53  
darkozoid:

Доброй ночи товарищи. Подскажите пожалуйста:

Написал индикатор (ну попытался во всяком случае)

засунул его на график в тестере, а он, зараза, рисует все как надо, но только 1 раз, а потом не реагирует на новые свечи...

суть индюка простая, ищем фракталы и соединяем их линией... (учу mql) 

 

Здесь по теме 

Boris
3883
Boris 2013.02.17 21:44  
Вы должны удалять все объекты по правилу (см. в Доке), которые создали, не просто "ray" и всё, когда приходят условия для создания новых объектов. Это я так думаю на первый взгляд.
Mislaid
557
Mislaid 2013.02.18 04:57  
   i=MathMax( 5, Bars-Counted_bars-1);           // Индекс первого непосчитанного
   int ind1, ind2;
   while(i>4)                      // Цикл по непосчитанным барам

Для фракталов как-то так.

Чтобы рисовались еще и линии, то надо организовывать цикл while с возрастающим значением i, от i=5. Выход из цикла, когда ind1, ind2 получат значения. Например, так:

i = 5; ind1=0; ind2=0;
while (ind1<1 && ind2<1)                      // Цикл по непосчитанным барам
{
   ...
   i++;                          // Расчёт индекса следующего бара
}
darkozoid
9
darkozoid 2013.02.18 07:12  
Спасибо всем за помощь, теперь буду разбираться) 
Sceptic Philozoff
Модератор
17849
Sceptic Philozoff 2013.02.23 18:42  
Подправил название темы. Желательно, чтобы оно было содержательным.
Dmitry Fedoseev
41203
Dmitry Fedoseev 2013.02.23 19:08  
      if(High[i-2]>=High[i-1] && High[i-2]>High[i] && High[i-2]>High[i-3] && High[i-2]>High[i-4]){
      up[i-2]=High[i-2]+0.0005;
      ind1=i-2;
      }
      if(Low[i-2]<=Low[i-1] && Low[i-2]<Low[i] && Low[i-2]<Low[i-3] && Low[i-2]<Low[i-4]){
      dow[i-2]=Low[i-2]-0.0005;
      ind2=i-2;

Не должно быть здесь всех этих минусов, должны быть плюсы.

Цикл до нуля

while(i>=0)   

используется формирующийся бар  High[i], Low[i] и запоминается индекс ind2=i-2;, как будто оно все состоялось, а может ведь исчезнуть. К тому же индексы менятся с появлением новых баров, нужно не индексы запоминать, а время. 

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий