Скачать MetaTrader 5

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

22 августа 2008, 09:19
Vladimir
0
2 084

Введение

Любая разметка - это определение экстремумов на графике и построение на основании этих точек фигур или линий определяемых пользователем. Последователям волн Эллиотта нужна разметка определенных волн и выводы (какая волна), определение номера и т.д. Последователям волн Вульфа – построение трендовых линий и обозначение целей. «Бабочникам» - точки и уровни для определения будущих бабочек, крабов и других фигур формализованных Гартли.

Уровни Мюррея нужны тем, кто предпочитает этот метод. Автоматический расчет не позволяет предусмотреть сотни, а может быть тысячи, формаций, если только это не специальное программное обеспечение. И второе: любой человек может видеть недостатки автоматической разметки, вследствие ограниченного количества вариантов формализации условий. А вмешиваться в процесс разметки позволяет не всякое программное обеспечение. Поэтому использование ручной разметки и передача дальнейшей обработки информации для обработки компьютеру расширяет возможности пользователя.


Полуавтоматическая разметка шаблона для торговли

Для примера рассмотрим разметку волн Вульфа. (Описание берем из известной книги Линды Рашке «Биржевые секреты»).

Теория волновых структур Билла Вульфа основана на ньютоновском первом законе физики: у каждого действия есть противодействие. Это движение создает четко выраженную волну с ценными возможностями проецирования. Наиболее отчетливо эта волна образуется, когда есть хорошая волатильность.

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


  1. Волна номер 2 — вершина.
  2. Волна номер 3 — основание первого снижения.
  3. Волна номер 1 — основание, предшествующее волне 2 (вершине). Точка 3 должна быть ниже точки 1.
  4. Волна номер 4 — вершина волны 3. Точка волны 4 должна быть выше основания волны 1
  5. Линия тренда проводится из точки 1 к точке 3. Продление этой линии проецирует ожидаемую точку разворота, которую мы назовем волной 5. Это точка вхождения для движения к линии расчетной конечной цены (1—4).
  6. Расчетная конечная цена (Estimated Price at Arrival, EPA) — линия тренда, прочерченная из точки 1 до точки 4, позволяет спроецировать ожидаемую ценовую цель. Наш первоначальный стоп помещен чуть ниже вновь сформированного разворота в точке 5. Он может затем быстро передвинуться к точке безубыточности.

ВАЖНЫЙ МОМЕНТ: вы не можете начинать искать «волну Вулфа», пока не сформированы точки 1, 2, 3 и 4.

Не забывайте, что для схемы покупки точка 3 должна быть ниже точки I. Для схемы продажи она должна быть выше точки 1. Кроме того, на лучших волнах точка 4 будет выше точки 1 для схемы покупки и ниже 1 для схемы продажи. Это гарантирует, что состояния абсолютного убегания рынка не существует. Теперь изучите примеры и посмотрите, сможете ли вы натренировать свой глаз начать видеть схему «волны Вулфа».


Пример показывает, как выглядит «волна Вулфа», когда начинает формироваться. Точки 1, 2 и 3 уже должны быть сформированы. Точка 2 должна быть минимумом или максимумом существенного колебания. Затем между точками 1 и 3 проводится линия тренда. Она проецирует, где мы должны ожидать точку 5.



Точка 5 сформирована. Мы купим на развороте из этой области и поставим чуть ниже близкий стоп. Если мы прочертим линию тренда из точки 1 к точке 4, она должна дать нам проекцию цены.



Точка 2 — начальная отправная точка модели. Мне всегда кажется легче начинать отсчет в этой точке. Затем отходим назад и находим точки 1 и 3. Не забудьте, что точка 4 должна быть выше

точки 1. Прочерченная нами линия тренда проецирует точку 5 На этом уровне рынок находит поддержку, поэтому мы открываем длинную позицию по цене рынка и размещаем стоп чуть ниже

точки 5. Рынок торгуется до своей цели.


Согласно приложенного описания, нам требуется установить разметку определенными знаками (цифрами от 1 до 5, а затем нанести трендовые линии исходящие из точки 1 и проходящие через точку 4 и точку 5.


При ручном методе создаются текстовые объекты, которые привязываются вручную к определенным точкам на графике, создаются затем трендовые линии, и наносятся на график. Средства языка программирования позволяют упростить процесс и исключить из ручного процесса, создание объектов и нанесение трендовых линий. При таком подходе пользователю остается только привязать к определенным точкам на графике метки и получить готовое построение трендовых линий.


Напомним, что нанесение информации на график возможно двумя способами.

Первый - это когда создаваемый текстовый объект привязывается к определенной точке на графике, и второй, это когда привязка происходит к определенной точке окна графика.


Используем эти свойства для создания разных объектов.Создаем кнопку «Сброс» для удаления нанесенных точек с графика, и удаление построенных линий и привязываем ее к определенному месту окна. И создаем объекты, которые будут привязываться к определенным точкам на графике. Учитывая, что на графике происходит масштабирование, а значит, последние объекты будут перемещаться вместе с графиком, определяем первоначальное положение точек привязки справа от нулевого бара графика. Мы будем использовать это расположение и для активизации или деактивизации функции построения трендовых линий.

// Проверяем наличие кнопки Сброс, если ee нет, то создаем ее
int    obj_total=ObjectsTotal();
  string index;
  for( i=0;i<obj_total;i++)
    {
     index=ObjectName(i);
      string Lbl = StringSubstr (index, 0, 12);
            if (Lbl == "Lable_On_Off") string LblOnOff=index;
     }
if (LblOnOff!="Lable_On_Off") OnOff(Red, 10);

где

OnOff(Red, 10);

это функция создания и позиционирования кнопки OnOff.

void OnOff (color clr_, int h)
         {                                      
         ObjectCreate("Lable_On_Off",OBJ_LABEL,0,0,0);// Создание Кнопки OnOff
         ObjectSetText("Lable_On_Off",CharToStr(204) , 12, "Wingdings", clr_);
         ObjectSet(   "Lable_On_Off", OBJPROP_CORNER, 3);     // Угол отображения на графике
         ObjectSet(   "Lable_On_Off", OBJPROP_XDISTANCE, 10);
         ObjectSet(   "Lable_On_Off", OBJPROP_YDISTANCE, h);
         } 
return;

Встроенная функция

CharToStr()

позволяет отображать на графике любые объекты

"Wingdings"

, просто вводя код символа.

Активизацию индикатора производим выделением и перемещением кнопки OnOff вверх. После перемещения и первого тика графика, кнопка закрепляется на другой позиции и изменяет свой цвет на зеленый, и справа от последнего бара выводим объекты - цифры для нумерации на графике с помощью функции.

В зависимости от положения этой кнопки управляем объектами на графике.

// Проверяем наличие кнопки "Сброс" на месте
   
if (ObjectGet("Lable_On_Off",OBJPROP_XDISTANCE)>70||
    ObjectGet("Lable_On_Off",OBJPROP_YDISTANCE)<20)// если нет на месте то
       { 
          OnOff(Red, 10);// возвращаем на место кнопку "Сброс" и удаляем все метки, канал, трендовую линию
         for ( i=0; i<point_kol; i++)
            ObjectDelete("Lable_"+i);
            ObjectDelete("TRDLine");
            ObjectDelete("FIBOCanal");
         return;
         }  
                                               
if (ObjectGet("Lable_On_Off",OBJPROP_YDISTANCE)>10 && 
    ObjectGet("Lable_On_Off",OBJPROP_YDISTANCE)!=40) //Если кнопка перемещена вверх то
       {  
         OnOff(Green, 40); // Фиксируем кнопку вверху
         CreatePoint();   // Создаем точки
       }

где

CreatePoint();

- функция первоначального размещения расчетных точек на графике

void CreatePoint ()
      {
      double shcala=(WindowPriceMax()-WindowPriceMin());
      for( i = 0; i < point_kol; i++) // Создаем точки 
               {                                      
      ObjectCreate("Lable_"+i, OBJ_ARROW, 0,Time[Bars-1],Bid);
      ObjectSet("Lable_"+i,OBJPROP_ARROWCODE,140+i);
      ObjectSet("Lable_"+i,OBJPROP_WIDTH,2);
      ObjectSet("Lable_"+i,OBJPROP_COLOR,Green);
      ObjectMove("Lable_"+i, 0,(Time[0]+Period()*720), (WindowPriceMin()+shcala/2)-shcala/12*i);
               } 
      }

Здесь я хочу обратить внимание на то, что при указанной разметке, активными являются только три точки, поэтому я ввел внешнюю переменную для того, чтобы можно было выбрать, сколько использовать точек для нанесения на график - 3 или 5. По умолчанию стоит 5, а я использую 3, зрительно отмечая для себя промежуточные точки.

extern int point_kol=5;

Вместо трендовой линии в сторону предполагаемого движения цены применяем канал Фибоначчи. Это дает расширенное представление на графике. Канал дает представление о линиях поддержки и сопротивления на уровнях Фибоначчи. В таком представлении мы можем наблюдать цели на пересечениях трендовой линии и уровней Фибоначчи, что позволяет локализовать определенные торговые тактики.


Вот как это будет выглядеть


Включаем индикатор - перемещаем кнопку вверх.

Дневной график. Мы разместили точки, а индикатор создал трендовую линию и канал фибоначчи.




Заключение

Подобное представление информации на графике предоставляет возможности для реализации, например, анализа по волнам Эллиота. Определив две точки экстремумов вручную, мы можем пересчитать внутренние волны с помощью таймфрейма меньшего периода, и сравнив с определенными условиями, получить результат для дальнейшего анализа. Причем, пользователь может задать явное назначение пересчета (импульсное или коррекционное).

Здесь мне еще хотелось бы пожелать разработчикам языка MQL ввести функцию пересчета оконного позиционирования объектов в пикселях – к непосредственной привязке на график. Дело в том что опробовав предлагаемый в настоящее время метод обращения к библиотеке user32.dll и вызов оттуда параметров текущего окна, выдает сообщение об отсутствующей библиотеке user32.lib. Это означает что в типовой поставке Windows XP и Метатрейдера эта возможность отсутствует. В такой реализации пришлось отказаться от внедрения возможности анализа по всему графику, если только не переносить точки вручную.


Сам индикатор (исходный код):

//|                                                        0_CTL.mq4 |
//|                                   Copyright © 2008, b2w@narod.ru |
//|                                             http://www.fibook.ru |
//+------------------------------------------------------------------+
#property copyright "b2w@narod.ru"
#property link      "http://www.fibook.ru"
#property indicator_chart_window
extern int point_kol=5;
string mon[]={"января", 
              "февраля", 
              "марта", 
              "апреля", 
              "мая", 
              "июня", 
              "июля", 
              "августа", 
              "сентября", 
              "октября", 
              "ноября", 
              "декабря"};
int i;
double coordinatsT[5], coordinatsP[5];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
  string info="Разметка  "+ Symbol()+" на "+Day()+" "+mon[Month()-1]+" "+Year()+" г."; 
   CreateUp (info);
 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
//----
 
// Проверяем наличие кнопки Сброс, если ee нет, то создаем ее
int    obj_total=ObjectsTotal();
  string index;
  for( i=0;i<obj_total;i++)
    {
     index=ObjectName(i);
      string Lbl = StringSubstr (index, 0, 12);
            if (Lbl == "Lable_On_Off") string LblOnOff=index;
     }
if (LblOnOff!="Lable_On_Off") OnOff(Red, 10);  
// Проверяем наличие кнопки "Сброс" на месте
   
if (ObjectGet("Lable_On_Off",OBJPROP_XDISTANCE)>70||
    ObjectGet("Lable_On_Off",OBJPROP_YDISTANCE)<20)// если нет на месте то
       { 
          OnOff(Red, 10);// возвращаем на место кнопку "Сброс" и удаляем все метки, канал, трендовую линию
         for ( i=0; i<point_kol; i++)
            ObjectDelete("Lable_"+i);
            ObjectDelete("TRDLine");
            ObjectDelete("FIBOCanal");
         return;
         }  
                                               
if (ObjectGet("Lable_On_Off",OBJPROP_YDISTANCE)>10 && 
    ObjectGet("Lable_On_Off",OBJPROP_YDISTANCE)!=40) //Если кнопка перемещена вверх то
       {  
         OnOff(Green, 40); // Фиксируем кнопку вверху
         CreatePoint();   // Создаем точки
       }  
         
           for (i=0; i<point_kol; i++)
               {   
                 coordinatsT[i]=ObjectGet("Lable_"+i,OBJPROP_TIME1); // Считываем координаты
                 coordinatsP[i]=ObjectGet("Lable_"+i,OBJPROP_PRICE1);
               }   
     
         // если все точки нанесены на график то строим дополнительные объекты
         if  ((coordinatsT[0]<Time[0])&&
              (coordinatsT[1]<Time[0])&&
              (coordinatsT[2]<Time[0])&&
              (coordinatsT[3]<Time[0])&&
              (coordinatsT[4]<Time[0]))  
            {
            ObjectCreate("TRDLine", OBJ_TREND, 0,0,0);
            ObjectCreate("FIBOCanal", OBJ_FIBOCHANNEL, 0,0,0);
            ObjectMove ("TRDLine", 0,coordinatsT[0],coordinatsP[0]);
            ObjectMove ("TRDLine", 1,coordinatsT[point_kol-2],coordinatsP[point_kol-2]);
            ObjectMove ("FIBOCanal", 0,coordinatsT[0],coordinatsP[0]);
            ObjectMove ("FIBOCanal", 2,coordinatsT[point_kol-2],coordinatsP[point_kol-2]);
            ObjectMove ("FIBOCanal", 1,coordinatsT[point_kol-1],coordinatsP[point_kol-1]);
            }
   return(0);
  }
//+------------------------------------------------------------------+
 
void OnOff (color clr_, int h)
         {                                      
         ObjectCreate("Lable_On_Off",OBJ_LABEL,0,0,0);// Создание Кнопки OnOff
         ObjectSetText("Lable_On_Off",CharToStr(204) , 12, "Wingdings", clr_);
         ObjectSet(   "Lable_On_Off", OBJPROP_CORNER, 3);     // Угол отображения на графике
         ObjectSet(   "Lable_On_Off", OBJPROP_XDISTANCE, 10);
         ObjectSet(   "Lable_On_Off", OBJPROP_YDISTANCE, h);
         } 
return;          
 
void CreatePoint ()
      {
      double shcala=(WindowPriceMax()-WindowPriceMin());
      for( i = 0; i < point_kol; i++) // Создаем точки 
               {                                      
      ObjectCreate("Lable_"+i, OBJ_ARROW, 0,Time[Bars-1],Bid);
      ObjectSet("Lable_"+i,OBJPROP_ARROWCODE,140+i);
      ObjectSet("Lable_"+i,OBJPROP_WIDTH,2);
      ObjectSet("Lable_"+i,OBJPROP_COLOR,Green);
      ObjectMove("Lable_"+i, 0,(Time[0]+Period()*720), (WindowPriceMin()+shcala/2)-shcala/12*i);
               } 
      } 
 void CreateUp(string info) 
               {
                  ObjectCreate("TextAlerts", OBJ_LABEL, 0, 0, 0);  
                  ObjectSetText("TextAlerts",info , 16, "Times New Roman", Green);
                  ObjectSet("TextAlerts", OBJPROP_CORNER, 0);
                  ObjectSet("TextAlerts", OBJPROP_XDISTANCE, 20);
                  ObjectSet("TextAlerts", OBJPROP_YDISTANCE, 10);       
               }

Прикрепленные файлы |
0_CTL.mq4 (5.47 KB)
Переход на новые рельсы: пользовательские индикаторы в MQL5 Переход на новые рельсы: пользовательские индикаторы в MQL5

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

Вот мы и получили долгожданные MetaTrader 5 и MQL5 Вот мы и получили долгожданные MetaTrader 5 и MQL5

Это очень краткий обзор MetaTrader 5. Я не могу описать все новшества системы за столь короткий период времени - тестирование стартовало 09-09-2009. Это символическая дата, и я уверен, что это будет счастливым числом. Всего несколько дней у меня на руках бета-версия терминала MetaTrader 5 и MQL5. Я не успел опробовать все, что в нем есть нового, но то, что есть, уже впечатляет.

Работа с корзинами валютных пар на рынке Форекс Работа с корзинами валютных пар на рынке Форекс

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

Текстовые файлы для хранения входных параметров советников, индикаторов и скриптов Текстовые файлы для хранения входных параметров советников, индикаторов и скриптов

В статье рассмотрены вопросы хранения динамических объектов, массивов и других переменных в качестве свойств советников, индикаторов и скриптов в текстовых файлах. Они служат удобным дополнением к функционалу стандартных средств, предлагаемых языками MQL.