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

 
Vladimir Karputov:

В отладке пройдитесь и проверьте, в каких случаях Ваше условие будет выполняться?


rates_total - prev_calculates очень даже действенная конструкция.

  • Если равно нулю - значит расчёт на текущем баре по тику
  • Если равно 1 - значит новый бар и рассчитываться будут два бара - прошлый и текущий
  • Если больше 1 - значит либо первый запуск, либо изменение в исторических данных
Мы же limit рассчитываем. А в цикле от limit до больше, либо равно нулю рассчитываем данные индикатора. Ну и сам посчитай чему limit равен при расчёте limit = rates_total - prev_calculates.
 
Artyom Trishkin:

rates_total - prev_calculates очень даже действенная конструкция.

  • Если равно нулю - значит расчёт на текущем баре по тику
  • Если равно 1 - значит новый бар и рассчитываться будут два бара - прошлый и текущий
  • Если больше 1 - значит либо первый запуск, либо изменение в исторических данных
Мы же limit рассчитываем. А в цикле от limit до больше, либо равно нулю рассчитываем данные индикатора. Ну и сам посчитай чему limit равен при расчёте limit = rates_total - prev_calculates.

Код посмотри. 

Потом комментируй.

 
Vladimir Karputov:

Код посмотри. 

Потом комментируй.

К чему грубости? Я тебе не грубил же.

Я ответил в каких случаях процитированная тобой строчка и её условие будет выполняться:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Vladimir Karputov, 2020.08.06 13:03

В отладке пройдитесь и проверьте, в каких случаях Ваше условие будет выполняться?


И даже дополнил ответ тремя её возможными состояниями, и что делается в таком случае:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Artyom Trishkin, 2020.08.06 15:17

rates_total - prev_calculates очень даже действенная конструкция.

  • Если равно нулю - значит расчёт на текущем баре по тику
  • Если равно 1 - значит новый бар и рассчитываться будут два бара - прошлый и текущий
  • Если больше 1 - значит либо первый запуск, либо изменение в исторических данных
Мы же limit рассчитываем. А в цикле от limit до больше, либо равно нулю рассчитываем данные индикатора. Ну и сам посчитай чему limit равен при расчёте limit = rates_total - prev_calculates.

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

 
Artyom Trishkin:

К чему грубости? Я тебе не грубил же.

Я ответил в каких случаях процитированная тобой строчка и её условие будет выполняться:

И даже дополнил ответ тремя её возможными состояниями, и что делается в таком случае:

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

Возьми код и пройдись в отладке. Дальше подсказуй сам - только теперь доведи дело до конца и растолкуй как минимум три ошибки.

 
Vladimir Karputov:

Возьми код и пройдись в отладке. Дальше подсказуй сам - только теперь доведи дело до конца и растолкуй как минимум три ошибки.

Нет. Мне некогда. Я ответил только на ту строчку, которую ты цитировал - в ней нет ошибки. А дальше (я глянул код краем глаза) пусть сам попробует разобраться (ошибки есть, и они наповерхности).

Примеров с такими конструкциями здесь на форуме и его сервисах предостаточно.

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

Victor Nikolaev
Victor Nikolaev
  • www.mql5.com
Профиль трейдера
 
Artyom Trishkin:

Нет. Мне некогда. Я ответил только на ту строчку, которую ты цитировал - в ней нет ошибки. А дальше (я глянул код краем глаза) пусть сам попробует разобраться (ошибки есть, и они наповерхности).

Примеров с такими конструкциями здесь на форуме и его сервисах предостаточно.

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

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

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


Вот пример: на базе 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. затем поставить условие для выбора какую свечу выделять.
И в конце-то концов научиться пользоваться отладчиком.
Причина обращения: