Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2512

 
Maxim Kuznetsov #:

возможно это я так непонятно поясняю :-)

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

у ATR есть замечательное свойство - внутри дня он стационарен (пики/впадины примерно в одно и то-же время каждый день), а величина хоть и отстаёт но характеризует рыночную активность.

--

Предположим ты хочешь прогнозировать размер свечи M30. Например чтобы ставить стопы. Или  если свеча "слишком длинная", то что-то торгануть.

(дальнейшее можно даже в Excel делать - экспортировать данные и на досуге крутить/вертеть)

Если просто выведешь зависимость ATR->размер_свечи (построишь двумерный график), то это будет пальцем в небо. Даже навскидку - в первую половину дня будет недобор, во вторую перебор.

Можешь попробовать вывести зависимость время_дня->размер_свечи, они есть, но будет тоже нехорошо, там слишком большой разброс.

А если объединить эти подходы - (время_дня,ATR)->размер_свечи то есть 3-х мерный график, поверхность - будет сильно точнее. Но данных мало, не все точки заполненны - нужен интерполятор, функция которая пройдёт по контрольным точкам и заполнит прогалы.

В итоге получится что в любой момент времени, ты можешь опираясь на статистику, довольно точно определить размер (пределы) будущей свечи.

---

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

PS2/ 3-х мерных графиков (ф-ций 2-х переменных) понадобиться минимум 2, чтобы получились пределы - "в 85% случаев свеча не более Zmax" "в 15% свеча менее Zmin" и можно какое-то среднее "в половине случаев свеча около Ztyp"

PS3/ чтобы совсем хорошело, а для старших ТФ обязательно, стоит учитывать наклон SMA (потому-что он неявно влияет на ATR и создаёт "помеху")

Что-то я из этого всего понял ).

Но в этих диалогах я ещё слаб ). Ваш коментарий я сохраню в word и на досуге поразбираюсь.

Всё таки идеи мыслящих и адыкватных людей, просто так не надешь, а мне учится у когото надо.) 

Спасибо Вам, за советы  и предложения.


Мне больше всего этот myАТР нужен для Акциий на D1.

Я совершаю сделки в ручную, месяц назад начал изучать MQL5.

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

Стандартный АТР как вы и говорили " считаются чуть иначе", он учитывает гэпы, которые мне не нужны.

Потому что после гэпа, размер на следующий день HL остаётся таким же, как и до него "+" "-" . 

 
Maxim Kuznetsov #:

отгадайте которую из них получает программист нажав F1 на iATR

при этом они не связаны между собой и ни по каким ссылкам не перейти от iATR к Average True Range

собственно отчасти потому и последние 2 страницы обсуждений и для кого-то новые открытия :-) Зато новый логотип

А почему вы как программист не нажимаете F1 на открытом терминале? Типа не царское дело?

 
Maxim121285 #:
   for(int i = 0; i < total; i++)
     {
      mATR[i] = iHigh(NULL, PERIOD_CURRENT, period_atr) - iLow(NULL, PERIOD_CURRENT, period_atr);
      //---Округление числа с плавающей точкой до указанной точности
      mATR[i] = NormalizeDouble(mATR[i] * 100000, Digits()); 
      period_atr++;//--- сдвиг периода
      Print(i, " ATR = ", (int)mATR[i]); // Распечатка.
     }
   for(int i = 0; i < total; i++)
     {
      mATR[i]=NormalizeDouble((iHigh(NULL, PERIOD_CURRENT, period_atr) - iLow(NULL, PERIOD_CURRENT, period_atr))/_Point,0);
      period_atr++;//--- сдвиг периода
      Print(i, " ATR = ", (int)mATR[i]); // Распечатка.
     }
 
Maxim121285 #:

my_ATR_HL

Требуетя сделать функцию  my_ATR_HL. 

Условия следующие: 

За выбраный период цен, High минус Low. (для простаты будем считать 10 периодов). К примеру ATR_HL: 150, 78, 240, 469, 69, 65, 127, 49, 84, 185


не проверял, но

