Você está na página 1de 2

//+------------------------------------------------------------------+ //| Medias.mq4 | //| Copyright 2012, MetaQuotes Software Corp.

| //| Leco | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, MetaQuotes Software Corp." #property link "Leco" #define comentariodoconsultor "meu EA v1" #define media longa 21 //periodo padro para a media longa #define media curta 10 //periodo padro para a media longa //--- input parameters extern int MMLPeriodo=21; extern int MMRPeriodo=10; int NumeroMagico = 1001; //Numero magico da verso 1 //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //testar se limites esto investidos if (MMLPeriodo<MMCPeriodo) ( //Periodo do mdia Longa pe menor que a Curta ento invesrte os valores int Auxiliar = MMLPeriodo; // Guarda valor original de Periodo Longo MMLPeriodo = MMCPeriodo; //novo valor para o periodo longo MMCPeriodo = Auxiliar; //novo valor para periodo curto } //e perodos iguais ento assume o padro // pois se as mdias forem iguais no existira cruzamento if (MMLPeriodo==MMCPeriodo){ MMLPeriodo = MediaLonga; // novo valor para Perodo Rpido MMCPeriodo = MediaCurta; // novo valor para Perodo Rpido } return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { } return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int Total = OrdersTotal(), // Numero Total de ordens no MetaTrader NumOrdensBuy = 0, // Numero de ordens buyneste consultor NumOrdensSell = 0, // Numero de ordens sellneste consultor i; // utilizado nos loops // Calculo das medias para o perodo lento double MML1 = iMA(NULL,0,MMLPeriodo,0,MODE_EMA,PRICE_CLOSE,1); // barra 1 double MML2 = iMA(NULL,0,MMLPeriodo,0,MODE_EMA,PRICE_CLOSE,2); // barra 2 // Calculo das medias para o perodo Curto

double MMC1 = iMA(NULL,0,MMCPeriodo,0,MODE_EMA,PRICE_CLOSE,1); // barra 1 double MMC2 = iMA(NULL,0,MMCPeriodo,0,MODE_EMA,PRICE_CLOSE,2); // barra 2// Determina se tem algum cruzamento// se Curta abaixo da lenta na barra 2 e // Curta acima da lenta na barra 1 entao sinal buy bool SinalBuy = (MMC2<MML2) && (MMC1>MML1); // Cruzou paracima? // se Curta acima da lenta na barra 2 e // Curta abaixo da lenta na barra 1 entao sinal sell bool SinalSell = (MMC2>MML2) && (MMC1<MML1); // Cruzou para baixo? // Conta as ordens abertas por este sistema for(i=0;i<Total;i++) { // passa por todas as ordens abertas // seleciono a ordem da lista de ordens // pela localizao da mesma na lista OrderSelect(i,SELECT_BY_POS,MODE_TRADES); // se a ordem pertence a este par e tem este nmero mgico if ((OrderSymbol()==Symbol()) && // deste par de moedas (OrderMagicNumber()==1001)) { // e deste consultor if (OrderType()==OP_BUY) NumOrdensBuy++; if (OrderType()==OP_SELL) NumOrdensSell++; } } // verifica se tem de fechar alguma ordem e a fecha for(i=0;i<Total;i++) { // passa por todas as ordens abertas // seleciono a ordem da lista de ordens // pela localizao da mesma na lista OrderSelect(i,SELECT_BY_POS,MODE_TRADES); // se a ordem pertence a este par e tem este nmero mgico if ((OrderSymbol()==Symbol()) && // deste par de moedas (OrderMagicNumber()==1001)) { // e deste consultor // se tem ordem aberta e for contraria ao sinal obtido ento fecha if ((SinalBuy &&(NumOrdensSell>0)) || // Sina Buy com Ordem Sell Aberta (SinalSell&&(NumOrdensBuy>0 ))) // ou Sina Sell com Ordem Buy Aberta // entao fechar essa ordem OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0, Red); } } // verifica se abre uma posio longa // deve ter sinal buy e nenhuma ordem buy aberta if ((SinalBuy) && (NumOrdensBuy==0)) OrderSend(Symbol(), OP_BUY, 1, Ask, 0, 0, 0, ComentarioDoConsultor,NumeroMagico, 0, Green); // verifica se abre uma posio Curta // deve ter sinal sell e nenhuma ordem sell aberta if (SinalSell && (NumOrdensSell==0)) OrderSend(Symbol(), OP_SELL, 1, Bid, 0, 0, 0, ComentarioDoConsultor, NumeroMagico, 0, Green); return(0); } //+------------------------------------------------------------------+

Você também pode gostar