'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
Download Download MetaTrader 5
0
7 62 1 SAMUEL OLOWOYO
Introdução Este artigo é destinado a iniciantes que desejam aprender como escrever Consultores Especialistas simples na nova linguagem MQL5. Nós começaremos primeiro definindo o que queremos que o nosso CE Consultor Especialista! faça" e descriç#o ent#o passaremos para como nós queremos que o CE o faça.
1. Estratégia de negociação $ que o nosso CE far%& Ele ir% monitorar um indicador particular e" quando uma certa condiç#o for alcançada ou certas condiç'es foram alcançadas!" ele ir% colocar uma negociaç#o tanto uma posiç#o curta(vendida ou longa(comprada!" dependendo da condiç#o presente que foi alcançada. $ mencionado acima é c)amado de estratégia de negociaç#o. *ntes que voc+ possa escrever um CE" voc+ precisa primeiro desenvolver a estratégia que voc+ deseja automati,ar no CE. Ent#o" neste caso" dei-enos modificar a afirmaç#o acima de forma forma que ela reflita reflita a estratégia estratégia que nós queremos queremos desenvolver desenvolver no CE. Nós utili,aremos um indicador c)amado média móvel com um per/odo de 0 voc+ pode escol)er qualquer per/odo" mas para os propósitos da nossa estratégia" nós usaremos 0!. Quere Queremos mos que que o nosso nosso CE ofere ofereça ça uma uma negoc negociaç iaç#o #o longa longa comp compra! ra! quando a média móvel0 para o propósito neste assunto" eu irei me referir a ela como MM0! estiver aumentando e o preço estiver acima dela" e oferecer% uma negociaç#o curta venda! quando a MM0 estiver diminuindo e o preço estiver a1ai-o dela. 2am1ém utili,aremos utili,aremos outro outro indicado indicadorr c)amado c)amado movimento movimento direcion direcional al médio *34! com per/odo 0 tam1ém para nos ajudar a determinar se o mercado est% em tend+ncia t end+ncia ou n#o. Estamos fa,endo isso porque porque apenas queremos entrar na negociaç#o quando o mercado me rcado estiver em tend+ncia e rela-ar quando o mercado estiver variando isto é" sem tend+ncia!. ara alcançar isso" apenas ofereceremos a nossa negociaç#o comprar ou vender! quando quando as condiç'es acima forem atendidas e o valor do *34 for 1 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
maior que 66. 7e o *34 for maior do que 66 porém diminuindo" ou o *34 for menor do que 66" n#o negociaremos" mesmo que a condiç#o 8 ten)a sido atendida. 2am1ém queremos nos proteger definindo uma ordem para parar perda ou stop loss! de 9: pontos" pontos" e para o nosso nosso alvo de lucro; definirem definiremos os como o1jetivo um lucro de <:: pontos. 2am1é 2am1ém m quer querem emos os que que noss nossoo CE proc procur uree por por opor oportu tuni niddades ades de compra(venda somente quando uma nova 1arra ten)a sido formada e tam1ém queremos nos certificar que a1rimos uma posiç#o de compra" se as condiç'es de compra forem atendidas e j% n#o tivermos uma em a1erto" e a1rir uma posiç#o de venda quando as condiç'es de venda forem atendidas e j% n#o ti vermos uma em a1erto. *gora desenvolvemos desenvolve mos a nossa estratégia; estrat égia; é a )ora de começar a escrever o nosso código.
2. Escrever um Expert Advisor 2.1 Assistente do MQL5
=nicie com a e-ecuç#o do editor de linguagem do MetaQuotes 5. ressione Ctr!" ou clique no 1ot#o "ovo na 1arra do menu.
>igura gura <. =niciando ciando um nov o documento doc umento do MQL5
Na janela do instalador do MQL5" selecione consultor especialista e clique em ?ró-imo? como mostrado na figura 6&
2 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
>igura gura 6. 7elecionando um tipo de programa prog rama
Na pró-ima janela" digite o nome que voc+ quer dar ao seu CE na cai-a Nome. Neste Neste caso" caso" eu digitei M#$%irst$EA . @oc+ pode ent#o digitar o seu nome na cai-a *utor e tam1ém o endereço da sua p%gina da internet ou endereço de email na cai-a LinA se voc+ tiver um!.
>igura 9. ropriedades gerais do consultor especialista
B% que queremos ser capa,es de mudar alguns al guns dos parmetros para o nosso CE de forma a ver quais dos valores podem nos fornecer mel)or resultado" nós iremos adicion%los clicando no 1ot#o ?*dicionar?.
3 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
>igura D. Configurando os parmetros de entrada do CE
Em nosso CE" queremos ser capa,es de e-perimentar com as nossas configuraç'es de ordem do tipo parar perda" o1ter lucro" per/odo *34 e per/odo de média móvel" ent#o iremos definilos nesse momento. Clique duas ve,es so1 a seç#o "ome e digite o nome do parmetro" ent#o clique duas ve,es so1re o &ipo para selecionar o tipo de dados para o parmetro e clique duas ve,es so1 a seç#o 'aor inicia e digite o valor inicial para o parmetro. Quando terminar" ele deve se parecer com isto&
>igura 5. 2ipos de dados dos parmetros de entrada do CE
4 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
Como pode ser visto acima" foi selecionado o tipo de dado inteiro int! para todos os parmetros. @amos falar um pouco so1re tipos de dados. c(ar) $ tipo c)ar toma < 1te de memória 0 1its! e permite e-pressar em notaç#o 1in%ria 6F0G65H valores. $ tipo c)ar pode conter am1os valores positivos e negativos. * mudança de valores é de <60 a <6I. uc(ar ) $ tipo inteiro uc)ar tam1ém ocupa < 1te de memória" assim como o tipo de c)ar " mas ao contr%rio dele o uc)ar destinase apenas a valores positivos. $ valor m/nimo é ,ero" o valor m%-imo é 655. * primeira letra u no nome do tipo uc)ar é a a1reviaç#o para n#o assinado . s(ort) $ taman)o do tipo s)ort é de 6 1tes
ela descriç#o acima dos v%rios tipos de dados" os tipos inteiros n#o assinados n#o s#o projetados para arma,enar valores negativos" qualquer tentativa de configurar um valor negativo pode levar a consequ+ncias inesperadas. or e-emplo" se voc+ quer arma,enar valores negativos" voc+ n#o pode arma,en%los dentro dos tipos n#o assinados isto é" uc)ar" uint" us)ort" ulong!. @oltando ao ao nosso CE. $l)ando os tipos de dados" voc+ ir% concordar que devemos utili,ar os tipos de dados c)ar ou uc)ar j% que os dados que pretendemos arma,enar nestes parmetros sejam menores do que <6I ou 655 respectivamente. ara 1om gerenciamento da memória" essa é a mel)or coisa a se fa,er. Entretanto" pelo propósito desta discuss#o" iremos nos ater ao tipo int . Jma ve, que ten)a aca1ado de configurar todos os parmetros necess%rios" clique no 1ot#o %inis(ed e o editor do MetaQuotes criar% um esqueleto do código para voc+ como mostrado na pró-ima figura.
5 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
@amos separar o código em v%rias seç'es para mel)or entendimento. * parte superior ca1eçal)o! do código é onde a propriedade do CE é definida. @oc+ pode ver que aqui est#o os valores que voc+ preenc)eu durante o assistente do MQL5 na figura 9. Nesta seç#o do código" voc+ pode definir parmetros adicionais como descriç#o 1reve descriç#o do te-to do CE!" declarar constantes" incluir arquivos adicionais ou funç'es mais importantes.
Quando uma declaraç#o começa com um s/m1olo " ela é c)amada de diretiva de préprocessamento e n#o termina com um ponto e v/rgula ; outros e-emplos de diretivas de préprocessamento incluem& *de+ine &
* diretiva *de+ine é utili,ada para uma declaraç#o de constantes. O escrita na forma *de+ine identificador toAenPstring
$ que isso fa, é su1stituir cada ocorr+ncia de identificador no seu código com o valor toAenPstring .
6 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
E-emplo& #define ABC 100 #define COMPANY_NAME "MetaQuotes Software Corp."
Ele su1stituir% todas as ocorr+ncias de C$M*NPN*ME pela sequ+ncia ?MetaQuotes 7oftRare Corp.? ou ele su1stituir% todas as ocorr+ncias de *8C pelo c)ar ou inteiro! <:: em seu código. @oc+ pode ler mais so1re as diretivas de préprocessamento no manual do MQL5. @amos agora continuar com a nossa discuss#o. * segunda parte do ca1eçal)o do nosso código é a seç#o parmetros de entrada&
Nós especificamos todos os parmetros" que ser#o utili,ados em nosso CE nesta seç#o. Estes incluem todas as vari%veis que ser#o utili,adas por todas as funç'es que nós escreveremos em nosso CE. @ari%veis declaradas nesse n/vel s#o c)amadas de @ari%veis glo1ais porque elas s#o acess/veis por todas as funç'es em nosso CE que possam precisar delas. $s parmetros de entrada s#o parmetros que podem apenas ser modificados fora do nosso CE. 2am1ém podemos declarar outras vari%veis que iremos manipular no curso do nosso CE mas n#o estar#o dispon/veis fora do nosso CE nesta seç#o. * seguir est% a funç#o de iniciali,aç#o do CE. Essa é a primeira funç#o que é c)amada quando o CE é iniciado ou ane-ado a um gr%fico e é c)amado apenas uma ve,.
Essa seç#o é o mel)or local para reali,ar algumas verificaç'es importantes de forma a se certificar de que o nosso CE funciona muito 1em. odemos decidir se o gr%fico possui 1arras suficientes para o nosso CE funcionar" etc. 2am1ém é o mel)or local para pegar as cotaç'es que utili,aremos para os nossos indicadores indicadores *34 e de média móvel!.
* funç#o $n3einit é c)amada quando o CE é removido do gr%fico. ara o nosso CE" nós iremos li1erar as cotaç'es criadas para os nossos indicadores durante a iniciali,aç#o nesta seç#o.
7 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
Essa funç#o processa o evento NeR2icA " que é gerado quando uma nova cotaç#o é rece1ida para um s/m1olo. $1serve que o consultor especialista n#o pode reali,ar operaç'es de negócios se o uso dos consultores especialistas no terminal do cliente n#o estiver permitido 1ot#o ?*uto Negociaç#o?!.
>igura H. *uto Negociaç#o est% ativada
* maior parte dos nossos códigos que ir#o implementar a nossa estratégia de de negócios" desenvolvidos anteriormente" ser#o escritos nessa seç#o. *gora que j% o1servamos as v%rias seç'es do código para o nosso CE" vamos começar a adicionar mais conteSdo a este esqueleto. 2.2 ,E-/ 0E A3ME&/, 0E E"&A0A //--- input parameters input int StopLoss=30; // Stop Loss input int TakeProfit=100; // Take Profit input int ADX_Period=8; // ADX Period input int MA_Period=8; // Moving Average Period input int EA_Magic=12345; // EA Magic Number input double Adx_Min=22.0; // Minimum ADX Value input double Lot=0.1; // Lots to Trade //--- Other parameters int adxHandle; // handle for our ADX indicator int maHandle; // handle for our Moving Average indicator double plsDI[],minDI[],adxVal[]; // Dynamic arrays to hold the double maVal[]; // Dynamic array to hold the values of Moving double p_close; // Variable to store the close value of a bar int STP, TKP; // To be used for Stop Loss & Take Profit valu
Como voc+ pode ver" nós adicionamos mais parmetros. *ntes de continuarmos a discutir os novos parmetros" vamos discutir algo que voc+ pode ver agora. *s duas 1arras normais (( nos permitem inserir coment%rios em nossos códigos. Com coment%rios" somos capa,es de sa1er o que as nossas vari%veis significam" ou o que nós estamos fa,endo naquele momento de tempo em nosso código. 2am1ém fornece um mel)or entendimento do nosso código. T% duas formas 1%sicas de escrever coment%rios& // Outros parâmetros ...
Esse é um coment%rio de uma lin)a&
8 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
/* Esse é um comentário de várias linhas */
Esse é um coment%rio de v%rias lin)as. Coment%rios com v%rias lin)as começam com o par de s/m1olos (U e terminam com o par U(. $ compilador ignora todos os coment%rios quando compilando o código. Jtili,ar coment%rios de uma lin)a para os parmetros de entrada é uma 1oa forma de fa,er os usu%rios do CE entenderem o que esses parmetros significam. Nas propriedades de entrada do CE" nossos usu%rios n#o ir#o visuali,ar o parmetro em si" ao invés disso ver#o os coment%rios como mostrados a1ai-o&
>igura I. armetros de ent rada do consultor especialista
*gora de volta para o nosso código... Nós decidimos adicionar parmetros adicionais ao nosso CE. $ EA$Magic é o nSmero m%gico para todas as ordens pelo nosso CE. $ valor *34 m/nimo Adx$Min ! é declarado como um tipo de dado dou1le . Jm dou1le é utili,ado para arma,enar constantes de ponto flutuante" que contém uma parte inteira" um ponto decimal" e uma parte de fraç#o. E-emplo& double mysum = 123.5678; double b7 = 0.09876;
$ lote para negociaç#o Lote! representa o volume do instrumento financeiro que nós queremos negociar. Ent#o nós declaramos outros parmetros que utili,aremos& $ adx4ande deve ser utili,ado para arma,enar a cotaç#o do indicador *34" enquanto o ma4ande ir% arma,enar a cotaç#o para o indicador de média móvel. $s ps0I67 min0I67 adx'a6 s#o arranjos dinmicos que ir#o manter os valores de V3=" 3= e *34 principal do indicador do *34! para cada 1arra do gr%fico. $ ma'a6 é um arranjo dinmico que ir% manter os valores do indicador da média móvel para cada 1arra do gr%fico. * propósito" o que s#o arranjos dinmicosW Jm arranjo dinmico é um arranjo declarado sem uma dimens#o. Em outras palavras" nen)um valor é especificado no par de colc)etes. Jm arranjo est%tico" por outro lado" possui suas dimens'es definidas no ponto da declaraç#o. E-emplo&
9 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
double allbars[20]; // this will take 20 elements
p$cose é uma vari%vel que nós utili,aremos para arma,enar o preço de fec)amento para a 1arra que nós iremos monitorar para verificar as nossas negociaç'es de compra(venda. ,& e &8 ser#o utili,ados para arma,enar os valores de stop loss e t aAe profit em nosso CE. 2.9. ,eção de iniciai:ação do CE int OnInit() { //--- Get handle for ADX indicator adxHandle=iADX(NULL,0,ADX_Period); //--- Get the handle for Moving Average indicator maHandle=iMA(_Symbol,_Period,MA_Period,0,MODE_EMA,PRICE_CLO //--- What if handle returns Invalid Handle if(adxHandle<0 || maHandle<0) { Alert("Error Creating Handles for indicators - error: ", }
*qui nós o1temos as cotaç'es do nosso indicador utili,ando as funç'es do indicador respectivo. * cotação do indicador A0; é o1tida utili,ando a funç#o i*34. Ele toma o s/m1olo do gr%fico NJLL tam1ém significa o s/m1olo atual no gr%fico atual!" o per/odo do gr%fico(cronograma : tam1ém significa o cronograma atual no gr%fico atual!" o per/odo de média do *34 para calcular o /ndice que nós definimos antes so1 a seç#o de parmetros de entrada! como parmetros ou argumentos. int iADX( string symbol, // symbol name ENUM_TIMEFRAMES period, // period int adx_period // averaging period );
* cotação do indicador da média m? ou "@LL para o s/m1olo atual no gr%fico atual!" o gr%fico do per/odo(cronograma que pode ser o1tido utili,ando $period7 period>? " ou : para o cronograma atual no gr%fico atual!" $ per/odo médio da média móvel que nós definimos antes so1 a seç#o parmetros de entrada!" a mudança do indicador relativa ao gr%fico de preços a mudança aqui é :!" o tipo de suavi,aç#o da média móvel poderia ser qualquer um dos seguintes métodos de c%lculo da média& Média ,impesM/0E$,MA7 Média exponenciaM/0E$EMA7 Média suavi:adaM/0E$,MMA ou Média ponderada inearM/0E$LBMA !" e o preço utili,ado para o c%lculo da média aqui utili,amos o preço de fec)amento!. int iMA( string symbol, // symbol name ENUM_TIMEFRAMES period , // period int ma_period , // averaging period int ma_shift, // horizontal shift ENUM_MA_METHOD ma_method , // smoothing type ENUM_APPLIED_PRICE applied_price // type of price or handle );
10 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
or favor" leia o manual do MQL5 para o1ter mais detal)es so1re essas funç'es do indicador. Ele l)e dar% um mel)or entendimento de como utili,ar cada indicador. Nós novamente tentamos verificar a presença de qualquer erro caso a funç#o n#o ten)a devolvido a cotaç#o com sucesso" nós rece1eremos um erro =N@*L=3PT*N3LE. Jsamos a funç#o de alerta para e-i1ir o erro utili,ando a funç#o XetlastError. //--- Let us handle currency pairs with 5 or 3 digit prices in STP = StopLoss; TKP = TakeProfit; if(_Digits==5 || _Digits==3) { STP = STP*10; TKP = TKP*10; }
3ecidimos arma,enar os valores de parar perdas e o1ter lucros nas vari%veis ,& e &8 que declaramos anteriormente. or que estamos fa,endo issoW O porque os valores arma,enados nos parmetros de EN2Y*3* s#o somente para leitura" eles n#o podem ser modificados. Ent#o aqui nós queremos nos certificar de que o nosso CE funciona 1em com todos os corretores. 3igits ou 3igits! retorna o nSmero de d/gitos decimais determinando a precis#o do preço do s/m1olo do gr%fico atual. ara um gr%fico de preços com 5 d/gitos ou 9 d/gitos" nós multiplicamos am1os o parar perdas e o o1ter lucros por <:. 2.. ,E-/ 0E 0E,I"ICIALIDA-/ 0/ CE
Jma ve, que essa funç#o é utili,ada sempre que o CE é desativado ou removido de um gr%fico" nós iremos li1erar todas as cotaç'es de indicadores que foram criadas durante o processo de iniciali,aç#o aqui. Nós criamos duas cotaç'es" uma para o indicador do *34 e outra cotaç#o para o indicador da média móvel. Nós utili,aremos a funç#o =ndicatorYelease! para conseguir isso. Leva apenas um argumento a cotaç#o do indicador !. bool IndicatorRelease( int indicator_handle, // indicator handle );
* funç#o remove uma cotaç#o do indicador e li1era o 1loco de c%lculo do indicador" se ele n#o foi utili,ado. 2.5 A ,E-/ /"&IC8 0/ CE
* primeira coisa que precisamos fa,er é verificar se temos 1arras suficientes no gr%fico atual. odemos o1ter o total de 1arras no )istórico de qualquer gr%fico utili,ando a funç#o 8ars . 7#o necess%rios dois parmetros" o s/m1olo pode ser o1tido utili,ando P7m1ol ou 7m1ol!. Esses dois retornam o s/m1olo atual para o gr%fico atual no qual o nosso CE est% ane-ado! e o per/odo ou cronograma do gr%fico presente pode ser o1tido utili,ando eriod ou eriod!. Esses dois ir#o retornar o cronograma do gr%fico atual no qual o CE est% ane-ado!. 7e o total dispon/vel de 1arras é menos do que H:" nós queremos que o nosso 11 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
CE rela-e até que nós ten)amos 1arras o suficiente dispon/veis no gr%fico. * funç#o *lert e-i1e uma mensagem em uma janela separada. Ela toma quaisquer valores separados por v/rgulas como parmetros(argumentos. Neste caso" nós possu/mos apena um valor de cadeia string!. $ retorno sai da iniciali,aç#o do nosso CE. //+----------------------------------------------------------//| Expert tick function //+----------------------------------------------------------void OnTick() { // Do we have enough bars to work with if(Bars(_Symbol,_Period)<60) // if total bars is less than { Alert("We have less than 60 bars, EA will now exit!!"); return; } // We will use the static Old_Time variable to serve the bar t // At each OnTick execution we will check the current bar time // If the bar time isn't equal to the saved time, it indicates static datetime Old_Time; datetime New_Time[1]; bool IsNewBar=false;
|
// copying the last bar time to the element New_Time[0] int copied=CopyTime(_Symbol,_Period,0,1,New_Time); if(copied>0) // ok, the data has been copied successfully { if(Old_Time!=New_Time[0]) // if old time isn't equal to { IsNewBar=true; // if it isn't a first call, the new if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("We have ne Old_Time=New_Time[0]; // saving bar time } } else { Alert("Error in copying historical times data, error =", ResetLastError(); return; } //--- EA should only check for new trade if we have a new bar if(IsNewBar==false) { return; } //--- Do we have enough bars to work with int Mybars=Bars(_Symbol,_Period); if(Mybars<60) // if total bars is less than 60 bars { Alert("We have less than 60 bars, EA will now exit!!"); return; } //--- Define some MQL5 Structures we will use for our trade M qlTi ck lat es t_ pr ic e; / / T o b e u se d fo r g ett in g r ec en t/ MqlTradeRequest mrequest; // To be used for sending our tr MqlTradeResult mresult; // To be used to get our trade r MqlRates mrate[]; // To be used to store the prices, ZeroMemory(mrequest); // Initialization of mrequest str
$ consultor especialista reali,ar% operaç'es de negociaç#o no in/cio de uma nova 1arra" ent#o é necess%rio resolver o pro1lema com a nova identificaç#o da 1arra. Em outras palavras" nós queremos nos certificar de que o nosso CE n#o verifique as configuraç'es longas(curtas a cada variaç#o" nós apenas queremos que o nosso CE verifique as posiç'es longas(curtas quando )ouver uma nova 1arra. Começamos declarando uma vari%vel datetime est%tica /d$&ime" que ir% arma,enar o tempo da 1arra. 3eclaramos ela como est%tica porque nós queremos que o valor seja retido na memória até a pró-ima utili,aç#o da 12 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
funç#o $n2icA. Ent#o seremos capa,es de comparar o seu val or com a vari%vel "e$&ime tam1ém do tipo de dados datetime!" que é um arranjo de um elemento para manter o novo atual! tempo da 1arra. 2am1ém declaramos uma vari%vel de tipo de dados 1ool Is"eFar e configuramos seu valor para +ase . =sto é porque queremos que esse valor seja @EY3*3E=Y$ apenas quando nós possuirmos uma nova 1arra. Jtili,amos a funç#o Cop2ime para conseguir o tempo da 1arra atual. Ela copia o tempo da 1arra para o arranjo "e$&ime com um elemento" se ele for 1em sucedido" nós comparamos o tempo de uma nova 1arra com o tempo da 1arra anterior. 7e os tempos n#o forem iguais" isso significa que temos uma nova 1arra" e configuramos a vari%vel Is"eFar para @EY3*3E=Y$ e salvamos o valor do tempo da 1arra atual para a vari%vel /d$&ime. * vari%vel Is"eFar indica que temos uma 1arra nova. 7e for falso" terminamos a e-ecuç#o da funç#o $n2icA. 3+ uma ol)ada no código& if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("We have new bar her
Ele verifica a e-ecuç#o do modo de depuraç#o" ele ir% i mprimir uma mensagem so1re os tempos da 1arra quando em modo de depuraç#o" nós iremos consider%lo mais a frente. * pró-ima coisa que queremos fa,er aqui é verificar se nós temos 1arras suficientes para tra1al)ar. or que repetir issoW 7ó queremos nos certificar de que o nosso CE funciona corretamente. 3evese notar que enquanto a funç#o /nInit é c)amada apenas uma ve, quando o CE est% ane-ado a um gr%fico" a funç#o /n&icG é c)amada toda ve, que )% um novo ponto cotaç#o de preço!. @oc+ pode notar que fi,emos de forma diferente novamente aqui. 3ecidimos arma,enar as 1arras totais no )istórico que o1tivemos da e-press#o& int Mybars=Bars(_Symbol,_Period);
em uma nova vari%vel" M#=ars" declarada dentro da funç#o $n2icA. Esse tipo de vari%vel é uma vari%vel local" ao contr%rio da vari%vel que nós declaramos na seç#o de *YZME2Y$7 3E EN2Y*3* do nosso código. Enquanto as vari%veis" declaradas na seç#o de parmetros de entrada do nosso código" est#o dispon/veis para todas as funç'es dentro do nosso código que possam precisar delas" vari%veis declaradas dentro de uma Snica funç#o s#o limitadas e dispon/veis para aquela funç#o somente. Ela n#o pode ser utili,ada fora daquela funç#o. * seguir" nós declaramos algumas vari%veis do tipo de estrutura do MQL5 que ser#o utili,adas nessa seç#o do nosso CE. $ MQL5 possui um nSmero grande de estruturas integradas que torna as coisas 1em f%ceis para os desenvolvedores do CE. @amos fa,er as estruturas uma após a outra. MH&icG
Essa é uma estrutura utili,ada para arma,enar os preços mais recentes de s/m1olos. struct MqlTick { datetime time; // Hora da última atualização dos preços double bid; // preço de compra (Bid) atual double ask; // Preço de venda (Ask) atual double last; // Preço da última negociação (Last) ulong volume; // Volume para o último preço atual };
Qualquer vari%vel declarada como sendo do tipo MH&icG pode ser facilmente utili,ada para o1ter os valores atuais de 'enda >AsG?7 Compra >Fid?7 Itima 13 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
>Last? e'oume uma ve, que voc+ c)ama a funç#o ,#m=oIn+o&icG>? . Ent#o nós declaramos atest$price como do tipo MH&icG de forma que pudéssemos utili,%la para conseguir os preços de venda *sA! e compra 8id!. MH&radeeHuest
Esta estrutura é utili,ada para reali,ar todos os pedidos de negociaç#o para uma operaç#o de negociaç#o. Ele contém" em sua estrutura" todos os campos necess%rios para reali,ar um acordo de negociaç#o. struct MqlTrade Request { ENUM_TRADE_REQUEST_ACTIONS action; // Trade operation type ulong magic; // Expert Advisor ID (magic number) ulong order; // Order ticket string symbol; // Trade symbol double volume; // Requested volume for a deal in lots double price; // Price double stoplimit; // StopLimit level of the order double sl; // Stop Loss level of the order double tp; // Take Profit level of the order ulong deviation; // Maximal possible deviation from the requested price ENUM_ORDER_TYPE type; // Order type ENUM_ORDER_TYPE_FILLING type_filling; // Order execution type ENUM_ORDER_TYPE_TIME type_time; // Order execution time datetime expiration; // Order expiration time (for the orders of ORDER_TIME_SPECIFIED type) string comment; // Order comment };
Qualquer vari%vel declarada como do tipo Mql2radeYequest pode ser utili,ada para enviar pedidos para nossas operaç'es de negociaç#o. *qui nós declaramos o mreHuest como do tipo Mql2radeYequest. MH&radeesut
$ resultado de qualquer operaç#o de negociaç#o é retornado como uma estrutura especial prédefinida do tipo Mql2radeYesult. Qualquer vari%vel declarada como do tipo Mql2radeYesult ser% capa, de acessar os resultados do pedido de negociaç#o. struct MqlTrade Result { uint retcode; // Operation return code ulong deal; // Deal ticket, if it is performed ulong order; // Order ticket, if it is placed double volume; // Deal volume, confirmed by broker double price; // Deal price, confirmed by broker double bid; // Current Bid price double ask; // Current Ask price string comment; // Broker comment to operation (by default it is filled by the operation description) };
*qui nós declaramos mresut como sendo do tipo Mql2radeYesult. MHates
$ preço a1erto" fec)ado" alto" 1ai-o!" a )ora" os volumes de cada 1arra e a distri1uiç#o de um s/m1olo s#o arma,enados nessa estrutura. Qualquer arranjo declarado como sendo do tipo MHates pode ser utili,ado para arma,enar preço" volumes e )istórico de diferenças spread! de um s/m1olo. struct MqlRates { datetime time; // Period start time double open; // Open price
14 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
double high; // The highest price of the period double low; // The lowest price of the period double close; // Close price long tick_volume; // Tick volume int spread; // Spread long real_volume; // Trade volume };
*qui nós declaramos um arranjo mrate6 que ir% ser utili,ado para arma,enar essas informaç'es. /* Let's make sure our arrays values for the Rates, ADX Valu is store serially similar to the timeseries array */ // // // // //
the rates arrays ArraySetAsSeries(mrate,true); the ADX DI+values array ArraySetAsSeries(plsDI,true); the ADX DI-values array ArraySetAsSeries(minDI,true); the ADX values arrays ArraySetAsSeries(adxVal,true); the MA-8 values arrays ArraySetAsSeries(maVal,true);
Em seguida nós decidimos configurar todos os arranjos que nós utili,aremos para arma,enar os detal)es das 1arras como série. =sso é para nos certificar de que os valores que ser#o copiados para os arranjos ser#o inde-ados como a timeseries" isto é" :" <" 6" 9" para corresponder com o /ndice das 1arras. Ent#o nós utili,amos a funç#o *rra7et*s7eries!. bool ArraySetAsSeries( void array[], // array by reference bool set // true denotes reverse order of indexing );
3evese notar que isso tam1ém pode ser feito uma ve, na seç#o de iniciali,aç#o do nosso código. No entanto" eu decidi mostrar isso nesse momento para o 1em da nossa e-plicaç#o. //--- Get the last price quote using the MQL5 MqlTick Structur if(!SymbolInfoTick(_Symbol,latest_price)) { Alert("Error getting the latest price quote - error:",Ge return; }
*gora nós utili,amos a funç#o 7m1ol=nfo2icA para o1ter a cotaç#o de preço mais recente. Essa estrutura toma dois argumentos [ s/m1olo do gr%fico e a vari%vel de estrutura MH&icG atest$price !. Novamente" se )ouver erros" nós o reportamos. //--- Get the details of the latest 3 bars if(CopyRates(_Symbol,_Period,0,3,mrate)<0) { Alert("Error copying rates/history data - error:",GetLas return; }
Em seguida" nós copiamos a informaç#o so1re as tr+s Sltimas 1arras em noso arranjo do tipo Mqlrates utili,ando a funç#o CopYates . * funç#o CopYates é utili,ada para conseguir dados de )istórico da estrutura do MHates de um per/odo(s/m1olo em quantidade espec/fica dentro do arranjo do tipo MqlYates. int CopyRates(
15 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
string symbol_name, // symbol name ENUM_TIMEFRAMES timeframe, // period int start_pos, // start position int count, // data count to copy MqlRates rates_array[] // target array to copy );
$ nome do s/m1olo é o1tido utili,ando PsEm1olN " o per/odo(cronograma atual é o1tido utili,ando Pperiod . ara a posiç#o de in/cio" nós começaremos da 1arra atual" =arra J e nós contaremos apenas tr+s 1arras" =arras J7 17 e 2. $ resultado ser% arma,enado em nosso arranjo" mrate6. $ arranjo mrate6 agora contém todas as informaç'es de preço" tempo" volumes e distri1uiç#o para as 1arras :" < e 6. 3essa forma para conseguir detal)es de qualquer 1arra" nós utili,aremos o seguinte& mrate[bar_number].bar_property
or e-emplo" nós podemos ter a seguinte informaç#o em cada 1arra. mrate[1].time // Bar 1 Start time mrate[1].open // Bar 1 Open price mrate[0].high // Bar 0 (current bar) high price, etc
Em seguida nós copiamos todos os valores indicadores nos arranjos dinmicos que nós declaramos utili,ando a funç#o Cop8uffer. int CopyBuffer( int indicator_handle, // indicator handle int buffer_num, // indicator buffer number int start_pos, // start position int count, // amount to copy double buffer[] // target array to copy );
* cotaç#o do indicador é a cotaç#o que nós criamos na seç#o /nInit. Quanto a nSmeros de amortecimento" o indicador *34 possui tr+s amortecimentos& : M*=NPL=NE" < LJ73=PL=NE" 6 M=NJ73=PL=NE. $ indicador da média móvel possui apenas um
16 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
{ Alert("Error copying ADX indicator Buffers - error:",Get return; } if(CopyBuffer(maHandle,0,0,3,maVal)<0) { Alert("Error copying Moving Average indicator buffer - e return; }
Nesse momento" queremos verificar se nós j% possu/mos uma posiç#o de compra ou venda a1erta" em outras palavras" nós queremos nos certificar de que nós possu/mos @MA negociaç#o de compra ou venda a1erta de cada ve,. Nós n#o queremos a1rir uma nova compra se nós j% possu/mos uma" e nós n#o queremos a1rir uma nova venda se nós j% a1rimos uma. ara alcançar isso primeiramente declaramos dois tipos de dados 1ool vari%vei s Fu#$opened e ,e$opened ! que manter#o um valor EAL se j% possuirmos uma posiç#o a1erta tanto para compra ou venda. //--- we have no errors, so continue //--- Do we have positions opened already? bool Buy_opened=false; // variable to hold the result of bool Sell_opened=false; // variable to hold the result of if (PositionSelect(_Symbol) ==true) // we have an opened { if (PositionGetInteger(POSITION_TYPE) == POSITION_TYP { Buy_opened = true; //It is a Buy } else if(PositionGetInteger(POSITION_TYPE) == POSITION { Sell_opened = true; // It is a Sell } }
Nós usamos a funç#o de negociaç#o osition,eect para sa1er se possu/mos uma posiç#o a1erta. Essa funç#o retorna @EY3*3E=Y* se j% possu/mos uma posiç#o a1erta e >*L7* se n#o possu/mos nen)uma. bool PositionSelect( string symbol );
// Symbol name
Ela toma" como o maior argumento(parmetro" o s/m1olo par de moedas! que nós queremos verificar. *qui nós utili,amos Psm1ol porque estamos verificando o s/m1olo atual par de moedas!. 7e a e-press#o voltar @EY3*3E=Y* ent#o queremos verificar se a posiç#o a1erta é uma compra ou uma venda. Nós utili,amos a funç#o ositionXet=nteger para isso. Ela nos d% o tipo de posiç#o a1erta quando nós utili,amos ela com o modificador/,I&I/"$&KE. Ela retorna o osition tpe identifier que pode tanto ser/,I&I/"$&KE$F@K ou /,I&I/"$&KE$,ELL long PositionGetInteger( ENUM_POSITION_PROPERTY );
property_id
// Property identi
Em nosso caso" a utili,amos para determinar qual posiç#o j% a1rimos. 7e for uma venda" arma,enamos um valor 'E0A0EI/ em ,e$opened e se for uma compra" arma,enamos um valor 'E0A0EI/ em Fu#$opened. 7eremos capa,es de utili,ar essas duas vari%veis posteriormente quando verificarmos as condiç'es de compra e venda posteriormente em nosso código. *gora é )ora de arma,enar o preço de fec)amento para a 1arra que utili,aremos para a nossa configuraç#o de compra(venda. Lem1rese que 17 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
declaramos uma vari%vel para i sso anteriormente // Copy the bar close price for the previous bar prior to the p_close=mrate[1].close;
// bar 1 close price
2endo feito isso" iremos agora proceder para o pró-imo passo. /* 1. Check for a long/Buy Setup : MA-8 increasing upwards, previous price close above it, ADX > 22, +DI > -DI */ //--- Declare bool type bool Buy_Condition_1 bool Buy_Condition_2 bool Buy_Condition_3 bool Buy_Condition_4
variables to hold our Buy Conditions = (maVal[0]>maVal[1]) && (maVal[1]>maV = (p_close > maVal[1]); // pre = (adxVal[0]>Adx_Min); // Cur = (plsDI[0]>minDI[0]); // +DI
//--- Putting all together if(Buy_Condition_1 && Buy_Condition_2) { if(Buy_Condition_3 && Buy_Condition_4) { // any opened Buy position? if (Buy_opened) { Alert("We already have a Buy Position!!!"); return; // Don't open a new Buy Position } mrequest.action = TRADE_ACTION_DEAL; mrequest.price = NormalizeDouble(latest_price.ask, _Di mrequest.sl = NormalizeDouble(latest_price.ask - STP* mrequest.tp = NormalizeDouble(latest_price.ask + TKP* mrequest.symbol = _Symbol; mrequest.volume = Lot; mrequest.magic = EA_Magic; mrequest.type = ORDER_TYPE_BUY; mrequest.type_filling = ORDER_FILLING_FOK; mrequest.deviation=100; //--- send order OrderSend(mrequest,mresult);
*gora é )ora de iniciar a verificaç#o para uma oportunidade de compra. @amos organi,ar a e-press#o acima conforme ela representa a estratégia que nós projetamos anteriormente. Nós estamos declarando uma vari%vel do tipo =oo para cada uma de nossas condiç'es que devem ser atendidas antes que uma ordem possa ser feito. Jma vari%vel do tipo 1oll pode apenas conter 'E0A0EI/ ou %AL,/. Ent#o" a nossa estratégia de compra foi dividida em quatro condiç'es. 7e qualquer uma das condiç'es for atendida ou satisfeita" ent#o um valor de 'E0A0EI/ é arma,enado em nossa vari%vel do tipo 1ool" de modo contr%rio" um valor de %AL,/ ser% arma,enado. @amos ol)ar pra elas mais uma ve,. bool Buy_Condition_1 = (maVal[0]>maVal[1]) && (maVal[1]>maVal[
*qui nós estamos ol)ando para os valores MA nas =arras J7 1 e 2. 7e o valor de M*0 na 1arra atual for maior do que seu valor na 1arra Farra 1 anterior e tam1ém o valor de MA na =arra 1 for maior do que sei valor na =arra 2" significa que o MA est% crescendo para cima . =sso satisfa, uma das nossas condiç'es para uma configuraç#o de compra. bool Buy_Condition_2 = (p_close > maVal[1]);
Essa e-press#o est% verificando para ver se o preço de fec)amento da =arra 1 é maior do que o valor de MA no mesmo per/odo per/odo da 1arra!. 7e o preço for maior" ent#o a nossa segunda condiç#o tam1ém foi satisfeita" e nós podemos verificar as outras condiç'es. No entanto" se as duas condiç'es que
18 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
aca1amos de considerar n#o foram atendidas" ent#o n#o )% necessidade de verificar outras condiç'es. O por isso que decidimos incluir as pró-imas e-press'es dentro dessas duas condiç'es iniciais e-press'es!. bool Buy_Condition_3 = (adxVal[0]>Adx_Min);
*gora queremos verificar se o valor atual de *34 valor de *34 na 1arra :! é maior do que o valor de *34 m%-imo declarado nos parmetros de entrada. 7e essa e-press#o for verdadeira" isto é" o valor atual de *34 é maior do que o valor m/nimo necess%rio; nós tam1ém queremos nos certificar de que o valor pus0I é maior do que o valor minus0I . =sso é o que alcançamos na pró-ima e-press#o. bool Buy_Condition_4 = (plsDI[0]>minDI[0]);
7e todas essas condiç'es forem atendidas" isto é" se eles ret ornam verdadeiras" ent#o nós queremos nos certificar de que nós n#o vamos a1rir uma nova posiç#o de compra se nós j% possu/mos uma. O )ora de verificar o valor da vari%vel 8uPopened que declaramos anteriormente em nosso código. // any opened Buy position? if (Buy_opened) { Alert("We already have a Buy Position!!!"); return; // Don't open a new Buy Position }
7e 8uPopened for verdadeira" nós n#o queremos a1rir outra posiç#o de compra" ent#o" e-i1imos um alerta para nos informar e a/ retornar de forma que o nosso CE ir% agora esperar pela pró-ima variaç#o. No entanto" se 8uPopened é >*L7$" ent#o preparamos os nossos registros utili,ando a vari%vel do tipo Mql2radeYequest mreHuest ! que declaramos anteriormente para enviar a nossa ordem. * aç#o aqui" que é o tipo de operaç#o de negociaç#o" é &A0E$AC&I/"$0EAL porque nós estamos fa,endo uma ordem de negociaç#o para uma e-ecuç#o imediata. 7e estamos modificando uma ordem" ent#o utili,aremos&A0E$AC&I/"$M/0I%K . ara deletar uma ordem vamos utili,ar &A0E$AC&I/"$EM/'E. Nós utili,amos o nosso tipo Mql2icA atest$price para conseguir o preço preço de venda mais atual. $ preço da ordem stop loss é o1tido ao su1trair nosso ,topLoss em pontos do reço de @enda enquanto o preço da ordem o1ter lucro s é o1tido ao adicionar nosso &aGero+it em pontos ao reço de @enda. @oc+ tam1ém o1servar% que utili,amos a funç#o Normali,e3ou1le para os valores de preço de venda" valores de parar perdas e o1ter lucros" é uma 1oa pr%tica sempre normali,ar esses preços para o nSmero de d/gitos do par de moedas de cm1io antes de envi%los para o servidor de comerciali,aç#o. $ sEm1ol é o atual s/m1olo P7m1ol ou 7m1ol!!. $ tipo de ordem é o tipo de ordem que nós estamos colocando" aqui nós estamos colocando uma ordem de compra /0E$&KE$F@K . ara uma ordem de venda" ser% /0E$&KE$,ELL. * ordem tEpePfilling é o tipo de e-ecuç#o da ordem; /0E$%ILLI"$%/8 significa que o acordo pode ser e-ecutado e-clusivamente com um volume espec/fico no preço igual ou mel)or do que o preço especificado pela ordem. 7e n#o )ouver volume de ordens suficiente no s/m1olo ordem" a ordem n#o ser% e-ecutada. * funç#o $rder7end! toma dois argumentos" a vari%vel tipo Mql2radeYequest e a vari%vel tipo Mql2radeYesult. bool OrderSend( MqlTradeRequest&
19 d 36
request
// query structure
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
MqlTradeResult& );
https://www.mql5.com/pt/articles/100
result
// structure of the answer
Como voc+ pode ver" nós utili,amos o nosso tipo vari%vel Mql2radeYequest e a vari%vel tipo Mql2radeYesult ao colocar a nossa ordem utili,ando $rder7end. // get the result code if(mresult.retcode==10009 || mresult.retcode==10008) { Alert("A Buy order has been successfully placed wi } else { Alert("The Buy order request could not be complete ResetLastError(); return; }
2endo enviado a nossa ordem" utili,aremos a vari%vel tipo Mql2radeYesult para verificar o resultado da nossa ordem. 7e a nossa ordem é e-ecutada com sucesso" queremos ser informados" se n#o" nós queremos sa1er tam1ém. Com o tipo MH&radeesut vari%vel mresut podemos acessar o código de retorno da operaç#o e tam1ém o nSmero do ticAet da ordem se a ordem foi colocada. $ código de retorno 1JJJN mostra que a ordem $rder7end foi completada com sucesso" enquanto que 1JJJ mostra que a nossa ordem foi colocada. O por isso que verificamos para qualquer um desses dois códigos de retorno. 7e possu/mos qualquer um deles" temos certe,a de que a nossa ordem foi completa ou foi feita. ara verificar se )% uma oportunidade de venda" verificamos o oposto do que fi,emos para oportunidade de compra e-ceto o nosso *34 que deve ser maior do que o valor minimo especificado. /* 2. Check for a Short/Sell Setup : MA-8 decreasing downward previous price close below it, ADX > 22, -DI > +DI */ //--- Declare bool type variables to hold our Sell Conditions bool Sell_Condition_1 = (maVal[0]Adx_Min); bool Sell_Condition_4 = (plsDI[0]
*ssim" como fi,emos na seç#o de compra" estamos declarando uma vari%vel do
20 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
tipo =oo para cada uma de nossas condiç'es que devem ser atendidas antes que uma ordem possa ser colocada. Jma vari%vel do tipo 1oll pode apenas conter 'E0A0EI/ ou %AL,/. Ent#o a nossa estratégia de venda foi que1rada em quatro condiç'es. 7e qualquer uma das condiç'es for atendida ou satisfeita" ent#o um valor de 'E0A0EI/ é arma,enado em nossa vari%vel do tipo 1ool" de modo contr%rio" um valor de %AL,/ ser% arma,enado. @amos ol)ar para elas uma a uma como nós fi,emos para a seç#o de compra. bool Sell_Condition_1 = (maVal[0]
*qui nós estamos ol)ando para os valores MA nas =arras J7 1 e 2. 7e o valor de M*0 na 1arra atual for menor do que seu valor na =arra 1 anterior e tam1ém o valor de MA na =arra 1 for menor do que seu valor na Farra 2" significa que o MA est% decrescendo para =aixo. =sso satisfa, uma das nossas condiç'es para uma configuraç#o de venda. bool Sell_Condition_2 = (p_close
Essa e-press#o est% verificando para ver se o preço de fec)amento da 1arra < é menor do que o valor de M*0 no mesmo per/odo per/odo da 1arra Adx_Min);
*gora queremos verificar se o valor atual de *34 valor de *34 na 1arra :! é maior do que o valor de *34 m%-imo declarado nos parmetros de entrada. 7e essa e-press#o for verdadeira" isto é" o valor atual de *34 é maior do que o valor m/nimo necess%rio; tam1ém queremos nos certificar de que o valor Minus0I é maior do que o valor pus0I . =sso é o que alcançamos na pró-ima e-press#o. bool Sell_Condition_4 = (plsDI[0]
7e todas essas condiç'es forem atendidas" isto é" se elas ret ornam verdadeiras" ent#o nós queremos nos certificar de que n#o vamos a1rir uma nova posiç#o de compra se nós j% possu/mos uma. O )ora de verificar o valor da vari%vel 8uPopened que declaramos anteriormente em nosso código. // any opened Sell position? if (Sell_opened) { Alert("We already have a Sell position!!!"); return; // Don't open a new Sell Position }
7e 7ellPopened for verdadeira" nós n#o queremos a1rir outra posiç#o de venda" ent#o" e-i1imos um alerta para nos informar e a/ retornar de forma que o nosso CE ir% agora esperar pela pró-ima variaç#o. No entanto" se 7ellPopened for >*L7$" ent#o configuramos a nossa ordem de negociaç#o de venda como fi,emos para a ordem de compra. * maior diferença aqui é a forma como calculamos o nosso preço stop loss e o preço taAe profit. 2am1ém j% que estamos vendendo" nós vendemos no preço de cotaç#o; é por isso que utili,amos o nosso tipo MH&icG vari%vel atest$price para conseguir o preço de cotaç#o mais recente. $ outro tipo aqui" conforme e-plicado anteriormente" é $Y3EYP2EP7ELL. 2am1ém aqui" utili,amos a funç#o Normali,e3ou1le para o preço de compra" valor do stop loss parar perdas! e taAe profit o1ter lucros!" é 1oa pr%tica
21 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
sempre normali,ar estes preços ao nSmero de d/gitos do par de moedas antes de enviar para o servidor de negociaç#o. *ssim" como fi,emos com a nossa ordem de compra" precisamos tam1ém verificar se a nossa ordem de venda foi 1em sucedida ou n#o. Ent#o utili,amos a mesma e-press#o do que na nossa ordem de compra. if(mresult.retcode==10009 || mresult.retcode==10008) { Alert("A Sell order has been successfully placed w } else { Alert("The Sell order request could not be complet ResetLastError(); return; } }
9. 0epurando e testando o nosso consutor especiaista Nesse momento" precisamos testar o nosso CE pra sa1ermos se a nossa estratégia funciona ou n#o. 2am1ém é poss/vel que )aja um ou dois erros no código do nosso CE. =sso ser% desco1erto no pró-imo passo. 9.1 0epurando
3epurar o nosso código nos ajuda a ver como o nosso código se desempen)a lin)a por lin)a se nós configurarmos pontos de parada 1reaApoints!! e l% podemos notar quaisquer erros ou 1ugs no nosso código e rapidamente fa,er as correç'es necess%rias antes de utili,ar nosso código em uma negociaç#o real. *qui vamos passar pelo processo passo a passo de depurar o nosso consultor especialista" primeiramente" configurando 1reaApoints e em segundo lugar" sem 1reaApoints. ara fa,er isso" certifiquese de que voc+ n#o fec)ou o editor. rimeiramente" vamos selecionar o gr%fico que queremos utili,ar para testar o nosso CE. Na 1arra do menu do editor" clique em +erramentas e clique em /pçOes como mostrado a1ai-o&
>igura 0. Configurando opç'es de depuraç#o
Jma ve, que a janela de opç'es aparece" selecione o par de moeda" e o per/odo(cronograma para utili,ar e clique no 1ot#o $\&
22 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
*ntes de iniciarmos o depurador" vamos configurar os 1reaApoints. FreaGpoints nos permitem monitorar o comportamento(desempen)o do nosso código em certas locali,aç'es ou lin)as selecionadas. *o invés de percorrer todo o código de uma ve," o depurador para sempre que ver um 1reaApoint" esperando a sua pró-ima aç#o. Com isso" seremos capa,es de analisar o nosso código e monitorar seu comportamento conforme ele alcança cada conjunto de 1reaApoints. Nós tam1ém seremos capa,es de avaliar os valores de algumas das nossas variPveis para ver se as coisas de fato est#o da forma como foram visionadas. ara inserir um 1reaApoint" v% na lin)a em seu código na qual voc+ quer inserir o 1reaApoint. No lado da m#o esquerda" no campo cin,a perto da 1orda da lin)a do código" clique duas ve,es e voc+ ver% um pequeno 1ot#o a,ul redondo com um quadrado 1ranco dentro dele. $u alternativamente" posicione o cursor do seu mouse em qualquer lugar na lin)a do código onde voc+ quer que o 1reaApoint apareça e aperte %N . ara remover o 1reaApoint" pressione >K novamente ou clique nele duas ve,es.
>igura <:. Configurando um 1reaApoint
ara o nosso código" nós vamos configurar 1reaApoints em cinco lin)as diferentes. 23 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
Eu tam1ém identificarei eles de < a 5 para o 1em da e-plicaç#o. ara continuar" configure o 1reaApoint nas sete lin)as de código como mostrado na figura a1ai-o. $ 1reaApoint < é o que nós criamos acima.
>igura <<. C onfigurando 1reaApoints ad icionais
Jma ve, que ten)amos terminado de configurar os nossos 1reaApoints" estamos agora prontos para começar a depurar o nosso código. ara iniciar o depurador" pressione >5 ou clique no 1ot#o verde na 1arra de ferramentas do MetaEditor.
>igura <6. =niciando o depurador
* primeira coisa que o editor fa, é compilar o código" se )ouver qualquer erro no ponto" ele ir% e-i1ilo e se n#o )ouver erro" ele ir% l)e avisar que o código foi compilado com sucesso.
>igura <9. Yelatório de compilaç#o
or favor o1serve que o fato de que o código compilou com sucesso n#o significa que n#o e-istem erros no seu código. 3ependendo de como o código é escrito" podem )aver erros de e-ecuç#o. or e-emplo" se qualquer uma das nossas e-press'es n#o avalia corretamente devido a qualquer pequeno descuido" o código ir% compilar corretamente porém pode n#o e-ecutar corretamente. Muita conversa" vamos ver em aç#o...
24 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
Jma ve, que o depurador terminou de compilar o código" ele leva voc+ para o terminal de comerciali,aç#o" e ane-a o CE ao gr%fico que voc+ especificou nas configuraç'es das opç'es do MetaEditor. *o mesmo tempo" ele mostra para voc+ a seç#o de parmetros de entrada do E*. B% que n#o ainda n#o estamos ajustando nada" apenas clique no 1ot#o $\.
>igura
@oc+ vai agora ver o CE claramente no canto superior direito do gr%fico. Jma ve, que ele inicia o /n&icG>?" ele ir% parar assim que ele c)egar no nosso 1reaApoint <.
>igura <5. 3epurador p ara no primeiro 1reaApoint
@oc+ notar% uma seta verde na lin)a do código. =sso l)e di, que a lin)a de código anterior foi e-ecutada; estamos agora prontos para e-ecutar a lin)a atual. 3ei-eme fa,er algumas e-plicaç'es antes de prosseguirmos. 7e voc+ ol)ar a 1arra de ferramentas do editor" voc+ o1servar% que os tr+s 1ot'es com setas curvas que estavam anteriormente em cin,a agora est#o ativados. =sso é porque estamos agora e-ecutando o depurador. Esses 1ot'es s#o utili,ados
25 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
para percorrer o nosso código entrar" passar ou cima ou sair!
>igura
$ entrar é utili,ado para ir de um passo na e-ecuç#o do programa para o pró-imo passo" entrando em qualquer funç#o c)amada dentro daquela lin)a de código. Clique no 1ot#o ou pressione %11 para invocar o comando utili,aremos esse comando em nossa depuraç#o passo a passo para o nosso código!.
>igura
$ passar por cima" por outro lado n#o entra na c)amada funç#o dentro daquela lin)a de código. clique no 1ot#o ou pressione %1J para invocar o comando
>igura <0. Comando sair
ar e-ecutar o passo do programa que é um n/vel acima" voc+ clica nesse 1ot#o ou pressiona ,(i+t!%11. 2am1ém" na parte inferior do editor" voc+ ver% a janela da caixa de +erramentas. * a1a de depuraç#o nessa janela possui os seguintes ca1eçal)os& ArHuivo) =sso e-i1e o nome do arquivo c)amado; %unção) =sso e-i1e a funç#o presente do arquivo c)amado; Lin(a) =sso e-i1e o nSmero da lin)a de código no arquivo do qual a funç#o é c)amada; Expressão) =sso é onde voc+ pode digitar o nome de qualquer e-press#o(vari%vel que voc+ est% interessado em monitorar do nosso código; 'aor) =sso ir% e-i1ir o valor da e-press#o(vari%vel que nós digitamos na %rea de e-press#o; &ipo) =sso e-i1ir% o tipo de dados da e-press#o(vari%vel que foi monitorada.
3e volta ao processo de depuraç#o... * pró-ima coisa que queremos fa,er é agora inserir as vari%veis(e-press'es do nosso código que nós estamos interessados em monitorar. Certifiquese de apenar monitorar vari%veis(e-press'es que realmente importam para o seu código. or e-emplo" monitoraremos as seguintes& /d$&ime tempo antigo da 1arra!; "e$&imeJ6 tempo atual da 1arra!; Is"eFar 1andeira que indica a nova 1arra!; M#=ars total de 1arras no )istórico! [ $ nosso CE depende disso.
@oc+ pode adicionar outras como os valores A0; " os valores MA" etc.
26 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
ara adicionar a e-press#o(vari%vel" clique duas ve,es so1 a %rea de e-press'es ou cliquei direito so1 a %rea de e-press'es e selecione Adicionar como mostrado na figura acima. 3igite a e-press#o(vari%vel para monitorar ou o1servar.
>igura
3igite todas as vari%veis(e-press'es necess%rias...
>igura 6:. *dicionando e- press'es ou vari%veis para o1servar
7e a vari%vel n#o foi declarada ainda" seu tipo é ?identificador descon)ecido? e-ceto as vari%veis est%ticas!. *gora" vamos prosseguir...
>igura 6<. Comando entrar em aç#o
Clique no 1ot#o entrar ou pressione %11 e o1serve o que acontece. Continue pressionando esse 1ot#o ou %11 até que voc+ c)egue no 1reaApoint no 2" continue até que voc+ c)egue no 1reaApoint no como mostrado a1ai-o e 27 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
o1serve a janela de o1servaç#o de e-press'es.
>igura 66. $1 servando as e-press'es ou vari%veis
>igura 69. $1 servando as e-press'es ou vari%veis
28 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
>igura 6D. $1 servando as e-press'es ou vari%veis
Jma ve, que )% uma nova variaç#o" ela retornar% para a primeira lin)a do código na funç#o /n&icG>?. E todos os valores das nossas vari%veis(e-press'es agora ser#o reiniciados porque essa é uma nova vari%vel se qualquer um deles for declarado como uma vari%vel est%tica. Em nosso caso possu/mos uma vari%vel est%tica $ldP2ime.
>igura 65. @alores das v ari%veis no evento NeR2icA
ara revisar o processo novamente" continue pressionando a tecla %11 e continue monitorando as vari%veis na janela de o1servaç#o de e-press'es. @oc+ pode parar o depurador e ent#o remover todos os 1reaApoints. Como podemos ver" em modo de depuraç#o ele pu1lica a mensagem ?Nós 29 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
temos uma nova 1arra aqui...?.
>igura 6H. E- pert *dvisor imprime a mensagem no modo de depuraç#o
=niciando o processo de depuraç#o novamente; mas dessa ve, sem 1reaApoints. >ique o1servando a cada variaç#o e se qualquer uma das nossas condiç'es de compra(venda for satisfeita" ele oferecer% uma negociaç#o e j% que escrevemos o nosso código para nos di,er se uma ordem é feita com sucesso ou n#o" veremos um alerta.
>igura 6I. E- pert *dvisor oferece uma negoc iaç#o durante a depuraç#o
*c)o que voc+ pode dei-ar o CE E*! tra1al)ando por mais alguns minutos enquanto voc+ toma um café. Quando voc+ estiver de volta e tiver gan)ado algum din)eiro 1rincadeira!" ent#o clique no 1ot#o *Y*Y vermel)o! no MetaEditor para parar a depuraç#o.
>igura 60. arando o depurador
30 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
$ que nós fi,emos de fato aqui é ver que o nosso CE apenas procura uma operaç#o de comerciali,aç#o na a1ertura de uma nova 1arra e que o nosso CE funciona de fato. T% muito espaço para ajustes ao código do nosso CE. reciso dei-ar claro" nesse ponto" que o terminal de comerciali,aç#o deve ser conectado ] internet" caso contr%rio" a depuraç#o n#o funcionar% porque o terminal n#o é capa, de comerciali,ar. 9.2 &estando a nossa estratégia de CE
*gora nesse momento queremos testar o nosso CE utili,ando o verificador de estratégia integrado no terminal de comerciali,aç#o. ara iniciar o testador de estratégia" pressione C$N2Y$LVY ou clique no menu @isuali,ar na 1arra do menu do terminal e clique em verificador de estratégia como mostrado a1ai-o.
>igura 6H. =niciando o teste da estratégia
$ verificador verificador de estrategia! é mostrado na parte mais 1ai-a do terminal. ara voc+ ver todas as configuraç'es do verificador" é preciso e-pandir(redimensionar ele. ara fa,er isso" mova o ponteiro do seu mouse para a ponta mostrada pela seta vermel)a como mostrado a1ai-o!&
>igura 6I. Banela do verificador de estratégia
$ ponteiro do mouse muda para uma seta com ponta dupla" segure o mouse e arraste a lin)a para cima. are quando voc+ desco1rir que voc+ pode ver tudo na a1a de configuraç'es.
31 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
>igura 60. *1a de configuraç'es do verificador de estratégia
<. 7elecione o CE que voc+ quer testar. 6. 7elecione o par de moedas que voc+ quer utili,ar para o teste. 9. 7elecione um per/odo(cronograma para utili,ar para o teste. D. 7elecione o per/odo personali,ado e configure as datas em 5. 5. Configure as datas para o per/odo personali,ado a ser utili,ado no t este. H. E-ecuç#o é normal. I. 7elecione a quantidade depositada em J73 a ser utili ,ada para o teste. 0. Configure a otimi,aç#o para desa1ilitar nós n#o estamos otimi,ando agora" só queremos testar!. K. Clique nesse 1ot#o quando voc+ estiver pronto para começar. *ntes de clicarmos no 1ot#o iniciar" vamos ol)ar as outras a1as no verificador. A=a agentes
$ processador utili,ado pelo verificador para o teste. 3ependendo do tipo de processador do seu computador. $ meu é apenas um processador de um
>igura 6K. *1a agentes do verificador de estratégia
Jma ve, no agente" voc+ ver% algo similar a figura a1ai-o&
>igura 9:. * a1a agentes do verificador de estratégia durante um teste
A=a orna
O aonde todos os eventos ocorrendo durante o per/odo de teste s#o e-i1idos
32 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
>igura 9<. *1a jornal do verificador de estratégia mostrando atividades de comerciali,aç#o
A=a de entradas
*qui é onde voc+ pode especificar os parmetros de entrada para o CE.
>igura 96. *1a entradas do verificador de estratégia
7e nós estamos otimi,ando o nosso CE" ent#o nós precisaremos configurar os valores na %rea circulada. $ ,tart é o valor que voc+ quer que comece com o verificador. $ ,tep é a ta-a de incremento para o valor que voc+ selecionou" e $ ,top é o valor no qual o verificador ir% parar de incrementar o valor para aquele parmetro. No entanto" em nosso caso" n#o estamos otimi,ando o nosso CE" ent#o n#o precisaremos tocar nisso por enquanto. Jma ve, que tudo estiver pronto" podemos agora voltar a a1a de Con+iguraçOes e clicar no 1ot#o iniciar. Ent#o o verificador começa o seu tra1al)o. 2udo que voc+ precisa fa,er agora é ir e tomar outra -/cara de café" se quiser" ou" se voc+ for como eu" pode querer monitorar cada evento e" ent#o" ir para a a1a jornal. A=a grP+ico
Jma ve, que voc+ começar a ver mensagens so1re ordens sendo enviadas para a a1a jornal" voc+ pode querer voltarse para uma nova a1a c)amada grP+ico que aca1ou de ser criada. Jma ve, que voc+ mude para a a1a gr%fico" ver% o gr%fico aumentando ou diminuindo cada ve, mais conforme o caso dependendo do resultado das suas comerciali,aç'es.
>igura 99. $ resultado do g r%fico para o teste do consultor especialista
A=a resutados
33 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
Jma ve, que o teste estiver completo" voc+ ver% outra a1a c)amada resutados. Mude para a a1a resutados e voc+ ver% o resumo do teste que nós aca1amos de fa,er.
>igura 9D. * a1a dos resultados do v erificador de estratégia mostrando o resumo dos resultados do teste
@oc+ pode ver o lucro 1ruto total" lucro l/quido" comerciali,aç'es totais" comerciali,aç'es de perda total e muito mais. O muito interessante ver que temos cerca de out @,0 175J.J dentro do per/odo que foi selecionado para o nosso teste. *o menos temos um poco de lucro. 3ei-eme tornar uma coisa muito clara para voc+ aqui. @oc+ desco1rir% que as configuraç'es para os parmetros CE que voc+ v+ no verificador de estratégia é diferente das configuraç'es iniciais nos parmetros de entrada do CE. Eu aca1ei de demonstrar para voc+ que é poss/vel mudar qualquer um desses parmetros de entrada para conseguir o mel)or do seu CE. *o invés de utili,ar um per/odo de 0 cada para a média móvel e *34" eu mudei para <: para a média móvel e
>igura 95. 7alvando o resultado do teste
* janela de di%logo salvo aparecer%" digite um nome para o seu relatório se quiser" caso contr%rio dei-e o nome padr#o! e clique no 1ot#o salvar. 2odo o relatório ser% salvo no formato T2ML para voc+. ara visuali,ar o gr%fico para o teste que foi reali,ado" clique em a=rir grP+ico e voc+ ver% o gr%fico e-i1ido.
34 d 36
08/12/2015 01 19
'Guia passo a passo para iniciantes para escrever um Expert Advisor n...
https://www.mql5.com/pt/articles/100
>igura 9H. $ gr%fico mostrando o teste
ronto" escrevemos e testamos o nosso CE com sucesso e agora possu/mos um resultado para tra1al)ar. @oc+ pode agora voltar para a a1a de configuraç'es de estratégia do verificador de estratégia e testar outros cronogramas(per/odos. &are+a
Quero que voc+ condu,a o teste utili,ando diferentes pares de moedas" diferentes cronogramas" diferentes stop loss" diferentes taAe profit e veja como o CE se desempen)a. @oc+ pode até tentar a nova média móvel e os valores *34. Como eu disse anteriormente" isso é a ess+ncia do verificador de estratégia. Eu tam1ém gostaria que voc+ compartil)asse os seus resultados comigo.
Concusão Nesse guia passo a passo nós conseguimos visuali,ar as etapas 1%sicas necess%rias para escrever um consultor especialista simples 1aseado em uma estratégia de comerciali,aç#o desenvolvida. Nós tam1ém vimos como verificar o nosso CE para erros utili,ando o depurador. 2am1ém discutimos como testar o desempen)o do nosso CE utili,ando o verificador de estratégia. Com isso" conseguimos ver o poder e ro1uste, da nova linguagem MQL5. $ nosso CE ainda n#o é perfeito ou completo j% que muitos outros ajustes precisam ainda ser feitos de forma a utili,ar ele para comerciali,aç'es reais. *inda )% mais a aprender e eu quero que voc+ leia o artigo v%rias ve,es juntamente com o manual do MQL5" e tente tudo que voc+ aprendeu nesse artigo" eu posso l)e assegurar que voc+ ser% um ótimo desenvolvedor de CE em um futuro pró-imo. >eli, programaç#o. 2radu,ido do =ngl+s por MetaQuotes 7oftRare Corp. *rtigo original& )ttps&((RRR.mql5.com(en(articles(<::
3oRnload _= ArHuivos anexados ^ mPfirstPea.mq5 <<.0H \8! Aviso) 2odos os direitos a estes materiais s#o reservados a MQL5 Ltd. * cópia ou reimpress#o destes materiais" no todo
Buntese a nós ` doRnload Meta2rader 5
35 d 36
08/12/2015 01 19