// средне-типичный размер свечи из набора count игноря percentil свечей справа и слева
double AvTyp(int shift,int count=20,double percentil=5)
{
   int qty=(int)MathRound(count*percentil/100.0);  // столько свечей "убираем" справа-слева
   if (count-qty*2<=0) return 0;
   double size[];ArrayResize(size,count); // сюда складываем размеры свечей
   // складываем размеры
   for(int i=0;i<count;i++) {
      size[i]=iHigh(_Symbol,_Period,shift+i)-iLow(_Symbol,_Period,shift+i);   // можно сразу поделить на _Point - будут пункты
   }
   // сортируем
   ArraySort(size);
   // считаем среднее, игнорируя qty свечей справа-слева
   double sum=0.0;
   for(int i=qty;i<count-qty;i++) {
      sum=sum+size[i];
   }
   // возвращаем среднее
   return sum/(count-qty*2);
}
 
Здравствуйте! Мне нужно создать прямоугольник через клики мышки по графику. Как определить первую точку, я понимаю. Через использование lparam. Но когда я делаю клик во второй раз, то первый и второй получается одинаковыми. Подскажите, как сделать так, чтобы первый клик был с одной ценой, а второй клик был уже с другой ценой(Т.е они не должны быть равны)
Сейчас мой код выглядит примерно следующим образом:
void OnChartEvent(const int id,         // event ID  
                  const long& lparam,   // event parameter of the long type
                  const double& dparam, // event parameter of the double type
                  const string& sparam) // event parameter of the string type
  { 
  if(id==CHARTEVENT_CLICK){
  l=(int)lparam;
  }
  
  if(id==CHARTEVENT_CLICK){
  y=(int)lparam;
  Print(l + " " + y);
  }  
 } 
С точки зрения логики, я понимаю, что это не будет работать так, как мне нужно. Но своих знаний в программирование мне не хватает для решения данной проблемы
 
Tretyakov Rostyslav #:
   for(int i = 0; i < total; i++)
     {
      mATR[i]=NormalizeDouble((iHigh(NULL, PERIOD_CURRENT, period_atr) - iLow(NULL, PERIOD_CURRENT, period_atr))/_Point,0);      
      period_atr++;//--- сдвиг периода
      Print(i, " ATR = ", (int)mATR[i]); // Распечатка.
     }

Так интересней выглядит.

А вместо  "0" в канце, вункцию Digets() можно использовать, или это привидет к неправильным данным на других инструментах?  

 
Maxim Kuznetsov #:

не проверял, но

Всё отлично работает! Класс ! Вы профессионал !

Я как раз смотрел функции массивов, но немного в обучении завис.

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

Мозговой штурм! 

Уверень что мне это поможет в освоении MQL5. 

А Вам, за вашу отзывчивость и помощь, вернется добром, в двойне! )

Спасибо!

 
Sergei Gurov #:
Здравствуйте! Мне нужно создать прямоугольник через клики мышки по графику. Как определить первую точку, я понимаю. Через использование lparam. Но когда я делаю клик во второй раз, то первый и второй получается одинаковыми. Подскажите, как сделать так, чтобы первый клик был с одной ценой, а второй клик был уже с другой ценой(Т.е они не должны быть равны)
Сейчас мой код выглядит примерно следующим образом:
С точки зрения логики, я понимаю, что это не будет работать так, как мне нужно. Но своих знаний в программирование мне не хватает для решения данной проблемы

решений масса
как вариант:

void OnChartEvent(const int id,         // event ID  
                  const long& lparam,   // event parameter of the long type
                  const double& dparam, // event parameter of the double type
                  const string& sparam) // event parameter of the string type
  { 
    static bool first_click = true;
    if(id==CHARTEVENT_CLICK) {
      if (first_clik) l = (int)lparam;
      else {
        y = (int)lparam;
        Print(l," ",y);
      }
      first_click =!first_click;
   }
 } 
 
Nikolai Semko #:
    static bool first_click = true;     if(id==CHARTEVENT_CLICK) {       if (first_clik) l = (int)lparam;       else {         y = (int)lparam;         Print(l," ",y);       }       first_click =!first_click;    }

Все заработало. Огромное вам спасибо!

 
Maxim121285 #:

Так интересней выглядит.

А вместо  "0" в канце, вункцию Digets() можно использовать, или это привидет к неправильным данным на других инструментах?  

При делении на _Point, после запятой нет ничего, независимо от инструмента, так что _ Digits там не нужен