Tudo sobre Arquitetura de Robôs - página 7

 
A new way to sentiment-tag financial news
A new way to sentiment-tag financial news
  • Vered Zimmerman
  • towardsdatascience.com
So we know we’re missing important information by using the M-L word lists. (We’ll see just by how much a bit further down.) Finally, it’s simply unsustainable to pay for data labeling for every sub-domain application. What’s there to do? Well, the thing about specific domains is that they don’t just have specialised vocabularies; they have...
 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

negociar em um robô, varios ativos.

Rogerio Figurelli, 2019.09.15 12:53

Bem observado  Trader_Patinhas, esse é o clássico problema técnico de tratamento por interrupção ou polling de qualquer sistema mais complexo, e no MT5 a solução de polling é a mais simples em termos de montagem de ambiente (apenas um gráfico e EA), mas certamente não é a ideal para estratégias que exigem menor latência, como no caso de scalpers.
Sds.,
Rogério Figurelli


 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

COMO DIMINUIR A LATÊNCIA DO METATRADER

Rogerio Figurelli, 2019.09.26 12:06

Olá  Trader_Patinhas, perfeitamente, minha observação foi apenas para não deixar margem para erros de interpretação, uma vez que o investimento é alto, e sua análise me parece dentro do escopo do fórum, afinal nada impede algum algotrader utilizar o próprio MT5 para acesso direto ao PUMA e rede local da B3, como, por exemplo, através de uma interface direta em protocolo FIX, mas sem dúvida essa é além de uma solução mais custosa, bem mais complexa. Na verdade, a grande maioria dos traders está buscando uma solução mais affordable, e o VPS com baixa latência entre cliente/servidor MT5 é sem dúvida o paradigma atual. Mas trazer opções e pensar "fora da caixa" — como você fez muito bem — também faz parte da lógica do fórum.

Por essa mesma lógica, não concordo com sua observação (Em tempo), já que o potencial de integração é ilimitado, e você pode justamente agregar sistemas integrados por FIX. Se desejar ir além, pode até mesmo integrar uma FPGA dedicada com protocolo FIX e algoritmos de HFT ao MT5, e nesse caso estar dentro desse rack é fundamental. Além disso, essa me parece uma arquitetura interessante para integrar trading systems que utilizam machine learning e linguagens externas, como Python, diretamente a decisões de HFT, já que a plataforma pode realizar as tarefas de integração em várias camadas e roteamento de ordens.

Sds.,
Rogério Figurelli


 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Nova versão da plataforma MetaTrader 5 build 2170: escopos em MQL5, atualização global do testador de estratégia e hospedagem integrada

MetaQuotes Software Corp., 2019.10.03 21:58

