Económico.Fórum

Fóruns Think Finance => Sistemas e Programação => Tópico iniciado por: Incognitus em 2010-10-27 17:54:23



Título: (MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: Incognitus em 2010-10-27 17:54:23
O Expert Advisor abaixo serve como um exemplo simples e base para quem quiser evoluir a partir daí. O que ele faz é controlar duas médias móveis, uma rápida outra lenta, comprando no cruzamento para cima da rápida e shortando no cruzamento para baixo. O EA controla as médias móveis na barra que se formou imediatamente antes, e na anterior a essa, comprando no open da barra actual (é possível colocar a compra ainda ligeiramente mais cedo, se seguirmos o cruzamento na própria barra, mas isso não é feito por uma questão de simplicidade).

Este Expert advisor também serve para se terem duas funções úteis e reutilizáveis: uma função que controla quando se forma uma barra nova, e outra que fecha todas as posições do EA (usada para fechar tudo cada vez que há um sinal, invertendo depois, e também para fechar tudo se o EA for desligado).

Este EA é utilizável na plataforma MT4, que usa como linguagem o MQL.

Código:
//+------------------------------------------------------------------+
//|                                        Exemplo médias móveis.mq4 |
//|                                                              XTB |
//|                                                                  |
//+------------------------------------------------------------------+

#define IdentificadorEA  101

#property copyright "XTB"
#property link      ""

//---- Input parameters - parâmetros do Expert Advisor que podem ser alterados quando se executa o dito.
extern double       Lotes=0.1;
extern int       MMlenta=50;
extern int       MMrapida=20;

//-------------------------------------------------------------------------------------------------

datetime LastTradeBarTime;

//-------------------------------------------------------------------------------------------------
// init, função executada quando o EA se inicia ou reinicia

int init()
  {
   // Necessário para controlar se estamos numa nova barra
   LastTradeBarTime = Time[1];
   return(0);
  }


//-------------------------------------------------------------------------------------------------
// start, função executada a cada tick recebido pelo EA

int start()
  {

  // Variáveis temporárias, renovadas a cada chamada do EA

  double vMMrapida0;                 // MM rápida da última barra
  double vMMrapida1;                 // MM rápida da penúltima barra
  double vMMlenta0;                  // MM lenta da última barra
  double vMMlenta1;                  // MM lenta da penúltima barra
  int resposta;                      // Variável que obterá a resposta do terminal quando envia uma ordem

  // Verifica se estamos no início de uma barra e apenas processa as instruções se isso for verdade
  if (LastTradeBarTime == Time[0])
     return(0); // Não é o primeiro tick de uma nova barra, por isso sai
  else
  {
     LastTradeBarTime = Time[0]; // continua

     // Valores das médias móveis na barra que acabou de terminar, e na imediatamente anterior
     vMMrapida0=iMA(Symbol(),0,MMrapida,0,MODE_SMA,PRICE_CLOSE,1); // Obtém o valor da MM rápida da barra que terminou
     vMMrapida1=iMA(Symbol(),0,MMrapida,0,MODE_SMA,PRICE_CLOSE,2); // Obtém o valor para a MM rápida da barra anterior
     vMMlenta0=iMA(Symbol(),0,MMlenta,0,MODE_SMA,PRICE_CLOSE,1);   // Obtém o valor da MM lenta da barra que terminou
     vMMlenta1=iMA(Symbol(),0,MMlenta,0,MODE_SMA,PRICE_CLOSE,2);   // Obtém o valor para a MM lenta da barra anterior

     // Verifica se existiu um cruzamento da MM rápida acima da MM lenta
     if (vMMrapida1<vMMlenta1 && vMMrapida0>vMMlenta0)
     {
        // Se já existem trades abertos, tem de os fechar
        if (OrdersTotal() > 0) FecharTodosTrades();

        // Abre um trade longo
        resposta = OrderSend(Symbol(), OP_BUY, Lotes, NormalizeDouble(Ask,Digits), 3, 0, 0, "mm exemplo buy", IdentificadorEA, 0, Blue);
     }

     // Verifica se existiu um cruzamento da MM rápida abaixo da MM lenta
     if (vMMrapida1>vMMlenta1 && vMMrapida0<vMMlenta0)
     {
        // Se já existem trades abertos, tem de os fechar
        if (OrdersTotal() > 0) FecharTodosTrades();

        // Abre um trade curto
        resposta = OrderSend(Symbol(), OP_SELL, Lotes, NormalizeDouble(Bid,Digits), 3, 0, 0, "mm exemplo sell", IdentificadorEA, 0, Red);
     }
  }
  return(0);
}


//-------------------------------------------------------------------------------------------------
// deinit, função executada quando o EA termina

int deinit()
  {
   // Se existem trades abertos, tem de os fechar
   if (OrdersTotal() > 0) FecharTodosTrades();
   return(0);
  }


//-------------------------------------------------------------------------------------------------
// Função que fecha todos os trades existentes

int FecharTodosTrades()
  {
   for(int i=0;i<OrdersTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == false)        break;
     
      // A função vai fechar todas as ordens que sejam deste EA e sobre o símbolo corrente
      if(OrderMagicNumber() == IdentificadorEA && OrderSymbol() == Symbol())
      {
         if(OrderType()==OP_BUY)
            OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,White);
         if(OrderType()==OP_SELL)
            OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,White);
      }
   }
   return(0);
  }


