Автоматическая генерация кода - страница 2

 

Алексей, я Вас понял. Имхо, сначала прежде чем заниматься формой, нужно проверить содержательную часть...

У меня к Вам вопрос такого плана. 

Допустим, что есть 3 фильтра. Сколько предикторов будет в системе?

Предиктор - это независимая переменная, оказывающая или не оказывающая влияние на конечный результат. Именно это и нужно выяснить...

 
Dennis Kirichenko:

Алексей, я Вас понял. Имхо, сначала прежде чем заниматься формой, нужно проверить содержательную часть...

У меня к Вам вопрос такого плана. 

Допустим, что есть 3 фильтра. Сколько предикторов будет в системе?

Предиктор - это независимая переменная, оказывающая или не оказывающая влияние на конечный результат. Именно это и нужно выяснить...

Предиктор, это не переменная, а результат вычислений алгоритма, формирующий некий признак. 10 фильтров даст 10 единиц предикторов для советника. А вот то, что может показывать каждый из них - результат отдельных настроек.

 
Aleksey Vyazmikin:

Предиктор, это не переменная, а результат вычислений алгоритма, формирующий некий признак. 10 фильтров даст 10 единиц предикторов для советника. А вот то, что может показывать каждый из них - результат отдельных настроек.

Соглашусь тут только с одним: здесь фильтр - это и есть предиктор, в лучшем случае. В худшем - пустышка.

Давайте с моим примером, где есть 3 фильтра, а то я плохо считаю, боюсь запутаться...

Пусть Ri - это i-тый предиктор.

Если есть 3 фильтра то мы имеем:

1) 3 предиктора первого уровня: R1, R2, R3;

2) 2 предиктора второго уровня: R1*R2 (эффект от совместной жизни предикторов R1 и R2), R1*R3, R2*R3;

3) 1 предиктор третьего уровня: R1*R2*R3 (эффект от совместной жизни предикторов R1,R2 и R3).

Итого имеем 6 предикторов (правда разного уровня, важно уточнить)! 

Насколько я понимаю, Вы сейчас подыскиваете оптимальные значения для R1, R2 и R3 по отдельности, получая частные предикторные результаты. Потом скрещиваете их в попытке найти оптимальные значения всей группы на основе частных предикторных результатов. 

Вопрос, правильно ли так делать? А если нет, то что нужно сделать в начале? :-))

 
Dennis Kirichenko:

Соглашусь тут только с одним: здесь фильтр - это и есть предиктор, в лучшем случае. В худшем - пустышка.

Давайте с моим примером, где есть 3 фильтра, а то я плохо считаю, боюсь запутаться...

Пусть Ri - это i-тый предиктор.

Если есть 3 фильтра то мы имеем:

1) 3 предиктора первого уровня: R1, R2, R3;

2) 2 предиктора второго уровня: R1*R2 (эффект от совместной жизни предикторов R1 и R2), R1*R3, R2*R3;

3) 1 предиктор третьего уровня: R1*R2*R3 (эффект от совместной жизни предикторов R1,R2 и R3).

Итого имеем 6 предикторов (правда разного уровня, важно уточнить)! 

Насколько я понимаю, Вы сейчас подыскиваете оптимальные значения для R1, R2 и R3 по отдельности, получая частные предикторные результаты. Потом скрещиваете их в попытке найти оптимальные значения всей группы на основе частных предикторных результатов. 

Вопрос, правильно ли так делать? А если нет, то что нужно сделать в начале? :-))

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

А что Вы предлагаете сделать в начале - так расскажите, может что-то гениальное.

 
Aleksey Vyazmikin:

А что Вы предлагаете сделать в начале - так расскажите, может что-то гениальное.

Так всё украдено  предложено до нас :-)

Имхо, в начале нужно попробовать сократить число фильтров. Допустим, есть пара фильтров, которые сильно коррелируют. Тогда один можно выкинуть из корзины... 

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

 
Dennis Kirichenko:

Так всё украдено  предложено до нас :-)

Имхо, в начале нужно попробовать сократить число фильтров. Допустим, есть пара фильтров, которые сильно коррелируют. Тогда один можно выкинуть из корзины... 

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

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

В любом случае, я рассматриваю ситуацию, когда логика фильтров не связана и их гармоничное сосуществование нужно определить методом оптимизации.
 
Aleksey Vyazmikin:

...но а если вход генерируется не столь очевидно и запрет на вход в точке А дает разрешение входу в точке Б, то такой подход не сработает - есть идеи, как сравнить в этом случае фильтры?

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

 
Dennis Kirichenko:

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

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

 

Возвращаясь к теме топика, ниже приведено ТЗ, как иллюстрация, возможно ли выполнить это ТЗ силами MQL5, если да, то как? Если нет, то почему?

Заказы на разработку программ для трейдинга

Конвертер текста в примитивный код MQL5 по шаблону

> 30 USD

Необходимо сделать обработчик текстового файла, который будет отформатированный текст по определенным правилам преобразовывать в строку кода следующего формата:

if (Переменная_01>10 && Переменная_n<=55 && Переменная_n+1<=X) Условие_N=true //Информация из скобок(47;53)

Строк может быть много.

Вот так выглядит фрагмент текстового файла

  1) root 605999 277734 1 (0.4583077 0.5416923)  
    2) arr_DonProcVisota< 7.5 520363 245903 1 (0.4725605 0.5274395)  
      4) arr_DonProc>=8.5 96224  44499 0 (0.5375478 0.4624522)  
        8) arr_DonProc>=9.5 39589  16834 0 (0.5747809 0.4252191) *
        9) arr_DonProc< 9.5 56635  27665 0 (0.5115211 0.4884789)  
         18) arr_DonProcVisota< 3.5 19254   8471 0 (0.5600395 0.4399605)  
           36) Part_H4>=3.5 5142   1861 0 (0.6380786 0.3619214) *
           37) Part_H4< 3.5 14112   6610 0 (0.5316043 0.4683957)  
             74) arr_Den_Nedeli>=1.5 10701   4807 0 (0.5507896 0.4492104) *
             75) arr_Den_Nedeli< 1.5 3411   1608 1 (0.4714160 0.5285840) *
         19) arr_DonProcVisota>=3.5 37381  18187 1 (0.4865306 0.5134694)  
           38) arr_DonProcVisota< 5.5 24479  12170 0 (0.5028392 0.4971608)  
             76) Levl_Support_H1< 4.5 22401  10969 0 (0.5103344 0.4896656)  
              152) Levl_Low_D1s1>=-7.5 20841  10051 0 (0.5177295 0.4822705)  
                304) Levl_Low_H1>=-6.5 20412   9786 0 (0.5205761 0.4794239) *
                305) Levl_Low_H1< -6.5 429    164 1 (0.3822844 0.6177156) *
              153) Levl_Low_D1s1< -7.5 1560    642 1 (0.4115385 0.5884615) *
             77) Levl_Support_H1>=4.5 2078    877 1 (0.4220404 0.5779596) *
           39) arr_DonProcVisota>=5.5 12902   5878 1 (0.4555883 0.5444117) *
      5) arr_DonProc< 8.5 424139 194178 1 (0.4578169 0.5421831)  
       10) arr_DonProc< 2.5 87414  41474 0 (0.5255451 0.4744549)  
         20) arr_DonProc< 1.5 35586  15370 0 (0.5680886 0.4319114) *
         21) arr_DonProc>=1.5 51828  25724 1 (0.4963340 0.5036660)  
           42) Part_H4>=3.5 9900   4285 0 (0.5671717 0.4328283) *
           43) Part_H4< 3.5 41928  20109 1 (0.4796079 0.5203921)  
             86) arr_TimeH>=2.5 32482  15936 1 (0.4906102 0.5093898)  
              172) Levl_Close_D1>=5.5 1790    760 0 (0.5754190 0.4245810) *
              173) Levl_Close_D1< 5.5 30692  14906 1 (0.4856640 0.5143360) *
             87) arr_TimeH< 2.5 9446   4173 1 (0.4417743 0.5582257) *
       11) arr_DonProc>=2.5 336725 148238 1 (0.4402346 0.5597654)  
         22) arr_DonProcVisota< 2.5 51021  24374 0 (0.5222751 0.4777249)  
           44) Part_H4>=3.5 15248   6136 0 (0.5975866 0.4024134)  
             88) arr_TimeH>=3 12146   4487 0 (0.6305780 0.3694220) *
             89) arr_TimeH< 3 3102   1453 1 (0.4684075 0.5315925) *
           45) Part_H4< 3.5 35773  17535 1 (0.4901742 0.5098258)  
             90) Levl_High_H4s1< 6.5 33554  16752 1 (0.4992549 0.5007451)  
              180) Povtor_Type_D1>=-3.5 32054  15813 0 (0.5066762 0.4933238)  
                360) arr_DonProcVisota< 1.5 2678   1011 0 (0.6224795 0.3775205) *
                361) arr_DonProcVisota>=1.5 29376  14574 1 (0.4961193 0.5038807) *
              181) Povtor_Type_D1< -3.5 1500    511 1 (0.3406667 0.6593333) *
             91) Levl_High_H4s1>=6.5 2219    783 1 (0.3528616 0.6471384) *
         23) arr_DonProcVisota>=2.5 285704 121591 1 (0.4255838 0.5744162)  
           46) arr_TimeH>=1.5 272159 117390 1 (0.4313287 0.5686713)  
             92) arr_DonProcVisota< 4.5 163759  73296 1 (0.4475846 0.5524154)  
              184) Part_H4>=3.5 30827  15116 1 (0.4903494 0.5096506)  
                368) arr_TimeH>=3 8764   3583 0 (0.5911684 0.4088316) *
                369) arr_TimeH< 3 22063   9935 1 (0.4503014 0.5496986) *
              185) Part_H4< 3.5 132932  58180 1 (0.4376674 0.5623326) *
             93) arr_DonProcVisota>=4.5 108400  44094 1 (0.4067712 0.5932288)  
              186) Levl_High_W1s1>=4.5 38182  16627 1 (0.4354670 0.5645330)  
                372) Levl_High_H4s1>=7.5 3658   1676 0 (0.5418261 0.4581739) *
                373) Levl_High_H4s1< 7.5 34524  14645 1 (0.4241977 0.5758023) *
              187) Levl_High_W1s1< 4.5 70218  27467 1 (0.3911675 0.6088325) *
           47) arr_TimeH< 1.5 13545   4201 1 (0.3101513 0.6898487) *
    3) arr_DonProcVisota>=7.5 85636  31831 1 (0.3717012 0.6282988)  
      6) arr_DonProc< 1.5 10168   5077 1 (0.4993116 0.5006884) *
      7) arr_DonProc>=1.5 75468  26754 1 (0.3545079 0.6454921)  
       14) arr_DonProc>=9.5 10279   4879 1 (0.4746571 0.5253429) *
       15) arr_DonProc< 9.5 65189  21875 1 (0.3355627 0.6644373)  
         30) arr_DonProcVisota< 10.5 44291  15964 1 (0.3604344 0.6395656)  
           60) arr_TimeH>=2.5 19180   7581 1 (0.3952555 0.6047445)  
            120) rPeresek_Up_H1>=1.5 570    213 0 (0.6263158 0.3736842) *
            121) rPeresek_Up_H1< 1.5 18610   7224 1 (0.3881784 0.6118216) *
           61) arr_TimeH< 2.5 25111   8383 1 (0.3338378 0.6661622) *
         31) arr_DonProcVisota>=10.5 20898   5911 1 (0.2828500 0.7171500) *

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

А так этот файл выглядит в виде дерева


Примерно так должен выглядеть код самого левого верхнего листа дерева:

if(arr_DonProcVisota< 7.5 && arr_DonProc>=8.5 && arr_DonProc>=9.5) B=true; //(57 43)

"B" - переменная формирующаяся в зависимости от значений в скобках текстового файла - как правило 3 или 2 варианта - зависит от количества объектов классификации.

Преобразование можно делать не обязательно в MQL5 - подойдет решение на любом языке.