Как рисовать контрольные линии каждые 10 пунктов

 

Вот удобный скрипт, который я постоянно использую. Он рисует контрольные линии каждые 10 пунктов, чтобы помочь мне определить движение на рынке. Я был очень расстроен, пытаясь понять это, глядя на цены в правой части экрана, поэтому я создал скрипт. Этот сценарий может быть полезен для начинающих, чтобы попрактиковаться в рисовании объектов.

int start()
{  
    int nLines = 40;                                   // Number of total line to draw
    double lineInterval = 0.0010;                      // Interval between lines
    ObjectsDeleteAll(0,OBJ_HLINE);                     // Clear all the lines from the window - CAREFUL!
    double normPrice = NormalizeDouble(Close[1],3);    // Current price is rounded to nearest "10"
    for (int ix = 0; ix < nLines; ix++)                // Loop span number of times
        {
            ObjectCreate("tensLines"+ix, OBJ_HLINE, 0, 0, normPrice+((ix-(nLines/2))*lineInterval));    // Place half above and half below the current price
            ObjectSet("tensLines"+ix,OBJPROP_COLOR,DarkSlateGray);      // Make the lines look better
        }
    return(0); //All done
}
 
MisterDog:

Вот удобный скрипт, который я постоянно использую. Он рисует контрольные линии каждые 10 пунктов, чтобы помочь мне определить движение на рынке. Я был очень расстроен, пытаясь понять это, глядя на цены в правой части экрана, поэтому я создал скрипт. Этот сценарий может быть полезен для начинающих, чтобы попрактиковаться в рисовании объектов.

Сделайте его CI, а не скриптом, рассчитывайте от 0, а не от цены закрытия, рисуйте только на видимой части графика (WinPriceMax() и его сестра), обновляйте его, когда цена выходит за пределы лимита (в вашем случае интервал между линиями = 10 пунктов), используйте OBJ_RECTANGLE вместо OBJ_HLINE.

Это будет синхронизироваться на всех открытых графиках.

:D

 

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

int deinit()
   {
   for (int ix = 0; ix < nLines; ix++) // delete my horizontal lines
      {
      ObjectDelete("tensLines"+ix);
      }
   return(0);
   }


int start()
   {  
   int nLines = 40;                                   // Number of total line to draw
   double lineInterval = 0.0010;                      // Interval between lines
   double normPrice = NormalizeDouble(Close[1],3);    // Current price is rounded to nearest "10"

   for (int ix = 0; ix < nLines; ix++)                // Loop span number of times
      {
      if(ObjectFind("tensLines"+ix) < 0) 
         ObjectCreate("tensLines"+ix, OBJ_HLINE, 0, 0, normPrice+((ix-(nLines/2))*lineInterval));    // Place half above and half below the current price

      else ObjectSet("tensLines"+ix, OBJPROP_PRICE1, normPrice+((ix-(nLines/2))*lineInterval));
      ObjectSet("tensLines"+ix,OBJPROP_COLOR,DarkSlateGray);      // Make the lines look better
      }
   return(0); //All done
   }
 
onewithzachy:

Сделайте его CI, а не скриптом, рассчитывайте от 0, а не от цены закрытия, рисуйте только на видимой части графика (WinPriceMax() и его сестра), обновляйте его, когда цена выходит за пределы лимита (в вашем случае интервал между линиями = 10 пунктов), используйте OBJ_RECTANGLE вместо OBJ_HLINE.

Это будет синхронизироваться на всех открытых графиках.

:D


Все это имеет смысл, кроме части "OBJ_RECTANGLEвместо OBJ_HLINE". Почему прямоугольники?
 
RaptorUK:

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


Да, конечно, так гораздо лучше. Скажите, есть ли возможность использовать что-то вроде "подстановочного знака" для таких вещей, как ObjectDelete? Я хотел бы сделать что-то вроде этого, ObjectDelete("tensLines "*); другими словами, удалить все, что начинается с "tensLines".
 
MisterDog:

Все это имеет смысл, кроме части "OBJ_RECTANGLEвместо OBJ_HLINE". Почему прямоугольники?

У меня эта штука с сеткой уже много лет, я все равно никогда не вижу цены справа, возможно, вам не нравится прямоугольник, используйте WindowsBarsPerChart() и, возможно, WindowsFirstVisibleBar().