// FIM
//-------------------------------------------------------------------------------------------------


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: breakmov em 2010-10-29 17:14:51
 Deixo tambem 3 sites que abordam  tudo o que se refere a MLQ4.. tambem o antigo MLQ3 ou o recente MLQ5. :)

http://www.metatrader4.com/forum (http://www.metatrader4.com/forum)
http://articles.mql4.com/ (http://articles.mql4.com/)
http://www.forex-tsd.com/indicators-metatrader-4/ (http://www.forex-tsd.com/indicators-metatrader-4/)



breakmov


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: local em 2010-11-01 10:21:03
Peço desculpa pela ignorância, mas como é que consigo passar essa informação para o programa?
Indo pelo Editor de linguagem Metastock não consigo escrever os dados que indicaste.
Obrigado.


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: Incognitus em 2010-11-01 10:45:44
Uma forma é gravar isto num ficheiro de texto com a extensão ".mq4" e colocar no directório indicado neste pequeno manual:

http://www.xtb.pt/?p=694#3   (ver "Formação")


Outra, é entrar no editor metaquotes, abrir um "novo"/"new", escolher expert advisor, dar-lhe um nome e fazer "concluir", o que cria um novo EA vazio, depois fazer o copy+paste deste código para dentro desse EA vazio (substituindo o que ele criou), gravar e compilar.


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: local em 2010-11-01 11:03:47
Utilizei o editor. Obrigado Inc!


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: cp em 2010-11-11 00:52:00
e depois como se coloca isto a funcionar?


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: Incognitus em 2010-11-11 01:12:51
Uma forma é gravar isto num ficheiro de texto com a extensão ".mq4" e colocar no directório indicado neste pequeno manual:

http://www.xtb.pt/?p=694#3   (ver "Formação")


Outra, é entrar no editor metaquotes, abrir um "novo"/"new", escolher expert advisor, dar-lhe um nome e fazer "concluir", o que cria um novo EA vazio, depois fazer o copy+paste deste código para dentro desse EA vazio (substituindo o que ele criou), gravar e compilar.

cp, se seguires o que diz neste link, vais compreender como colocar a funcionar (ou testar).


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: cp em 2010-11-11 01:24:50
Uma forma é gravar isto num ficheiro de texto com a extensão ".mq4" e colocar no directório indicado neste pequeno manual:

http://www.xtb.pt/?p=694#3   (ver "Formação")


Outra, é entrar no editor metaquotes, abrir um "novo"/"new", escolher expert advisor, dar-lhe um nome e fazer "concluir", o que cria um novo EA vazio, depois fazer o copy+paste deste código para dentro desse EA vazio (substituindo o que ele criou), gravar e compilar.

cp, se seguires o que diz neste link, vais compreender como colocar a funcionar (ou testar).

Gracias!


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: cp em 2010-11-11 02:40:21
este EA simples, fiz o teste e a 0.1 deu -2100 euros em 15 dias  ;D


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: Incognitus em 2010-11-11 06:23:20
este EA simples, fiz o teste e a 0.1 deu -2100 euros em 15 dias  ;D

É um EA apenas para se compreender a mecânica do programa. E para se fazerem outros com base neste.


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: cp em 2010-11-11 11:17:17
este EA simples, fiz o teste e a 0.1 deu -2100 euros em 15 dias  ;D

É um EA apenas para se compreender a mecânica do programa. E para se fazerem outros com base neste.

sim, já percebi..

vou passar mais um bocadinho em volta de alguns conceitos de programação porque sem isso duvido que seja possível colocar as minhas condições em prática,

uma dúvida que ainda não a tirei é, tendo um EA simples e depois de deixar a parte de programação, estando já na plataforma é possível acrescentar condições indo busca-las a uma outra pasta??  não sei se fará algum sentido  :-\


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: Incognitus em 2010-11-11 15:09:13
Não, para se introduzirem condições diferentes, é necessário alterar o programa.

Mas podes tentar usar um Expert Builder, que te permite construir um EA visualmente, sem programar o código.

Por enquanto ainda não está em Português, mas podes ver aqui:

http://www.xtb.es/?p=736#2

Vai a "Descargar".


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: Thorn Gilts em 2010-11-11 19:45:40
precisava uma coisa neste sentido:

O trade já esta aberto:

Se margem disponivel for suficiente para  comprar 0.1 lotes de X então compra 0.1 lotes de X...

ou seja, sempre que houver margem para comprar o activo X, ele compra.

Sabes traduzir isto inc?


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: Incognitus em 2010-11-11 20:12:39
só no contexto de um programa, mas imagino que existam vários EA's com esse pedaço de código ...


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: Thorn Gilts em 2010-11-11 20:20:32
só no contexto de um programa, mas imagino que existam vários EA's com esse pedaço de código ...

Pois, era para introduzir num EA, mas nao encontro nada nesse sentido.


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: Incognitus em 2010-11-11 21:22:26
Existe uma função que podes usar para determinar a margem disponível: AccountFreeMargin()

Existe uma outra que te permite saber o valor do lote, valor do tick, etc: MarketInfo(Symbol(), MODE_LOTSIZE), MarketInfo(Symbol(), MODE_TICKVALUE)


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: Thorn Gilts em 2010-11-12 20:16:57
Existe uma função que podes usar para determinar a margem disponível: AccountFreeMargin()

Existe uma outra que te permite saber o valor do lote, valor do tick, etc: MarketInfo(Symbol(), MODE_LOTSIZE), MarketInfo(Symbol(), MODE_TICKVALUE)


estou sem tempo, mas vou ver se faço algo dentro disso.


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: maj em 2010-11-12 20:48:15

No inicio do start() podes fazer o check da free margin,

if (AccountFreeMargin()<1000*Lots) return;

no sublinhado defines os valores do activo


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: ingenuo em 2010-11-26 14:26:04
Boa tarde,

Será que me podem ajudar, estou a tentar instalar 1 EA que fiz o download do codebase mql e instalei-o na XTB, creio que fiz tudo bem, activei o consultor expert, passei pelo meta editor instalei-o no gráfico, onde aparece no canto superior direito, mas não dá ordens nem sinais.

Fui ao site da XTB (formação) segui todos os passos mas, não consegui nada, devo estar a falhar nalguma coisa, o quê não sei.

Penso que não é do EA porque tentei com outros e acontece o mesmo.

Antecipadamente agradecido.

Abraço e bons negócios


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: maj em 2010-11-26 16:26:05
Boas,

Verifica em tools -> options -> expert advisors , se o allow live trading está permitido.


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: ingenuo em 2010-11-26 17:26:50
Boas maj,

sim está permitido.

Abraço e bons negocios


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: maj em 2010-11-26 17:45:06
No terminal vê o que diz no journal e nos experts .


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: Incognitus em 2010-11-26 17:47:24
Quanto a este expert, verifica também se estás num timeframe em que existam cruzamentos das médias, idealmente um timeframe baixo (1M, 5M) de forma a que observes rápido um cruzamento para ver se o EA gerou a ordem correspondente.


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: ingenuo em 2010-11-26 18:29:04
Boas maj e inc.,

Antes demais obr. pela ajuda,

