mql5: Крутите цифирки мышкой, господа. Это удобно.

 

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

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

деятельность. Мда. Вот как-то сидел курил и вдруг подумал, а нельзя ли и с цифрами извратиться да сделать что-то подобное? Задачка показалась привлекательной по результату,

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

В результете через пару дней озарило. Для целых чисел решение нашлось.

Просто объявляем перечислимый тип вида:

enum eIntTypeName
{
  i0 = 0, // 0
  i1 = 1, // 1
  ...
  iN = N  // N
}:

Потом вставляем везде в инпут-параметрах вместо типа int наш тип TypeName и собсно фсё.

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

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

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

поделаешь... Однако через день нашлось решение и для этой задачки, правда, чуть более сложное.

Объявляем что-то вроде:

enum  eFloatTypeName
{
  uf0 = 	0, 	 // 0.000
  uf1 = 	1, 	 // 0.001
  uf2 = 	2, 	 // 0.002
  uf3 = 	3, 	 // 0.003
  uf4 = 	4, 	 // 0.004
  uf5 = 	5, 	 // 0.005
  ...........
};

....а затем, перед использованием в программе, делим на соответствующий делитель (в данном случае 1000). Быстренько сделал второй скрипт и нагенерил этих типов...

- сколько потребовалось. Чтоб с множителями исключить ошибки сделал перегруженную функцию вида

double eFloatToString(eFloat01 a)
  {
   return (double)a/10.0; 
  }

double eFloatToString(eFloat001 a)
  {
   return (double)a/100.0; 
  }

и т.п.

И фсё. Задачка целиком и полностью решена. В прицепе весь набор индикаторов из папки <Indicators\Examples>, переделанные под полностью мышиную установку параметров.

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

Все типы я разбил на три группы - signed, unsigned и (для целых) positive (положительные не включающие ноль). Для действительных я делать positive не стал. Пока без надобности.

При необходимости можно генерить подобным способом новые типы. Генератор прилагается. Крутите, вертите, пределывайте...

Успехов в программировании и трейдинге.

Файлы:
mql5progs.rar  89 kb
 
MetaDriver >>:

....а затем, перед использованием в программе, делим на соответствующий делитель (в данном случае 1000). Быстренько сделал второй скрипт и нагенерил этих типов...

- сколько потребовалось. Чтоб с множителями исключить ошибки сделал перегруженную функцию вида

double eFloatToString(eFloat01 a)
  {
   return (double)a/10.0; 
  }

double eFloatToString(eFloat001 a)
  {
   return (double)a/100.0; 
  }

и т.п.

Рылся на форуме, глянул этот свой пост. Обнаружил неисправленную функцию (делал промежуточный вариант для отладки, забыл поправить).

Правильно конечно же:

double eFloatToDouble(eFloat01 a)
  {
   return (double)a/10.0; 
  }

double eFloatToDouble(eFloat001 a)
  {
   return (double)a/100.0; 
  }

и т.п.

Кладу в прицеп исправленную папку Enums. Индикаторы поправлять влом. Кому надо сам легко поправит заменой.

Файлы:
enums.rar  18 kb