|
CRIAÇÃO PASSO A PASSO DE UM "EXPERT ADVISOR" SIMPLES
Vamos criar um "Expert Advisor" que funciona com o indicador MACD e que utiliza
profit-taking, trailing stop e mecanismos de proteção.
No exemplo aqui apresentado, o trade é feito com a abertura e controle
uma única posição.
Princípios do Trade System
-
Entrada
- COMPRA ("Long"): O indicador MACD está abaixo de zero, começa a subir e
é cruzado pela linha de sinal que vai ficando abaixo do MACD.
- VENDA ("Short"): O indicador MACD está acima de zero, começa a cair e
é cruzado pela linha de sinal que vai ficando acima do MACD.
-
Saída
- COMPRA ("Long"): pela execução de um "take profit",
"trailing stop" ou quando o MACD cruza sua linha de sinal (MACD está acima de
zero, vai para baixo e é cruzado pela linha de sinal que vai ficando acima do MACD).
- VENDA ("Short"): pela execução de um "take profit",
"trailing stop" ou quando o MACD cruza sua linha de sinal (MACD está abaixo de
zero, vai para cima e é cruzado pela linha de sinal que vai ficando abaixo do MACD).
| Nota importante |
|
Para excluir mudanças insignificantas
do MACD ('hillocks' pequenos no gráfico) de nossa análise, nós introduzimos uma
medida adicional para controlar o tamanho dos 'hillocks': o tamanho do
MACD deve ser ao menos 5 unidades do preço mínimo (5*Point, que para USD/CHF = 0.0005
e para USD/JPY = 0.05).
|
PASSO 1: Criação do Expert Advisor
Aponte o mouse na seção "Expert Advisors" que está no "Navigator Window",
pressione o botão direito do mouse e selecione a opção "Create a new Expert" no menu.
O "wizard" do Expert Advisor pedirá que você preencha
determinados dados. Na janela que está aparecendo, voce deve escrever o nome ("Name")
do "Expert Advisor" - MACD Sample, autor ("Author") - indicate your name,
o link (Link) - a link to your website, nas notas (Notes) - Test example of an
MACD-based Expert Advisor. Você pode também indicar os valores default que você
deseja usar para número lotes, "Stop Loss", "Take Profit" e o "Trailing Stop".
PASSO 2: Criando a estrutura principal do programa
Para se ter uma idéia da estrutura do nosso "Expert Advisor", vamos dar uma olhada
na descrição abaixo:
- Verificação inicial
- Verificar o gráfico, número de barras no gráfico
- Verificar o valor de variáveis externas: Lots, S/L, T/P, T/S
- Ajustar as variáveis internas
- Verificando o dados da conta e de trading:
- Verificar disponibilidade de saldo na conta etc...
- É possível abrir uma posição de compra (BUY)?
abra a posição e saia
- É possível abrir uma posição de venda (SELL)?
abra a posição e saia
saindo do "Expert Advisor"...
- Controle das posições previamente abertas
- se for uma posição de compra
- ela deve ser fechada?
- o "trailing stop" deve ser alterado?
- se for uma posição de venda
- ela deve ser fechada?
- o "trailing stop" deve ser alterado?
A estrutura tornou-se relativamente simples, com 4 blocos principais.
Agora vamos gerar, passo a passo, os trechos de código para cada seção da estrutura:
-
Verificação inicial de dados
Este pedaço de código vale para praticamente todos os Expert Advisors,
necessitando apenas de poucas alterações.
If Bars<200 Then Exit; // Se o número de barras for menor que 200, então "Exit"
If TakeProfit<10 Then Exit; // Testar parâmetros errados. Nesse exemplo,
"takeprofit" não pode ser menor que 10.
-
Ajustar as vari´veis internas
No código é muito frequente a necessidade de acessar e manipular indicadores
e valores computados. Para simplificar o código e agilizar o acesso a esses dados,
eles são inicializados em variáveis internas.
MacdCurrent=iMACD(12,26,9,MODE_MAIN,0); // valor do MACD na barra corrente
MacdPrevious=iMACD(12,26,9,MODE_MAIN,1); // valor do MACD na barra anterior
SignalCurrent=iMACD(12,26,9,MODE_SIGNAL,0); // valor do sinal do MACD na barra corrente
SignalPrevious=iMACD(12,26,9,MODE_SIGNAL,1);// valor do sinal do MACD na barra anterior
MaCurrent=iMA(MATrendPeriod,MODE_EMA,0); // valor da média móvel barra corrente
MaPrevious=iMA(MATrendPeriod,MODE_EMA,1); // valor da média móvel barra anterior
Agora, ao invés de usar a notação monstruosa iMACD(12,26,9,MODE_MAIN,0), nó
pode simplificar e escrever o programa usando a variável MacdCurrent. Todas as variáveis
usadas pelo Expert Advisor precisam ser preliminarmente declaradas, de acordo
com a linguagem MetaQuotes II (MQL II). Sendo assim, nós declaramos essas variáveis
no inío do programa:
var: MacdCurrent(0), MacdPrevious(0), SignalCurrent(0), SignalPrevious(0);
var: MaCurrent(0), MaPrevious(0);
MetaQuotes Language II introduz também o conceito de parâmetros,
que podem ser inicializadas ou modificadas fora do programa, sem precisar de
modificação no código-fonte do Expert Advisor, fornecendo, assim,
maior flexibilidade. A variável MATrendPeriod é um parâmetro.
Então, nós incluímos a sua declaração no
início do programa.
defines: MATrendPeriod(56);
-
Verificando o dados da conta e de trading
Para evitar que o programa execute ordens simultâneas, vamos incluir uma vamos
introduzir a seguinte verificação:
If TotalTrades<1 then // verifica se há alguma trade, ordem aberta
{
verificar: disponibilidade de saldo na conta etc. Antes de analisar o mercado
é aconselhável verificar a situação da sua conta para
ter certeza há saldo disponível para abrir uma posição.
If FreeMargin<1000 then Exit; // se estiver sem saldo - "Exit"
É possível abrir uma posição de compra (BUY)?
Condição de entrada: MACD é menor do que zero, começa a
subir e é cruzada pela linha de sinal. Então, o código em MQL II fica
dessa forma (Note que nós estamos usando os valores do MACD que foram previamente
armazenadas nas variáveis):
If MacdCurrent<0 and MacdCurrent>SignalCurrent and
MacdPrevious<SignalPrevious and // verifica se um cruzamento existe
Abs(MacdCurrent)>(MACDOpenLevel*Point) and // se o MACD possui um mínimo 'hillock'
MaCurrent>MaPrevious then // tendência compradora ('bull')
{
SetOrder(OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,RED); // enviando a ordem de compra
Exit; // saindo
};
Acima nós mencionamos um mé todo para monitorar o tamanho de
'hillocks' no MACD. A variável MACDOpenLevel é um parâmetro que pode
ser modificado sem sem causar interferência no código do programa.
No início do programa, nós inserimos a declaração desse
parâmetro:
defines: MACDOpenLevel(3), MACDCloseLevel(2);
É possível abrir uma posição de venda (SELL)?
Condição de entrada: MACD está abaixo de zero, começa a cair
e é cruzado pela sua linha de sinal. O código correspondente segue abaixo:
If MacdCurrent>0 and MacdCurrent<SignalCurrent and
MacdPrevious>SignalPrevious and MacdCurrent>(MACDOpenLevel*Point) and
MaCurrent<MaPrevious then
{
// Enviando a ordem de venda
SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED);
Exit; // saindo
};
Exit; // sem novas posição para abrir - apenas exit
};
-
Controle das posições previamente abertas
for cnt=1 to TotalTrades
{
if OrderValue(cnt,VAL_TYPE)<=OP_SELL and // é uma posição aberta?
OrderValue(cnt,VAL_SYMBOL)=Symbol then // é uma posição
do par ("cross") correspondente ao
gráfico que estamos trabalhando?
{
cnt é uma variável usada apenas no loop e foi declarada no início
do programa:
var: cnt(0);
se é uma posição de compra ("long position")
If OrderValue(cnt,VAL_TYPE)=OP_BUY then // se for uma posição de compra aberta
{
Deve ser fechada? Condição para sair de uma posição de
compra ("long position"): MACD estando acima de zero, começa a cair e é
cruzado pela linha de sinal.
If MacdCurrent>0 and MacdCurrent<SignalCurrent and
MacdPrevious>SignalPrevious and MacdCurrent>(MACDCloseLevel*Point) then
{
CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet);
Exit; // exit
};
O "trailing stop"deve ser ajustado? Nós ajustamos o 'trailing stop' somente no caso
de a posição já ter algum lucro que exceda o nível do 'trailing stop'
em 'pips', e no caso do novo nível do stop ser melhor do que o anterior.
If TrailingStop>0 then // se 'trailing stops' estão sendo usados...
{
If (Bid-OrderValue(cnt,VAL_OPENPRICE))>(Point*TrailingStop) then
{
If OrderValue(cnt,VAL_STOPLOSS)<(Bid-Point*TrailingStop) then
{
ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_OPENPRICE),
Bid-Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red);
Exit;
};
};
};
};
else // caso contrário, é uma posição de venda ("short position")
{
Ela deve ser fechada? Condição para sair de uma posição de venda ('short position'):
MACD estando abaixo de zero, começa a subir e é cruzado pela linha de sinal.
If MacdCurrent<0 and MacdCurrent>SignalCurrent and
MacdPrevious<SignalPrevious and Abs(MacdCurrent)>(MACDCloseLevel*Point) then
{
CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Ask,3,Violet);
Exit; // exit
};
O "trailing stop"deve ser ajustado? Nós ajustamos o 'trailing stop' somente no caso de a posição
já ter algum lucro que exceda o nível do 'trailing stop' em 'pips', e no caso do novo nível
do stop ser melhor do que o anterior.
If TrailingStop>0 then // o programa verifica o 'trailing stop' configurado pelo usuário
{
If (OrderValue(cnt,VAL_OPENPRICE)-Ask)>(Point*TrailingStop) then
{
If OrderValue(cnt,VAL_STOPLOSS)=0 or
OrderValue(cnt,VAL_STOPLOSS)>(Ask+Point*TrailingStop) then
{
ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_OPENPRICE),
Ask+Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red);
Exit;
};
};
};
Fechando todos as chaves que ainda estão abertas:
};
};
};
PRÓXIMOS PASSOS:
|