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

 
Сергей Таболин:


Вот пример: на базе DRAW_COLOR_CANDLES, если размер свечи меньше заданного - свеча не рисуется.

Внимание: это переделанный индикатор - он изначально рисовал свечи по High и Low. И пока никаких тиков - просто пример работы с DRAW_COLOR_CANDLES, если размер свечи меньше заданного - свеча не рисуется.

//+------------------------------------------------------------------+
//|                                             High Low Candles.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_plots   1
//--- plot HLC_
#property indicator_label1  "High Low Candles"
#property indicator_type1   DRAW_COLOR_CANDLES
#property indicator_color1  clrLimeGreen,clrLavender
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input uint     InpMinSize     = 150;            // Candles: min size
//--- indicator buffers
double   OpenBuffer[];  // open
double   HighBuffer[];  // high
double   LowBuffer[];   // low
double   CloseBuffer[]; // close
double   Colors[];
//---
double   m_min_size           = 0.0;            // Candles: min size          -> double
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,OpenBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,HighBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,LowBuffer,INDICATOR_DATA);
   SetIndexBuffer(3,CloseBuffer,INDICATOR_DATA);
   SetIndexBuffer(4,Colors,INDICATOR_COLOR_INDEX);
//--- an empty value
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
//--- set the display of the symbol
   string symbol=Symbol();
   PlotIndexSetString(0,PLOT_LABEL,symbol+" Open;"+symbol+" High;"+symbol+" Low;"+symbol+" Close");
   IndicatorSetString(INDICATOR_SHORTNAME,"HLC ("+symbol+")");
//---
   m_min_size=InpMinSize*Point();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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 limit=prev_calculated-1;
   if(prev_calculated==0)
      limit=0;
   for(int i=limit; i<rates_total; i++)
     {
      HighBuffer[i]=high[i];
      LowBuffer[i]=low[i];
      if(open[i]<close[i])
        {
         if(close[i]-open[i]>m_min_size)
           {
            OpenBuffer[i]=low[i];
            CloseBuffer[i]=high[i];
            Colors[i]=1.0;
           }
         else
           {
            OpenBuffer[i]=0.0;
            HighBuffer[i]=0.0;
            LowBuffer[i]=0.0;
            CloseBuffer[i]=0.0;
            Colors[i]=0.0;
           }
        }
      else
        {
         if(open[i]-close[i]>m_min_size)
           {
            OpenBuffer[i]=high[i];
            CloseBuffer[i]=low[i];
            Colors[i]=0.0;
           }
         else
           {
            OpenBuffer[i]=0.0;
            HighBuffer[i]=0.0;
            LowBuffer[i]=0.0;
            CloseBuffer[i]=0.0;
            Colors[i]=0.0;
           }
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


Результат:


Файлы:
 
Vladimir Karputov:

Ты лучше не с мобилки читай форум, а с компьютера. И читай ВСЕ сообщений, а не избранное. Не хочешь помогать - лучше вообще не встревай в разговор.

Болеешь? :)


[Удален]  

Парни, Артём и Владимир, не ссорьтесь, право же не из-за чего... )))

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

Я попросил показать мне, где я не прав (в коде). И, желательно, почему.

Отладчиком пользоваться не могу. Не умею. Никакие переменные в "наблюдаемые" не добавляются (об этом я уже довольно давно писал на форуме...).

Просто скажите, где затык?

Дискретизация ценового ряда, случайная составляющая и "шумы"
Дискретизация ценового ряда, случайная составляющая и "шумы"
  • www.mql5.com
Классический способ представления ценовых движений в виде временных отрезков возник на заре становления финансовых рынков, когда еще не было компьютеров и вся торговля шла на реальных рынках, реальными товарами. Хранить каждое изменение цены в течении дня было трудно, да и не имело смысла, цены менялись не так быстро. Поэтому представлялось...
 
Сергей Таболин:

Просто скажите, где затык?

Затык в организации кода. Я попытался посмотреть, но написано так, что мозг не воспринимает такое. А как объяснить в чём ошибки не знаю.

Могу только посоветовать начать с начала и по порядку.

  1. начать с того, что выделить каждую N-ную свечу.
  2. затем поставить условие для выбора какую свечу выделять.
И в конце-то концов научиться пользоваться отладчиком.
[Удален]  
Alexey Viktorov:

Затык в организации кода. Я попытался посмотреть, но написано так, что мозг не воспринимает такое. А как объяснить в чём ошибки не знаю.

Могу только посоветовать начать с начала и по порядку.

  1. начать с того, что выделить каждую N-ную свечу.
  2. затем поставить условие для выбора какую свечу выделять.
И в конце-то концов научиться пользоваться отладчиком.

Чтобы тут не расписывать, я дал полные комментарии в своей ветке. Посмотрите, если не затруднит...

 
Сергей Таболин:

Чтобы тут не расписывать, я дал полные комментарии в своей ветке. Посмотрите, если не затруднит...

Сергей, у меня нет желания вникать в код. Ведь это как в той поговорке «Увязнет коготок всей птичке пропасть». Только начало

   if(rates_total - prev_calculated > 1)
   {
      if(prev_calculated == 0)
      {

Когда prev_calculated == 0 разве может быть rates_total - prev_calculated < 1???

 
Alexey Viktorov:

Сергей, у меня нет желания вникать в код. Ведь это как в той поговорке «Увязнет коготок всей птичке пропасть». Только начало

Когда prev_calculated == 0 разве может быть rates_total - prev_calculated < 1???

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

 
Artyom Trishkin:

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

Артём повнимательней. Если нет посчитанных баров!!! Тогда получается на графике нет вообще баров!!! А чего тогда считать??? Это, наверное, могло быть в МТ3 и такие перестраховки тянутся оттуда.

[Удален]  
Alexey Viktorov:

Сергей, у меня нет желания вникать в код. Ведь это как в той поговорке «Увязнет коготок всей птичке пропасть». Только начало

Когда prev_calculated == 0 разве может быть rates_total - prev_calculated < 1???

Ну на нет и суда нет )))

Но вообще то Вы меня удивили... Я не знаток индикаторов, но из документации я точно знаю, что при запуске prev_calculated = 0 а далее сколько посчитано. Всего данных 100, посчитанных 100 100-100=0...

Но даже и не в этом дело! У меня условие не < а > ! Разница очевидная! И я именно так определяю момент запуска индикатора. Может это и не правильно по всем канонам, но это работает! Вопрос стоит - почему при заполнении (корректном!) индикаторных буферов свечи не отрисовываются?

Ткните носом! 

 
Alexey Viktorov:

Артём повнимательней. Если нет посчитанных баров!!! Тогда получается на графике нет вообще баров!!! А чего тогда считать??? Это, наверное, могло быть в МТ3 и такие перестраховки тянутся оттуда.

Ты ж задал чёткий вопрос:

разве может быть rates_total - prev_calculated < 1???

и получил такой же абсолютно чёткий ответ: в 99.99% случаев :)

Цифру процентов сам придумал :)