ATcl - Intérprete Tcl para MT4 - página 6

 
Maxim Kuznetsov:

Em termos de tecnologia de software, potencialmente sim. As bibliotecas podem ser chamadas do otimizador, desde que não estejam na nuvem.

do lado NS - como você o imagina?

No otimizador é feito um passe e os dados são escritos no arquivo, depois são passados para o treinamento da rede, após o treinamento os resultados da avaliação do treinamento são devolvidos ao MT4/5 e a rede (regras) é escrita no arquivo. E a outra visão é quando usamos os arquivos gravados da lógica NS para otimizar (as variantes de NS) e fixar indicadores padrão de TS.

 

Eu ampliei a demonstração do gráfico Tk - agora ele mostra também a tabela de pedidos.

Tabela de pedidos em uma janela separada

O código MQL que se refere à tabela de pedidos
- seleciona todas as suas ordens e as envia para o tcl no método OnOrderList
- na saída recebemos 3 listas de bilhetes - os que são novos, os que mudaram e os que foram eliminados

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);
   }
}

e o método Tcl que faz o trabalho principal :
- recebe uma nova lista de pedidos
- em comparação com chamadas anteriores
- constrói 3 listas (novas, alteradas, apagadas).
- cria uma mesa ...que na verdade é uma árvore e pode ser feita em vários níveis.


# надо обновить внутренние структуры
# и вернуть триплет (список из трёх списков)
#   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 ]
}

tudo é muito compacto.
Você pode usar os pontos fortes dos dois idiomas - a MQL está próxima do ambiente comercial e conta rapidamente em arrays,
O Tcl pode facilmente lidar com listas e hashes.
A MQL implementa um algoritmo de negociação difícil enquanto os scripts lidam com a interação com o mundo e o usuário.

O arquivo está anexado.

Arquivos anexados:
atcl.zip  6662 kb
 

Um roteiro para exportar citações para o Excel

Eu fiz um pequeno roteiro para exportar citações diretamente para o Excel.
Sem nenhuma entrada em CSV ou qualquer parâmetro - basta jogá-lo no gráfico, a planilha Excel será aberta e todas as citações serão copiadas para dentro dela.

Comentei o texto na medida do possível e o anexei. Eu forneci os detalhes do roteiro em meu site http://nektomk.ru/atcl:ratestoexcel.
O volume vai além do fórum, portanto, lá. Talvez quando eu estiver com vontade, eu a duplique no blog local para que as informações não se percam com certeza.

O roteiro anexo

PS/ Alguém tem uma marca - arquivo para compilação em lote de mql ? que irá mudar um mqh, empurrar marca e reconstruir um monte de mq4 que estão listados em dependências...

atualizar/duplicar o artigo no blog local https://www.mql5.com/ru/blogs/post/718304 - agora provavelmente não vai desaparecer
RatesToExcel
  • nektomk.ru
Часто возникающий (и довольно практичный) вопрос у пользователей MetaTrader - «Как скопировать котировки в Excel?» . При помощи библиотеки ATcl это программируется довольно легко. В состав библиотеки входит «большая» программа работающая с Excel, но для частых потребностей сделал короткий скрипт, который делает самую простую вещь - экспорт...
Arquivos anexados:
 

O carteiro trabalha, mas ainda precisa de mais trabalho...

Enquanto isso, uma pergunta para as pessoas - será que o GUI-Builder será solicitado?
para Tk, eles estão lá, mas devido ao fato de que os scripts em texto escrevem mais rápido do que em desenho, eles são pouco requisitados.

algo como isto :

PS/ o resultado de tal GUI-builder pode ser iniciado a partir do MT4...

 
Maxim Kuznetsov:

o carteiro trabalha, mas ainda precisa de mais trabalho a ser feito

mas enquanto isso, uma pergunta para as pessoas - haverá uma demanda de GUI-Builder ?
para Tk eles são, mas devido ao fato de que os scripts são mais rápidos de escrever em texto do que em desenho, eles não são muito procurados.

algo como isto :

PS/ O resultado de tal construtor de GUI e agora com a ajuda de "tal e tal mãe" pode ser iniciado a partir do MT4...

Que coisas interessantes... somente como aplicá-las?

Ah, eu tenho uma idéia para apenas interfaces gráficas - criando uma lógica comercial como uma árvore de decisão! Ou seja, criar uma árvore no editor gráfico (ou seja, shell) e usar um botão para convertê-la em regras simples, ou mesmo diretamente em código! Entretanto, as regras também podem ser lidas em código de uma maneira muito compacta.

Por que precisamos dele? Esta abordagem permite detalhar a estratégia comercial, por exemplo, podemos facilmente dividi-la em séries temporais - não apenas decidindo se devemos ou não comercializar, mas também se devemos comercializar neste momento e neste momento de uma maneira diferente. Os sinais de uma mudança de tática são muitos e variados, mas não é muito conveniente escrevê-la no código e, em segundo lugar, é difícil de ler visualmente - você pode cometer muitos erros.

Interessado em tal idéia para aplicar seus talentos?

 
Aleksey Vyazmikin:

Que coisas interessantes... mas como aplicá-las?

Ah, eu tenho uma idéia para apenas interfaces gráficas - criando uma lógica comercial como uma árvore de decisão! Ou seja, criamos uma árvore no editor gráfico (ou seja, shell) e usamos um botão para convertê-la em algumas regras simples ou até mesmo diretamente em código! Entretanto, as regras também podem ser lidas em código de uma maneira muito compacta.

Por que precisamos dele? Esta abordagem permite detalhar a estratégia comercial, por exemplo, podemos facilmente dividi-la em séries temporais - não apenas decidindo se devemos ou não comercializar, mas também se devemos comercializar neste momento e neste momento de uma maneira diferente. Os sinais de uma mudança de tática são muitos e variados, mas não é muito conveniente escrevê-la no código e, em segundo lugar, é difícil de ler visualmente - você pode cometer muitos erros.

Interessado em tal idéia para uma aplicação de seus talentos?

Não entendo a idéia de uma "árvore de decisão gráfica". :-) talvez seu talento não seja suficiente :-)

 
Maxim Kuznetsov:

Eu não entendo nada da "árvore de decisão gráfica". :-) talvez você não seja talentoso o suficiente :-)

Imagine uma tabela de dados com um conjunto de regras



Estas regras estão dispostas em código da seguinte forma

      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;
           }
        }

Se tivermos um valor de regra e um valor calculado (valor indicador/tempo/ outro padrão) coincidir, então uma ação comercial é realizada, por exemplo.

Este método de decisões comerciais é muito compacto e versátil - podemos codificar de forma tão simples, por exemplo, muitas estratégias - dando-lhes diferentes símbolos mágicos.

Mas o senão é que precisamos apenas do ambiente para tal estilo de programação. Este ambiente deve parecer uma árvore de decisão (um diagrama de blocos primitivo) onde podemos criar blocos (resultado do cálculo por exemploarr_iDelta_Max_D1 com valores predefinidos (1,2,3,4 ...n) e/ou com possibilidade de limitar valores de e para, criando muitos grupos diferentes desta forma), a partir deste bloco ramificará para cada valor de variável ou faixa de valores de variável, e assim por diante até o próximo bloco e assim por diante. Assim, teremos um conjunto de regras, cada uma das quais, a propósito, não tem que utilizar todos os blocos.

Isto o faz entender? Se você precisar de explicações, por favor, pergunte.

 
Aleksey Vyazmikin:

Apresentar uma tabela de dados com um conjunto de regras



Estas regras são codificadas da seguinte forma

Se tivermos uma coincidência entre os valores das regras e os valores calculados (valor indicador/tempo/ outro padrão), então, por exemplo, uma ação comercial é realizada.

Este método de decisões comerciais é muito compacto e versátil - podemos codificar de forma tão simples, por exemplo, muitas estratégias - dando-lhes diferentes símbolos mágicos.

Mas o senão é que precisamos apenas do ambiente para tal estilo de programação. Este ambiente deve parecer uma árvore de decisão (um diagrama de blocos primitivo) onde podemos criar blocos (resultado do cálculo por exemploarr_iDelta_Max_D1 com valores predefinidos (1,2,3,4 ...n) e/ou com possibilidade de limitar valores de e para, criando muitos grupos diferentes desta forma), a partir deste bloco ramificará para cada valor de variável ou faixa de valores de variável, e assim por diante até o próximo bloco e assim por diante. Assim, teremos um conjunto de regras, cada uma das quais, a propósito, não tem que utilizar todos os blocos.

Isto o faz entender? Se você precisar de explicações, por favor, pergunte.

Como Xcos (http://www.scilab.org/en/scilab/features/xcos) e similares em simulações ?
Eu vi isso no tcl - um ambiente onde eles conectam blocos com flechas... foi assim que eles programaram o processamento de som/vídeo/gráfico. http://wiki.tcl.tk/8565 parece ser muita coisa, eles até enfiaram o Maxima em algum bloco
Se for - prestará muita atenção
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:
Como Xcos (http://www.scilab.org/en/scilab/features/xcos) e similares na moda em simulações ?
Eu já vi isso no tcl - ambiente onde eles conectam os blocos com flechas... foi assim que eles programaram o processamento de som/vídeo/gráfico. http://wiki.tcl.tk/8565 parece ser muita coisa, eles até enfiaram o Maxima em algum bloco
Se for - prestará muita atenção

Sim, esta é a abordagem! O principal é não complicar as coisas, e fazer um intérprete correto, para que todos os blocos sejam coletados em uma linha (um ramo), com o qual o programa em MQL já funcionará.

 
Aleksey Vyazmikin:

Sim, esta é a abordagem! O principal é não complicar, e fazer um intérprete correto, para que todos os blocos sejam coletados em uma linha (uma filial), com a qual o programa já irá trabalhar em MQL.

Eu não acho que quero complicar demais, por exemplo, não quero mexer com o código bwise.

No máximo, vou adaptá-lo para usar junto com a ATcl (isto é, transferir dados da Mql para suas entradas) e pegar as saídas.
Naturalmente, terei que escrever alguns HowTo "como desenhar quadrados e anexá-los à EA". E pratique o inglês ao se comunicar com o(s) autor(es) :-)

Razão: