Morse code - страница 5

 
Morse code version "1.004": исправлена ошибка - паттерн считывался задом-на пёрёд.
Файлы:
Morse_code.mq5  15 kb
 
Vasiliy Sokolov:

Вопрос: какова вероятность появления на рынке комбинации совпадающей с требуемой в 64 разрядах? Ответ: (1/2^64)*BarsCount. Т.е. с вероятностью близкой к 100% такой комбинации найдено не будет. Т.е. очевидно, что одно только число int или long не способно полностью описать паттерн, поэтому требуется дополнительный параметр, указывающий длину паттерна.

Это - если глядеть на все 64 разряда. Но - это явно лишнее.

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

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

 

Ещё точно не сформировал, но в общих чертах идея такая: два параметра - длина и параметр int от 0 до 3. Внутри советника уже идёт интерпретация этого числа (Псевдобитовое представление):

int Длина (она же маска)Псевдобитовое представление
 0 х 0
 1 х 1
   
 2 хх 00
 3 хх 01
 4 хх 10
 5 хх 11
   
 6 ххх 000
 7 ххх 001
 8 ххх 010
 9 ххх 011
 10 ххх 100
 11 ххх 101
 12 ххх 110
 13 ххх 111

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

И главное - структуру оптимизатор позволяет перебирать!

 

Для трех свечей можно и три отдельных параметра в окне свойств сделать. Сразу два зайца убиты - и наглядно и оптимизируется.

Так же можно и для 10 свечей.

 
Dmitry Fedoseev:

Для трех свечей можно и три отдельных параметра в окне свойств сделать. Сразу два зайца убиты - и наглядно и оптимизируется.

Так же можно и для 10 свечей.

Поддерживаю

input bool svecha1 = true;
input bool svecha2 = false;
input bool svecha3 = true;
input bool svecha4 = false;
input bool svecha5 = true;
 
Vladimir Karputov:

Ещё точно не сформировал, но в общих чертах идея такая: два параметра - длина и параметр int от 0 до 3. Внутри советника уже идёт интерпретация этого числа (Псевдобитовое представление):

int Длина (она же маска)Псевдобитовое представление
 0 х 0
 1 х 1
   
 2 хх 00
 3 хх 01
 4 хх 10
 5 хх 11
   
 6 ххх 000
 7 ххх 001
 8 ххх 010
 9 ххх 011
 10 ххх 100
 11 ххх 101
 12 ххх 110
 13 ххх 111

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

И главное - структуру оптимизатор позволяет перебирать!


Вот такое перечисление для маски от х до ххх:

//+------------------------------------------------------------------+
//| Enum pattern type: numerical or string                           |
//+------------------------------------------------------------------+
enum ENUM_PATTERN_MASK
  {
   _0=B'0',       // 
   _1=B'1',       //  
   _2=B'00',      // 
   _3=B'01',      // 
   _4=B'10',      // 
   _5=B'11',      // 
   _6=B'000',     // 
   _7=B'001',     // 
   _8=B'010',     // 
   _9=B'011',     // 
   _10=B'100',    // 
   _11=B'101',    // 
   _12=B'110',    // 
   _13=B'111',    // 
  };
 

Morse code version "1.005"

Вот такое решение: маска задаётся в виде перечисления

//+------------------------------------------------------------------+
//| Enum pattern mask                                                |
//+------------------------------------------------------------------+
enum ENUM_PATTERN_MASK
  {
   _0    =   0    ,   // 0
   _1    =   1    ,   // 1

   _2    =   2    ,   // 00
   _3    =   3    ,   // 01
   _4    =   4    ,   // 10
   _5    =   5    ,   // 11

   _6    =   6    ,   // 000
   _7    =   7    ,   // 001
   _8    =   8    ,   // 010
   _9    =   9    ,   // 011
   _10   =   10   ,   // 100
   _11   =   11   ,   // 101
   _12   =   12   ,   // 110
   _13   =   13   ,   // 111

   _14   =   14   ,   // 0000
   _15   =   15   ,   // 0001
   _16   =   16   ,   // 0010
   _17   =   17   ,   // 0011
   _18   =   18   ,   // 0100
   _19   =   19   ,   // 0101
   _20   =   20   ,   // 0110
   _21   =   21   ,   // 0111
   _22   =   22   ,   // 1000
   _23   =   23   ,   // 1001
   _24   =   24   ,   // 1010
...

в OnInit() маска переводится в строковую переменную "sExtMorseCode" (переменная "sExtMorseCode" объявлена на глобальном программном уровне) в функции ConvertNumberToString:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool ConvertNumberToString(const ENUM_PATTERN_MASK num_mask,string &text)
  {
   bool result=true;
//---
   switch(num_mask)
     {
      case 0:  text="0"; break;
      case 1:  text="1"; break;
      case 2:  text="00"; break;
      case 3:  text="01"; break;
      case 4:  text="10"; break;
      case 5:  text="11"; break;
      case 6:  text="000"; break;
      case 7:  text="001"; break;
      case 8:  text="010"; break;
      case 9:  text="011"; break;
      case 10: text="100"; break;
...
      case 53: text="10111"; break;
      case 54: text="11000"; break;
      case 55: text="11001"; break;
      case 56: text="11010"; break;
      case 57: text="11011"; break;
      case 58: text="11100"; break;
      case 59: text="11101"; break;
      case 60: text="11110"; break;
      case 61: text="11111"; break;
      default: text=""; return(false);
     }
//---
   return(result);
  }

Решилось две проблемы:

1). пользователь видит во входных параметрах паттерн в виде "0101":

Удобное вид входного пареметра

2). Входной параметр отлично поддаётся оптимизации в тестере.

Файлы:
Morse_code.mq5  20 kb
 
Vladimir Karputov:

Morse code version "1.005"

Решилось две проблемы:

1). пользователь видит во входных параметрах паттерн в виде "0101":

2). Входной параметр отлично поддаётся оптимизации в тестере.

Пользователь может задавать свечную комбинацию без математических вычислений, согластно первоначальной задумке?

 
Pyxis:

Пользователь может задавать свечную комбинацию без математических вычислений, согластно первоначальной задумке?


Да, может без никаких математических вычислений. Причем теперь не нужно вводить вручную комбинацию - достаточно выбрать подходящую свечную комбинацию в выпадающем списке "pattern mask".
 
Погонял в тестере (полная оптимизация) Morse code version "1.005" - в чистом виде паттерны (как сейчас) совсем не рыбные :(.
Причина обращения: