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

 

После последних ответов картина стала проясняться и самое очевидное это то что стать программистом мне не судьба :-)

Пока что начал с самого простого листинга и вот что оказалось:


2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[4] = 86.09999999999999   2018.10.15 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[3] = 85.98999999999999   2018.10.16 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[2] = 86.76000000000001   2018.10.17 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[1] = 86.5   2018.10.18 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[0] = 85.72   2018.10.19 00:00:00



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

И это происходит безо всяких погрешностей в вычислениях, это просто вывод значения цены из базы графика tmp1[i]=close[i];      

Это можно как-то победить или просто не обращать внимание?



 

Из него можно выкинуть всё относящееся к пятёрке, и получите шаблон для четвёрки.


Такое можно писать тем кто знает чем пятерка отличается от четверки и это точно не я :-)


//--- Проверка количества доступных баров
   if(rates_total<fmax(period_ma,4)) return 0;


Откуда цифра 4 взялась, какой у неё сакральный смысл?

 
psyman:


Такое можно писать тем кто знает чем пятерка отличается от четверки и это точно не я :-)



Откуда цифра 4 взялась, какой у неё сакральный смысл?

Вы точно и не слушаете, и не читаете... Было же ж:

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

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

Artyom Trishkin, 2018.10.18 09:26

//+------------------------------------------------------------------+
//| 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[])
  {
//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   if(limit>1) 
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
      limit=rates_total-1;
      // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }
//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      // необходимые действия по расчёту индикатора
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

 
psyman:

После последних ответов картина стала проясняться и самое очевидное это то что стать программистом мне не судьба :-)

Пока что начал с самого простого листинга и вот что оказалось:


2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[4] = 86.09999999999999   2018.10.15 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[3] = 85.98999999999999   2018.10.16 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[2] = 86.76000000000001   2018.10.17 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[1] = 86.5   2018.10.18 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[0] = 85.72   2018.10.19 00:00:00



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

И это происходит безо всяких погрешностей в вычислениях, это просто вывод значения цены из базы графика tmp1[i]=close[i];      

Это можно как-то победить или просто не обращать внимание?



Всё нормально. Для вывода дробных чисел на печать просто используйте DoubleToString() с нужной точностью. В данном случае необходимой точностью должно выступать Digits()

 
psyman:

После последних ответов картина стала проясняться и самое очевидное это то что стать программистом мне не судьба :-)

Пока что начал с самого простого листинга и вот что оказалось:


2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[4] = 86.09999999999999   2018.10.15 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[3] = 85.98999999999999   2018.10.16 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[2] = 86.76000000000001   2018.10.17 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[1] = 86.5   2018.10.18 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[0] = 85.72   2018.10.19 00:00:00


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

И это происходит безо всяких погрешностей в вычислениях, это просто вывод значения цены из базы графика tmp1[i]=close[i];      

Это можно как-то победить или просто не обращать внимание?

это обычные значения для вещественного числа, Вы может научиться писать программы, все с этого начинают- просто читать много нужно и пытаться писать и писать свои коды

про точность вещественного числа, мантису и как оно все хранится в памяти, Вы можете нагуглить в интернете, принципы хранения и везде одни и те же

если хотите красивый вывод используйте DoubleToStr()

 
Igor Makanu:

это обычные значения для вещественного числа, Вы может научиться писать программы, все с этого начинают- просто читать много нужно и пытаться писать и писать свои коды

про точность вещественного числа, мантису и как оно все хранится в памяти, Вы можете нагуглить в интернете, принципы хранения и везде одни и те же

если хотите красивый вывод используйте DoubleToStr()

Где есть возможность использования совместимых функций, лучше предлагать их к использованию. А то потом сия эпопея заново начнётся. В данном случае: DoubleToString()

 

Как можно было запретить запуск советника на одинаковых инструментах?

Например, советник работает в окне eur/usd, а при запуске в других окнах по eur/usd  выводится некоторое alert сообщение. Буду благодарен за помощь.

 
gans71:

Как можно было запретить запуск советника на одинаковых инструментах?

Например, советник работает в окне eur/usd, а при запуске в других окнах по eur/usd  выводится некоторое alert сообщение. Буду благодарен за помощь.

нужно передать данные из одного советника в другой, поиском по форуму

или используйте глобальные переменные терминала (это наиболее простой способ) - туда можно записать значение первым советником, а последующие копии советников будут считывать это значение и не будут запускаться https://www.mql5.com/ru/docs/globals

Документация по MQL5: Глобальные переменные терминала
Документация по MQL5: Глобальные переменные терминала
  • www.mql5.com
Глобальные переменные существуют в клиентском терминале 4 недели с момента последнего обращения, после этого автоматически уничтожаются. Обращением к глобальной переменной считается не только установка нового значения, но и чтение значения глобальной переменной.
 
Igor Makanu:

нужно передать данные из одного советника в другой, поиском по форуму

или используйте глобальные переменные терминала (это наиболее простой способ) - туда можно записать значение первым советником, а последующие копии советников будут считывать это значение и не будут запускаться https://www.mql5.com/ru/docs/globals

советник один и тот же, нужно запретить ему запускаться на одинаковых инструментах
 
gans71:
советник один и тот же, нужно запретить ему запускаться на одинаковых инструментах

и? за 2 минуты Вы не смогли бы изучить справку

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

if(GlobalVariableCheck(_Symbol)) .....

если нет такой переменной, то создаете такую перемеренную, примерно так: 

if(GlobalVariableSet(_Symbol,Magic)==0) Print("Ошибка записи в глоб.переменную № ",GetLastError()); 

потом нужно при завершении работы советника удалить глоб.переменную

кактотак, терминала нет под рукой, да и вроде направление поисков я указал

Причина обращения: