English Русский 中文 Español Deutsch 日本語
Características dos Experts Advisors

Características dos Experts Advisors

MetaTrader 4Exemplos | 13 abril 2016, 17:00
1 265 0
MetaQuotes
MetaQuotes


  • Antes de abrir uma posição, você deve verificar se existe dinheiro disponível na conta. Se não existir dinheiro suficiente na conta, a operação de abertura da posição não será bem sucedida. O valor da "FreeMargin" não deve ser menor do que 1000 apenas durante os testes, porque o preço de um lote é 1000 durante os testes.

    if(AccountFreeMargin() < 1000) return(0);    // dinheiro insuficiente
  • Você pode acessar os dados do histórico, usando os arrays predefinidos: Time, Open, Low, High, Close, Volume. Devido a situações do histórico, o índice nesses arrays aumenta partindo do fim ao início. Isso significa que os dados mais recentes tem índice 0. O índice 1 indica dados deslocados no período anterior, o índice 2 significa que os dados deslocaram dois períodos anteriores, 3 são três períodos anteriores, etc.

    // Se "Close" na barra anterior é menor do que 
    // "Close" na barra anterior
    if(Close[1] < Close[2]) return(0);
    
  • Também é possível ter o acesso aos dados históricos usando outros intervalos de tempo e até mesmo utilizando outros pares de moedas. Para obter esses dados, é necessário a definição de um array unidimensional primeiramente e execução de operação de cópia usando a função "ArrayCopySeries". Lembre-se que, ao chamar a função é possível transferir um menor número de parâmetros e não determinar os parâmetros padrões.

    double eur_close_m1[];
    int number_copied = ArrayCopySeries(eur_close_m1, MODE_CLOSE, "EURUSD", PERIOD_M1);
    
  • No processo de escrever um expert advisor, bem como qualquer outro software, às vezes é necessário obter algumas informações de depuração adicional. a linguagem MQL4 fornece vários métodos para obter tais informações.

    • A função "Alert" exibe uma caixa de diálogo com alguns dados definidos pelo usuário.

      Alert("FreeMargin grows to ", AccountFreeMargin(), "!");
    • A função "Comment" exibe dados definidos pelo usuário no canto superior esquerdo do gráfico. A sequência de caracteres "\n" é usada para iniciar uma nova linha.

      Comment("FreeMargin is ", AccountFreeMargin(), ".");
    • A função "Print" salva os dados definidos pelo usuário no log do sistema.

      Print("FreeMargin is ", AccountFreeMargin(), ".");
  • Para obter as informações sobre erros no programa, a função "GetLastError" é muito útil. Por exemplo, uma operação com uma ordem sempre retorna o número do tick. Se o número do tick é igual a 0 (alguns erros ocorreram no processo ao realizar a operação), é necessário chamar a função "GetLastError" para obter informações adicionais sobre o erro:

    int iTickNum = 0;
    int iLastError = 0;
    ...
    iTickNum = OrderSet (OP_BUY, g_Lots, Ask, 3, 0, Ask + g_TakeProfit * g_Points, Red);
    if (iTickNum <= 0) 
       {
         iLastError = GetLastError();
         if (iLastError != ERROR_SUCCESS) Alert("Some Message");
       }
    

    Você deve se lembrar que chamar a função "GetLastError" exibe o código do último erro e redefine seu valor. É por isso que ao chamar esta função, mais uma vez uma linha sempre retornará o valor 0

  • Como definir o inicio de uma nova barra? (Pode ser necessário descobrir que a barra anterior acaba de ser finalizada.) Existem vários métodos para fazê-lo.


    O primeiro método é baseado na verificação do número de barras:

    int prevbars = 0;
    ...
    if(prevbars == Bars) return(0);
    prevbars = Bars;
    ...
    

    Este método pode não funcionar durante o carregamento do histórico. Ou seja, o número de barras é alterado enquanto a "anterior" ainda não foi concluída. Neste caso, você pode fazer uma verificação mais complicada pela introdução de uma verificação de diferença entre os valores iguais.

    O método seguinte baseia-se no fato de que valor "volume" é gerado em função do número de ticks que têm vindo para cada barra e o primeiro tick significa que o valor de "volume" de uma nova barra equivale a 1:

    if( Volume > 1) return(0);
    ...
    

    Este método pode não funcionar quando existem muitas entradas de ticks de preço. A questão é que ticks de preços recebidos são processados num segmento separado. E se esta discussão é ocupada com a próxima chegada do tick, este novo tick de entrada não é processado para evitar sobrecarrega do processador! Neste caso, você também pode fazer a verificação mais complicada, salvando o valor anterior "Volume".

    O terceiro método baseia-se no tempo em que uma barra é aberta:

    datetime prevtime=0;
    ...
    if(prevtime == Time[0]) return(0);
    prevtime = Time[0];
    ...
    

    É o método mais confiável. Ele funciona em todos os casos.

  • Um exemplo de trabalho com um arquivo do tipo "CSV":

    int h1;
    h1 = FileOpen("my_data.csv", MODE_CSV | MODE_WRITE, ";");
    if(h1 < 0)
      {
       Print("Unable to open file my_data.csv");
       return(false);
      }
    FileWrite(h1, High[1], Low[1], Close[1], Volume[1]);  
    FileClose(h1);
    

    Algumas explicações do código. O arquivo de formato "CSV" é aberto pela primeira vez. Caso ocorra um erro ao abrir o arquivo, o programa é encerrado. No caso da abertura do arquivo com sucesso, o seu conteúdo fica livre, os dados são salvos no arquivo e o arquivo é fechado. Se você precisa manter o conteúdo do arquivo aberto, você deve usar o modo de abertura MODE_READ:

    int h1;
    h1 = FileOpen("my_data.csv", MODE_CSV | MODE_WRITE | MODE_READ, ";");
    if(h1 < 0)
      {
       Print("Unable to open file my_data.csv");
       return(false);
      }
    FileSeek(h1, 0, SEEK_END);
    FileWrite(h1, High[1], Low[1], Close[1], Volume[1]);  
    FileClose(h1);
    

    Neste exemplo, os dados são adicionados no fim do arquivo. Para fazer isso, usamos a função "FileSeek" logo depois da abertura.

Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/1494

Características do Desenvolvimento de Indicadores Personalizados Características do Desenvolvimento de Indicadores Personalizados
O Desenvolvimento de Indicadores Personalizados no sistema de negociação MetaTrader tem uma série de características.
Indicador Rope por Erik Naymanf Indicador Rope por Erik Naymanf
O artigo revela como o indicador "Rope" foi criado com base na "The Small Encyclopedia of Trader" (Pequena Enciclopédia do Trader), por Erik L. Nayman. Este indicador mostra a direção da tendência, usando cálculos dos valores das tendências de alta e de baixa durante um período de tempo determinado. O artigo também conta com os princípios do desenvolvimento e cálculos do indicador, bem como exemplos do código. Outros temas abordados incluem o desenvolvimento de um Expert Advisor com base no indicador, e também, a otimização dos parâmetros externos.
Testador de Estratégias: Modos de Modelagem Durante o Teste Testador de Estratégias: Modos de Modelagem Durante o Teste
Muitos programas de análise técnica permitem testar estratégias de negociação sobre os dados do histórico. Na maioria dos casos, o teste é realizado em dados já concluídos, sem qualquer tentativa de modelar as tendências dentro de uma barra de preço, pode ser feito rapidamente, mas não suficientemente preciso.
Usando Layouts e Containers para Controles da Interface Gráfica do Usuário (GUI): A Classe CGrid Usando Layouts e Containers para Controles da Interface Gráfica do Usuário (GUI): A Classe CGrid
Este artigo apresenta um método alternativo de criação da Interface Gráfica do Usuário (GUI) com base em layouts e containers, usando um gerenciador de layout - a classe CGrid. A classe CGrid é um comando auxiliar, atua como um container para outros containers e faz o controle usando um layout de grade.