ATcl - интерпретатор Tcl для MT4 - страница 6

 
Maxim Kuznetsov:

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

со стороны НС - как вы себе это представляете ?

В оптимизаторе делается проход, и пишутся данные в файл, потом отдаются на обучение сети, после обучения результаты оценки обучения возвращаются в MT4/5, а сама сеть(правила) записываются в файл. Ну а другой вид, это когда мы из записанных файлов логики НС проводим  оптимизацию (самих вариантов НС) и фиксируем стандартные показатели ТС.

 

Расширил демку про графику Tk - теперь она ещё и табличку ордеров показывает.

Таблица ордеров в отдельном окне

Код MQL который относится к таблице ордеров
- выбирает все свои ордера и отправляет их в tcl в метод OnOrderList
- на выходе получает 3 списка тикетов - те который новые, те у которых что-то поменялось и те которые были удалены

void
SendOrderList() 
{
   int total=OrdersTotal();
   Tcl_Obj list=tcl.Ref(tcl.Obj()); // пустой список
   for(int pos=0;pos<total;pos++) {
      if (!OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) ||
         OrderMagicNumber()!=MAGIC ||
         OrderSymbol()!=_Symbol ||
         OrderCloseTime()!=0) continue;
      Tcl_Obj ord=tcl.Ref(tcl.List(
         tcl.Obj(OrderTicket()),
         tcl.Obj(OrderType()),
         tcl.Obj(OrderOpenTime()),
         tcl.Obj(OrderSymbol()),
         tcl.Obj(OrderLots()),
         tcl.Obj(OrderOpenPrice()),
         tcl.Obj(OrderStopLoss()),
         tcl.Obj(OrderTakeProfit()),
         tcl.Obj(OrderComment()),
         tcl.Obj(OrderSwap()),
         tcl.Obj(OrderCommission())
      ));
      tcl.AppendObj(list,ord);
      tcl.Unref(ord);
   }
   if (tcl.Call(panel,methodOnOrderList,list)!=TCL_OK) {
      PrintFormat("OrderSendList failed : %s",tcl.StringResult());
   } else {
      Tcl_Obj triplet=tcl.Ref(tcl.Result()); // 0-новые 1-изменённые 2-удалённые
      Tcl_Obj created=tcl.Ref(tcl.Index(triplet,0));  // список новых ордеров
      Tcl_Obj changed=tcl.Ref(tcl.Index(triplet,1));  // список изменённых ордеров
      Tcl_Obj removed=tcl.Ref(tcl.Index(triplet,2));  // список удалённых ордеров
      PrintOrderList("New orders",created);
      PrintOrderList("Modified orders",changed);
      PrintOrderList("Deleted orders",removed);
      // объекты больше ненужны
      tcl.Unref(removed);
      tcl.Unref(changed);
      tcl.Unref(created);
      tcl.Unref(triplet);
   }
}

и метод Tcl который производит основную работу :
- получает новый список ордеров
- сравнивает с теми что были при пред.вызове
- строит 3 упомянутых списка (новые,изменённые, удаленные)
- заодно ведёт таблицу ..которая на самом деле дерево и её можно сделать в несколько уровней


# надо обновить внутренние структуры
# и вернуть триплет (список из трёх списков)
#   1 - список новых ордеров
#   2 - ордера которые поменялись
#    3 - ордера которые удалены
method OnOrderList { orderList } {
    set created {}
    set changed {}
    set removed {}
    foreach order $orderList {
        set ticket [ lindex $order 0 ]
        set known($ticket) $order
        if { ! [ info exists Orders($ticket) ] } {
            # новый тикет
            # добавить в список свежесозданных
            lappend created $ticket
            set Orders($ticket) $order
            continue
        }
        if { $Orders($ticket) != $order } {
            # что-то поменялось
            # добавить в список изменённых
            set Orders($ticket) $order
            lappend changed $ticket
        }
    }
    foreach ticket [ array names Orders ] {
        if { ! [ info exists known($ticket) ] } {
            # прежнего ордера нет в новом списке - значит удалён
            lappend removed $ticket
            unset Orders($ticket)
        }
    }
    # обновить грфику :-)
    foreach ticket $removed {
        my OnRemoveOrder $ticket
    }
    foreach ticket $changed {
        my OnChangeOrder $ticket
    }
    foreach ticket $created {
        my OnCreateOrder $ticket
    }
    return [ list $created $changed $removed ]
}

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

Архив прикладываю.

Файлы:
atcl.zip  6662 kb
 

Скрипт экспорта котировок в Excel

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

Текст максимально прокомментировал и прилагаю. На личном сайте расписал детали скрипта http://nektomk.ru/atcl:ratestoexcel
Объём выходит за рамки форума,  поэтому там. Может под настроение продублирую в местном блоге, чтобы информация точно не терялась

Скрипт прилагаю

PS/ у кого нить есть заготовка make - файла для пакетной компиляции mql ? чтобы поменял один mqh, ткнул make и пересобралась кучка mq4 которые перечислены в зависимостях..

update/ продублировал статью в местном блоге https://www.mql5.com/ru/blogs/post/718304 - теперь уж наверное не пропадёт
RatesToExcel
  • nektomk.ru
Часто возникающий (и довольно практичный) вопрос у пользователей MetaTrader - «Как скопировать котировки в Excel?» . При помощи библиотеки ATcl это программируется довольно легко. В состав библиотеки входит «большая» программа работающая с Excel, но для частых потребностей сделал короткий скрипт, который делает самую простую вещь - экспорт...
Файлы:
 

почтарик работает, но надо ещё дотянуть докоментить, доописать...

а пока вопрос к людям - будет ли востребован GUI-Builder ?
для Tk они есть, но вследствии того что скрипты текстом написать быстрее чем в рисовать они мало мало востребованы.

что-то типа такого :

PS/ результат такого GUI-строения и сейчас при помощи "такой-то матери" может быть запущено из MT4..

 
Maxim Kuznetsov:

почтарик работает, но надо ещё дотянуть докоментить, доописать...

а пока вопрос к людям - будет ли востребован GUI-Builder ?
для Tk они есть, но вследствии того что скрипты текстом написать быстрее чем в рисовать они мало мало востребованы.

что-то типа такого :

PS/ результат такого GUI-строения и сейчас при помощи "такой-то матери" может быть запущено из MT4..

Какие интересные штучки... только как их применить?

А, есть у меня идея для как раз графических интерфейсов - создание торговой логики по типу дерева решений! Т.е. создаем в графическом редакторе (т.е. оболочке) дерево и при помощи кнопочки конвертируем его в нехитрые правила или даже сразу в код! Впрочем, читать правила так же очень компактно можно в коде.

Зачем это нужно? Да такой подход позволяет детализировать торговую стратегию, к примеру легко её разбить на временные ряды - не только принимая решения торгуем/не торгуем, а торгуем в это время так, а в это время иначе. Признаков смены тактики торговлю много разных, а в коде это писать во первых некомпактно, а во вторых визуально трудно четаемо - можно совершить кучу ошибок.

Интересна такая идея для приложения Вашего таланта?

 
Aleksey Vyazmikin:

Какие интересные штучки... только как их применить?

А, есть у меня идея для как раз графических интерфейсов - создание торговой логики по типу дерева решений! Т.е. создаем в графическом редакторе (т.е. оболочке) дерево и при помощи кнопочки конвертируем его в нехитрые правила или даже сразу в код! Впрочем, читать правила так же очень компактно можно в коде.

Зачем это нужно? Да такой подход позволяет детализировать торговую стратегию, к примеру легко её разбить на временные ряды - не только принимая решения торгуем/не торгуем, а торгуем в это время так, а в это время иначе. Признаков смены тактики торговлю много разных, а в коде это писать во первых некомпактно, а во вторых визуально трудно четаемо - можно совершить кучу ошибок.

Интересна такая идея для приложения Вашего таланта?

вообще не понял идею про "графическое дерево принятия решений" :-) может прикладывемого таланта нехватает :-)

 
Maxim Kuznetsov:

вообще не понял идею про "графическое дерево принятия решений" :-) может прикладывемого таланта нехватает :-)

Представьте таблицу данных с набором правил



Эти правила в коде организуются следующим образом

      for(int i=1;i<StrokTotal_Buy; i++)
        {
         UslovieSumm_Buy=
                          Sravnenief(arr_Vektor_Week,arrRead_Buy_01[i])+
                          Sravnenief(arr_Vektor_Day,arrRead_Buy_02[i])+
                          Sravnenief(arr_Vektor_Don,arrRead_Buy_03[i])+
                          Sravnenief(arr_DonProc,arrRead_Buy_04[i])+
                          Sravnenief(arr_iDelta_H1,arrRead_Buy_05[i])+
                          Sravnenief(arr_iDelta_H3,arrRead_Buy_06[i])+
                          Sravnenief(arr_iDelta_H4,arrRead_Buy_07[i])+
                          Sravnenief(arr_iDelta_H6,arrRead_Buy_08[i])+
                          Sravnenief(arr_iDelta_H12,arrRead_Buy_09[i])+
                          Sravnenief(arr_iDelta_D1,arrRead_Buy_10[i])+
                          Sravnenief(arr_iDelta_W1,arrRead_Buy_11[i])+
                          Sravnenief(arr_iDelta_MN1,arrRead_Buy_12[i])+
                          Sravnenief(arr_RSI_Open_M1,arrRead_Buy_13[i])+
                          Sravnenief(arr_RSI_Open_H1,arrRead_Buy_14[i])+
                          Sravnenief(arr_BB_Center_Open,arrRead_Buy_15[i])+
                          Sravnenief(arr_BB_Up_Open,arrRead_Buy_16[i])+
                          Sravnenief(arr_BB_Down_Open,arrRead_Buy_17[i])+
                          Sravnenief(arr_TimeH,arrRead_Buy_18[i])+
                          Sravnenief(arr_Den_Nedeli,arrRead_Buy_19[i])+
                          Sravnenief(arr_iDelta_Max_H1,arrRead_Buy_20[i])+
                          Sravnenief(arr_iDelta_Min_H1,arrRead_Buy_21[i])+
                          Sravnenief(arr_iDelta_Max_D1,arrRead_Buy_22[i])+
                          Sravnenief(arr_iDelta_Min_D1,arrRead_Buy_23[i]);                                                                              
;




         if(UslovieSumm_Buy==23)
           {
            Pattern_Buy=1;
            Pravilo_Buy=i;
            break;
           }
        }

Если у нас происходит совпадение значений правила и расчетных значений(значение индикатора/время/иной паттерн), то осуществляется, к примеру, торговое действие.

Такой метод торговых решений очень компактен и разнообразен - можно закодировать таким нехитрым образом, к примеру, много стратегий - дав им разный маджик.

Но, вот загвоздка заключается в том, что нужна как раз среда для такого стиля программирования. Эта среда должна выглядить как дерево принятия решений (примитивная блок схема), где можно создавать блоки (результат вычисления к примеру arr_iDelta_Max_D1 с предопределенными значениями (1,2,3,4 ..n) и/или с возможностью ограничивать значения от и до, создавая много разных групп таким образом), от этого блока будут отходить ветви для каждого значения переменной или диапазона значений переменной, и так до следующего блока и так далее. Таким образом у нас будет набор правил, каждый их которых, кстати не обязательно должен использовать все блоки.

Так понятней? Если нужны пояснения - спрашивайте.

 
Aleksey Vyazmikin:

Представьте таблицу данных с набором правил



Эти правила в коде организуются следующим образом

Если у нас происходит совпадение значений правила и расчетных значений(значение индикатора/время/иной паттерн), то осуществляется, к примеру, торговое действие.

Такой метод торговых решений очень компактен и разнообразен - можно закодировать таким нехитрым образом, к примеру, много стратегий - дав им разный маджик.

Но, вот загвоздка заключается в том, что нужна как раз среда для такого стиля программирования. Эта среда должна выглядить как дерево принятия решений (примитивная блок схема), где можно создавать блоки (результат вычисления к примеру arr_iDelta_Max_D1 с предопределенными значениями (1,2,3,4 ..n) и/или с возможностью ограничивать значения от и до, создавая много разных групп таким образом), от этого блока будут отходить ветви для каждого значения переменной или диапазона значений переменной, и так до следующего блока и так далее. Таким образом у нас будет набор правил, каждый их которых, кстати не обязательно должен использовать все блоки.

Так понятней? Если нужны пояснения - спрашивайте.

Типа Xcos (http://www.scilab.org/en/scilab/features/xcos) и подобных модных в симуляциях ?
В tcl подобное видел - среду где соединяют блоки стрелочками..они так обработку звука/видео/графиков программировали. http://wiki.tcl.tk/8565 вроде как много чего навернуть, в какой-то блок даже Максиму воткнули
Если оно - обращу пристальное внимание
 
Xcos / Features / Scilab / Home - Scilab
Xcos / Features / Scilab / Home - Scilab
  • Scilab Enterprises
  • www.scilab.org
Xcos is a graphical editor to design hybrid dynamical systems models. Models can be designed, loaded, saved, compiled and simulated.
 
Maxim Kuznetsov:
Типа Xcos (http://www.scilab.org/en/scilab/features/xcos) и подобных модных в симуляциях ?
В tcl подобное видел - среду где соединяют блоки стрелочками..они так обработку звука/видео/графиков программировали. http://wiki.tcl.tk/8565 вроде как много чего навернуть, в какой-то блок даже Максиму воткнули
Если оно - обращу пристальное внимание
 

Да, это такой подход! Главное не усложнять, и сделать корректный интерпретатор, что б все блоки собирались в одну строку (по одной ветви), с которой уже будет работать программа на MQL.

 
Aleksey Vyazmikin:

Да, это такой подход! Главное не усложнять, и сделать корректный интерпретатор, что б все блоки собирались в одну строку (по одной ветви), с которой уже будет работать программа на MQL.

вряд-ли я буду усложнять, то есть например сильно ковыряться в коде bwise.

Максимум - адаптирую чтоб его можно было использовать вместе с ATcl (то есть передавать данные из Mql на его входы) и принимать выходы.
Придётся конечно писать какой-то HowTo "как нарисовать квадратики и прицепить к эксперту". И плотно попрактиваться в английском при общении с автором(авторами) :-)