English 中文 Español Deutsch 日本語 Português
Лень - двигатель прогресса. Полуавтоматическая разметка шаблона

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

MetaTrader 4Примеры | 22 августа 2008, 09:19
3 623 0
Vladimir
Vladimir

Введение

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

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


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

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

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

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


  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)
Визуальное тестирование прибыльности индикаторов и сигналов Визуальное тестирование прибыльности индикаторов и сигналов
Выбор индикатора торговых сигналов или просто методики их расчета обычно проверяют в тестере при прогонах экспертов, использующих эти сигналы. Однако не всегда бывает возможно/нужно/целесообразно писать эксперт под каждый индикатор. Оперативно просчитать прибыльность торговли по сигналам других индикаторов можно с помощью специального индикатора, который сам собирает их сигналы и рисует картину идеальной торговли по ним. С его помощью Вы можете не только визуально оценить результаты, но и быстро подобрать наиболее оптимальные параметры.
Дополнительные Материалы Чемпионатов 2006-2007 годов Дополнительные Материалы Чемпионатов 2006-2007 годов
Предлагаем вашему вниманию подборку этих материалов, которые разбиты по темам. В данной теме представлены дополнительные материлы об Автоматическом Трейдинге, разработке экспертов и т.д.
Спать или не спать? Спать или не спать?
Предлагается альтернатива использованию функции Sleep() при реализации пауз между действиями эксперта. Рассматриваемый подход позволяет более рационально использовать машинное время.
Взгляд на технический анализ с точки зрения САУ (систем автоматического управления), или “Взгляд наоборот” Взгляд на технический анализ с точки зрения САУ (систем автоматического управления), или “Взгляд наоборот”
В статье показан альтернативный взгляд на технический анализ, основывающийся на принципах как современной теории автоматического управления, так и технического анализа. Это вводная работа, представляющая собой теорию с некоторыми практическими ее приложениями.