помочь с кодом для эксперта - страница 3

 
Dina Paches:

P./S.: Артём, sorry, но применение MathPow(10,Digits()) для получения разницы в пунктах - так-то не ноу-хау.

Я, например, давно такое применяю. /* По тому же символу - так это один раз вычисление в OnInit(), затем расчёты на основе вычисленного значения при новом баре. Т.е., и дальнейшие вычисления - не на каждом тике.*/

После того, как путём "проб и ошибок" открыла для себя такой способ, обнаружила на четвёртом форуме, что и я являюсь далеко не первооткрывателем в этом.

P./S.: Если память мне не изменяет, и у тебя где-то это встречалось на четвёртом(?) форуме. Но, насколько помню, не MathPow(), а аналог этой функции (pow()).


Хотя может я в чём-то тебя не поняла в текущей теме.

Диночка, это сарказм был про Ноу-Хау... Мне когда нужно было сделать ожидание подкачки данных в панели, а сделана она была как индикатор, так я при помощи pow() делал задержку. А тут количество пунктов предложили так вычислять.
 
Artyom Trishkin:
Диночка, это сарказм был про Ноу-Хау... Мне когда нужно было сделать ожидание подкачки данных в панели, а сделана она была как индикатор, так я при помощи pow() делал задержку. А тут количество пунктов предложили так вычислять.

Ещё не видя твой пост, внесла уточнение в свой перед ним: "... <=Это просто уточнение, в связи с тем, что в своей практике не применяла никаким из вышеприведённых способов расчёты на каждом тике."

То, что pow() можно применять в качестве тормоза - не знала. Я не применяла эту функцию.

А поскольку сейчас сама хорошо торможу (ночью не спала, за компом просидела), то просто передам через тебя привет Лёвушке и отправлюсь подремать. После обеда по своим делам надо сходить.

 
Artyom Trishkin:

На более-менее "свежую голову" дополню, что:

Тема для меня оказалась полезной. Спасибо.


Но, просмотрев некоторые из своих кодов (и в т.ч., на основе своих замеров), всё-таки остаюсь при своём мнении, что применять определение количества пунктов через MathPow(10,Digits()) - можно.

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


Дополнено: Ну и предложения же сформировала... Сама же через некоторое время начну воспринимать смысл не так, как подразумевала.

Поэтому уточню. В общем:

1. Переменная A = MathPow(10,digits) <= это разовое присвоение: в скрипте - до основных вычислений, а в индикаторе/советнике, например, в OnInit.

2. Затем эту переменную A можно добавлять для дальнейших расчётов в "боевые" условия (в циклы и т.д.).

За счёт этого решается проблема замедления расчётов при применении функции MathPow.



Имхо, по поводу применения MathPow(10,...): например, если у меня в одном и том же коде определение разницы в пунктах для чего-то дальнейшего производится:

  • между одними значениям без применения MathAbs(); /*например, на сколько в "целых пунктах" больше или меньше предыдущего значения и вывод результата идёт со знаком "минус" или без него*/
  • а между другими значениями - с применением MathAbs(); /*например, количество пунктов в положительных целых знаках между другими величинами*/
  • да при этом заложена возможность выбора вывода результатов по "четырёхзнаку на пятизнаке", /* 1.20302  -  1.20281 = 2 */

то мне удобнее (и это, имхо, не является фактором, тормозящим расчёты) применять такой способ, разово задав переменной в OnInit() значение через MathPow(10,digits).


Так-то, если Point() = 0, то и Digits() должно быть равно 0. /*Поскольку point = 0.00001 - это digits = 5. В общем, разные ракурсы. */

Ниже тестовый скрипт, где есть вариант искусственно задать digits равным нулю. Можно наглядно увидеть, что можно получить при MathPow(10,0).

#property script_show_inputs
//---
#define TEST_PRINT_ONE(v1)            Print(__LINE__,", ",__FUNCTION__,", ",(#v1)," = ",(v1))
#define TEST_PRINT_THREE(v1,v2,v3)    Print(__LINE__,", ",__FUNCTION__,", ",(#v1)," = ",(v1),\
                                      ", ",(#v2)," = ",(v2),", ",(#v3)," = ",(v3))
//---
enum varDigits
  {
   AUTO=0,
   MINUS_ONE=1,
   EXPONENT_0=-1,
  };
//---
input double    i_value_1=1.20302;
input double    i_value_2=1.20281;
input varDigits i_var_digits=AUTO;
//---
double g_point_pow;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int digits=DigitsSet(i_var_digits);
//---
   g_point_pow=MathPow(10,digits);
//---
   TEST_PRINT_THREE(EnumToString(i_var_digits),digits,g_point_pow);
//---
   func1(i_value_1,i_value_2,g_point_pow);
//---
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void func1(const double value_1,
           const double value_2,
           const double point_pow)
  {
   double delta=0;
//---
   delta=NormalizeDouble((value_1-value_2)*point_pow,0);
//---
   TEST_PRINT_ONE(DoubleToString(delta));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int DigitsSet(varDigits count)
  {
   int result=Digits();
//---
   if(count==EXPONENT_0){return(0);}
   if(count<=result){return(result-count);}
//---
   return(result);
  }
//+------------------------------------------------------------------+

Вывод результатов:

2016.09.29 19:01:24.749 Test__9 (EURUSD.m,H1)   52, func1, DoubleToString(delta) = 0.00000000
2016.09.29 19:01:24.749 Test__9 (EURUSD.m,H1)   36, OnStart, EnumToString(i_var_digits) = EXPONENT_0, digits = 0, g_point_pow = 1.0

2016.09.29 19:01:18.896 Test__9 (EURUSD.m,H1)   52, func1, DoubleToString(delta) = 2.00000000
2016.09.29 19:01:18.896 Test__9 (EURUSD.m,H1)   36, OnStart, EnumToString(i_var_digits) = MINUS_ONE, digits = 4, g_point_pow = 10000.0

2016.09.29 19:01:10.295 Test__9 (EURUSD.m,H1)   52, func1, DoubleToString(delta) = 21.00000000
2016.09.29 19:01:10.295 Test__9 (EURUSD.m,H1)   36, OnStart, EnumToString(i_var_digits) = AUTO, digits = 5, g_point_pow = 100000.0


P./S.: На всякий случай упомяну ещё, что всё вышесказанное мной не является утверждением, что "нельзя применять /Point(), применяйте только MathPow(10,Digits())"

 

P./S.: Дополню ещё, что для моделирования ситуаций "digits равно нулю", в этом тестовом скрипте будет ещё наглядным задать во внешних параметрах:

  • различающиеся числа без десятичных знаков,
  • и выбрать вариант EXPONENT_0.

Например:

Вывод результата:

2016.09.30 08:15:11.118 Test__9 (EURUSD.m,M5)   52, func1, DoubleToString(delta) = 5.00000000
2016.09.30 08:15:11.118 Test__9 (EURUSD.m,M5)   36, OnStart, EnumToString(i_var_digits) = EXPONENT_0, digits = 0, g_point_pow = 1.0
 

Заодно, для разнообразия приведу вывод количества пунктов с дельты между числами 108 и 103 (но уже на паре USDJPY) при выборе других вариантов работы скрипта:

2016.09.30 08:18:43.258 Test__9 (USDJPY.m,M5)   52, func1, DoubleToString(delta) = 500.00000000
2016.09.30 08:18:43.258 Test__9 (USDJPY.m,M5)   36, OnStart, EnumToString(i_var_digits) = MINUS_ONE, digits = 2, g_point_pow = 100.0

2016.09.30 08:18:19.495 Test__9 (USDJPY.m,M5)   52, func1, DoubleToString(delta) = 5000.00000000
2016.09.30 08:18:19.495 Test__9 (USDJPY.m,M5)   36, OnStart, EnumToString(i_var_digits) = AUTO, digits = 3, g_point_pow = 1000.0
Причина обращения: