English Русский 中文 Español Deutsch 日本語 한국어 Français Italiano Türkçe
preview
Como e por que desenvolver seu próprio sistema de negociação algorítmica

Como e por que desenvolver seu próprio sistema de negociação algorítmica

MetaTrader 5Negociação | 5 maio 2022, 10:25
908 11
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Introdução

Não há dúvida de que a importância do desenvolvimento e da programação está aumentando a cada dia em todas as áreas de nossas vidas. A programação não apenas facilita nossas vidas, mas também nos permite fazer algumas coisas com mais precisão e também nos ajuda a manter claramente a estratégia escolhida.

No maravilhoso mundo do trading, a programação traz simplicidade e sistematicidade, automatiza certas ações e faz uma enorme quantidade de trabalho para nós. Sem dúvida, a programação traz muitas vantagens, mas na minha opinião, uma das mais importantes é a disciplina, pois todos sabemos como é difícil ser disciplinado ao tomar e implementar decisões de negociação. Muitas vezes a disciplina tem um impacto direto nos resultados do trading e dos investimentos. Como eu gosto de dizer, a disciplina é a chave para o sucesso no trading e na vida em geral. Em termos simplistas, a disciplina pode ser explicada como a capacidade de tomar as ações necessárias no momento certo, independentemente das circunstâncias ao seu redor. A autodisciplina é uma coisa muito difícil, porque você tem que controlar conscientemente suas próprias ações. É aqui que a programação vem a calhar.

Na maioria das vezes, nossas emoções nos impedem de ser disciplinados no trading, o que significa que precisamos de alguma forma de remover essas emoções ou evitar seu impacto negativo em nossas decisões de trading. Imagine se, em vez de nós, tivéssemos um sistema de negociação que efetuasse operações sem interferência humana e com base em certos parâmetros pré-estabelecidos. Tal sistema automatizado evitaria a influência negativa das emoções humanas espontâneas. Por outro lado, existe uma ferramenta pronta que pode ser usada para criar um sistema desse tipo. Hoje este artigo vem falar sobre isso, é sobre a linguagem de programação MQL (MetaQuotes Language) para a plataforma de negociação MetaTrader. Com a ajuda desta linguagem, podemos programar um sistema de negociação que funcionará de acordo com os parâmetros por nós especificados, para que seja garantida a realização de determinadas ações e a tomada de decisões de trading específicas.

Para ajudar você a entender melhor este conceito, vou lhe dar um exemplo. Suponha que tenhamos dois investidores, A e B, negociando exatamente com a mesma estratégia: compra e retenção de posicição durante uma tendência altista e venda durante uma reversão. Mas eles se comportam de maneira diferente: o investidor A negocia de maneira disciplinada, ao contrário de B. Dê uma olhada nestas imagens:


2- Investor_B


Você pode ver que a disciplina é necessária para obter bons resultados. Por outro lado, sem disciplina, os resultados não são tão bons.

Neste artigo vamos analisar o básico da linguagem de programação MQL5 e tentar escrever nosso próprio sistema de negociação automático com base no cruzamento de médias móveis. Este artigo inclui muitos exemplos de código MQL5 para ajudá-lo a entender melhor o assunto. Ele dá uma visão geral do que pode ser feito usando a linguagem de programação na plataforma de negociação.

O principal objetivo deste artigo é ajudar os iniciantes a aprender como desenvolver seus próprios sistemas de negociação algorítmicos em MQL5. Vamos rever alguns conceitos básicos da MQL5 e desenvolver passo a passo um sistema de negociação simples. O proveito deverá ser um código executável, cujo desfecho veremos no final do artigo. Para entender melhor tudo o que será descrito aqui, recomendo aos leitores que estudem cada fragmento de código apresentado no artigo e repitam todo o processo em seu próprio programa. Observe que todos os fragmentos de código apresentados neste artigo são dados apenas para estudar as potencialidades da programação e não pretendem ser utilizados para outros fins. Todos os códigos serão escritos em MQL5.


O que precisamos para desenvolver nosso próprio algoritmo de negociação

Nesta parte, consideraremos quais ferramentas precisamos para desenvolver o sistema:

  • Plataforma de negociação MetaTrader 5 (ou terminal de negociação MetaTrader 5). O código final é executado no terminal, que é propriamente o local onde todas as ordens de negociação são executadas. É uma plataforma de negociação muito popular com enormes possibilidades.



3- MT5 platform

Conta de demonstração. Será necessário abrir uma conta demo com a corretora de sua escolha, com a qual você poderá testar suas estratégias sem arriscar dinheiro real, mas em condições reais de mercado. Certifique-se de não iniciar programas de treinamento em uma conta real. Você definitivamente precisa de uma conta de demonstração, porque o programa que está sendo criado realizará operações de negociação nesta conta.

