//+------------------------------------------------------------------+ //| MM EA.mq4 | //| Copyright 2019, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict #define IdentificadorEA 101 //--- Input parameters - parâmetros do Expert Advisor que podem ser alterados quando se executa o dito. extern double Lotes = 0.1; extern int MMlenta = 40; extern int MMrapida = 5; extern int StopLoss = 300; extern int TakeProfit = 30; extern bool MMfechar = false; // Fechar no cruzamento das MMs (true / false) //--- datetime LastTradeBarTime; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- Necessário para controlar se estamos numa nova barra LastTradeBarTime = Time[1]; //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- Se existem trades abertos, tem de os fechar if(OrdersTotal() > 0) {FecharTodosTrades();} } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- 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;} // 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) { //--- Verifica se existem posições abertas e se devem ser fechadas if(OrdersTotal() > 0 && MMfechar) {FecharTodosTrades();} //--- Abre um trade longo resposta = OrderSend(Symbol(), OP_BUY, Lotes, Ask, 3, Ask - StopLoss * Point, Ask + TakeProfit * Point, "mm exemplo buy", IdentificadorEA, 0, clrBlue); } //--- Verifica se existiu um cruzamento da MM rápida abaixo da MM lenta if(vMMrapida1 > vMMlenta1 && vMMrapida0 < vMMlenta0) { //--- Verifica se existem posições abertas e se devem ser fechadas if(OrdersTotal() > 0 && MMfechar) {FecharTodosTrades();} //--- Abre um trade curto resposta = OrderSend(Symbol(), OP_SELL, Lotes, Bid, 3, Bid + StopLoss * Point, Bid - TakeProfit * Point, "mm exemplo sell", IdentificadorEA, 0, clrRed); } } } //+------------------------------------------------------------------+ //| Função que fecha todos os trades existentes | //+------------------------------------------------------------------+ void FecharTodosTrades() { bool rec; 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) {rec = OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrWhite);} else if(OrderType() == OP_SELL) {rec = OrderClose(OrderTicket(), OrderLots(), Ask, 3, clrWhite);} } } } //+------------------------------------------------------------------+ //| Expert End | //+------------------------------------------------------------------+
Boas malta....
tou aqui com algumas dificuldades, sou um iniciante em tudo, mas gostava de um codigo em que quando duas medias moveis se cruzam uma de 8 e outra de 32 e quando a mais pequena cruzasse a maior houvesse uma venda ou uma compra, dependendo se cruza para cima ou para baixo, mas gostava que fosse mesmo no momento em que se dá o cruzamento, é possivel? e é possivel tambem essa venda ou essa compra ser fechada no seguinte cruzamento das médias e ao mesmo tempo que fecha auma ordem, abre logo outra, mas se fechou de venda abre uma ordem de compra, é possivel?
Saudações,
Muito bom!
Estava precisando de uma robô assim para realizar alguns testes pra confirmar algumas estratégias a partir do cruzamento das MM.
Entretanto, ao copiar e compilar esse robô, as posições abertas não estão sendo fechadas com o novo cruzamento e assim acabo ficando com duas
posições abertas, pois quando há cruzamento da média rápida uma nova ordem é aberta, mas a antiga só sai no StopLoss. Pode me ajudar a corrigir
isso?
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Boa tarde
Gostaria que alguém me ajudasse a alterar a função vender(TakeProfit) no cruzamento de médias para um TakeProfit definido por mim. O cruzamento de médias ficaria apenas com a função, que já há no código, de abrir operação tanto de buy quanto de selll. Apos abrir a operação o TP já seria lançado pelo EA
//+------------------------------------------------------------------+
//| EA médias móveis.mq4 |
//| Prado |
//| |
//+------------------------------------------------------------------+
#define IdentificadorEA 101
#property copyright "Prado"
#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 = 40;
extern int MMrapida = 5;
extern int StopLoos = 300;
extern int TakeProfit = 3;
//-------------------------------------------------------------------------------------------------
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,StopLoos,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,StopLoos,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)
int rec = OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,White);
if(OrderType()==OP_SELL)
rec = OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,White);
}
}
return(0);
}