Рисование квадрата или прямоугольника. Очень нужна помощь... - страница 5

 
Alex_Profit:

Не знаю как сделать. Подскажите пожалуйста. Максимальный период это месяц.

В переменную t_Line. нужно вставить значение 1й,2й,3й,4й, кв.

Не могу понять.

Буду признателен. 

 

Оххх, ну и программка получилась... Сам-то понял, что написал, или как? Ну зачем там два цикла на одном счётчике, что они нациклят? Хоть бы значение переменной i  вручную прикинь на каждой итерации.

Кто такой  barsToProcess? Где объявлен, чему равен? Опять, один limit  на два цикла, ни к чему хорошему это не приводит, по рукам надо себя бить когда так пишешь, чтобы неповадно было.

Ну и считать бары ТФ, на котором запущен график, для работы с периодом MN1 как-то бессмысленно.

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

 

Я его не писал. нашел индикатор на подобии и стал его разбирать, методом тыка получилась такая "программка". Сам я только начал, соответственно и получается то не очень. Читал справку, но она не всегда понятна. Вот со "скрипом" и еду. Хорошо что есть форум, где можно спросить совета. Было бы не плохо пообщаться с кем то по вопросам программирования.

За критику отдельное спасибо. Тем не менее вопрос остаётся не решенным. Всё ровно спасибо за отзывчивость.

 
Alex_Profit:

Я его не писал. нашел индикатор на подобии и стал его разбирать, методом тыка получилась такая "программка". Сам я только начал, соответственно и получается то не очень. Читал справку, но она не всегда понятна. Вот со "скрипом" и еду. Хорошо что есть форум, где можно спросить совета. Было бы не плохо пообщаться с кем то по вопросам программирования.

За критику отдельное спасибо. Тем не менее вопрос остаётся не решенным. Всё ровно спасибо за отзывчивость.

Ну вот, например, грубый набросок, на коленке щас написал по-быстрому скрипт:

void OnStart()
{
   int limit=iBars(_Symbol,PERIOD_MN1);
   for(int i=0;i<=limit;i++)
   {
      datetime timemn=iTime(_Symbol,PERIOD_MN1,i);
      int  month=TimeMonth(timemn);
      if(month==1 || month==4 || month==7 || month==10)
      {
         int qt=0;
         switch(month)
         {
            default:break;
            case 1: qt=1;break;
            case 4: qt=2;break;
            case 7: qt=3;break;
            case 10: qt=4;break;
         }
 
         string name=StringConcatenate("Qt"+IntegerToString(qt)+", "+TimeToStr(timemn));
         ObjectCreate (name,OBJ_VLINE,0,timemn,0);         //--- Создаём обьект вертикальную линию
         ObjectSet    (name,OBJPROP_STYLE,2);              //--- Со стилем
         ObjectSet    (name,OBJPROP_COLOR,DimGray);        //--- Со цветом  
         ObjectSet    (name,OBJPROP_WIDTH,0);              //--- С  толщиной
         ObjectSet    (name,OBJPROP_BACK,0);               //--- С типом отображения. Объект на заднем плане
      }
   }   
}

 

Небольшой недостаток, если квартал начинается в выходной, то линию рисует на последнем баре пятницы. Ну и первый квартал в истории также останется без линии, если, например, история начинается  2-го числа. Это уже надо уточнять число месяца и если это не 1, то брать ближайшее последующее.

Для удаления всех линий этого скрипта с графика, можно запустить этот:

void OnStart()
{
     ObjectsDeleteAll(0,"Qt");
}

Можно сделать зацикленный скрипт, с проверкой существования конкретной линии на нужном баре, чтобы не было попыток ставить линию поверх уже нарисованной и с удалением разметки при деинициализации скрипта.

Ещё можно параметры линии вывести в настройки, много ещё чего можно сделать.

 
evillive:

Ну вот, например, грубый набросок, на коленке щас написал по-быстрому скрипт:

Всё супер. Спасибо большоое. 

Интересно, сколько времени нужно чтобы освоить данные фишки? 

 

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

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

Если этого нет, но есть желание учиться, то года должно хватить с лихвой. 

 
evillive:

Если этого нет, но есть желание учиться, то года должно хватить с лихвой. 

Я понял.

 

Даже не знаю как и обратиться. Нужно доделать последний штрих. А как пока тоже не соображу.

Вертикальные линии рисуются, с этим проблем нет. А вот как воткнуть синие полоски по хай барам, это для меня пока еще остаётся тайной.

Линия от дневки. попытка привязаться к буферу не привела к результату.

Буду премного благодарен за содействие.

Спасибо. 

 

 
Alex_Profit:

Даже не знаю как и обратиться. Нужно доделать последний штрих. А как пока тоже не соображу.

Вертикальные линии рисуются, с этим проблем нет. А вот как воткнуть синие полоски по хай барам, это для меня пока еще остаётся тайной.

Линия от дневки. попытка привязаться к буферу не привела к результату.

Буду премного благодарен за содействие.

Спасибо. 

 

Код покажите, будем править вместе.
 

Только пинать не надо, код "корявенький". Я это уже понял. Хотелось бы на примерах и ошибках достигнуть логического результата.

Задача минимум, он работает. Ну А с опытом и по "красивше" станет .

 

 

//+------------------------------------------------------------------+

#property strict

#property indicator_chart_window

   

    //---  Внешние Глобальные переменные 

extern int     barsToProcess = 5;        //--- Кол-во отображаемых периодов (линий) 


    //---  Глобальные переменные    

string Name_VLine;     //--- Имя Элементов

string Name_CHECK;     //--- Имя Элементов


//MqlDateTime mqlDateTime;

MqlRates    mqlRates[1];


//+------------------------------------------------------------------+

int init()

  {  

    return(0);

  }

//+------------------------------------------------------------------+

int deinit()

  {

   int i;  

         for (i=0; i<Bars; i++)                              //--- Выбираем все установленные объекты  

           {

              ObjectDelete(Name_VLine + " VLine"  + DoubleToStr(i,0));          //--- Удаляем все объекты

              ObjectDelete(Name_CHECK + "H_CHECK"  + DoubleToStr(i,0));  //--- Удаляем все объекты

              ObjectDelete(Name_CHECK + "L_CHECK"  + DoubleToStr(i,0));  //--- Удаляем все объекты

           }       

   return(0);

  }

//+------------------------------------------------------------------+

int start()

{                  

int counted_bars = IndicatorCounted();     //--- перем counted_bars = функц.  Возвращает количество баров

int limit;                                 //--- переменная  старт кол-во баров. Линии рисуем о по всем барам

   

if(counted_bars > 0) counted_bars --;      //--- последний посчитанный бар будет пересчитан 

  //--- основной цикл 

  limit = Bars - counted_bars;         

  for(int i = 0; i < limit; i ++)

      {

      

 //+------------------------ При выборе кол-ва линий отобразим их ко-во------------------------+                 

         if(limit > barsToProcess)                                     //--- Если кол-во линий > Кол-ву отображаемых периодов (линий) 

         {

          limit = barsToProcess;                                      //--- Тогда устанавливаем Кол-во отображаемых периодов (линий)

             while (i<limit)                                           //--- Пока есть линии в окне терминала. Или пока висит индикатор в окне терминала.                        

             {   

               datetime t_Line = iTime(Symbol(),PERIOD_H4,i);         //--- В ПЕРЕМ t_Line Будет Присваиваться значение времени открытия бара

               CopyRates(_Symbol, PERIOD_H4, t_Line, 1, mqlRates);

   {


         //--- кубики по хай (В место галочек нужно подставить кубики)

         ObjectCreate    (0,Name_CHECK + "H_CHECK" + DoubleToStr(i,0), OBJ_ARROW_CHECK, 0, t_Line, mqlRates[0].high, t_Line,mqlRates[0].high);

         ObjectSetInteger(0,Name_CHECK + "H_CHECK" + DoubleToStr(i,0), OBJPROP_COLOR, clrGreen); 

   

         //--- кубики по лоу (В место галочек нужно подставить кубики)

         ObjectCreate    (0,Name_CHECK + "L_CHECK" + DoubleToStr(i,0), OBJ_ARROW_CHECK, 0, t_Line, mqlRates[0].low, t_Line,mqlRates[0].low);

         ObjectSetInteger(0,Name_CHECK + "L_CHECK" + DoubleToStr(i,0), OBJPROP_COLOR, clrGreen); 

        

    //+------------------------ Рисуем вертикальную линии -----------------------------------------------------+                 

    ObjectCreate (Name_VLine + " VLine" + DoubleToStr(i,0),OBJ_VLINE,0,t_Line,0);         //--- Создаём обьект вертикальную линию

    ObjectSet    (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_STYLE,2);              //--- Со стилем

    ObjectSet    (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_COLOR,DimGray);        //--- Со цветом  

    ObjectSet    (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_WIDTH,0);              //--- С  толщиной

    ObjectSet    (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_BACK,0);               //--- С типом отображения. Объект на заднем плане

 }

  i++;

             }

          }

      }

      

   return(0);

}


 
Alex_Profit:

Только пинать не надо, код "корявенький". Я это уже понял. Хотелось бы на примерах и ошибках достигнуть логического результата.

Задача минимум, он работает. Ну А с опытом и по "красивше" станет .

 

Ну и где он работает? Линии рисует на каждом баре, а не по ТЗ. Или на картинке выше ТФ=Н1?

Пересчитайте на бумажке, чему будут равны limit и i  на каждой итерации циклов.

Мой пример, показанный выше, так и не учтен, как  я понимаю.

Галочки-стрелки можно рисовать с помощью индикаторных буферов, как и линии, соединяющие тени свечей.

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