Могли бы вы рассказать о случае, когда участник форума оказался полезным в вашей работе, и можете ли вы описать это подробно? - страница 7

 
lynxntech #:

зачем уводить с форума, это не спор, а обсуждения, как показывает исследование, тут многие толком не знает как точно надо оформлять этот расчет, в какой индикатор не загляни - вариантов очень много, какой из них верный?

Просто мне сложно написать так, чтобы было понятно. Если бы я мог, то написал бы статью по этому вопросу.

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

Где-то на форуме есть какой-то примитивный индикатор в двух вариантах. Один писал Артём, второй писал я. И вот на примере этого индикатора можете увидеть всё что надо. Но ссылки у меня на эти сообщения нету.

К примеру?

Вариант 1

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1

#property indicator_type1   DRAW_COLOR_LINE
#property indicator_color1  clrNavy, clrRed
#property indicator_width1  2
//---
double   dataBuff[];
double   colorBuff[];
/*************Custom indicator initialization function***************/
int OnInit()
 {
  SetIndexBuffer(0, dataBuff);//, INDICATOR_DATA);
  SetIndexBuffer(1, colorBuff, INDICATOR_COLOR_INDEX);

  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 == 0 ? 1 : rates_total-1;
  for(int i = limit; i < rates_total; i++)
   {
    dataBuff[i] = high[i];
    colorBuff[i] = high[i] > high[i-1] ? 0 : 1;
   }
  return rates_total;
 }/******************************************************************/

Вариант 2

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1

#property indicator_type1   DRAW_COLOR_LINE
#property indicator_color1  clrNavy, clrRed
#property indicator_width1  2
//---
double   dataBuff[];
double   colorBuff[];
/*************Custom indicator initialization function***************/
int OnInit()
 {
  SetIndexBuffer(0, dataBuff);//, INDICATOR_DATA);
  SetIndexBuffer(1, colorBuff, INDICATOR_COLOR_INDEX);

  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[])

 {
  if(prev_calculated == 0)
   {
    ArraySetAsSeries(high, true);
    ArraySetAsSeries(dataBuff, true);
    ArraySetAsSeries(colorBuff, true);
   }
  int limit = prev_calculated == rates_total ? 1 : 0;
  for(int i = limit; i >= 0; i--)
   {
    dataBuff[i] = high[i];
    colorBuff[i] = high[i] > high[i+1] ? 0 : 1;
   }
  return rates_total;
 }/******************************************************************/

Вариант 3

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1

#property indicator_type1   DRAW_COLOR_LINE
#property indicator_color1  clrNavy, clrRed
#property indicator_width1  2
//---
double   dataBuff[];
double   colorBuff[];
/*************Custom indicator initialization function***************/
int OnInit()
 {
  SetIndexBuffer(0, dataBuff);//, INDICATOR_DATA);
  SetIndexBuffer(1, colorBuff, INDICATOR_COLOR_INDEX);

  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 == 0 ? 1 : rates_total-1;
  //for(int i = limit; i < rates_total; i++)
  while(limit < rates_total && !_StopFlag)
   {
    dataBuff[limit] = high[limit];
    colorBuff[limit] = high[limit] > high[limit-1] ? 0 : 1;
    limit++;
   }
  return rates_total;
 }/******************************************************************/

И все эти индикаторы показывают одинаково.

Файлы:
 
Alexey Viktorov #:

Просто мне сложно написать так, чтобы было понятно. Если бы я мог, то написал бы статью по этому вопросу.

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

Где-то на форуме есть какой-то примитивный индикатор в двух вариантах. Один писал Артём, второй писал я. И вот на примере этого индикатора можете увидеть всё что адо. Но ссылки у меня на эти сообщения нету.

тут всего-то надо несколько условий в паре строк описать, как обычно задача стоит когда рынок закрыт) завтра воспроизведу все варианты, отключение интернета и т.д.

ну и конечно в понятном стиле i++, а не обратно

навести порядок наконец в индикаторах у себя

 
lynxntech #:

тут всего-то надо несколько условий в паре строк описать, как обычно задача стоит когда рынок закрыт) завтра воспроизведу все варианты, отключение интернета и т.д.

ну и конечно в понятном стиле i++, а не обратно

навести порядок наконец в индикаторах у себя

смотреть надо в штатных примерах терминала -- в них сделано правильно с корректной полноценной отработкой.

как я понял (возможно ошибаюсь) по алгоритму Артёма -- это компиляция с какой-то вариации "бородатого" подхода для четвёрки -- который использовался ещё до 600-го билда -- этот подход не лучший и он принципиально устарел.

 
Andrey F. Zelinsky #:

смотреть надо в штатных примерах терминала -- в них сделано правильно с корректной полноценной отработкой.

как я понял (возможно ошибаюсь) по алгоритму Артёма -- это "бородатый" стиль для четвёрки -- который использовался ещё до 600-го билда -- этот подход принципиально устарел.

Начинается спор тупоконечников с остроконечниками. Пипсы-пункты, прямые-обратные циклы...

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

Ну, и к предпочтениям.

Я использую потому, что ни разу не было сбоев за почти два десятка лет.

Ещё потому, что все индексы всех массивов совпадают и не нужно их пересчитывать.

Ещё потому, что направление расчёта от старых данных к новым совпадает с реальным направлением расчёта - мы сначала принимаем решение на текущих данных, и лишь потом - при поступлении новых данных, используем уже посчитанные в прошлом данные. Если же взять расчёт индикатора от настоящего в прошлое, то мы вынуждены рассчитывать индикатор от "неизвестного" будущего к известному прошлому (чтобы понять о чём речь, нужно попробовать рассчитать индикатор в окне в середине истории, где бары справа - это неизвестное будущее).

Ещё я рассчитываю так потому, что просто привык к простой и понятной схеме, где не нужно в уме переворачивать несовпадающие по индексации массивы.

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

 
Andrey F. Zelinsky #:

смотреть надо в штатных примерах терминала -- в них сделано правильно с корректной полноценной отработкой.

как я понял (возможно ошибаюсь) по алгоритму Артёма -- это компиляция с "бородатого" стиля для четвёрки -- который использовался ещё до 600-го билда -- этот подход принципиально устарел.

p.s. надо поднимать свои архивы с индикаторами до 600-го билда МТ4 -- и смотреть какое тогда обоснование было для такого подхода.

в штатных и во "Free Indicators" такая же сборная солянка как и в кодобазе))

 
lynxntech #:

в штатных и во "Free Indicators" такая же сборная солянка как и в кодобазе))

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

 
Andrey F. Zelinsky #:
этот подход не лучший и он принципиально устарел

Технические выкладки будут? Пока только озвучивание личностного.

Я сделал тестовый индикатор, на котором проверю на открытом рынке обрывы связи и их обработку.

//+------------------------------------------------------------------+
//|                                                    TestLimit.mq5 |
//|                                  Copyright 2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Test"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);
   ArraySetAsSeries(Buffer,true);
//---
   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[])
  {
//---
   ArraySetAsSeries(time,true);
   ArraySetAsSeries(close,true);
   string tm=TimeToString(time[0]);
   int limit=rates_total-prev_calculated;
   /*
   if(limit==0)
     {
      Расчёт каждого тика на текущем нулевом баре
     }
   */
//--- Первый запуск, либо изменения в истории
   if(limit>1)
     {
      limit=rates_total-1;
      PrintFormat("%s: Обрабатываем условие if(limit>1) { инициализация буфера и полный перерасчёт индикатора (%d баров) }",tm,limit);
      ArrayInitialize(Buffer,EMPTY_VALUE);
     }
   if(limit>=1)
     {
      string x=(limit==1 ? "Новый бар" : "Первый запуск или изменения в истории");
      PrintFormat("%s: %s. rates_total=%d, prev_calculated=%d, limit=%d. Считаем от %d до 0",tm,x,rates_total,prev_calculated,limit,limit);
     }
//--- Цикл от начала истории до текущего времени
   for(int i=limit;i>=0;i--)
     {
      Buffer[i]=close[i];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Artyom Trishkin #:
же взять расчёт индикатора от настоящего в прошлое

разве так кто-то считает?

в штатных индикаторах везде i++, 0-бар первый, rates_total последний(самый свежий)

вот это как раз и правильный способ расчет от 0 до 10000 баров, в роботе уже переворачиваем массив

 
Alexey Viktorov #:
И все эти индикаторы показывают одинаково.

Проверь завтра как они все отрабатывают на минутках с отключением связи на несколько минут. Интересно.

 
Artyom Trishkin #:

Пока только озвучивание личностного.

ты о чём? о каком личностном?

ты культивируешь в массы подход -- по твоему подходу есть вопросы -- и у твоего подхода есть принципиальные недостатки -- которые на паре страниц выше я детально описал.

но ты почему-то не даёшь внятное пояснение ни по одному обозначенному недостатку -- все твои пояснения в стиле "просто привык к простой и понятной схеме" -- но эта схема не понятная, иначе отсутствовали бы вопросы к ней.

твоё:

Artyom Trishkin #:
направление расчёта от старых данных к новым совпадает с реальным направлением расчёта

-- здесь ты путаешь направление расчёта от истории к текущему бару -- с направлением индексации буферных массивов.

по направлению расчёта в твоём алгоритме вопросов нет.

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