MetaEditor, o código do programa será escrito nele. Esse editor é instalado junto com o terminal MetaTrader 5. As capturas de tela abaixo mostram como iniciá-lo. Existem três maneiras de rodar o editor.

  • No menu "Ferramentas", selecione MetaQuotes Language Editor:

4- MetaEditor opening  

                   

Ou clique no ícone MetaEditor na barra de ferramentas:

   5- MetaEditor opening

Ou pressione F4 no teclado enquanto o terminal estiver aberto.

A criação em si do código do seu próprio sistema de negociação será efetuada no editor. É assim como se vê:

   6- MetaEditor window

 

Bem, vamos criar nosso primeiro programa no editor - um arquivo no qual escreveremos o código.

Uma vez clicado em Novo, são mostrados os tipos de programas disponíveis que podem ser criados no editor:

7- MetaEditor window



8- MetaEditor - New



Assim, você pode optar entre criar um EA, um indicador personalizado e um roteiro. Vamos dar uma olhada no que tudo isso significa.

  • Expert Advisor: programa rodado no terminal que é desenvolvido e utilizado para automação de processos analíticos e de negociação, de acordo com os parâmetros que você definir.
  • Indicador personalizado: programa que permite exibir graficamente algumas dependências calculadas preliminarmente.
  • Script: programa destinado a uma única execução de qualquer ação, pode cumprir tanto funções analíticas quanto operacionais, e ao contrário dos Expert Advisors, é executado sob solicitação, não por ticks.

Programa Hello World!

Nesta parte, escreveremos nosso primeiro código e nosso primeiro programa MQL5. O caminho em qualquer linguagem de programação começa com a escrita de "Olá, Mundo". Também escreveremos o primeiro programa que exibirá “Hello World” na tela. Então, vamos começar.

Abrimos o MetaEditor, criamos um novo programa, selecionamos o tipo de programa script, clicamos em "Avançar".


9- MetaEditor - New file - Script


<Será aberta a seguinte janela, onde você deverá especificar os parâmetros:

  • Nome — nome do script
  • Autor — nome do autor do script
  • Link — link para seu site
  • Parâmetros — parâmetros operacionais do futuro script. Como nosso script não precisa de parâmetros, pulamos esta etapa.
Clicamos em "Concluir".

10- MetaEditor - Script info


Depois disso, aparecerá a mesma janela na qual escreveremos o código do programa. Deixe-me lembrá-lo de que estamos escrevendo um programa que imprimirá “Hello World!” na janela do terminal. Vamos começar a escrever nosso código dentro de chaves.


 11 - Codes place

Quais elementos são usados aqui:

  • Alerta: exibe uma determinada mensagem na tela, em nosso exemplo, esta função imprimirá “Hello World!”
  • ( “ ”): dentro das aspas vamos escrever o texto que precisamos, nomeadamente "Hello World!" ou qualquer outra mensagem que você precisar.
  • ; - é usado como separador.

O resultado é um exemplo de código como este:

//+----------------------------------------------------------+
//|                                         Hello World!.mq5 |
//|                          Copyright 2022, MetaQuotes Ltd. |
//|                                     https://www.mql5.com |
//+----------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+----------------------------------------------------------+
//| Script program start function                            |
//+----------------------------------------------------------+
void OnStart()
  {
   Alert("Hello World!");
  }
//+----------------------------------------------------------+

Depois de ter escrito o código, ele deve ser compilado. Para fazer isso, clicamos no botão "Compilar". Nesta fase, é importante que não haja erros ou avisos no programa. Não deve haver mensagens na guia Erros, somente assim podemos esperar que o programa funcione exatamente como precisamos. Agora pressione F4 e acessamos o terminal para testar o programa resultante.

12- Hello World code

No terminal, na janela do navegador, na subseção de scripts, encontramos o programa resultante com o nome definido, no nosso caso é "Hello World!". Executamos o script arrastando-o para o gráfico ou clicando duas vezes nele. Depois disso, o mesmo alerta que definimos no script aparecerá no gráfico. Fica assim:

13- Hello World alert



Ideia para uma estratégia de negociação (cruzamento de duas médias móveis)

Nesta parte, aprenderemos como escrever uma estratégia de negociação. Ela é apresentada apenas com o propósito de aprender o básico da linguagem de programação MQL5 e nós servir do editor.

Comentário
Qualquer informação é dada "como está" apenas para fins informativos e não deve ser usada para aconselhamento ou negociação. Nenhum desempenho passado pode garantir os mesmos resultados no futuro. Se você optar por usar qualquer código, use-o por sua conta e risco.

O propósito de tal estratégia de negociação é operar acompanhando a tendência após receber confirmação de sinal de duas médias móveis simples:

  • Média móvel simples — indicador atrasado que calcula o preço médio de fechamento durante um determinado período, o sinal de tal indicador é recebido mais tarde do que o da ação do preço.
  • Estratégia de negociação:
    • Se a média móvel curta (com um período de 20) cruzar a média móvel longa (com um período de 50) de baixo para cima, isso é um sinal de compra.
    • Se a média móvel curta (com um período de 20) cruzar a média móvel longa (com um período de 50) para baixo, este é um sinal de venda.

Em seguida, escreveremos um programa que implementa essa estratégia.

15- Trading Idea1


14- Trading Idea


Esquema de um sistema de negociação algorítmico

Nesta parte do artigo, consideraremos uma etapa muito importante no desenvolvimento de sistemas de negociação. Nesta fase, desenvolveremos um esquema da estratégia de negociação na forma de uma sequência de etapas que o sistema deve executar. Esse sistema fornece uma compreensão clara das etapas de desenvolvimento necessárias. Para nosso sistema baseado no cruzamento de duas médias móveis, o fluxo de trabalho ajudará a saber claramente que tipo de código precisamos escrever e qual o resultado que queremos obter.

    16- Simple 2MA-Blueprint-–-MQL5


      Para começar, vamos considerar alguns conceitos básicos da linguagem MQL5 que usaremos.


      Variáveis e tipos de variáveis, como usá-las

      Nesta parte, veremos:

      • O que é uma variável
      • Tipos de variáveis
      • Uso

      Em geral, os dados nos programas podem ser de dois tipos: constantes e variáveis. Os valores das variáveis podem ser alterados pelo usuário ou pelo programa. A variável está na memória. O nome de uma variável está associado à sua localização na memória. Os dados são armazenados neste endereço. Um programa MQL5 pode conter dezenas e centenas de variáveis. Uma característica importante de uma variável é que pode usar seu valor em um programa. A limitação desta característica está relacionada ao escopo da variável, ou seja, a parte do programa em que esta variável está disponível. Cada variável tem seu próprio escopo.

      Existem dois tipos de variáveis no escopo em MQL5: local e global. Uma variável local é uma variável declarada dentro de uma função. O escopo de uma variável local é o corpo da função na qual ela é declarada. Uma variável local pode ser inicializada com uma constante ou com uma expressão que corresponda ao seu tipo. Variáveis globais são declaradas fora de todas as funções. O escopo das variáveis declaradas no nível global é o programa inteiro. Uma variável global só pode ser inicializada com uma constante que corresponda ao seu tipo (não com uma expressão). As variáveis globais são inicializadas apenas uma vez antes da execução de funções especiais.

      Independentemente do escopo das variáveis, estas podem ser dos seguintes tipos:

      • int é um tipo numérico; existem diferentes tipos de variáveis inteiras para armazenar valores numéricos de diferentes comprimentos.
      • double. Para escrever um programa que use valores numéricos na negociação, precisamos de um tipo de dado que possa manusear números de ponto flutuante. O MetaTrader tem os tipos float e double, que permitem trabalhar com esses dados. A diferença entre eles está nos bytes alocados na memória: 4 para float e 8 para double. Esses dados podem conter os seguintes valores mínimos e máximos:
        • float - mínimo 1.175494351e-38, máximo 3.402823466e+38
        • double - mínimo 2.2250738585072014e-308, máximo 1.7976931348623158e+308
          Quando declaramos esses tipos, usamos as palavras float e double.
      • string é outro tipo de dados importante que é frequentemente usado em programação, incluindo MQL5. Os dados de string facilitam o armazenamento e processamento de sequências alfanuméricas de caracteres.
      • bool é um tipo lógico que pode assumir os valores true ou  false.

      Vamos ver como se usam essas variáveis:

      //+------------------------------------------------------------------+
      //|                                                    Variables.mq5 |
      //|                                  Copyright 2022, MetaQuotes Ltd. |
      //|                                             https://www.mql5.com |
      //+------------------------------------------------------------------+
      #property copyright "Copyright 2022, MetaQuotes Ltd."
      #property link      "https://www.mql5.com"
      #property version   "1.00"
      //+------------------------------------------------------------------+
      //| Script program start function                                    |
      //+------------------------------------------------------------------+
      void OnStart()
        {
          int myInteger = 5;
          double myDouble = 10.56;
          string myString = "My name is Mohamed";
          bool myBoolean = true;
          
          Alert(myInteger);
          Alert(myDouble);
          Alert(myString);
          Alert(myBoolean); 
        }
      //+------------------------------------------------------------------+
      
      

      Se compilarmos esse código e o executarmos no terminal, na janela será exibida a seguinte mensagem:

      18- Variables

      Vamos considerar mais um exemplo.

        Aqui convém lembrar as seguintes variáveis e seus valores: A e seu valor 10, B = 10, C = 10 + 5, var1 = 2.5, var2 = 4, result = 2.5/4, message1 = Hello Mohamed, e message2 = Value of A is: 10. Se compilarmos e executarmos o código, na janela veremos essas quatro mensagens:
        • Valor da variável message1
        • Valor da variável C
        • Valor da variável result
        • Valor da variável message2
        //+------------------------------------------------------------------+
        //|                                                  Variables 2.mq5 |
        //|                                  Copyright 2022, MetaQuotes Ltd. |
        //|                                             https://www.mql5.com |
        //+------------------------------------------------------------------+
        #property copyright "Copyright 2022, MetaQuotes Ltd."
        #property link      "https://www.mql5.com"
        #property version   "1.00"
        //+------------------------------------------------------------------+
        //| Script program start function                                    |
        //+------------------------------------------------------------------+
        void OnStart()
          {
           int A = 10;
           int B = 5;
           int C;
         
           double var1 = 2.5;
           double var2 = 4;
           double result = var1 / var2;
           
           string greeting = "Hello";
           string space = " ";
           string name = "Mohamed";
           string message1;
           string message2;
           
           C = A + B;
           message1 = greeting + space + name;  
           message2 = "Value of A is: " + string(A);
           
           Alert(message1);
           Alert(C);
           Alert(result);
           Alert(message2);
          }
        //+------------------------------------------------------------------+
        
        


         19- Variables 2

        Operações booleanas

        O tipo de dados retorna o valor da operação lógica true ou false.

        • == igual
        • != não é igual
        • < menor que
        • <= menor ou igual
        • > maior que
        • >= maior ou igual
        //+------------------------------------------------------------------+
        //|                                           Boolean Operations.mq5 |
        //|                                  Copyright 2022, MetaQuotes Ltd. |
        //|                                             https://www.mql5.com |
        //+------------------------------------------------------------------+
        #property copyright "Copyright 2022, MetaQuotes Ltd."
        #property link      "https://www.mql5.com"
        #property version   "1.00"
        //+------------------------------------------------------------------+
        //| Script program start function                                    |
        //+------------------------------------------------------------------+
        void OnStart()
          {
           bool result = 4 < 5;
           Alert (result);     //true
          }
        //+------------------------------------------------------------------+
        
        

        Deve retornar true, dado que 4 < 5.

         20- Boolean Operations

        Ciclo While

        O operador while consiste na expressão a ser testada e no operador a ser executado. Se a expressão for verdadeira, a instrução será executada até que ela se torne falsa. No exemplo a seguir, o programa notifica quando o ciclo começa e termina, verifica o valor do contador e o exibe se o valor for menor que três. Ele adiciona então uma unidade ao resultado anterior até que a expressão se torne falsa, ou seja, = ou > 3, e em seguida mostrará a última mensagem quando o ciclo estiver terminado. Quando o programa for executado, na tela devem aparecer as seguintes mensagens: Start of script, 1, 2, Loop has finished.
        //+------------------------------------------------------------------+
        //|                                                   While Loop.mq5 |
        //|                                  Copyright 2022, MetaQuotes Ltd. |
        //|                                             https://www.mql5.com |
        //+------------------------------------------------------------------+
        #property copyright "Copyright 2022, MetaQuotes Ltd."
        #property link      "https://www.mql5.com"
        #property version   "1.00"
        //+------------------------------------------------------------------+
        //| Script program start function                                    |
        //+------------------------------------------------------------------+
        void OnStart()
          {
           //While (Loop)
           Alert("Start of script");
           
           int counter = 1;
           
           while(counter < 3) //true?
            {
              Alert(counter);
              counter = counter + 1;
            }
            
            Alert("Loop has finished");
          }
        
        


         21- While Loop


        Ciclo For

        O operador for consiste em três expressões e em um operador executável:

                 for(expressão1; expressão2; expressão3)
                 operator;

        Expressão1 descreve a inicialização do ciclo. Expressão2 verifica a condição de término do ciclo. Se for verdadeira, o operador do corpo do loop for será executado. Tudo se repete até expressão2 se tornar falso. Se for falso, o ciclo termina e o controle passa para o próximo operador. Expressão3 é avaliada após cada iteração.

        Assim, no exemplo a seguir de um ciclo for, pode-se esperar que a execução do código resulte em cinco mensagens Hello (I = 0, I = 2, ............, I = 4), depois será = 5 e o ciclo será terminado.

        //+------------------------------------------------------------------+
        //|                                                     For Loop.mq5 |
        //|                                  Copyright 2022, MetaQuotes Ltd. |
        //|                                             https://www.mql5.com |
        //+------------------------------------------------------------------+
        #property copyright "Copyright 2022, MetaQuotes Ltd."
        #property link      "https://www.mql5.com"
        #property version   "1.00"
        //+------------------------------------------------------------------+
        //| Script program start function                                    |
        //+------------------------------------------------------------------+
        void OnStart()
          {
           for(int i=0; i<5 ; i++)
           {
           Alert("Hello");
           }
          }
        //+------------------------------------------------------------------+
        
        


        22- For Loop

        Expressão IF, Else

        O operador IF - ELSE é usado quando é preciso fazer uma escolha. A sintaxe fica assim:


        if (expression)
        operator1
        else
        operator2


        Se a expressão for verdadeira, o operador1 é executado e o controle é transferido para o operador seguinte ao operador2 (o operador2 não é executado). Se a expressão for falsa, o operador2 é executado.

        Por exemplo, no caso a seguir, primeiro precisamos exibir uma mensagem com o valor do preço do Bid, depois determinar se o Bid > 1,146600 é verdadeiro, e caso seja assim mostrar a mensagem “Preço acima de 1,146600 -> BUY”. Caso contrario, será necessário mostrar a mensagem “Preço abaixo de 1.146600 -> SELL”. Abaixo está o código e o resultado.

        //+------------------------------------------------------------------+
        //|                                            If-else statement.mq5 |
        //|                                  Copyright 2022, MetaQuotes Ltd. |
        //|                                             https://www.mql5.com |
        //+------------------------------------------------------------------+
        #property copyright "Copyright 2022, MetaQuotes Ltd."
        #property link      "https://www.mql5.com"
        #property version   "1.00"
        //+------------------------------------------------------------------+
        //| Script program start function                                    |
        //+------------------------------------------------------------------+
        void OnStart()
          {
           double level = 1.146600;
           double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
           Alert("Bid Price = " + string(Bid));
        
          if(Bid > level)
          {
          Alert ("Цена выше " + string(level) + " -> BUY");
          }
        // А если условие ложно и нужно совершить другое действие, можно использовать функцию else, а не писать новый код if
           else
           {
           Alert ("The price is below " + string(level) + " -> SELL");
           } 
            
          }
        //+------------------------------------------------------------------+
        
        


         23- If-Else Statement


        Parâmetros de entrada

        Em seguida, vamos ver como definir nossas entradas ou parâmetros para o programa.

        Parâmetros (#property): Cada programa MQL5 permite especificar parâmetros específicos adicionais com a diretiva #property que ajuda o terminal do cliente a executar os programas corretamente.

        script_show_inputs: Exibição da janela de propriedades antes de executar o script e desativar esta janela de confirmação

        Parâmetros de entrada: A classe input define variáveis externas. O modificador  input é definido antes do tipo de dados.

        //+------------------------------------------------------------------+
        //|                                                Trader Inputs.mq5 |
        //|                                  Copyright 2022, MetaQuotes Ltd. |
        //|                                             https://www.mql5.com |
        //+------------------------------------------------------------------+
        #property copyright "Copyright 2022, MetaQuotes Ltd."
        #property link      "https://www.mql5.com"
        #property version   "1.00"
        #property script_show_inputs
        //+------------------------------------------------------------------+
        //| Script program start function                                    |
        //+------------------------------------------------------------------+
        input int TakeProfit = 10;
        input int StopLoss = 10;
        
        void OnStart()
          {
           double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
           double TakeProfitLevel = Bid + TakeProfit * 0.00001; // 0.00001 (5 digits broker, so multiplied by 10)
           double StopLossLevel = Bid - StopLoss * 0.00001;
           
           Alert("Price now = " + string(Bid));
           Alert ("TakeProfitLevel = ", TakeProfitLevel);
           Alert ("StopLossLevel = ", StopLossLevel);
          }
        //+------------------------------------------------------------------+
        
        

        24- Trader Input 1


        24- Trader Input 2


         24- Trader Input 3


        24- Trader Input 4


        Abertura de ordens

        Vejamos o código que abre as ordens:

        //+------------------------------------------------------------------+
        //|                                                         TEST.mq5 |
        //|                                  Copyright 2022, MetaQuotes Ltd. |
        //|                                             https://www.mql5.com |
        //+------------------------------------------------------------------+
        #property copyright "Copyright 2022, MetaQuotes Ltd."
        #property link      "https://www.mql5.com"
        #property version   "1.00"
        #property script_show_inputs
        #include <Trade\Trade.mqh>
        CTrade trade;
        //+------------------------------------------------------------------+
        //| Script program start function                                    |
        //+------------------------------------------------------------------+
        input int TakeProfit = 150;
        input int StopLoss = 100;
        
        void OnStart()
          {
           double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
           double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
           double Balance = AccountInfoDouble(ACCOUNT_BALANCE);
           double Equity = AccountInfoDouble(ACCOUNT_EQUITY); 
           double TakeProfitLevel = (Ask+TakeProfit*0.00001);
           double StopLossLevel = (Ask-StopLoss*0.00001);
           
           
           if(Equity >= Balance)
           trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL);
           
           for (int i=PositionsTotal()-1; i>=0; i--)
           {
             ulong ticket = PositionGetTicket(i);
             ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE));
        
              
             Alert (" Order Ticket # ", ticket);
             Alert("TakeProfit = ", TakeProfitLevel);
             Alert("StopLoss = ", StopLossLevel);
           }
          }
        //+------------------------------------------------------------------+
        
          O resultado da execução do script será esse:

          25- Opening orders


          Processamento de erros

          Quando o programa está em execução, algo pode dar errado, podem ocorrer erros. Por esse motivo, devemos adicionar um código que verifique a criação de ordens ou a execução do código correspondente e notifique se algo deu errado. Em outras palavras, é para proteger o trader e o dinheiro de situações imprevistas. 

          //+------------------------------------------------------------------+
          //|                                                         TEST.mq5 |
          //|                                  Copyright 2022, MetaQuotes Ltd. |
          //|                                             https://www.mql5.com |
          //+------------------------------------------------------------------+
          #property copyright "Copyright 2022, MetaQuotes Ltd."
          #property link      "https://www.mql5.com"
          #property version   "1.00"
          #property script_show_inputs
          #include <Trade\Trade.mqh>
          CTrade trade;
          //+------------------------------------------------------------------+
          //| Script program start function                                    |
          //+------------------------------------------------------------------+
          input int TakeProfit = 150;
          input int StopLoss = 100;
          
          void OnStart()
            {
             double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
             double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
             double Balance = AccountInfoDouble(ACCOUNT_BALANCE);
             double Equity = AccountInfoDouble(ACCOUNT_EQUITY); 
             double TakeProfitLevel = (Ask+TakeProfit*0.00001);
             double StopLossLevel = (Ask-StopLoss*0.00001);
             
             
             if(Equity >= Balance)
             trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL);
             
                for (int i=PositionsTotal()-1; i>=0; i--)
                {
                   ulong ticket = PositionGetTicket(i);
                   ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE));
                  
                 if (ticket <= 0)
                  {
                   Alert("Error!");  //предупреждение появляется в случае возникновения ошибок или если ордер не смог открыться
             
                  }
                else
                  {
                   Alert("Your ticket # is: " + string(ticket));
                   Alert("TakeProfit = ", TakeProfitLevel);
                   Alert("StopLoss = ", StopLossLevel);
                  }
                }
            }
          //+------------------------------------------------------------------+
          
          

          26- Errors programming techniques 1


          27- Errors programming techniques 2


          Configurações de fechamento de ordens

          Vejamos o código que abre e fecha ordens.
          //+------------------------------------------------------------------+
          //|                                                         TEST.mq5 |
          //|                                  Copyright 2022, MetaQuotes Ltd. |
          //|                                             https://www.mql5.com |
          //+------------------------------------------------------------------+
          #property copyright "Copyright 2022, MetaQuotes Ltd."
          #property link      "https://www.mql5.com"
          #property version   "1.00"
          #property script_show_inputs
          #include <Trade\Trade.mqh>
          CTrade trade;
          //+------------------------------------------------------------------+
          //| Script program start function                                    |
          //+------------------------------------------------------------------+
          input int TakeProfit = 150;
          input int StopLoss = 100;
          
          void OnStart()
            {
             double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
             double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
             double Balance = AccountInfoDouble(ACCOUNT_BALANCE);
             double Equity = AccountInfoDouble(ACCOUNT_EQUITY); 
             double TakeProfitLevel = (Ask+TakeProfit*0.00001);
             double StopLossLevel = (Ask-StopLoss*0.00001);
             
             
             
             trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL);
             
             for (int i=PositionsTotal()-1; i>=0; i--)
             {
               ulong ticket = PositionGetTicket(i);
               ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE));
          
                
               Alert (" Order Ticket # ", ticket);
               Alert("TakeProfit = ", TakeProfitLevel);
               Alert("StopLoss = ", StopLossLevel);
               
               Sleep(2000);
               
               trade.PositionClose(ticket,-1);
               Alert("Order Closed...");
             }
          
            }
          //+------------------------------------------------------------------+
          


           28- Closing orders

          Ajuste de ordens por meio da função OrderModify

          Este código permite modificar as ordens já especificadas. Essa função altera as características de ordens anteriormente abertas ou pendentes.

          //+------------------------------------------------------------------+
          //|                                                         TEST.mq5 |
          //|                                  Copyright 2022, MetaQuotes Ltd. |
          //|                                             https://www.mql5.com |
          //+------------------------------------------------------------------+
          #property copyright "Copyright 2022, MetaQuotes Ltd."
          #property link      "https://www.mql5.com"
          #property version   "1.00"
          #property script_show_inputs
          #include <Trade\Trade.mqh>
          CTrade trade;
          //+------------------------------------------------------------------+
          //| Script program start function                                    |
          //+------------------------------------------------------------------+
          input int TakeProfit = 150;
          input int StopLoss = 100;
          
          void OnStart()
            {
             double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
             double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
             double Balance = AccountInfoDouble(ACCOUNT_BALANCE);
             double Equity = AccountInfoDouble(ACCOUNT_EQUITY); 
             double TakeProfitLevel = (Ask+TakeProfit*0.00001);
             double StopLossLevel = (Ask-StopLoss*0.00001);
             double TakeProfitLevel2 = (TakeProfitLevel+0.00100);
             double StopLossLevel2 = (StopLossLevel-0.00050);   
             
             
             trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL);
             
             for (int i=PositionsTotal()-1; i>=0; i--)
             {
               ulong ticket = PositionGetTicket(i);
               ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE));
          
                
               Alert (" Order Ticket # ", ticket);
               Alert("TakeProfit = ", TakeProfitLevel);
               Alert("StopLoss = ", StopLossLevel);
               
               Sleep(5000);
               
               trade.PositionModify(ticket,StopLossLevel2,TakeProfitLevel2);
               Alert("Order Modified...");
               Alert("Modified TakeProfit = ", TakeProfitLevel2);
               Alert("Modified StopLoss = ", StopLossLevel2);
             }
          
            }
          //+------------------------------------------------------------------+
          
          

          29- Modifying orders



          Sistema baseado no cruzamento de duas médias móveis

          Vamos juntar tudo e criar um sistema que negocie com base nos sinais do cruzamento de duas médias móveis. O programa funcionará de acordo com o esquema que discutimos acima.

          Para escrever o sistema, vamos criar um novo arquivo usando o tipo Expert Advisor no MetaEditor.

          Vamos lembrar o esquema de trabalho novamente:

          16- Simple 2MA-Blueprint-–-MQL5


          Precisamos escrever o código que leva à prática nossa estratégia:
          • Se a média móvel curta (com um período de 20) cruzar a média móvel longa (com um período de 50) de baixo para cima, isso é um sinal de compra.
          • Se a média móvel curta (com um período de 20) cruzar a média móvel longa (com um período de 50) para baixo, este é um sinal de venda.
          É assim que o código deve ficar.
          //+------------------------------------------------------------------+
          //|                                                SMA crossover.mq5 |
          //|                                  Copyright 2022, MetaQuotes Ltd. |
          //|                                             https://www.mql5.com |
          //+------------------------------------------------------------------+
          #property copyright "Copyright 2022, MetaQuotes Ltd."
          #property link      "https://www.mql5.com"
          #property version   "1.00"
          //+------------------------------------------------------------------+
          //| Тиковая функция эксперта                                         |
          //+------------------------------------------------------------------+
          
          void OnTick()
            {
             //create an array for several prices
             double myMovingAverageArray1[], myMovingAverageArray2[];
             
             //определим свойства скользящих - простые MA с периодами 20 и 50
             int movingAverage1 = iMA(_Symbol, _Period, 20, 0, MODE_SMA, PRICE_CLOSE);
             int movingAverage2 = iMA(_Symbol,_Period,50,0,MODE_SMA,PRICE_CLOSE);
             
             //sort the price arrays 1, 2 from current candle
             ArraySetAsSeries(myMovingAverageArray1,true);
             ArraySetAsSeries(myMovingAverageArray2,true);
             
             //Параметры MA1, MA2 - линия - текущая свеча, 3 свечи - сохраним результат
             CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1);
             CopyBuffer(movingAverage2,0,0,3,myMovingAverageArray2);
             
             //Проверка сигнала на покупку
             if (
                (myMovingAverageArray1[0]>myMovingAverageArray2[0])
             && (myMovingAverageArray1[1]<myMovingAverageArray2[1])
                )
                   {
                   Comment("BUY");
                   }
              
             //Проверка сигнала на продажу      
             if (
                (myMovingAverageArray1[0]<myMovingAverageArray2[0])
             && (myMovingAverageArray1[1]>myMovingAverageArray2[1])
                )
                   {
                   Comment("SELL");
                   }          
            }
          //+------------------------------------------------------------------+
          
          


          Após a execução, o programa exibirá comentários no gráfico com o sinal atual (compra ou venda) conforme a estratégia selecionada. Aqui está como deve ficar:


          30- SMA - comment


           31- SMA - Sell comment

          As capturas de tela abaixo mostram como encontrar o sistema que criamos no terminal e como iniciá-lo:

          32- Simple MA program place

          Após iniciar o programa clicando duas vezes ou arrastando, aparecerá a seguinte janela:

          33- Simple MA program interface

          Ativamos a negociação automática Allow Algo Trading e clicamos em Ok. O Expert Advisor será iniciado no gráfico e uma mensagem sobre a inicialização bem-sucedida aparecerá na guia Log:


           34- Simple MA program activated1


          35- Simple MA program activated2

          Bem, criamos e executamos um programa que negocia automaticamente com base no cruzamento de duas médias móveis. Este é o exemplo mais simples de como você pode criar seu próprio programa de negociação automática no terminal. Com a linguagem de programação MQL5, você pode implementar e automatizar praticamente qualquer estratégia de negociação.

          Novamente, o objetivo principal não é usar essa estratégia, mas aprender o básico da MQL5 e começar a conhecer os recursos de programação que podem tornar a negociação mais fácil e lucrativa. Para usar esta estratégia, ela definitivamente precisa ser modificada porque todo o código é instrutivo.


          Conclusão:

          A MQL5 é uma ótima ferramenta para ajudar a tornar a negociação mais fácil e mais lucrativa, para elaborar bons sistemas de negociação algorítmicos. E qualquer investimento em aprender e usar essa ferramenta será muito útil e vantajoso.

          Traduzido do Inglês pela MetaQuotes Ltd.
          Artigo original: https://www.mql5.com/en/articles/10293

          Últimos Comentários | Ir para discussão (11)
          Laudable222
          Laudable222 | 9 fev 2022 em 10:40

          Olá @Mohamed Abdelmaaboud .

          Você pode ilustrar como fazer o mesmo para o MT4 e incluir o uso de indicadores personalizados para criar a EA.

          Mohamed Abdelmaaboud
          Mohamed Abdelmaaboud | 14 fev 2022 em 18:55
          Laudable222 indicadores personalizados para criar a EA.

          Olá, elogiável222,

          Não posso publicá-lo através de um artigo, pois a MQL5 não suportará isso, pois a MQL4 não será suportada.

          Toto Sarono
          Toto Sarono | 17 mar 2022 em 02:17

          Prezado Mohamed.


          Eu sou um novo comediante no mundo comercial e a primeira pergunta é "quando abrir e fechar posições?

          Muito obrigado por seus artigos claros que me levam à resposta de minhas grandes perguntas acima.

          O resto devem ser muitos exercícios para sentir as mudanças comerciais e as questões de mercado, penso eu.


          Abraço,

          Toto Sarono

          Mohamed Abdelmaaboud
          Mohamed Abdelmaaboud | 18 mar 2022 em 13:59
          Toto Sarono #:

          Prezado Mohamed.


          Eu sou um novo comediante no mundo comercial e a primeira pergunta é "quando abrir e fechar posições?

          Muito obrigado por seus artigos claros que me levam à resposta de minhas grandes perguntas acima.

          O resto devem ser muitos exercícios para sentir as mudanças comerciais e as questões de mercado, penso eu.


          Abraço,

          Toto Sarono

          Prezado Toto,

          Você é bem-vindo e estou feliz em ver que meus artigos o ajudaram.

          E o que eu preciso confirmar aqui é que a prática e a consistência são chaves importantes para qualquer sucesso no comércio ou em qualquer outro campo.

          Boa sorte.

          Toto Sarono
          Toto Sarono | 20 mar 2022 em 12:43
          Mohamed Abdelmaaboud #:

          Prezado Toto,

          Você é bem-vindo e estou feliz em ver que meus artigos o ajudaram.

          E o que eu preciso confirmar aqui é que a prática e a consistência são chaves importantes para qualquer sucesso no comércio ou em qualquer outro campo.

          Boa sorte.

          Absolutamente certo.....!

          Tenho muita sorte de encontrar seus artigos e sua orientação para construir uma simples EA. Isso me facilita copiar códigos de outros comerciantes e economiza muito do meu tempo.


          Tenha um bom dia

          Desenvolvendo um EA de negociação do zero (Parte 13): Times And Trade (II) Desenvolvendo um EA de negociação do zero (Parte 13): Times And Trade (II)
          Construa um sistema de Times & Trade para analisar o mercado. Esta é a segunda parte. No artigo anterior Times & Trade ( I ) apresentei um sistema alternativo para montar um gráfico de forma a você ter um indicador que lhe permitisse interpretar os negócios que foram executados no mercado de forma o mais rápido possível.
          Gráficos na biblioteca DoEasy (Parte 93): preparando a funcionalidade para criar objetos gráficos compostos Gráficos na biblioteca DoEasy (Parte 93): preparando a funcionalidade para criar objetos gráficos compostos
          Neste artigo, vamos começar a desenvolver a funcionalidade para a criação de objetos gráficos compostos. Nossa biblioteca terá suporte para a criação de objetos gráficos compostos complexos, sendo que tais objetos podem ter qualquer hierarquia de relações. Prepararemos todas as classes necessárias para a posterior geração de tais objetos.
          Desenvolvendo um EA de negociação do zero (Parte 14): Volume at Price (II) Desenvolvendo um EA de negociação do zero (Parte 14): Volume at Price (II)
          Aqui vamos adicionar recursos diversos no nosso EA. Este artigo vai ser bastante interessante, podendo direcionar você a novas ideias e métodos de apresentar informações e ao mesmo tempo corrigir pequenas falhas nos seus projetos.
          Gráficos na biblioteca DoEasy (Parte 94): objetos gráficos compostos, movimentação e eliminação Gráficos na biblioteca DoEasy (Parte 94): objetos gráficos compostos, movimentação e eliminação
          Neste artigo vamos começar a desenvolver os diversos eventos de um objeto gráfico composto. Analisaremos em parte a movimentação e a eliminação de um objeto gráfico composto. Hoje, estaremos, sobretudo, refinando o que foi criado no último artigo.