[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 82

 
wolf05632:

Спасибо, но мне не подойдет. Мне не нужно смещение. Выше я написал. Допустим для первой свечи буфер[1]=Hight[1], для третьей буфер[3]=Hight[3], а для второй надо рассчитать: буфер[2]=MathAbs(Higth[1]-Hight[3])/2 и получим то, что я хотел на рисунке.
А чем Вам Мой вариант не понравился? :)) Куда проще и меньше расчётов. Или Вам нужно, чтобы в буфере оставались значения на каждом баре?
 

wolf05632:

ЗЫ: как сделать так, чтоб индюк работал, т.е. производил расчеты (именно РАБОТАЛ, а не был виден) только на определенном таймфрейме (н1)?

Нужно привязывать расчёт не к текущему таймфрейму, а к H1! :)) То есть использовать не массивы Open[], Close[], High[], Low[], Time[], а функции iOpen(), iClose(), iHigh(), iLow(), iTime() с соответствующему параметрами...
 
MaxZ:
А чем Вам Мой вариант не понравился? :)) Куда проще и меньше расчётов. Или Вам нужно, чтобы в буфере оставались значения на каждом баре?

Пробовал, спасибо, но че-то не получилось. НА графике ниче не показывало. Мож что-то недопонял? Единственное, я понял главное: элементы у буфера должны идти последовательно (1,2,3...), т.е. без пропусков (1,3,5...) и КАЖДОМУ! элементу буфера должно быть присвоено значение! :-)
 

Roman, спасибо за ответ..... К сожалению, так и не понял один момент. В Учебнике, https://book.mql4.com/ru/basics/expressions, в разделе "Приведение типов. Вариант 4.1. Вычисляется результат целого типа

и Вариант 4.2. Аналогичная ситуация возникает и в случае, если искать результат в виде значения действительного типа", приведена одна и та же формула, но в одном случае тип переменной F обозначен как int

   double A = 2.0;                      // Количество карандашей у Васи
   int    Y = 3;                        // Количество ответов Пети
   int    F = A + Y;                    // Общее количество

а во втором примере переменная уже как double

   double A = 2.0;                   // Количество карандашей у Васи
   int    Y = 3;                     // Количество ответов Пети
   double F = A + Y;                 // Общее количество

К сожалению так и не понял логику преобразования. Если в первом варианте вообщем-то понятно почему почему переменной F присваивается int (т.е. согласно правилу неявного приведения типов), то вот почему во втором варианте присвоили double.... совершенно меня запутало.

Пожалуйста, поясните, что я здесь возможно упустил в объяснениях?

Заранее спасибо.

 
wolf05632:

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

Вы полностью код скопировали или только то, что было в функции start()? Это важно!

wolf05632:

Единственное, я понял главное: элементы у буфера должны идти последовательно (1,2,3...), т.е. без пропусков (1,3,5...) и КАЖДОМУ! элементу буфера должно быть присвоено значение! :-)
Не правильно Вы поняли! :)) Например, у зиг-заг'а ведь не все элементы буфера заполнены. Также не обязательно заполнять все элементы буфера у значков.
 
Geowind64:

Roman, спасибо за ответ..... К сожалению, так и не понял один момент. В Учебнике, https://book.mql4.com/ru/basics/expressions, в разделе "Приведение типов. Вариант 4.1. Вычисляется результат целого типа

и Вариант 4.2. Аналогичная ситуация возникает и в случае, если искать результат в виде значения действительного типа", приведена одна и та же формула, но в одном случае тип переменной F обозначен как int

а во втором примере переменная уже как double

К сожалению так и не понял логику преобразования. Если в первом варианте вообщем-то понятно почему почему переменной F присваивается int (т.е. согласно правилу неявного приведения типов), то вот почему во втором варианте присвоили double.... совершенно меня запутало.

Пожалуйста, поясните, что я здесь возможно упустил в объяснениях?

Заранее спасибо.



n


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

Подробнее - см. здесь.

 
Roman.:


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

Подробнее - см. здесь.


Я частенько использую неявное приведение типов. Правда скобки приходится использовать лишние.
 

Ребята, что означает #INF - это выход за допустимые пределы диапазона double? см. вторую строчку сверху (там считается произведение double TWR, а именно предыдущее ее значение умножается на последующее). Как правильно считать ТАКИЕ значения, принимаемые переменной TWR?

 
Geowind64:

Если почитать данный раздел учебника по-внимательнее, то Вы поймёте, что сначала нужно смотреть на выражение, которое находится левее операции присваивания "=":

   A + Y

Согласно правилу:

  • если тип выражения справа от знака операции присвоения не совпадает с типом переменной слева от знака операции присвоения, то значение выражения приводится к типу переменной слева от знака операции присвоения; это называется приведением к целевому типу;

переменная A типа double находится левее, а значит значение выражения A+Y будет число типа double.

А дальше уже нужно обратить внимание на тип переменной, к которой присваивается выражение.

В первом случае: "сначала тип выражения A+Y будет приведен к типу int (в соответствии с правилом вычисления целых чисел), а затем этот результат станет значением целой переменной F".

Во втором случае: "целевой тип переменной F (слева от знака операции присвоения), в данном случае - тип double, совпадает с типом double выражения A+Y, поэтому целевого преобразования типов не происходит".

Verstehen? :)))

 
Roman.:

Ребята, что означает #INF - это выход за допустимые пределы диапазона double? см. вторую строчку сверху (там считается произведение double TWR, а именно предыдущее ее значение умножается на последующее). Как правильно считать ТАКИЕ значения, принимаемые переменной TWR?

Вообще INFINITY (сокращённо INF) - это бесконечность! :)) Да, получается, что double не хватает больше сил (памяти) хранить такое громадное число.

А как правильно считать, могу лишь догадываться... Создать Свой тип, условно: хранить в дополнительной переменной разрядность, а double умножать на 10^n, где n - и есть степень разрядности. Но в таком случае резко теряется точность, да и у Вас вижу точность всё хуже и хуже...

Но может будет проще поменять логику расчётов? :))) Или может где-то кроется ошибка.