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

 

Доброго времени суток. Очень нужна помощь не могу сообразить что нужно сделать. Если не сложно помогите.

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

Пр.(Три месяца. Разметка линиями за 3 месяца ). Или образец по которому можно посмотреть.

Заранее Спасибо. 

 

Вот образец скрипта размечающего день от открытия + и - 20 пунктов. аналогично можно сделать определение месяца и соответственно high и low этого месяца.

/********************************************************************\
                                                           20-20.mq4 |
                                                            Viktorov |
                                                   v4forex@yandex.ru |
\********************************************************************/
#property copyright "Viktorov"
#property link      "v4forex@yandex.ru"
#property version   "1.00"

MqlDateTime mqlDateTime;
MqlRates    mqlRates[1];
/********************Script program start function*******************/
void OnStart()
{
  double point = _Digits%2 == 0 ? _Point : _Point*10;
   datetime dt = ChartTimeOnDropped();
    TimeToStruct(ChartTimeOnDropped(), mqlDateTime);
     if(CopyRates(_Symbol, PERIOD_D1, dt, 1, mqlRates) < 0)
      Print("");
       string objName = TimeToString(mqlRates[0].time, TIME_DATE);
        ObjectCreate(0, objName, OBJ_TREND, 0, mqlRates[0].time, mqlRates[0].open, mqlRates[0].time+PeriodSeconds(PERIOD_D1), mqlRates[0].open);
        ObjectSetInteger(0, objName, OBJPROP_RAY_RIGHT, false);
       ObjectCreate(0, objName+"+20", OBJ_TREND, 0, mqlRates[0].time, mqlRates[0].open+20*point, mqlRates[0].time+PeriodSeconds(PERIOD_D1), mqlRates[0].open+20*point);
      ObjectSetInteger(0, objName+"+20", OBJPROP_RAY_RIGHT, false);
     ObjectCreate(0, objName+"-20", OBJ_TREND, 0, mqlRates[0].time, mqlRates[0].open-20*point, mqlRates[0].time+PeriodSeconds(PERIOD_D1), mqlRates[0].open-20*point);
    ObjectSetInteger(0, objName+"-20", OBJPROP_RAY_RIGHT, false);
   Comment(mqlRates[0].open, "\n"
         , objName, "\n"
         , sizeof(mqlDateTime), "\n"
         );
}/*******************************************************************/
 
AlexeyVik:

Вот образец скрипта размечающего день от открытия + и - 20 пунктов. аналогично можно сделать определение месяца и соответственно high и low этого месяца.

Спасибо огромное, с трудом но вроде получается.
 

AlexeyVik:  Спасибо за отзывчивость.

Не знаю правильно ли я изложил свою смыть. Нужно примерно это.Картинка

 Буду очень признателен если вы поможете, или подскажете как это реализовать в индикаторе.

В программировании я новичок.

Вертикальные линии рисуются правильно. 

Я не понимаю, как привязать "горизонт. линии и кружочки к хай и лоу к первой свече." 

За любую помощь буду благодарен.

 

Повнимательней почитай документацию по функции CopyRates() и структуре MqlRates. C их помощью получаем все необходимые данные для реализации твоих хотелок.

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

 

Вот исходный код. Буду признателен если поможете доработать. Нужно найти Хай и лоу каждой первой недели месяца.

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

#property copyright ""

#property link      ""


#property indicator_chart_window

   

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

extern int     TF = 43200;               //--- Через сколько баров рисуются линии (На каком Т/Ф)

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

extern string  TimeFrames = "M1,5,15,30; 60H1; 240H4; 1440D1; 10080W1; 43200MN.";  //--- Подсказка кол-во боров в Т/Ф


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

string    Name_Line;         //--- Имя Вертикальных уровней


//double    Price_H = High[0]; //--- Макс цены  

//double    Price_L = Low[0];  //--- Мин цены




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

int init()

  {  

   //--- 

        return(0);

  }

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

int deinit()

  {

   int i;  

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

           {

              ObjectDelete(Name_Line + DoubleToStr(i,0));        //--- Удаляем все установленные линии

           }       

   return(0);

  }

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

int start()

{                  

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

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

int i=0;                                   //--- переменная i = 0 обнуление

   

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

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

  limit = Bars - counted_bars;         

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

      {  

         //+-----  Выбираем количество линий отображаемых на экране 

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

         {

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

           Name_Line = "Time_VLine M" + TF + " "+DoubleToStr(i,0);      //--- И присваиваем имя с соответствующими параметрами 

 //+------------------------ Рисуем линии -----------------------------------------------------+                 

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

             {   

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


                   {

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

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

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

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

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

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

                   }

                    i++;

             }

          }

      }

      

return(0);


}


 
     if(CopyRates(_Symbol, PERIOD_W1, dt, 1, mqlRates) < 0)        //--- Если бросили скрипт на выбранную свечку

      Print("");

В моём коде это не свечка, а день. В твоём это неделя.

Из этого получаем время от которого рисовать линию. Тебе надо наверное месяц. Время начала месяца. Но оно редко совпадает с временем начала недели. Так-что тут надо ещё поколдовать как считать первую неделю.

        ObjectCreate(0, objName, OBJ_TREND, 0, mqlRates[0].time + PERIOD_MN1, mqlRates[0].high, mqlRates[0].time + PeriodSeconds(PERIOD_MN1), mqlRates[0].high); 

Так сказать почувствуй разницу. В mql4 пока разницы особой нет, но кто знает какие изменения нас могут подстерегать...

 

//--- Что здесь не так, при построении линии по лоу. На графике её нет. И Ошибки компиляции тоже нет? 

 //--- НО по отдельности всё работает.     

Обрати внимание на имена трендовых.

 //----- Для чего нужен этот блок если линия отрисовывается на графике и без него   

У меня линий 3. потому и функций 3 и имён линий тоже 3.

 
Спасибо за помощь, но до меня как то всё это не доходит.
 

Тогда ответ только на один вопрос

//--- Что здесь не так, при построении линии по лоу. На графике её нет. И Ошибки компиляции тоже нет? 

 //--- НО по отдельности всё работает.     

Здесь у тебя имя линии одно и то-же, а должны быть разные.

А зачем ты поудалял и исправил свои сообщения?

 

Вы не отвечали долго, я подумал, что на глупые вопросы вы не отвечаете, и по этому их удалил.

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