Características dos Experts Advisors
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
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso