Группа "Стол заказов MQL"

Рейтинг 2088



РЕКОМЕНДУЮ



Индикатор

Привет.
Нужно написать индикатор по следующим параметрам. Требуется показывать на графике валютных пар места, где образуется формация из трех свечей (как это описано в этом топике).
То есть сначала образуется свеча (свеча №2), которая больше предыдущей свечи (свеча №1) в два раза (максимум — в 10 раз) по длине. При этом тело свечи № 2 больше тела свечи №1. Длина тела свечи №1 — минимум 30 пунктов (по 5-знаку). Следующая после свечи №2 (свеча №3) имеет длину тела минимум 30 пунктов и при этом ее тень НЕ перекрывает тело свечи №2.

Свеча №2 и свеча №3 должны быть сонаправлены (свечи №1 это условие не касается).

При этом тень свечи №2, противоположная ее направлению не должна превышать 50% общей длины свечи.
Цена закрытия свечи №1 и цена открытия свечи №2 (а равно цена закрытия свечи №2 и открытия свечи №3) не должны отличаться более, чем на 10 пунктов. Это условие, чтобы исключить ценовые разрывы между пятницей и понедельником.

Для каждой такой формации пусть будет указание в виде стрелки на графике (если можно, цвет сделать по выбору). Бывает так, что Свеча № 3 служит свечой №1 для новой формации (то есть одна и та же свеча присутствует в двух формациях сразу). Поэтому, если можно, сделать так, чтобы они при этом не пересекались (стрелки).
  • 0
  • Просмотров: 3793
  • 17 сентября 2016, 18:38
  • Altrend
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
просто индюк
Следующая запись в группе  
Советник по сигналам индикатора FOREX ENTRY POINT
17 сентября 2016
18 сентября 2016

Комментарии (12)

+
0
Я начал делать, только скиньте все ТЗ в одно место чтобы мне не прыгать туда сюда.
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 17 сентября 2016, 19:36
+
0
Все ТЗ изложено в этом посте. Ссылка в посте сделана для того, чтобы показать, что это часть той торговой системы. Просто советник сразу написать правильно не получилось, т. к. неправильно объяснил. Поэтому решил его частями заказывать. Пардон, что запутал.
avatar

  15  Altrend Автор Сообщений: 76

  • 17 сентября 2016, 20:08
+
0
Пока сделано для двух свечей и есть 2 условия.

1. тело первой свечи в 3 раза больше тела второй.
2. тело второй свечи больше 30 п.




//+------------------------------------------------------------------+
//|                                                   CandleSize.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict
#property indicator_chart_window

input int Max = 10;
input int Min = 3;
input int Points = 30;


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,0,OBJ_RECTANGLE);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutRect(string name,datetime t1,double p1,datetime t2,double p2,color clr)
  {
   ObjectDelete(0,name);
//--- создадим прямоугольник по заданным координатам
   ObjectCreate(0,name,OBJ_RECTANGLE,0,t1,p1,t2,p2);
//--- установим цвет прямоугольника
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   for(int i=1;i<5555;i++)
     {
      if(MathAbs(close[i]-open[i])/MathAbs(close[i+1]-open[i+1])>Min  // 
       && MathAbs(close[i+1]-open[i+1])>Points*Point)                 //
       
       PutRect("Rect"+time[i],time[i],open[i+1],time[i+1],close[i],Red);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 17 сентября 2016, 19:44
+
0

в ТЗ в этом посте номера свечей указаны как на рисунке.
минимальная длина в 30 пунктов — у тела первой свечи.
avatar

  15  Altrend Автор Сообщений: 76

  • 17 сентября 2016, 20:13
+
0
Сделаны следующие условия для 3-х свечей:


 // свеча 2 больше свечи 3 в 3 раза
 // свеча 2 больше свечи 3 в 3 раза но меньше чем 10 раз
 // свеча 3 больше 30 пунктов
 // свеча 1 больше 30 пунктов





//+------------------------------------------------------------------+
//|                                                   CandleSize.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict
#property indicator_chart_window

input int Max = 10;
input int Min = 3;
input int Points=30;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,0,OBJ_RECTANGLE);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutRect(string name,datetime t1,double p1,datetime t2,double p2,color clr)
  {
   ObjectDelete(0,name);
//--- создадим прямоугольник по заданным координатам
   ObjectCreate(0,name,OBJ_RECTANGLE,0,t1,p1,t2,p2);
//--- установим цвет прямоугольника
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   for(int i=1;i<5555;i++)
     {
      if(MathAbs(close[i+1]-open[i+1])/MathAbs(close[i+2]-open[i+2])>=Min     // свеча 2 больше свечи 3 в 3 раза
         && MathAbs(close[i+1]-open[i+1])/MathAbs(close[i+2]-open[i+2])<=Max  // свеча 2 больше свечи 3 в 3 раза но меньше чем 10 раз
         && MathAbs(close[i+2]-open[i+2])>Points*Point                        // свеча 3 бльше 30 пунктов
         && MathAbs(close[i]-open[i])>Points*Point)                           // свеча 1 бльше 30 пунктов

         PutRect("Rect"+time[i],time[i],open[i],time[i+2],close[i+2],Red);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+



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

  34  AM2 Сообщений: 15882 - Андрей

  • 17 сентября 2016, 20:09
+
0
Можно и в три раза, если в два не удобно. Пара условий — тогда выберу условие о тени третьей свечи (чтобы тело второй свечи не перекрывало). Второе условие — про 10 пунктов максимальной разницы между ценами открытия и закрытия. Это чтобы гэп выходного дня нейтрализовать.

А можно эту часть сделать в этом месяце, а остальное — в следующем? Или это трудоемко получается?
avatar

  15  Altrend Автор Сообщений: 76

  • 17 сентября 2016, 20:20
+
0
Пока так, дальше если будет свободное время. На бесплатном не придумывайте ничего лишнего, чем проще будет задание тем больше у вас шансов получить его в готовом виде.


//+------------------------------------------------------------------+
//|                                                   CandleSize.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict
#property indicator_chart_window

input int Max = 10;
input int Min = 3;
input int Points=30;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,0,OBJ_RECTANGLE);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutRect(string name,datetime t1,double p1,datetime t2,double p2,color clr)
  {
   ObjectDelete(0,name);
//--- создадим прямоугольник по заданным координатам
   ObjectCreate(0,name,OBJ_RECTANGLE,0,t1,p1,t2,p2);
//--- установим цвет прямоугольника
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   for(int i=1;i<5555;i++)
     {
      if(MathAbs(close[i+1]-open[i+1])/MathAbs(close[i+2]-open[i+2])>=Min     // свеча 2 больше свечи 3 в 3 раза
         && MathAbs(close[i+1]-open[i+1])/MathAbs(close[i+2]-open[i+2])<=Max  // свеча 2 больше свечи 3 в 3 раза но меньше чем 10 раз
         && MathAbs(close[i+2]-open[i+2])>Points*Point                        // свеча 3 бльше 30 пунктов
         && MathAbs(close[i]-open[i])>Points*Point                            // свеча 1 бльше 30 пунктов
         && MathAbs(close[i+2]-open[i+1])<10*Points                           // закрытие 3-й минус открытие 2-й меньше 10п.
         && MathAbs(close[i+1]-open[i])<10*Points                             // закрытие 2-й минус открытие 1-й меньше 10п.                      
         )
         //&& (((close[i+1]-open[i+1])>0 && (close[i]-open[i])>0)||((close[i+1]-open[i+1])>0 && (close[i]-open[i])>0))// сонапрвлены
         PutRect("Rect"+time[i],time[i],open[i],time[i+2],close[i+2],Red);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 17 сентября 2016, 20:52
+
0
Хорошо, в следующий раз возьму что-нибудь проще. Благодарю и на том, что получилось.:) 
avatar

  15  Altrend Автор Сообщений: 76

  • 17 сентября 2016, 21:07
+
0
Когда 1-3 условия индикатор еще что то рисует, а когда наслаивается целая куча перестает рисовать т.к. не совпадают все условия.
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 17 сентября 2016, 21:30
+
0
Столько условий требует торговая система. Поэтому не всегда каждый день сигналы появляются (бывало целую неделю тишина была). Ничего страшного. Потестирую как есть.
avatar

  15  Altrend Автор Сообщений: 76

  • 17 сентября 2016, 21:44
+
0
Отладил условие для сонаправленных свечей. Ну и все для бесплатного заказа достаточно: www.opentraders.ru/downloads/1323/


//+------------------------------------------------------------------+
//|                                                   CandleSize.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict
#property indicator_chart_window

input int Max = 10;
input int Min = 3;
input int Points=30;
input int Count=55555; // баров для расчета
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   ObjectsDeleteAll(0,0,OBJ_RECTANGLE);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,0,OBJ_RECTANGLE);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutRect(string name,datetime t1,double p1,datetime t2,double p2,color clr)
  {
   ObjectDelete(0,name);
//--- создадим прямоугольник по заданным координатам
   ObjectCreate(0,name,OBJ_RECTANGLE,0,t1,p1,t2,p2);
//--- установим цвет прямоугольника
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   for(int i=1;i<Count;i++)
     {
      if(MathAbs(close[i+1]-open[i+1])/MathAbs(close[i+2]-open[i+2])>=Min     // свеча 2 больше свечи 3 в 3 раза
         && MathAbs(close[i+1]-open[i+1])/MathAbs(close[i+2]-open[i+2])<=Max  // свеча 2 больше свечи 3 в 3 раза но меньше чем 10 раз
         && MathAbs(close[i+2]-open[i+2])>Points*Point                        // свеча 3 бльше 30 пунктов
         && MathAbs(close[i]-open[i])>Points*Point                            // свеча 1 бльше 30 пунктов
         && MathAbs(close[i+2]-open[i+1])<10*Points                           // закрытие 3-й минус открытие 2-й меньше 10п.
         && MathAbs(close[i+1]-open[i])<10*Points                             // закрытие 2-й минус открытие 1-й меньше 10п.                      
         && ((close[i+1]-open[i+1]>0 && close[i]-open[i]>0) || (close[i+1]-open[i+1]<0 && close[i]-open[i]<0))// сонапрвлены 
         /*&& (close[i+1]-open[i+1]<0 && close[i]-open[i]<0)*/)                                    

         PutRect("Rect"+(string)time[i],time[i],open[i],time[i+2],close[i+2],Red);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


Редактирован: 18 сентября 2016, 09:52
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 18 сентября 2016, 09:42
+
0
Благодарю.
avatar

  15  Altrend Автор Сообщений: 76

  • 18 сентября 2016, 10:43

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари