Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1231

 

Пытаюсь простейший вход сделат. Как я хотел - если цена открытия меньше цены закрытия на количество пунктов padenie (на предыдущем баре), то покупаем с началом нового бара, с учётом тейк профита и стоп лосса. Но что-то работает похоже совсем не так как я хотел. Помогите разобраться


   MqlRates rt[1];

   if(CopyRates(_Symbol,_Period,0,1,rt)!=1)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }
   
   ENUM_ORDER_TYPE signal=WRONG_VALUE;

      if(rt[1].open - rt[1].close >= padenie) 
	 {
         signal=ORDER_TYPE_BUY;
         printf(rt[1].open+"____"+rt[1].close);
         }
         
      if(signal !=WRONG_VALUE && TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
         ExtTrade.PositionOpen(_Symbol,signal,1,SYMBOL_ASK,SymbolInfoDouble(_Symbol,SYMBOL_BID)-sl,SymbolInfoDouble(_Symbol,SYMBOL_ASK)+tp);
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Ценовые константы
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Ценовые константы
  • www.mql5.com
Технические индикаторы требуют для своих расчетов указания значений цен и/или значений объемов, на которых они будут считаться. Существуют 7 предопределенных идентификаторов перечисления ENUM_APPLIED_PRICE, для указания нужной ценовой базы расчетов. Если технический индикатор для своих расчетов использует ценовые данные, тип которых задается...
 
BorisD:

Пытаюсь простейший вход сделат. Как я хотел - если цена открытия меньше цены закрытия на количество пунктов padenie (на предыдущем баре), то покупаем с началом нового бара, с учётом тейк профита и стоп лосса. Но что-то работает похоже совсем не так как я хотел. Помогите разобраться


Ошибка 1: Вы копируете ОДИН элемент - следовательно индекс элемента будет [0]

Open 100, Close 105 - бычий бар. Open - Close = 100 - 105 = - 5. '-5' всегда будет меньше Вашего заданного значения, так как результат получился отрицательное число.

Open 110, Close 103 - медвежий бар. Open - Close = 110 - 103 = 7. '7' положительное число и это уже будет работать правильно.


Итог: исправить обращение по индексу (вместо [1] нужно обращаться к индексу [0]. Перед расчетом учитывать тип свечи: бычья она или медвежья.

 

Продолжение вопроса о построениях DRAW_HISTOGRAM2.

Пример:

// Индикатор Проба DRAW_HISTOGRAM2.mq5
//+------------------------------------------------------------------+
#property indicator_chart_window                   
#property indicator_buffers   20                    
#property indicator_plots     20                  

#property indicator_color1    clrOrange                
#property indicator_color2    clrOrange               
#property indicator_color3    clrLimeGreen        
#property indicator_color4    clrLimeGreen        

#property indicator_type5     DRAW_HISTOGRAM2
#property indicator_color5    clrOrange               
#property indicator_type6     DRAW_HISTOGRAM2
#property indicator_color6    clrLimeGreen        

//#property indicator_color9    clrRed                

double
   Line_High_Up[], Line_High_Dn[], Hist_High_Up[], Hist_High_Dn[],
   Line_Low_Up[],  Line_Low_Dn[],  Hist_Low_Up[],  Hist_Low_Dn[],  Line_Red[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit() 
   { 
   SetIndexBuffer     (0, Line_High_Up,      INDICATOR_DATA); 
   PlotIndexSetInteger(0, PLOT_DRAW_TYPE,    DRAW_LINE);      
   SetIndexBuffer     (1, Line_High_Dn,      INDICATOR_DATA); 
   PlotIndexSetInteger(1, PLOT_DRAW_TYPE,    DRAW_LINE);      

   SetIndexBuffer     (2, Line_Low_Up,       INDICATOR_DATA);
   PlotIndexSetInteger(2, PLOT_DRAW_TYPE,    DRAW_LINE);     
   SetIndexBuffer     (3, Line_Low_Dn,       INDICATOR_DATA);
   PlotIndexSetInteger(3, PLOT_DRAW_TYPE,    DRAW_LINE);     

   SetIndexBuffer     (4, Hist_High_Up,      INDICATOR_DATA); 
   SetIndexBuffer     (5, Hist_High_Dn,      INDICATOR_DATA);

   SetIndexBuffer     (6, Hist_Low_Up,       INDICATOR_DATA);
   SetIndexBuffer     (7, Hist_Low_Dn,       INDICATOR_DATA);

   //SetIndexBuffer     (8, Line_Red,          INDICATOR_DATA);
   //PlotIndexSetInteger(8, PLOT_DRAW_TYPE,    DRAW_LINE);     
   }
//+------------------------------------------------------------------+
//| 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[]   )                   
   {  
   int i;
   for(i=prev_calculated; i<=rates_total-1; i++)      
      {
      Line_High_Up[i] = high[i] + 50*_Point;
      Line_High_Dn[i] = high[i] + 30*_Point;
      Line_Low_Up[i]  = low[i]  - 30*_Point;
      Line_Low_Dn[i]  = low[i]  - 50*_Point;

      Hist_High_Up[i] = Line_High_Up[i];
      Hist_High_Dn[i] = Line_High_Dn[i];
      Hist_Low_Up[i]  = Line_Low_Up[i];
      Hist_Low_Dn[i]  = Line_Low_Dn[i];
      
      //Line_Red[i]     = low[i]  - 70*_Point;
      }
   return(i-1);
   }           
//+------------------------------------------------------------------+

В представленном индикаторе удалось построить обе гистограммы. Неожиданной особенностью стало следующее:

Для обычных линий в записях #property indicator_colorn, #property indicator_typen и т.п. значение n на 1 больше индекса буфера.
Причём это требование сохраняется и для случая, если индексы буферов указаны не подряд, а между соседними есть свободные места.
Например, если используются индексы 0, 1, 2, 3, 8, то все пять линий благополучно отображаются.

Для построений типа DRAW_HISTOGRAM2 иное требование, а именно:
Если гистограммы указаны подряд, то в записях  #property indicator_colorn, #property indicator_typen и т.п.
значение n рассчитывается по количественному счёту, а не от индекса буфера. В примере указаны индексы 5 и 6, хотя по логике ожидается 5 и 7.

Вся эта галиматНя приводит к тому, что понять каким должно быть значение n для обычной линии (красная), следующей за двумя гистограммами, вообще не представляется возможным.
В данном примере указано значение n=9, но это не работает, поэтому все строки, касающиеся буфера 8, закомментированы. Не получилось также и при других значениях n.

Вывод: все гистограммы должны быть указаны подряд в конце списка буферов. Причём, рассчитывать их значения следует просто подряд по количественному счёту (несмотря на индексы их буферов).
Понять это нельзя, но жить с этим можно.

Попутно: влияние порядка следования буферов типов INDICATOR_CALCULATIONS и INDICATOR_DATA не обнаружено.

Спасибо Владимиру Карпутову и Артёму Тришкину за участие в решении вопроса.

Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
При создании пользовательского индикатора можно указать один из 18 типов графического построения (способа отображения на главном окне графика или в подокне графика), значения которых указаны в перечислении ENUM_DRAW_TYPE. В зависимости от стиля рисования, может потребоваться от одного до четырех буферов значений (отмеченных как INDICATOR_DATA...
 
User_mt5:

Продолжение вопроса о построениях DRAW_HISTOGRAM2.

Пример:

В представленном индикаторе удалось построить обе гистограммы. Неожиданной особенностью стало следующее:

Для обычных линий в записях #property indicator_colorn, #property indicator_typen и т.п. значение n на 1 больше индекса буфера.
Причём это требование сохраняется и для случая, если индексы буферов указаны не подряд, а между соседними есть свободные места.
Например, если используются индексы 0, 1, 2, 3, 8, то все пять линий благополучно отображаются.

Для построений типа DRAW_HISTOGRAM2 иное требование, а именно:
Если гистограммы указаны подряд, то в записях  #property indicator_colorn, #property indicator_typen и т.п.
значение n рассчитывается по количественному счёту, а не от индекса буфера. В примере указаны индексы 5 и 6, хотя по логике ожидается 5 и 7.

Вся эта галиматНя приводит к тому, что понять каким должен быть индекс для обычной линии (красная), следующей за двумя гистограммами, вообще не представляется возможным.
В данном примере указано значение n=9, но это не работает, поэтому все строки, касающиеся буфера 8, закомментированы. Не получилось также и при других значениях n.

Вывод: все гистограммы должны быть указаны подряд в конце списка буферов. Причём, рассчитывать их значения следует просто подряд по количественному счёту (несмотря на индексы их буферов).
Понять это нельзя, но жить с этим можно.

Попутно: влияние порядка следования буферов типов INDICATOR_CALCULATIONS и INDICATOR_DATA не обнаружено.

Спасибо Владимиру Карпутову и Артёму Тришкину за участие в решении вопроса.

Пожалуйста. Но вы не решили вопрос.

В индикаторах нет зависимости от порядка следования разных типов буферов. Лишь расчётные должны быть после рисуемых.

 
Artyom Trishkin:

Пожалуйста. Но вы не решили вопрос.

В индикаторах нет зависимости от порядка следования разных типов буферов. Лишь расчётные должны быть после рисуемых.

Без особой уверенности, но всё же полагаю, что оба эти утверждения ошибочны.

На счёт "нет зависимости". У меня не получилось никаким способом отобразить 8й буфер в последнем примере . Каким должен быть этот порядок.. Может быть, у Вас получится?

На счёт "расчётные .. после рисуемых". В моём индикаторе используется более 200 буферов, первые 100 из которых, - расчётные.
В моём случае это всё простые линии, поэтому расчёт n для #property ведётся от значения индекса буфера: n=b+1. И простые линии при этом отображается. Непонятки начинаются с появления гистограмм.

Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
При создании пользовательского индикатора можно указать один из 18 типов графического построения (способа отображения на главном окне графика или в подокне графика), значения которых указаны в перечислении ENUM_DRAW_TYPE. В зависимости от стиля рисования, может потребоваться от одного до четырех буферов значений (отмеченных как INDICATOR_DATA...
 
User_mt5:

Без особой уверенности, но всё же полагаю, что оба эти утверждения ошибочны.

На счёт "нет зависимости". У меня не получилось никаким способом отобразить 8й буфер в последнем примере . Каким должен быть этот порядок.. Может быть, у Вас получится?

На счёт "расчётные .. после рисуемых". В моём индикаторе используется более 200 буферов, первые 100 из которых, - расчётные.
В моём случае это всё простые линии, поэтому расчёт n для #property ведётся от значения индекса буфера: n=b+1. И простые линии при этом отображается. Непонятки начинаются с появления гистограмм.

Не буду спорить. Создаю рисуемые буферы в абсолютно любой последовательности. Но стоит межу ними добавить расчётный буфер, как графические построения рисуемых индикаторов перестают отображаться на графике. В окне данных их значения остаются. Проводил множество тестов для описания в статьях создания индикаторов и их буферов. Пришёл к выводу, что только расчётные буферы (их расположение в порядке объявления индикаторных буферов) каким-то образом влияют на отображение/неотображение рисуемых.

 
Artyom Trishkin:

Не буду спорить. Создаю рисуемые буферы в абсолютно любой последовательности. Но стоит межу ними добавить расчётный буфер, как графические построения рисуемых индикаторов перестают отображаться на графике. В окне данных их значения остаются. Проводил множество тестов для описания в статьях создания индикаторов и их буферов. Пришёл к выводу, что только расчётные буферы (их расположение в порядке объявления индикаторных буферов) каким-то образом влияют на отображение/неотображение рисуемых.

Я тоже не уверен.

С некоторых пор (последние 3-4 мес) в окне символа вообще происходят непонятные и настораживающие явления.

Во-первых, многократно замечено, что построение индикатора может без всяких видимых причин просто съехать в любом направлении, например, вниз или вправо. Вот просто на новом тике весь индикатор бац! и сместился. То же иногда происходит при первом вкл. ПК.

Во-вторых, если некоторые буферы удаляются и потом выполняется компиляция, то "следы" этих удалённых построений остаются до невыясненных событий (перекл. ТФ туда-назад, новой перекомпиляции, обновлении настроечных параметров и т.п. ) Возможно, в окне данных тоже остаются "следы", являющие собой память давно прошедших дней (технически массивы чистятся только принудительно, и в МТ 5, если массив не нужен, он просто "снимается с учёта", но данные-то остаются; конечно, всё это глюки МТ5)
--

Есть шутка: история нашей Родины не предсказуема. То же можно сказать и про МТ5: слишком он загадочный:)
--

Кстати, сейчас вот внёс изменения в свой реальный индикатор в соответствии с моими последними утверждениями. Не работает. Добавил для отражающих массивов DRAW_HISTOGRAM2 и INDICATOR_CALCULATIONS - заработало.

Просмотр и настройка графиков - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
Просмотр и настройка графиков - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
  • www.metatrader5.com
Графики в торговой платформе отображают изменение котировок финансовых инструментов во времени. Они необходимы для проведения технического анализа и работы советников. Они позволяют трейдерам наглядно следить за котировками валют и акций в режиме реального времени и моментально реагировать на любое изменение ситуации на финансовых рынках...
 
User_mt5:


Не нужно самодеятельности - создавайте болванку советника при помощи MQL5 Wizard - так Вы будете допускать минимум ошибок при объявлении графических построений и индикаторных массивов.

 
User_mt5:

Я тоже не уверен.

С некоторых пор (последние 3-4 мес) в окне символа вообще происходят непонятные и настораживающие явления.

Во-первых, многократно замечено, что построение индикатора может без всяких видимых причин просто съехать в любом направлении, например, вниз или вправо. Вот просто на новом тике весь индикатор бац! и сместился. То же иногда происходит при первом вкл. ПК.

Во-вторых, если некоторые буферы удаляются и потом выполняется компиляция, то "следы" этих удалённых построений остаются до невыясненных событий (перекл. ТФ туда-назад, новой перекомпиляции, обновлении настроечных параметров и т.п. ) Возможно, в окне данных тоже остаются "следы", являющие собой память давно прошедших дней (технически массивы чистятся только принудительно, и в МТ 5, если массив не нужен, он просто "снимается с учёта", но данные-то остаются; конечно, всё это глюки МТ5)
--

Есть шутка: история нашей Родины не предсказуема. То же можно сказать и про МТ5: слишком он загадочный:)
--

Кстати, сейчас вот внёс изменения в свой реальный индикатор в соответствии с моими последними утверждениями. Не работает. Добавил для отражающих массивов DRAW_HISTOGRAM2 и INDICATOR_CALCULATIONS - заработало.

Не про меня.

Остальное - ваши ошибки и невнимательность (кроме смещения линий индикаторов, но вроде бы уже пофиксили, если память не изменяет)

Какой у вас билд?

 
Vladimir Karputov:

Не нужно самодеятельности - создавайте болванку советника при помощи MQL5 Wizard - так Вы будете допускать минимум ошибок при объявлении графических построений и индикаторных массивов.

Вы можете сказать как правильно отразить 8й буфер в моём последнем примере? Без самодеятельности?
Можете озвучить правила?

Artyom Trishkin:

Не про меня.

Остальное - ваши ошибки и невнимательность (кроме смещения линий индикаторов, но вроде бы уже пофиксили, если память не изменяет)

Какой у вас билд?

Вы можете сказать как правильно отразить 8й буфер в моём последнем примере? Со всей внимательностью?
И озвучить причины?
Билд 2530.

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

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