Посмотрите в правом нижнем углу графика, это 25/341. Это означает, что сетка составляет 25 пунктов, а высота графика - 341 пункт.

:D

 
onewithzachy:

У меня эта сетчатая штука уже много лет, я все равно никогда не вижу цены справа, возможно, вам не нравится прямоугольник, используйте WindowsBarsPerChart() и, возможно, WindowsFirstVisibleBar().

Посмотрите в правом нижнем углу графика, это 25/341. Это означает, что сетка составляет 25 пунктов, а высота графика - 341 пункт.

:D

Мне нравится, как вы расположили решетку. Это легко для глаз. Вы говорите: "Вы все равно никогда не видите цены с правой стороны". Я часто задумывался, почему при наличии всего двух вариантов, купить или продать, у меня есть шансы 50 на 50, но я ошибаюсь в 80% случаев. ;-)
 
MisterDog:
Мне вообще-то нравится, как ты расположил это с полосками. Это легко для глаз. Вы говорите: "Вы все равно никогда не видите цены справа". Я часто задумывался, почему при наличии всего двух вариантов, купить или продать, у меня есть шанс 50 на 50, но я ошибаюсь в 80% случаев. ;-)

То же самое здесь ...

:D

 
MisterDog:
Мне нравится, как вы расположили решетку. Это легко для глаз. Вы говорите: "Вы все равно никогда не видите цены с правой стороны". Я часто задумывался, почему при наличии всего двух вариантов, купить или продать, у меня есть шансы 50 на 50, но я ошибаюсь в 80% случаев. ;-)

На этот вопрос очень легко ответить... если предположить, что то, что я видел, тестируя советников, соответствует действительности. Это зависит от соотношения риск:вознаграждение, если у вас риск 20, а вознаграждение 80 (или аналогичное соотношение), я могу понять, как вы можете иметь коэффициент выигрыша 20%. Однако все не так просто, потому что вы должны учитывать спред, если вы заключаете небольшие сделки...
 
onewithzachy, я как раз занялся настройкой вашегографика в стиле OBJ_RECTANGLE.Вы упомянули "WindowsBarsPerChart() и, возможно, WindowsFirstVisibleBar()". Я все еще не могу понять, как сделать так, чтобы бары шли от левой стороны экрана к правой. Но мне нравится макет! Есть подсказки, как это сделать?
 
MisterDog:
onewithzachy, я как раз занялся настройкой вашейдиаграммы в стиле OBJ_RECTANGLE.Вы упомянули "WindowsBarsPerChart() и, возможно, WindowsFirstVisibleBar()". Я все еще не могу понять, как сделать так, чтобы бары шли от левой стороны экрана к правой. Но мне нравится макет! Есть подсказки, как это сделать?

Привет, MisterDog,

Все просто.

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

datetime Bar_Time_Gap; // or integer type

Bar_Time_Gap = Time [0] - Time [1]; // or Time [7] - Time [8] or whatever
Bar_Time_Gap = Period()*60;

2. WindowsFirstVisibleBar() - это самый левый бар. Начните рисовать с этого бара, или, что еще лучше, начните рисовать слева от этого бара, скажем, на 5 баров левее. Допустим, возврат WindowsFirstVisibleBar() равен 20. Это означает, что самый левый бар - бар [20], начинайте рисовать с бара [25]. На самом деле я рисую от [Bars - 1].

datetime Start;

Start = Time [WindowFirstVisibleBar() + 5];                  //which is the same ...
Start = Time [WindowFirstVisibleBar()] - 5 * Bar_Time_Gap;   //... with this one

3. WindowsBarsPerChart() - это количество баров на графике . Скажем, возвратWindowsBarsPerChart() равен 35, а WindowsFirstVisibleBar() - 20. Таким образом, начиная с бара [0], справа остается около 15 баров пустого пространства. Нарисуйте конец прямоугольника до самого правого бара этого пустого пространства, или, что еще лучше, начните рисовать от правого бара, скажем, на 5 баров в право.

datetime End;
int Right_Bar = WindowBarsPerChart() - WindowFirstVisibleBar() + 5;

End = Time[0] + Right_Bar * Bar_Time_Gap;

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

Надеюсь, я не делаю ошибок, потому что я написал это быстро.

:D

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