experts:
2010.11.26 16:50:05   X EURUSD,M5: initialized
2010.11.26 16:50:01   X EURUSD,M5: loaded successfully

journal:
2010.11.26 16:50:01   Expert X EURUSD,M5: loaded successfully

obg. e bn
 


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: maj em 2010-11-26 18:44:16

Corre o EA no strategy tester, e vê o que diz o journal.


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: ingenuo em 2010-11-27 00:07:54
maj,

Desculpa a ignorância mas o que é o strategy tester.

obg. e bn.


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: ingenuo em 2010-11-27 00:20:59
Boas,

Desculpa maj já sei o que é, ejá o meti a correr, quando tiver notícias aviso.

Obg. e BN



Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: ingenuo em 2010-11-27 11:28:52
Bom dia maj,

Isto é o relatório,

Barras em teste   2065
Ticks modelados   148107
Qualidade do modelamento   59.98%
Mismatched charts errors   44
Deposito Inicial   10000.00
Lucro líquido total   0.00
Lucro Bruto   0.00
Perda Bruta   0.00
Fator de lucro   
Compensação esperada   0.00
diminuição absoluta   0.00
Perda máxima   0.00 (0.00%)
Relative drawdown   0.00% (0.00)
Total de negociações   0
Posições de Venda (ganhos %)   0 (0.00%)
Posições de Compras (ganhos %)   0 (0.00%)
Negociações com Lucro (% do total)   0 (0.00%)
Negociações com perdas (% do total)   0 (0.00%)
   Maior
Negociações com lucro   0.00
Negociações com perda   0.00
   Média
Negociações com lucro   0.00
Negociações com perda   0.00
   Máximo
Ganhos consecutivos (lucro em dinheiro)   0 (0.00)
Perdas consecutivas (perdas em dinheiro)   0 (0.00)
   Máximo
ganhos consecutivos (contagem de ganhos)   0.00 (0)
perdas consecutivas (contagem de perdas)   0.00 (0)
   Média
ganhos consecutivos   0
perdas consecutivas   0

E isto é partes do que aparece no diário:

2010.11.27 00:18:10   X: loaded successfully

2010.11.27 00:18:17   TestGenerator: unmatched data error (high value 1.3485 at 2010.11.17 13:45 is not reached from the least timeframe, high price 1.3481 mismatches)

2010.11.27 00:18:17   TestGenerator: unmatched data error (volume limit 266 at 2010.11.26 15:45 exceeded)

O gráfico e resultados não tem nada.

Obg. e BN


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: Incognitus em 2010-11-27 15:35:14
Há um problema qualquer, configuraste tudo segundo o que diz no artigo http://www.xtb.pt/?p=694#3 nomeadamente em "Execução"?

No canto superior direito do gráfico onde colocas o EA, aparece uma carinha alegre?


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: maj em 2010-11-27 19:37:12

Boas,

Pode ser um problema com o código, alteraste alguma coisa?

De qualquer forma experimenta o EA em anexo no tester, em eurusd M5 a ver se funciona.


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: ingenuo em 2010-11-28 01:43:53
Boas

Obrigado maj e Inc. por me terem tentado ajudar, mas já descobri qual o problema.

Já consegui instalar o EA e já testei e está tudo bem agora.

Mais 1 vez obrigado pela disponibilidade e tempo.

Obg. e BN



Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: Incognitus em 2010-11-28 02:19:05
Óptimo, felizes testes.



Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: Gama em 2010-11-28 15:30:40
Boas

Obrigado maj e Inc. por me terem tentado ajudar, mas já descobri qual o problema.

Já consegui instalar o EA e já testei e está tudo bem agora.

Mais 1 vez obrigado pela disponibilidade e tempo.

Obg. e BN


Será possível dizer qual era o erro?
Pode ser útil para outros.


Título: Re:(MQL) Introdução, um EA simples, de cruzamento de médias móveis
Enviado por: ingenuo em 2010-11-29 11:42:29
Boas ,

O erro que eu cometi (a maioria de vocês não o cometia), foi ao fazer o download  não gravei na pasta devida, e assim podia-o instalar na plataforma compilava-o instalava-o no gráfico sem nunca dar erro, só que não funcionava.

Obrigado pela ajuda e espero que possa ser util a alguém.

abraço e bons negócios