Нужна помощь. Изучаю MQL возникают вопросы. - страница 2

 
alsu:

Я ж не зря свои вопросы писал. При смене цвета вы не только должны скрыть те линии, которые не надо рисовать, но и открыть взад предыдущее и текущее значения той, которую надо рисовать. Иначе не получится линии (линия ведь состоит минимум из 2 точек).

Такой совет - для отладки сменить тип отрисовки на гистограмму DRAW_HISTOGRAM (она-то не зависит от сказанного выше), тогда, по крайней мере, будет видно, правильно ли заполняются буфера. После этого уже можно прорисовывать линиями.

С DRAW_HISTOGRAM действительно более наглядно, почему сам сразу не подумал?) Дополнительно перечитал статью о которой писал выше, некоторые моменты стали яснее. Продолжаю разбираться. Спасибо.
 
В этой версии стохастика решил добавить построение линий флета (на чарте)
по зонам перекупленности/перепроданности.
Возникла проблема с удалением "старых" линий с истории. Очередное, что не так

и на что нужно обратить внимание?

//| Stochastic_flat |

//|                                         Copyright © 2012 Fox.RM  |
//|                                               fox.rm@mail.ru     |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012 Fox.RM"
#property link      "fox.rm@mail.ru"

//----
#property indicator_separate_window
#property indicator_buffers 4

//---- fan style
#property indicator_color1 Red
#property indicator_color2 Black
#property indicator_color3 Blue
#property indicator_color4 DarkGray

#property indicator_style1 0
#property indicator_style2 0
#property indicator_style3 0
#property indicator_style4 0
#property indicator_width4 2
#property indicator_level1 88.2
#property indicator_level2 11.8
 
#property indicator_levelcolor DarkGray
#property indicator_levelstyle 0

//---- basic fan indicator parameters
extern bool Show_STOCH_1=true;
extern int K_period1=13;
extern int S_period1=1;
extern bool Show_STOCH_2=true;
extern int K_period2=34;
extern int S_period2=1;
extern bool Show_STOCH_3=true;
extern int K_period3=89;
extern int S_period3=1;
extern bool Show_STOCH_4=true;
extern int K_period4=233;
extern int S_period4=1;
extern int delete=2;

//---- indicator buffers
double MainBuffer1[];
double MainBuffer2[];
double MainBuffer3[];
double MainBuffer4[];


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

int init()
  {
//---- stochastic line 1 (fast)
   if(Show_STOCH_1 ==true){Show_STOCH_1=DRAW_LINE; }
   else 
    {Show_STOCH_1=DRAW_NONE; }
   SetIndexBuffer(0,MainBuffer1);
   SetIndexStyle(0,Show_STOCH_1,0);
   SetIndexLabel(0,"fast WPR  ( "+K_period1+" )");
   
//---- stochastic line 2 (basic)
   if(Show_STOCH_2 ==true){Show_STOCH_2=DRAW_LINE; }
   else 
    {Show_STOCH_2=DRAW_NONE; }
   SetIndexBuffer(1,MainBuffer2);
   SetIndexStyle(1,Show_STOCH_2);
   SetIndexLabel(1,"basic WPR ( "+K_period2+" )");
   
//---- stochastic line 3 (flat)
   if(Show_STOCH_3 ==true){Show_STOCH_3=DRAW_LINE; }
   else 
    {Show_STOCH_3=DRAW_NONE; }
   SetIndexBuffer(2,MainBuffer3);
   SetIndexStyle(2,Show_STOCH_3,0);
   SetIndexLabel(2,"slow WPR ( "+K_period3+" )");
   
//---- stochastic line 4 (control)
   if(Show_STOCH_4 ==true){Show_STOCH_4=DRAW_LINE; }
   else
    {Show_STOCH_4=DRAW_NONE; }
   SetIndexBuffer(3,MainBuffer4);
   SetIndexStyle(3,Show_STOCH_4,0,2);
   SetIndexLabel(3,"control WPR ( "+K_period4+" )");

   
//---- name for DataWindow and indicator subwindow label   
   IndicatorShortName("Stochastic_flat");
  }

//----
   return(0);

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+

int deinit()
  {
//---- 
   ObjectsDeleteAll();
//----
   return(0);
  }

//+------------------------------------------------------------------+
//| Stochastic_fan                                                   |
//+------------------------------------------------------------------+

int start()
  {
   int    i,shift,limit,y=0,counted_bars=IndicatorCounted();
   double x1,x2;
   datetime y1,y11,y2,y22;
//---- Plot defined timeframe on to current timeframe   
 
   limit=Bars-counted_bars;
   //---stroim stohastik
   for(i=0,y=0;i<limit;i++,y++)
     {
      MainBuffer1[i]=iStochastic(NULL,0,K_period1,1,S_period1,0,0,MODE_MAIN,y);
      MainBuffer2[i]=iStochastic(NULL,0,K_period2,1,S_period2,0,0,MODE_MAIN,y);
      MainBuffer3[i]=iStochastic(NULL,0,K_period3,1,S_period3,0,0,MODE_MAIN,y);
      MainBuffer4[i]=iStochastic(NULL,0,K_period4,1,S_period4,0,0,MODE_MAIN,y);
    
     //---flat zona
  
     
     if (MainBuffer1[i] < 11.8) //---pervoe uslovie
     {
     x1=Low[i];
     y1=Time[i]; //--- opredelyaem koordinaty dlya x1,y1
     }
     if (MainBuffer1[i] > 88.2) //---vtoroe uslovie
     {
     x2=High[i];
     y2=Time[i];   //--- opredelyaem koordinaty dlya x2,y2
     }
     }
    for(i=Bars; i>0; i--)
    {
     //--- opredelyaem koordinaty dlya x11,y11 
     if (Low[i]<x1)
     {
     y11=Time[i];
     }
     //--- opredelyaem koordinaty dlya x22,y22
     if (High[i]>x2)
     {
     y22=Time[i];
     }
     }    
     
   
   string up_line = "upline";
  string down_line = "downline";
     flatlineup(up_line+TimeToStr(Time[i]), y2,x2,y22,x2,Red,1);
     flatlinedown(down_line+TimeToStr(Time[i]), y1,x1,y11,x1,Blue,1);
  
    
   dellline(up_line,i);
     
     //----
     
   return(0);
  }
