Вопрос к знатокам, про прорисовке индикаторов.

time_of_money

Местный
Вопрос заключается в следующем есть индикатор на основном графике
рисует DRAW_ARROW 217 или 218, индикатор перерисовывается на графике
удаляя старые сигналы, как сделать чтобы старые сигналы он оставлял и
рисовал новые и не удалял старые к примеру здесь.

Код:
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Yellow
#property indicator_color2 Lime
#property indicator_color3 Red
#property indicator_color4 Aqua
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1
#property indicator_width4 1

//input properties

extern int  dist2           = 21;
extern int  dist1           = 14;
extern bool alertsOn        = true;
extern bool alertsOnCurrent = true;
extern bool alertsMessage   = true;
extern bool alertsSound     = true;
extern bool alertsEmail     = false;

double b1[];
double b2[];
double b3[];
double b4[];


int init()
{
   SetIndexBuffer(0,b1);
   SetIndexBuffer(1,b2);
   SetIndexBuffer(2,b3);
   SetIndexBuffer(3,b4);
   SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,334);
   SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,333);
   SetIndexStyle(2,DRAW_ARROW); SetIndexArrow(1,233);
   SetIndexStyle(3,DRAW_ARROW); SetIndexArrow(0,234);
   return(0);
}
int start()
{
   int counted_bars=IndicatorCounted();
   int i,limit,hhb,llb,hhb1,llb1;

   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
           limit=Bars-counted_bars;
           limit=MathMax(limit,dist1);
           limit=MathMax(limit,dist2);

   //
   //
   //
   //
   //

   for (i=limit;i>=0;i--)
      {
         hhb1 = Highest(NULL,0,MODE_HIGH,dist1,i-dist1/2);
         llb1 = Lowest(NULL,0,MODE_LOW,dist1,i-dist1/2);
         hhb  = Highest(NULL,0,MODE_HIGH,dist2,i-dist2/2);
         llb  = Lowest(NULL,0,MODE_LOW,dist2,i-dist2/2);

            b1[i] = EMPTY_VALUE;
            b2[i] = EMPTY_VALUE;
            b3[i] = EMPTY_VALUE;
            b4[i] = EMPTY_VALUE;
      
         double tr = iATR(NULL,0,50,i);
         if (i==hhb)  b1[i]=High[hhb] +tr;
         if (i==llb)  b2[i]=Low[llb]  -tr;
         if (i==hhb1) b3[i]=High[hhb1]+tr/2;
         if (i==llb1) b4[i]=Low[llb1] -tr/2;
      }
      
   //
   //
   //
   //
   //
   
   if (alertsOn)
      {
         int forBar = 1;
            if (alertsOnCurrent) forBar = 0;
            if (b1[forBar] != EMPTY_VALUE && b3[forBar] != EMPTY_VALUE) doAlert("strong sell");
            if (b1[forBar] != EMPTY_VALUE && b3[forBar] == EMPTY_VALUE) doAlert("sell");
            if (b1[forBar] == EMPTY_VALUE && b3[forBar] != EMPTY_VALUE) doAlert("minor sell or exit buy");
            if (b2[forBar] != EMPTY_VALUE && b4[forBar] != EMPTY_VALUE) doAlert("strong buy");
            if (b2[forBar] != EMPTY_VALUE && b4[forBar] == EMPTY_VALUE) doAlert("buy");
            if (b2[forBar] == EMPTY_VALUE && b4[forBar] != EMPTY_VALUE) doAlert("minor buy or exit sell");
      }
  return(0);
}

//
//
//
//
//

void doAlert(string doWhat)
{
   static string   previousAlert="nothing";
   static datetime previousTime;
   string message;
   string TimePeriod;
   
   if (Period()== 1)       TimePeriod = "1 MIN";
   if (Period()== 5)       TimePeriod = "5 MIN";
   if (Period()== 15)      TimePeriod = "15 MIN";
   if (Period()== 30)      TimePeriod = "30 MIN";
   if (Period()== 60)      TimePeriod = "1 HR";
   if (Period()== 240)     TimePeriod = "4 HR";
   if (Period()== 1440)    TimePeriod = "DAILY";
   if (Period()== 10080)   TimePeriod = "WEEKLY";
   if (Period()== 43200)   TimePeriod = "MONTHLY";

      if (previousAlert != doWhat || previousTime != Time[0]) {
          previousAlert  = doWhat;
          previousTime   = Time[0];

          //
          //
          //
          //
          //

          message =  StringConcatenate(Symbol()," at ", TimePeriod, " Super signal : ",doWhat);
             if (alertsMessage) Alert(message);
             if (alertsEmail)   SendMail(StringConcatenate(Symbol(),"Super signal "),message);
             if (alertsSound)   PlaySound("alert2.wav");
      }
}
 

ale002

Пользователь
Попробуйте убрать

b1 = EMPTY_VALUE;
b2 = EMPTY_VALUE;
b3 = EMPTY_VALUE;
b4 = EMPTY_VALUE;

Не проверял, но по логике на текущем баре перерисовывать будет, на уже закрытых - нет
 

time_of_money

Местный
Попробуйте убрать

b1 = EMPTY_VALUE;
b2 = EMPTY_VALUE;
b3 = EMPTY_VALUE;
b4 = EMPTY_VALUE;

Не проверял, но по логике на текущем баре перерисовывать будет, на уже закрытых - нет


Если не b1 = EMPTY_VALUE;*********b4 = EMPTY_VALUE; -- то будет другое не прокатит.

Он должен прорисовывать, но старые(предыдущие) сигналы должен оставлять.
 

ale002

Пользователь
Если не b1 = EMPTY_VALUE;*********b4 = EMPTY_VALUE; -- то будет другое не прокатит.

Он должен прорисовывать, но старые(предыдущие) сигналы должен оставлять.


Этот кусок обнуляет значение всех буферов индикатора перед тем как посчитать и записать (если есть сигнал) туда новое значение. Поскоку последние dist2 баров он прочёсывет на каждом тике, то значения их обнуляются и перерисовываются. Если вы уберёте обнуление - не будут. Старые будут оставаться, новые добавляться
 

time_of_money

Местный
Этот кусок обнуляет значение всех буферов индикатора перед тем как посчитать и записать (если есть сигнал) туда новое значение. Поскоку последние dist2 баров он прочёсывет на каждом тике, то значения их обнуляются и перерисовываются. Если вы уберёте обнуление - не будут. Старые будут оставаться, новые добавляться
Согласен но при смене Tf сигналы пропадут, а мне бы этого как раз и не хотелось!
 

ale002

Пользователь
Этот индикатор хранит сигналы в буферах, при иницализации (в т.ч. переключении ТФ) буфера обнуляются терминалом, этого не обойти программно. Можно конечно выдрессировать его писать/читать инфо в файл или в объекты на графике, тока стоит ли оно этого гемора? Я бы не бралсо :)
 

time_of_money

Местный
Этот индикатор хранит сигналы в буферах, при иницализации (в т.ч. переключении ТФ) буфера обнуляются терминалом, этого не обойти программно. Можно конечно выдрессировать его писать/читать инфо в файл или в объекты на графике, тока стоит ли оно этого гемора? Я бы не бралсо :)
Для этого индюка нет, а для другого да!
Всем спасибо разобрался.
 

Онлайн статистика

Пользователи онлайн
0
Гости онлайн
64
Всего посетителей
64

Статистика форума

Темы
1 639
Сообщения
53 503
Пользователи
9 181
Новый пользователь
BobbyeriRoase

Мы в социальных сетях

Вверх Снизу