Индикаторы: Daily Change Text - страница 2

 
Vladimir Karputov #:

Вы вправе иметь собственное мнение и писать код как Вам вздумается.

Владимир, вот вам третий пример "бездумности программирования в стиле старого терминала", а не "умное копирование готового кода из учебника":

#property indicator_chart_window
//--- input parameters
input ushort      Depth=3;   //Количество дней (0=все дни)
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   ObjectsDeleteAll(0,"dc*",0,-1);
   int start;
   if(_Period==PERIOD_D1)
     { 
      if(Depth==0) start=Depth;
      else start=rates_total-Depth-1;
      for(int i=start; i<=rates_total; i++)
        {
         string dc = " "+DoubleToString((close[i+1]-close[i])*100.0/close[i+1],2)+"%";
         ObjectCreate(0,"dc"+i,OBJ_TEXT,0,time[i+1],high[i+1]);
         ObjectSetString(0,"dc"+i,OBJPROP_TEXT,dc);
         ObjectSetDouble(0,"dc"+i,OBJPROP_ANGLE,90.0);
         if(StringGetCharacter(dc,1)!=45) ObjectSetInteger(0,"dc"+i,OBJPROP_COLOR,clrBlue);
         ObjectSetInteger(0,"dc"+i,OBJPROP_ANCHOR,ANCHOR_LEFT);        
        }        
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,"dc*",0,-1);
  }
//+------------------------------------------------------------------+

Не сочтите за дерзость "новичка" с 30-ти летним стажем, но этот вариант дьявольски хорош! Да - он еще короче, быстрее и проще чем первый. Он занимает всего 39 строк, а не 265. И таки да - пользователь может ввести в единственный параметр 0 и получить данные по всему графику, даже на 365 дней может получить, в отличие от ваших 255. Согласитесь, Владимир, этот код прекрасен как румянец девственницы и чист как слеза младенца. В нём нет ничего лишнего, и он решает поставленную задачу? 

 
Roman Vladimirovich #:

Владимир, вот вам третий пример "бездумности программирования в стиле старого терминала", а не "умное копирование готового кода из учебника":

Не сочтите за дерзость "новичка" с 30-ти летним стажем, но этот вариант дьявольски хорош! Да - он еще короче, быстрее и проще чем первый. Он занимает всего 39 строк, а не 265. И таки да - пользователь может ввести в единственный параметр 0 и получить данные по всему графику, даже на 365 дней может получить, в отличие от ваших 255. Согласитесь, Владимир, этот код прекрасен как румянец девственницы и чист как слеза младенца. В нём нет ничего лишнего, и он решает поставленную задачу? 

Вам не нужно удалять и заново пересоздавать графические объекты. По сути объекты на ненулевом баре статичны, а на нулевом баре информация меняется (цвет и расположение точки привязки) - производится модификация объекта на нулевом баре. Именно модификация, а не пересоздание.


Добавлено: дальнее обсуждение с Вами бессмысленно. Прощайте.

 
Vladimir Karputov #:

Вам не нужно удалять и заново пересоздавать графические объекты. По сути объекты на ненулевом баре статичны, а на нулевом баре информация меняется (цвет и расположение точки привязки) - производится модификация объекта на нулевом баре. Именно модификация, а не пересоздание.


Добавлено: дальнее обсуждение с Вами бессмысленно. Прощайте.

Т.е. аргументов кроме как "писать предложение с заглавной" и "удалять и создавать обьект дорого" у вас нет?
Владимир, посмотрите:
- даже если реализовать изменение обьекта вызовом асинхронной функции вместо пересоздания (непонятно почему это мне не нужно, но не суть)
- даже если сделать проверки на возможные ошибки (кстати их тут всего одна, не знаю зачем прерывать когда выбран не тот ТФ)
- даже если сделать ненужные "телодвижения" обьекта на хай\лоу (вы наверное не видели как он мечется верх\вниз когда значение +-0% на крайнем баре, это забавно)

#property indicator_chart_window
//--- input parameters
input ushort      Depth=3;   //Количество дней (0=все дни)
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Depth>Bars(_Symbol,PERIOD_D1))
     {
      Print("Укажите количество дней от 0 до "+IntegerToString(Bars(_Symbol,PERIOD_D1)));
      return(INIT_FAILED);
     }
   return (INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   
   if(prev_calculated==0)
      if(prev_calculated!=rates_total)
        {
         ObjectsDeleteAll(0,"dc*",0,-1);
         int start;
         Comment("Перейдите на таймфрейм D1");
         if(_Period==PERIOD_D1)
           {
            Comment("");
            if(Depth==0) start=Depth+1;
            else start=rates_total-Depth;
            for(int i=start; i<rates_total; i++)
              {
               string dc = " "+DoubleToString((close[i]-close[i-1])*100.0/close[i],2)+"% ";
               if(StringGetCharacter(dc,1)!=45)
                 {
                  ObjectCreate(0,"dc"+IntegerToString(i),OBJ_TEXT,0,time[i],high[i]);
                  ObjectSetInteger(0,"dc"+IntegerToString(i),OBJPROP_COLOR,clrBlue);
                  ObjectSetInteger(0,"dc"+IntegerToString(i),OBJPROP_ANCHOR,ANCHOR_LEFT);
                 }
               else
                 {
                  ObjectCreate(0,"dc"+IntegerToString(i),OBJ_TEXT,0,time[i],low[i]);
                  ObjectSetInteger(0,"dc"+IntegerToString(i),OBJPROP_COLOR,clrRed);
                  ObjectSetInteger(0,"dc"+IntegerToString(i),OBJPROP_ANCHOR,ANCHOR_RIGHT);
                 }
               ObjectSetString(0,"dc"+IntegerToString(i),OBJPROP_TEXT," "+dc);
               ObjectSetDouble(0,"dc"+IntegerToString(i),OBJPROP_ANGLE,90.0);
              }
           }
         return (rates_total);
        }
   string dc = " "+DoubleToString((close[rates_total-1]-close[rates_total-2])*100.0/close[rates_total-1],2)+"% ";
   if(StringGetCharacter(dc,1)!=45)
     {
      ObjectSetInteger(0,"dc"+IntegerToString(rates_total-1),OBJPROP_COLOR,clrBlue);
      ObjectMove(0,"dc"+IntegerToString(rates_total-1),0,time[rates_total-1],high[rates_total-1]);
      ObjectSetInteger(0,"dc"+IntegerToString(rates_total-1),OBJPROP_ANCHOR,ANCHOR_LEFT);
     }
   else
     {
      ObjectSetInteger(0,"dc"+IntegerToString(rates_total-1),OBJPROP_COLOR,clrRed);
      ObjectMove(0,"dc"+IntegerToString(rates_total-1),0,time[rates_total-1],low[rates_total-1]);
      ObjectSetInteger(0,"dc"+IntegerToString(rates_total-1),OBJPROP_ANCHOR,ANCHOR_RIGHT);
     }
   ObjectSetString(0,"dc"+IntegerToString(rates_total-1),OBJPROP_TEXT,dc);
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,"dc*",0,-1);
  }
//+------------------------------------------------------------------+

Все равно код в 3 раза короче, чище и логичнее... Вам просто с высоты своего опыта и многолетних заслуг невероятно сложно (практически невозможно) признать, что код в топике мягко говоря "не фонтан"?