//+------------------------------------------------------------------+
void flatlineup(string labebe,datetime time1,double price1,datetime time2,double price2,color colir, int W)
  {
     ObjectCreate(labebe, OBJ_TREND, 0,time1,price1,time2,price2);
   ObjectSet(labebe, OBJPROP_COLOR, colir);
   ObjectSet(labebe, OBJPROP_STYLE,0);
   ObjectSet(labebe, OBJPROP_RAY,0);
   ObjectSet(labebe, OBJPROP_WIDTH,W);   
   ObjectSet(labebe, OBJPROP_BACK, true);
   }
  void flatlinedown(string labebe1,datetime time1,double price1,datetime time2,double price2,color colir, int W)
  {
   ObjectCreate(labebe1, OBJ_TREND, 0,time1,price1,time2,price2);
   ObjectSet(labebe1, OBJPROP_COLOR, colir);
   ObjectSet(labebe1, OBJPROP_STYLE,0);
   ObjectSet(labebe1, OBJPROP_RAY,0);
   ObjectSet(labebe1, OBJPROP_WIDTH,W);   
   ObjectSet(labebe1, OBJPROP_BACK, true);
    }
   
void dellline(string name_line, int i)  //--- первый вариант с удалением линий
  {
    string name = ObjectName(i);
    if (StringFind(name,name_line)!=-1)ObjectDelete(name);

 // if (StringFind(name,name_line)!=-1)del1++;
 // if (del1>2)ObjectDelete(name);
   }
void dellline(string name_line)  //--- второй вариант с удалением линий  
{
string name, dellname; 
bool del = false;
for(int i=ObjectsTotal(); i>=0;i--)
    {
if (del == false){ //---при этом условии должна происходить идентификация первой линии 
name = ObjectName(i); //--выполняется при первом обращении к функции
dellname=name;
del = true;}
if (del == true){
if (StringFind(dellname,name_line)!=-1)ObjectDelete(dellname);
dellname=name;}
}   
} 
    //---Были и промежуточные варианты, которые также не дали желаемого результата.

Файлы:
 
Вы хотите чтобы единомоментно были нарисованы только две линии?
 
Да, совершенно верно.
 
Fox_RM:
Да, совершенно верно.

Тогда

1. В имени объектов дата не нужна

2. Можно не создавать объекты каждый раз заново, а менять положение двух постоянных. Сразу уберется проблема с удалением.

 

Эти варианты я реализовывал. Первый самый простой, согласен (если их убрать линии перестанут множиться).

С использованием ObjectMove тоже проблем не возникает. В настоящем варианте я бы хотел

реализовать идею, когда пользователь может выбрать по желанию сколько линий оставить на графике

одну или несколько.

 
Тогда сортируете по времени и оставляете n наиболее молодых линии, остальные под снос.
 
Перепробовал разные подходы по работе с таймсерией Time, до сортировки дело так и не дошло
никак не могу увязать Time из основного кода программы с Time из функции, вроде как индексы
Time[i] первого и Time[i] второго получаются разные.

Вот один из последних вариантов. Прошу еще подсказок.

void dellline(string name_line, datetime time_line) 
{
string name;
datetime timeArr[]; //---пробовал организовать работу через массив
int obj=ObjectsTotal();
for (int i=0; i<=obj; i++)
{
name=ObjectName(i);
if(StringFind(name,time_line)!=-1)timeArr[i]=time_line; //---выделяем нужные линии и
}                                                        //--заносим их время в массив
int raz = ArrayRange(timeArr,1)+1;    //---по размеру массива определяем кол-во нужных
 for (i=3; i<=raz; i++)               //---нам линий
 {
if (StringFind(time_line,name)!=-1)ObjectDelete(name);  //--- если в строке с упоминанием
}                                              времени встречается name удаляем
}

Пишу это и вижу множество недочетов, но вариантов больше нет.

Дополнительно пробовал еще вот, что.

Сделал функцию отображающую на графике количество линий и время рассчитывал, что это прояснит ситуацию, но вопросов только прибавилось...

int rezult(string name, datetime t_line)
 {
int k, obj=ObjectsTotal();
for (int i=0; i<=obj; i++)
{
string name_1=ObjectName(i);
if(StringFind(name_1,name)!=-1)k++;
}
return(k);
}

Как обычно скрин.

 
Помогите плз!
 

Fox_RM:

индексы Time[i] первого и Time[i] второго получаются разные.

Смотрите по бОльшему времени. Сортировка таки нужна.

Причина обращения: