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

 

Я пропустил параметр "length of the pattern" указания длины для числового паттерна (этот параметр используется только для режима оптимизации).

#property version   "1.003"
#property description "Bull candle - \"1\", bear candle - \"0\""
//---
#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object
//+------------------------------------------------------------------+
//| Enum pattern type: numerical or string                           |
//+------------------------------------------------------------------+
enum ENUM_PATTERN_TYPE
  {
   PATTERN_TYPE_NUMERICAL=0,  // numerical
   PATTERN_TYPE_STRING=1,     // string 
  };
//---
input ENUM_PATTERN_TYPE    InpPatternType          = PATTERN_TYPE_STRING;  // pattern type
input uchar                InpLenNumerical         = 3;                    // length of the pattern (use only if pattern "numerical")
input string               InpsMorseCode           = "101";                // string Morse code (max 5 characters)
input ENUM_POSITION_TYPE   InpPosType              = POSITION_TYPE_BUY;    // posinion type
input double               InpLot                  = 0.1;                  // lot
sinput ulong               m_magic                 = 88430400;             // magic number
input ulong                m_slippage              = 30;                   // slippage
//---
string sExtMorseCode="";
int max_string_len=5;         // limitation of the length of the pattern "string"
int i_morse_code=0;           // int Morse code (use only if pattern type=numerical)
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(InpPatternType==PATTERN_TYPE_STRING)
     {
      //--- check start mode
      if(MQLInfoInteger(MQL_OPTIMIZATION))
         return(INIT_PARAMETERS_INCORRECT);
      //--- info print
      Print("The type of the pattern \"string\" is set - the parameters \"pattern length\" and \"int Morse code\" are ignored");

      sExtMorseCode=InpsMorseCode;

И сразу защита - если в режиме оптимизации выбран строковый тип паттерна - советник будет возвращать "INIT_PARAMETERS_INCORRECT"

 
Vitalii Ananev:


Надо сразу все предусмотреть, что бы потом не переделывать.

....

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



Позвольте мне вставить свои 5 копеек.

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

 
Pyxis:


Позвольте мне вставить свои 5 копеек.

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


Зачем суммировать. Ну например для простоты модели. И вообще это было дано для примера.

Почему не возможно? Все часто встречающие комбинации японских свечей можно тем или иным способом закодировать. Другое дело, что 1-го бита (об этом я выше писал) не достаточно, надо минимум использовать 2 бита и их тоже не достаточно если не суммировать (упрощать) модель паттерна. 

 

Пока Morse code version   "1.003": можно вручную задавать строковое описание паттерна и даже прогонять в тестере одиночные проходы.

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


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

Понял. Ну, тогда - строка символов и парсер. По-моему, самый гибкий вариант.
 
George Merts:

Что-то я не вполне пойму - тут программисты или лохи ?

Зачем что-то там переводить куда-то ???

Если нам нужен код 101 - то это обычное значение 5. Все.  Какие проблемы ? Перевести мысленно десятичный в двоичный ???

Я подобные эксперименты проводил, только у меня свеча еще имела четыре размера - от маленького до большого. Соответственно, восемь вариантов свечей. И, стало быть, три бита. В паттерне пишем число (ulong) - сетка больше, чем на двадцатибарный паттерн.

Проблема, на мой взгляд, надуманна.

Вы сначала разберитесь а потом критикуйте. Вот вам на подумать задача:

Закодируйте числом int следующие комбинации свечей:

  • 1011;
  • 01011;
  • 001011

Подсказка: это разные комбинации.

George Merts:
Понял. Ну, тогда - строка символов и парсер. По-моему, самый гибкий вариант.
Еще раз: оптимизатор_не_оптимизирует_строковые_параметры. Как Вы будете искать комбинацию прибыльных паттернов без оптимизатора?
 
Vasiliy Sokolov:
Еще раз: оптимизатор_не_оптимизирует_строковые_параметры. Как Вы будете искать комбинацию прибыльных паттернов без оптимизатора?

Если нужен оптимизатор - то, на мой взгляд, пользователь должен быть достаточно "подкован", чтобы перевести число в двоичный код (хотя бы с помощью обычного калькулятора Windows).

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

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

 
Vasiliy Sokolov:

Вы сначала разберитесь а потом критикуйте. Вот вам на подумать задача:

Закодируйте числом int следующие комбинации свечей:

  • 1011;
  • 01011;
  • 001011

Подсказка: это разные комбинации.

Более того - они различны по длине. Первая комбинация - включает в себя четыре шестиразрядных.

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

Соответственно, при оптимизации - просто брать 64 шестиразрядных комбинации.

Причем, последняя - является подмножеством первых двух вариантов, а предпоследняя - подмножеством первого варианта.

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

 
А в чём, собсно, цель мероприятия - найти наиболее прибыльную последовательность? Для этого ни робот ни тестер не нужны - хватит индикатора, в котором задаётся длина последовательноти и правила закрытия позиции (по TP или противоположному сигналу или ещё куда). Индикатор кодом переберёт все варианты в пределах заданной длины последовательности и заданной глубины истории, результат (включая просадку) отсортирует и распечатает куда укажете. А так действительно, проблема выглядит надуманной. Ну если это не игрушка типа погадай на 0101, чтобы юзера занять
 
George Merts:

Соответственно, при оптимизации - просто брать 64 шестиразрядных комбинации.

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

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

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