Na sexta-feira, 4 de outubro de 2019, será lançada uma versão atualizada da plataforma MetaTrader 5. Ela contém as seguintes alterações:

  1. Terminal: completamente redesenhado o gerenciamento do serviço de Hospedagem Virtual embutido. Todas as informações sobre o terminal alugado, bem como as funções de migração do ambiente, parada e inicialização, agora estão disponíveis em uma guia separada da janela "Caixa de Ferramentas".

    Antes, para trabalhar com hospedagem virtual, era usado o menu de contexto da conta no Navegador. Agora todas as informações e comandos de controle necessários estão sempre à sua vista na guia "VPS":




    No lado esquerdo, estão disponíveis informações básicas de assinatura:

    • Dados de conexão: comparação de atrasos na rede entre o seu terminal no servidor-hospedagem e o computador local.
    • A conta comercial - para a qual é alugada a hospedagem - e o plano de dados.
    • Identificador de assinatura exclusivo. Ao clicar nele, você será direcionado para a seção "Hospedagem" no seu perfil da MQL5.community, nele você pode gerenciar sua assinatura.
    • Data de formalização e status atual. Se sua hospedagem for interrompida, você saberá imediatamente sobre isto.

    Usando o botão Iniciar/Parar, você pode rapidamente parar e iniciar o terminal virtual.

    A parte direita mostra informações sobre o equipamento no servidor-hospedagem, bem como gráficos de consumo de recursos usados pelo seu terminal. Se o seu Expert Advisor ou indicador usar uma quantidade excessiva de memória ou tempo do processador, você verá isso imediatamente e poderá responder oportunamente.

    Também estão disponíveis informações sobre a migração mais recente do ambiente de negociação, bem como comandos para migrar novamente. Agora você não vai se esquecer de transferir o ambiente depois de comprar uma hospedagem.

    Agora, o aluguel de hospedagem virtual também é realizado na guia "VPS". O processo em si não mudou, ainda requer apenas algumas etapas. Basta escolher uma tarifa e um sistema para pagamento. O melhor servidor para se conectar à sua corretora é selecionado automaticamente.




  2. Terminal: adicionada a possibilidade de mudar rapidamente para depositar/retirar fundos da conta de negociação no site da corretora.

    Agora você não precisa procurar as funções correspondentes em sua conta no site da corretora. Os comandos para navegar rapidamente para as páginas de depósito e retirada ficaram disponíveis diretamente nos terminais — no menu de contas no Navegador e na guia de negociação na Caixa de Ferramentas:



    • Os comandos de depósito/retirada estão disponíveis apenas se as funções correspondentes estiverem ativadas para a conta de negociação no lado da corretora.
    • O terminal de negociação não realiza nenhuma operação de depósito/retirada da conta. As funções internas redirecionam o usuário apenas para as páginas da Web da corretora correspondentes.
  3. Terminal: adicionados novos campos à especificação do instrumento de negociação:

    Categoria
    A propriedade é usada para marcação adicional de instrumentos financeiros. Por exemplo, pode indicar setores de mercado relacionados com o símbolo: Agricultura, Petróleo e Gás, etc. Exibida apenas se as informações respectivas forem fornecidas pela corretora.

    Bolsa de valores
    Aqui é indicado o nome da bolsa ou da plataforma na qual é negociado o símbolo. Exibida apenas se as informações respectivas forem fornecidas pela corretora.

    Comissão
    Aqui são exibidas informações sobre as taxas cobradas pela corretora ao fazer trades do instrumento. São mostrados todos os detalhes do cálculo:

    • As comissões podem ser de nível único e multinível, ou seja, pode ser cobrado o mesmo valor, independentemente do volume do trade/lote ou variar de acordo com seu tamanho. Na especificação são mostradas informações correspondentes.
    • As comissões podem ser cobradas imediatamente após a transação ou no final do dia/mês de negociação.
    • As comissões podem ser cobradas dependendo da direção do trade: pela entrada, pela saída ou pelos dois tipos de operações.
    • As comissões podem ser cobradas por lote ou por trade.
    • As comissões podem ser cobradas em diferentes formatos: dinheiro, porcentagem ou pontos.

    Por exemplo, a entrada a seguir significa que uma comissão é cobrada imediatamente após a entrada e saída de transações. Se o volume da transação for de 0 a 10 lotes, será cobrada uma comissão de US$ 1,2 por operação. Se o volume da transação for de 11 a 20 lotes, será cobrada uma comissão de US$ 1,1 por cada lote da transação.
    Comissão | Imediatamente pelo volume, pela transação de entrada/saída
    0  - 10  | US$ 1.2 por transação
    11 - 20  | US$ 1.1 por transação



  4. Terminal: à especificação dos instrumentos adicionados campos adicionais para opções:

    • Tipo de opçõa — call ou put
    • Basis — nome do instrumento da opção
    • Strike price — preço de execução da opção

  5. Terminal: adicionado suporte à transmissão das "gregas" para opções: delta, gama, vega, teta, rô. Agora, para tais instrumentos, as corretoras podem transmitir informações adicionais na seção de estatísticas da observação do mercado, dando aos comerciantes mais oportunidades de análise:




  6. Terminal: agora, a ferramenta "Mira" mostra a distância entre os níveis de preços, não apenas em pips, mas também em porcentagem:




  7. Terminal: agora, ao executar operações nos modos de execução "A mercado" e "Em bosla", o preço final da transação é exibido nas caixas de diálogo de negociação se for conhecido no momento em que recebida a resposta da corretora:




  8. Terminal: corrigido um erro devido ao qual o comando "Mostrar tudo" na Observação do mercado em alguns casos não listava todos os instrumentos de negociação disponíveis.

  9. MQL5: alterado o funcionamento do escopo, tornando a MQL5 mais próxima de C++. Os programadores MQL5 terão muito mais liberdade para usar bibliotecas de terceiros. Eles não precisarão mais modificá-las para que todos os identificadores tenham uma única aparência.

    Exemplo: no código são declaradas duas estruturas com o mesmo nome, mas em classes diferentes. Anteriormente, essa declaração gerava o erro de compilação "identifier already used". Agora esse código será compilado e executado com sucesso. Ao mesmo tempo, para acessar corretamente a variável/estrutura/função desejada fora de seu escopo, a classe deve ser indicada, neste caso, CBar::Item.
    class CFoo
      {
    public:
       struct Item { int x; };
      };
    //+------------------------------------------------------------------+
    class CBar
      {
    public:
       struct Item { int x; };
      };
      
    CBar::Item item;  // declaração válida da estrutura Item a partir da classe Bar
    Item       item;  // declaração inválida
    Adicionado suporte ao espaço de nomes (namespace), dando ainda mais liberdade ao usar códigos/bibliotecas de terceiros em nossos programas.

    #define PrintFunctionName() Print(__FUNCTION__)
    
    namespace NS
    {
    void func()
      {
       PrintFunctionName();
      }
    
    struct C
      {
       int               x;
                         C() { PrintFunctionName(); };
      };
    }
    
    struct C
      {
       int               x;
                         C() { PrintFunctionName(); };
      };
    
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
    void func()
      {
       PrintFunctionName();
      }
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       func();
       NS::func();
    
       C c;
       NS::C ac;
      }
    Como resultado da execução, o programa mostrará as seguintes linhas:
    2019.09.18 13:39:35.947    TestScript (AUDCAD,H1)    func
    2019.09.18 13:39:35.949    TestScript (AUDCAD,H1)    NS::func
    2019.09.18 13:39:35.949    TestScript (AUDCAD,H1)    C::C
    2019.09.18 13:39:35.949    TestScript (AUDCAD,H1)    NS::C::C

  10. MQL5: acelerado acesso a dados de timeseries com ajuda das funções iTime, iOpen, iHigh, iLow, iClose, iVolume, iTickVolume, iSpread.

  11. MQL5: adicionado suporte ao atributo "=delete". Ele permite restringir o uso de métodos de classe específicos.
    class A
      {
       void              operator=(const A &)=delete;    // proíbe o operador de cópia de objeto
      };
    
    class B : public A
      {
      };
    
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       A a1,a2;
       B b1,b2; 
      
       a1=a2;
       b1=b2;
      }
    Neste exemplo, para as linhas "a1=a2" e "b1=b2", o compilador mostra os erros:
    attempting to reference deleted function 'void A::operator=(const A&)'
       function 'void A::operator=(const A&)' was explicitly deleted here

    attempting to reference deleted function 'void B::operator=(const B&)'
       function 'void B::operator=(const B&)' was implicitly deleted because it invokes deleted function 'void A::operator=(const A&)'

  12. MQL5: à enumeração ENUM_SYMBOL_INFO_STRING adicionados os seguintes valores:

    • SYMBOL_CATEGORY: categoria do símbolo. Utilizado para marcação adicional de instrumentos financeiros. Por exemplo, pode indicar setores de mercado relacionados com o símbolo: Agricultura, Petróleo e Gás, etc.
    • SYMBOL_EXCHANGE: é o nome da bolsa ou plataforma na qual o símbolo é negociado.

  13. MQL5: adicionado o suporte ao fechamento de posições pelo princípio FIFO.

    • À enumeração ENUM_ACCOUNT_INFO_INTEGER adicionado o valor ACCOUNT_FIFO_CLOSE: indica que a posição pode ser fechada apenas de acordo pelo princípio FIFO. Se o valor da propriedade for true, as posições de cada símbolo poderão ser fechadas somente na ordem em que foram abertas, isto é, primeiro a mais antiga, depois a mais recente etc. Se você tentar fechar as posições em uma ordem diferente, será mostrado um erro. Para contas sem registro com cobertura de posições (ACCOUNT_MARGIN_MODE!=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) a propriedade sempre é igual a false.
    • Adicionado o novo código de retorno do servidor TRADE_RETCODE_FIFO_CLOSE: solicitação rejeitada, pois para a conta de negociação definida a regra "Permitido fechar posições existentes apenas segundo o princípio FIFO".

    O fechamento de posições podem ser realizado de três maneiras:

    • Fechamento através do terminal do cliente: é o encerramento das posições realizado manualmente pelo trader, com a ajuda de um robô de negociação, por meio do serviço de "Sinais", etc. Se não tentar fechar posições segundo o princípio FIFO, o trader verá o erro correspondente.
    • Fechamento quando acionado Stop Loss ou Take Profit: esses pedidos são processados no lado do servidor, respectivamente, e as posições de fechamento nesse caso são iniciadas não pelo profissional (terminal), mas pelo próprio servidor. Se para uma posição for acionado um Stop Loss ou Take Profit e essa posição não corresponder com o princípio FIFO (existem posições anteriores para o mesmo instrumento), ela não será fechada.
    • Se acionado Stop out, essas operações também serão acionadas no lado do servidor. No modo normal, quando desativado o fechamento segundo princípio FIFO, se acontecer um Stop out, as posições são fechadas, começando pela menos lucrativa. Se ativada esta opção, para as posições não lucrativas encerradas, será adicionalmente verificado seu tempo de abertura. O servidor determina as posições mal-sucedidas de cada símbolo, localiza a posição mais antiga de cada símbolo e fecha a que mais causa perdas nas posições encontradas.

  14. Adicionada a possibilidade de agrupar parâmetros por meio do "input group". Isso permite que você separe visualmente alguns parâmetros de outros com base na lógica incorporada nos parâmetros.

    Exemplo de EA no qual o bloco de parâmetros de entrada é dividido segundo sua finalidade:
    input int             ExtBBPeriod    =20;         // Bollinger Bands period
    input double          ExtBBDeviation =2.0;        // deviation
    input ENUM_TIMEFRAMES ExtSignalTF    =PERIOD_M15; // BB timeframe
    
    input group           "Trend"
    input int             ExtMAPeriod    =13;         // Moving Average period
    input ENUM_TIMEFRAMES ExtTrendTF     =PERIOD_M15; // MA timeframe
    
    input group           "ExitRules"
    input bool            ExtUseSL       =true;       // use StopLoss
    input int             Ext_SL_Points  =50;         // StopLoss in points
    input bool            ExtUseTP       =false;      // use TakeProfit
    input int             Ext_TP_Points  =100;        // TakeProfit in points
    input bool            ExtUseTS       =true;       // use Trailing Stop
    input int             Ext_TS_Points  =30;         // Trailing Stop in points
    
    input group           "MoneyManagement"
    sinput double         ExtInitialLot  =0.1;        // initial lot value
    input bool            ExtUseAutoLot  =true;       // automatic lot calculation
    
    input group           "Auxiliary"
    sinput int            ExtMagicNumber =123456;    // EA Magic Number
    sinput bool           ExtDebugMessage=true;      // print debug messages
    Ao iniciar este EA no testador de estratégia, você pode clicar duas vezes no nome do grupo para recolher e expandir o bloco de parâmetros de entrada, além de selecionar todos os seus parâmetros com um clique na caixa de seleção do grupo para otimização.




  15. MQL5: corrigido um erro que acontecia ao importar funções de uma DLL cujos nomes se cruzavam com as funções MQL. Exemplo:
    #import "lib.dll"
    int func();
    #import
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
    int func()
      {
       return(0);
      }
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       Print( func() );
      }
    Anteriormente, a compilação deste tipo de código gerava o erro:
    'func' - ambiguous call to overloaded function with the same parameters
    could be one of 2 function(s)
       int func()
       int func()
    Agora, em vez do erro padrão, uma função MQL interna é usada como tendo uma prioridade mais alta. Para chamar a função importada, você deve especificar explicitamente o escopo:
    void OnStart()
      {
       Print( lib::func() );
      }
  16. MQL5: corrigida a especificação do tempo para notícia econômicas do calendário. Agora, a hora do evento é transmitida levando em consideração o fuso horário do servidor de negociação ao qual o terminal está conectado, e não o fuso horário do computador local.
  17. MQL5: corrigido o uso excessivo de memória nas funções CopyTicks e CopyTicksRange.
  18. Signals: corrigida exibição de gráficos de sinais ao trabalhar no Wine (Mac OS e Linux).
  19. Tester: testador de estratégia significativamente atualizado: adicionada página inicial, redesenhada página de configurações, aprimorada usabilidade.

    Página inicial
    Agora, ao iniciar o testador, em vez de muitas configurações, o usuário deve escolher uma das tarefas típicas e rapidamente começar a resolvê-la. Esta novidade é direcionada principalmente para usuários que não têm experiência.

    Identificamos várias tarefas básicas para testar e otimizar estratégias e as apresentamos graficamente na primeira página. Além disso, a partir da página inicial, agora você pode reiniciar rapidamente uma das tarefas anteriores. Se você executar muitas tarefas, e todas elas não couberem na lista, use a barra de pesquisa. Ela permite encontrar testes por qualquer parâmetro: nome do programa, por instrumento, por período gráfico, por tipo de simulação, etc.




    Omissão de parâmetros desnecessários
    Escolhida um das tarefas na página inicial, você é reencaminhado para um ajuste mais preciso dos parâmetros de teste: escolha de EA, de instrumento, de período gráfico, etc. Para facilitar o trabalho, estão ocultos todos os parâmetros que não são necessários para a tarefa selecionada. Por exemplo, se você escolher cálculos matemáticos, precisará definir apenas dois parâmetros: escolha um programa para teste e um modo de otimização. As configurações para o período de teste, atrasos e geração de ticks serão ocultadas.




    Configurações de teste convenientes
    Por conveniência, foram reorganizados alguns parâmetros na página de configurações. Além disso, adicionadas informações estendidas para os parâmetros de atraso e de visualização. Além disso, as configurações de teste agora podem ser salvas e carregadas manualmente, o que permite que você retorne rapidamente aos resultados anteriores.




    Você pode mudar rapidamente para a edição de programas no MetaEditor.

    Cálculo de lucro em pips
    Agora, nas configurações, você pode ativar o cálculo do lucro em pips. Isso permite acelerar o processo de teste, pois os lucros não são convertidos na moeda do depósito através de outras moedas (e, portanto, você não precisa fazer o download do histórico de preços). Também neste modo, não são calculados swaps e comissões.




    Lembre-se de que, ao calcular o lucro em pips, o volume de transações não importa. Para cada um, é sempre calculado apenas o número de pips ganhos/perdidos. Também neste modo, praticamente não há controle de margem. Use-o apenas para uma rápida avaliação aproximada da estratégia e verifique os resultados em modos mais precisos.

    Melhorias gerais
    O botão Iniciar/Parar o teste, bem como a barra de progresso foram movidos para a barra de guias. Isso permite que você controle o processo, não importa em que seção do testador de estratégia você esteja. Além disso, comandos de início e parada de teste foram adicionados aos menus de contexto das seções de configuração e de entrada de parâmetros.




  20. Tester: o gráfico de otimização agora pode ser exibido na área de trabalho principal do terminal e não, em uma seção separada do testador de estratégia. Isso permite que você use significativamente mais espaço na tela, tornando análise de dados mais conveniente. Além disso, foi atualizado o sistema de visualização 3D.




  21. Tester: adicionado o armazenamento de cache de otimização para o modo "Todos os Símbolos na Observação do Mercado".
  22. Tester: adicionado o armazenamento de cache de teste.

    Anteriormente, os resultados das tarefas concluídas eram salvos em arquivos apenas durante a otimização dos EAs. Agora, os arquivos de cache são salvos durante um teste único, permitindo que você retorne aos cálculos anteriores a qualquer momento, para ver todas as estatísticas, bem como gráficos de saldo, patrimônio e depósito. Também no futuro, isso permitirá comparar os resultados dos testes.

    Para carregar resultados de testes anteriores, use a nova página inicial do testador: clique em "Resultados Anteriores" e selecione o arquivo desejado:




  23. Tester: significativamente acelerados teste e otimização, incluindo com uso de Rede em nuvem MQL5 Cloud Network.
  24. Tester: corrigidos erros e otimizado o trabalho com frames.
  25. MetaEditor: adicionada a possibilidade de configurar o estilizador de código.

    No MetaEditor está embutido um estilizador de código que permite formatar automaticamente o código fonte de um programa de acordo com um padrão específico. Agora, além do estilo usual de design, você pode usar outros padrões populares. Para fazer isso, abra as configurações do MetaEditor e selecione o estilo desejado:




    Além disso, para o estilizador, agora você pode definir os seguintes parâmetros:

    Espaços de recuo
    Determina o número de espaços inseridos ao alinhar estruturas aninhadas:
    if(condition)
      {
       //---
      }

    Substituir tabulação por espaços
    Quando ativada esta opção, o estilizador substitui todos as tabulações no código por espaços. O número de caracteres de tabulação é determinado na seção "Geral".

    Excluir linhas em branco
    Quando ativada esta opção, o estilizador exclui do código todas as linhas que contêm apenas um caractere de quebra de linha.

    Inserir espaços após vírgulas e após ponto e vírgula
    Quando ativada esta opção, o estilizador separa visualmente os constructos contendo uma lista de elementos. Por exemplo:
    // antes de estilizar
    ParameterGetRange("InpX",enable,x_cur,x_start,x_step,x_stop);
    // após estilizar
    ParameterGetRange("InpX", enable, x_cur, x_start, x_step, x_stop);

    Inserir espaços ao redor dos operadores de declaração
    Quando ativada esta opção, o estilizador inserirá espaços ao redor dos operadores de atribuição, de igualdade, de comparação, etc. Por exemplo:
    // antes de estilizar
    if(x==1&y!=2)
      {
       int a=0;
      }
    // após estilizar
    if(x == 1 & y != 2)
     {
      int a = 0;
     }

  26. MetaEditor: ao menu de contexto dos favoritos do arquivo adicionado o comando "Mostrar no Navegador". Ele permite que você encontre rapidamente o arquivo aberto para edição na estrutura de pastas do editor.




  27. MetaEditor: corrigida a exibição da palavra-chave union nas dicas de balão.
  28. Adicionada tradução da interface do usuário para 18 novos idiomas:

    • Região européia — sueco, lituano, dinamarquês, letão, estoniano, sérvio, esloveno, eslovaco, finlandês, georgiano
    • Região asiática — javanês, marata, bengali, punjabi, tamil, telugu
    • Região africana — suaíli, hausa

    No total, a interface da plataforma agora está traduzida para 50 idiomas e, no total, eles são nativos para mais de 4 bilhões de pessoas.

    Para mudar a interface para o seu idioma, use o menu "Exibir \ Idioma" na parte superior do terminal.

  29. Documentação atualizada.
  30. Correções de crash-logs.

A atualização estará disponível através do sistema Live Update.


 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Um checklist dos riscos dos robôs antes de operar em conta real

Rogerio Figurelli, 2019.10.04 18:44

Olá  HT Saul, antes de mais nada, excelente post e obrigado pelo comentário a meu respeito.

Pela necessidade de "ressuscitar o tópico" e suposta popularidade dessa thread, de duas, uma: ou nossos robôs já estão todos seguros e não precisam mais de análise nesse sentido, ou estamos deixando de lado a segurança, acreditando que esse é um assunto resolvido e sem riscos!

Seja como for, na minha opinião, segurança é um processo, e não um ponto final, e portanto seus ótimos comentários podem ajudar muito nesse sentido.

Para não contaminar as respostas, e colaboração dos colegas, vou começar abordando o primeiro item e pergunta: 1-Existe tratamento para todas as situações de exceção das funções chamadas internamente pelo EA?

Pelo que você entendeu, "todas funções devem ter seu retorno checadas com if e caso não retornem o que seja esperado, é preciso ter algum tratamento". Eu diria que está correto, em parte, pois o mínimo que deve ser feito é checar o retorno das funções. 

Mas o ponto principal são as exceções, e como já foi discutido em vários pontos nesse Fórum, um dos problemas do MT4/MT5 é não prever o tratamento de exceções. Dessa forma, considero o mais seguro para qualquer robô prever uma possível exceção em toda e qualquer rotina utilizada, principalmente nas chamadas de função. 

Como por exemplo um retorno de valor fora da faixa prevista em documentação, um grande delay ou até mesmo travamento no retorno, no pior caso.

Para ser mais pragmático, vou citar um exemplo real: imagine que você está operando com uma exposição grande, e em determinado ponto decide chamar um Sleep(). O que acontece se o Sleep() dormir, literalmente, para sempre?

Não por menos, esse é um exemplo de função que evito ao máximo, pois me pare tão crítica quanto o GO TO de linguagens de programação do passado.

E esse é um ponto também relevante: muitas vezes a melhor decisão de segurança está em evitar o que tem maior chances de riscos. 

E qualquer programador tem essa decisão nas mãos.

Sds.,
Rogério Figurelli


 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Você negocia com ou sem Stop Loss?

Rogerio Figurelli, 2019.10.13 00:24

Olá  Marcelo Mota Valerio, na verdade toda posição possui um Stop Loss, que se não for programado pelo usuário, será programado pela área de risco da corretora/broker.

Dessa forma, no mínimo é mais elegante que essa programação seja feita pelo próprio trader, seja de forma sistêmica, seja de forma discricionária.

Entretanto, na minha opinião a maior parte dos sistemas não faz uma boa gestão do S/L, principalmente por questões emocionais. Ou seja, vale a velha máxima ilógica de encerrar cedo uma posição vencedora, e prolongar uma perdedora.

Nesse sentido, recomendo a todos o bom artigo abaixo, com testes reais sobre alguns dos mitos relacionados ao uso do S/L:

https://blog.quantinsti.com/hidden-truths-stop-loss-trading/

Respondendo agora sua pergunta, pessoalmente, uso um método sistêmico próprio, que chamo de StopLoss Máximo, ou seja, de buscar atuar o S/L apenas como proteção contra falhas e erros, e não como decisão final de fechar uma posição, que para mim deve ser idealmente definida a mercado, pelos algoritmos de inteligência de cenários (passado, presente e futuro) do trading system, ocultando tanto da corretora, como do book, os alvos operacionais do robô.

Sds.,
Rogério Figurelli


 
input string inicio="10:30"; //Horario de inicio(entradas);
input string termino="17:30"; //Horario de termino(entradas);
input string fechamento="17:45"; //Horario de fechamento(entradas);
MqlDateTime horario_inicio,horario_termino,horario_fechamento,horario_atual;
int OnInit(){
               //---
               TimeToStruct(StringToTime(inicio),horario_inicio);         //+-------------------------------------+
               TimeToStruct(StringToTime(termino),horario_termino);       //| Conversão das variaveis para mql    |
               TimeToStruct(StringToTime(fechamento),horario_fechamento); //+-------------------------------------+
  
               //verificação de erros nas entradas de horario
               if(horario_inicio.hour>horario_termino.hour || (horario_inicio.hour==horario_termino.hour && horario_inicio.min>horario_termino.min))
                {
                  printf ( "Parametos de horarios invalidos!" );
                  return INIT_FAILED;
                }
    
               if(horario_termino.hour>horario_fechamento.hour || (horario_termino.hour==horario_fechamento.hour && horario_termino.min>horario_fechamento.min))
                {
               printf("Parametos de horarios invalidos!");
               return INIT_FAILED;
                }
bool HorarioEntrada()
        {
       TimeToStruct(TimeCurrent(),horario_atual);
         if(horario_atual.hour >= horario_inicio.hour && horario_atual.hour <= horario_termino.hour)
         {
         // Hora atual igual a de início
            if(horario_atual.hour == horario_inicio.hour)
            // Se minuto atual maior ou igual ao de início => está no horário de entradas
            if(horario_atual.min >= horario_inicio.min)
               return true;
            // Do contrário não está no horário de entradas
            else
               return false;
     
         // Hora atual igual a de término
         if(horario_atual.hour == horario_termino.hour)
            // Se minuto atual menor ou igual ao de término => está no horário de entradas
            if(horario_atual.min <= horario_termino.min)
               return true;
            // Do contrário não está no horário de entradas
            else
               return false;
     
         // Hora atual maior que a de início e menor que a de término
         return true;
         }
  
      // Hora fora do horário de entradas
      return false;
   }


bool HorarioFechamento()
           {//Termina na linha 85
            TimeToStruct(TimeCurrent(),horario_atual);
     
    
         // Hora dentro do horário de fechamento
         if(horario_atual.hour >= horario_fechamento.hour)
         {
            // Hora atual igual a de fechamento
            if(horario_atual.hour == horario_fechamento.hour)
               // Se minuto atual maior ou igual ao de fechamento => está no horário de fechamento
             if(horario_atual.min >= horario_fechamento.min)
                return true;
               // Do contrário não está no horário de fechamento
               else
                return false;
     
            // Hora atual maior que a de fechamento
            return true;
         }
  
            // Hora fora do horário de fechamento
          return false;
         
         }
                   return false;
                   }
                   ///Boa tarte estou tentando rodar esse código para determinar os horários para o Robo mas estou com esse problema que não consegui indentifcar.

Peço a ajuda de todos.

Obrigado

Tudo sobre Arquitetura de Robôs
Tudo sobre Arquitetura de Robôs
  • 2019.04.06
  • www.mql5.com
Decidi criar esse tópico para concentrar tudo (perguntas, respostas, cases, informações, etc...
 
Fernando Teófilo:


Erros da compilação corrigidos.


input string inicio="10:30"; //Horario de inicio(entradas);
input string termino="17:30"; //Horario de termino(entradas);
input string fechamento="17:45"; //Horario de fechamento(entradas); 
MqlDateTime horario_inicio,horario_termino,horario_fechamento,horario_atual; 
int OnInit()
  {
   //---
   TimeToStruct(StringToTime(inicio),horario_inicio);         //+-------------------------------------+ 
   TimeToStruct(StringToTime(termino),horario_termino);       //| Conversão das variaveis para mql    | 
   TimeToStruct(StringToTime(fechamento),horario_fechamento); //+-------------------------------------+

   //verificação de erros nas entradas de horario 
   if(horario_inicio.hour>horario_termino.hour || (horario_inicio.hour==horario_termino.hour && horario_inicio.min>horario_termino.min)) 
    {
      printf ( "Parametos de horarios invalidos!" ); 
      return INIT_FAILED;
    }

   if(horario_termino.hour>horario_fechamento.hour || (horario_termino.hour==horario_fechamento.hour && horario_termino.min>horario_fechamento.min)) 
    {
      printf("Parametos de horarios invalidos!"); 
      return INIT_FAILED;
    }

   return(INIT_SUCCEEDED);
  }

bool HorarioEntrada()
        {
       TimeToStruct(TimeCurrent(),horario_atual); 
         if(horario_atual.hour >= horario_inicio.hour && horario_atual.hour <= horario_termino.hour)
         {
         // Hora atual igual a de início 
            if(horario_atual.hour == horario_inicio.hour)
            // Se minuto atual maior ou igual ao de início => está no horário de entradas 
            if(horario_atual.min >= horario_inicio.min)
               return true;
            // Do contrário não está no horário de entradas
            else
               return false; 
      
         // Hora atual igual a de término
         if(horario_atual.hour == horario_termino.hour)
            // Se minuto atual menor ou igual ao de término => está no horário de entradas 
            if(horario_atual.min <= horario_termino.min)
               return true;
            // Do contrário não está no horário de entradas
            else
               return false; 
      
         // Hora atual maior que a de início e menor que a de término
         return true;
         }
   
      // Hora fora do horário de entradas 
      return false;
   } 

bool HorarioFechamento()
           {//Termina na linha 85
            TimeToStruct(TimeCurrent(),horario_atual);
      
     
         // Hora dentro do horário de fechamento 
         if(horario_atual.hour >= horario_fechamento.hour)
         {
            // Hora atual igual a de fechamento 
            if(horario_atual.hour == horario_fechamento.hour)
               // Se minuto atual maior ou igual ao de fechamento => está no horário de fechamento 
             if(horario_atual.min >= horario_fechamento.min)
                return true;
               // Do contrário não está no horário de fechamento
               else 
                return false;
      
            // Hora atual maior que a de fechamento 
            return true;
         }
   
            // Hora fora do horário de fechamento 
          return false;
          
         }
 

Funcionou!!!

Muito Obrigado!! Pela Sua Ajuda.

Feliz2020!!!

Vinicius de Oliveira
Vinicius de Oliveira
  • www.mql5.com
Produto publicado The Expert Advisor is a fully automated, trades in all sessions (full-time), uses some important indicators to identify trade signals (Parabolic Stop And Reverse, Momentum, Stochastic Oscillator and Moving Average), as well as a adaptable algorithm to identify and trade in trend and important reversal levels (Support and...
 
Vinicius de Oliveira:


Erros da compilação corrigidos.



Vc se puder poderia apontar onde estava o erro?

Era "{" ?