Cruzamento de médias móveis no EA

 

Blz Galera!

Dei uma olhada no fórum, mas não encontrei nada do tipo para minha dúvida.

Gostaria de saber se é possível colocar a abertura de ordem compra ou venda no exato momento do cruzamento das médias, 

e não no PRICE_CLOSE ou OPEN do próximo candle que se forma depois do cruzamento como de costume?

Ex: if (iMA(NULL,0,MediaCurta,0,MODE_SMA,PRICE_CLOSE,0) > iMA(NULL,0,MediaLonga,0,MODE_SMA,PRICE_CLOSE,0) && order_compra==true){

 
TraderPrado:

Blz Galera!

Dei uma olhada no fórum, mas não encontrei nada do tipo para minha dúvida.

Gostaria de saber se é possível colocar a abertura de ordem compra ou venda no exato momento do cruzamento das médias, 

e não no PRICE_CLOSE ou OPEN do próximo candle que se forma depois do cruzamento como de costume?

Ex: if (iMA(NULL,0,MediaCurta,0,MODE_SMA,PRICE_CLOSE,0) > iMA(NULL,0,MediaLonga,0,MODE_SMA,PRICE_CLOSE,0) && order_compra==true){

Olá TraderPrado,

Isso é perfeitamente possível de ser feito! Entretanto a abordagem correta seria você passar os valores das médias para dois buffers, representando as médias curta e longa.

Uma vez copiados os valores para os buffers, os mesmos deverão ser utilizados em sua lógica operacional, de maneira a capturar o cruzamento das médias utilizando os últimos 2 candles, caso queira trabalhar com confirmação (o que é o mais comum).

Espero ter ajudado.

Abraços,
Malacarne

 
Rodrigo Malacarne:

Olá TraderPrado,

Isso é perfeitamente possível de ser feito! Entretanto a abordagem correta seria você passar os valores das médias para dois buffers, representando as médias curta e longa.

Uma vez copiados os valores para os buffers, os mesmos deverão ser utilizados em sua lógica operacional, de maneira a capturar o cruzamento das médias utilizando os últimos 2 candles, caso queira trabalhar com confirmação (o que é o mais comum).

Espero ter ajudado.

Abraços,
Malacarne


Ok!, obrigado!
Sabendo que é possível agora, vou postar o código do EA aqui, pois pode servir para alguém que esteja procurando algo parecido.
Eu sou novo em programação, não sei quase nada, e talvez tenha alguém aqui no fórum com a mesma dúvida ou problema. 
Tentei fazer alguns EAs especulando na net, mas não funcionou muito bem.
Então encontrei a ideia deste código abaixo e dei uma modificada, e pra mim que sou novato ele até que atendeu minha expectativa.
A única coisa que eu não consegui foi colocar as ordens de abertura e fechamento no exato cruzamento das médias.
Eu até tentei baseado no que vc me disse, eu pesquisei algo parecido, mas não funcionou nada depois que eu inseri os códigos, então resolvi voltar ao
estado anterior (ou seja, ordens no Price Close).
O que eu gostaria é de saber se alguma alma caridosa se arrisca a resolver esta questão, se não for abuso de minha parte. 
Fazer com que as ordens de abertura e fechamento sejam executadas no exato cruzamento das médias.


//+------------------------------------------------------------------+
//|                                             EA médias móveis.mq4 |
//|                                                            Prado |
//|                                                                  |
//+------------------------------------------------------------------+

7  #define IdentificadorEA  101
8
9  #property copyright "Prado"
10 #property link      ""
11
12 //---- Input parameters - parâmetros do Expert Advisor que podem ser alterados quando se executa o dito.
13 extern double Lotes = 0.1;
14 extern int  MMlenta = 40;
15 extern int MMrapida = 5;
16 extern int StopLoos = 300;
17
18 //-------------------------------------------------------------------------------------------------
19
20 datetime LastTradeBarTime;
21
22 //-------------------------------------------------------------------------------------------------
23 // init, função executada quando o EA se inicia ou reinicia
24
25 int init()
26  {
27 // Necessário para controlar se estamos numa nova barra
28 LastTradeBarTime = Time[1]; 
29   return(0);
30  }
31 //-------------------------------------------------------------------------------------------------
32 // start, função executada a cada tick recebido pelo EA 
33
34 int start()
35  {
36
37  // Variáveis temporárias, renovadas a cada chamada do EA
38
39  double vMMrapida0;                 // MM rápida da última barra 
40  double vMMrapida1;                 // MM rápida da penúltima barra 
41  double vMMlenta0;                  // MM lenta da última barra
42  double vMMlenta1;                  // MM lenta da penúltima barra
43  int resposta;                      // Variável que obterá a resposta do terminal quando envia uma ordem
44
45  // Verifica se estamos no início de uma barra e apenas processa as instruções se isso for verdade
46  if (LastTradeBarTime == Time[0]) 
47     return(0); // Não é o primeiro tick de uma nova barra, por isso sai
48  else 
49  {
50     LastTradeBarTime = Time[0]; // continua
51
52     // Valores das médias móveis na barra que acabou de terminar, e na imediatamente anterior
53     vMMrapida0=iMA(Symbol(),0,MMrapida,0,MODE_SMA,PRICE_CLOSE,1); // Obtém o valor da MM rápida da barra que terminou
54     vMMrapida1=iMA(Symbol(),0,MMrapida,0,MODE_SMA,PRICE_CLOSE,2); // Obtém o valor para a MM rápida da barra anterior
55     vMMlenta0=iMA(Symbol(),0,MMlenta,0,MODE_SMA,PRICE_CLOSE,1);   // Obtém o valor da MM lenta da barra que terminou
56     vMMlenta1=iMA(Symbol(),0,MMlenta,0,MODE_SMA,PRICE_CLOSE,2);   // Obtém o valor para a MM lenta da barra anterior
57
58     // Verifica se existiu um cruzamento da MM rápida acima da MM lenta
59     if (vMMrapida1<vMMlenta1 && vMMrapida0>vMMlenta0) 
60     {
61        // Se já existem trades abertos, tem de os fechar
62        if (OrdersTotal() > 0) FecharTodosTrades();
63
64        // Abre um trade longo
65         resposta = OrderSend(Symbol(),OP_BUY,Lotes,NormalizeDouble(Ask,Digits),3,StopLoos,0,"mm exemplo buy",IdentificadorEA,0,Blue);
66     }
67     
68
69     // Verifica se existiu um cruzamento da MM rápida abaixo da MM lenta
70     if (vMMrapida1>vMMlenta1 && vMMrapida0<vMMlenta0) 
71     {
72        // Se já existem trades abertos, tem de os fechar
73        if (OrdersTotal() > 0) FecharTodosTrades();
74
75        // Abre um trade curto
76        resposta = OrderSend(Symbol(),OP_SELL,Lotes,NormalizeDouble(Bid,Digits),3,StopLoos,0,"mm exemplo sell",IdentificadorEA,0,Red);
77     }
78  }
79  return(0);
80 }
81
82
83 //-------------------------------------------------------------------------------------------------
84 // deinit, função executada quando o EA termina
85
86 int deinit()
87  {
88   // Se existem trades abertos, tem de os fechar
89   if (OrdersTotal() > 0) FecharTodosTrades();
90   return(0);
91  }
92
93
94 //-------------------------------------------------------------------------------------------------
95 // Função que fecha todos os trades existentes
96
97 int FecharTodosTrades()
98  {
99   for(int i=0;i<OrdersTotal();i++)
100   {
101      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == false)        break;
102      
103      // A função vai fechar todas as ordens que sejam deste EA e sobre o símbolo corrente
104      if(OrderMagicNumber() == IdentificadorEA && OrderSymbol() == Symbol()) 
105      {
106         if(OrderType()==OP_BUY)
107         int   rec = OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,White);
108         if(OrderType()==OP_SELL)
109            rec = OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,White);
110      }
111   } 
112   return(0);
113  }
114
115
116 // FIM
117 //-------------------------------------------------------------------------------------------------
 

Poderiam me ajudar?

gostaria de abrir uma ordem de compra no cruzamento de MM 6/21, e efetuar o fechamento no movimento inverso no cruzamento da MM 21/6.  Porém, somente se houver lucro.


int start()

{

  double MyPoint=Point;

  if(Digits==3 || Digits==5) MyPoint=Point*10;

  

  double TheStopLoss=0;

  double TheTakeProfit=0;

  if( TotalOrdersCount()==0 ) 

  {

     int result=0;

     if((iMA(NULL,0,6,1,MODE_SMA,PRICE_CLOSE,1)>iMA(NULL,0,21,1,MODE_SMA,PRICE_CLOSE,1))) // Here is your open buy rule

     {

        result=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"EA Generator www.ForexEAdvisor.com",MagicNumber,0,Blue);

        if(result>0)

        {

         TheStopLoss=0;

         TheTakeProfit=0;

         if(TakeProfit>0) TheTakeProfit=Ask+TakeProfit*MyPoint;

         if(StopLoss>0) TheStopLoss=Ask-StopLoss*MyPoint;

         OrderSelect(result,SELECT_BY_TICKET);

         OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);

        }

        return(0);

     }

  }

  

  for(int cnt=0;cnt<OrdersTotal();cnt++)

     {

      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

      if(OrderType()<=OP_SELL &&   

         OrderSymbol()==Symbol() &&

         OrderMagicNumber()==MagicNumber 

         )  

        {

         if(OrderType()==OP_BUY)  

           {

              if((iMA(NULL,0,6,1,MODE_SMA,PRICE_CLOSE,1)<iMA(NULL,0,21,1,MODE_SMA,PRICE_CLOSE,1))) //here is your close buy rule

              {

                   OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red);

              }

            if(TrailingStop>0)  

              {                 

               if(Bid-OrderOpenPrice()>MyPoint*TrailingStop)

                 {

                  if(OrderStopLoss()<Bid-MyPoint*TrailingStop)

                    {

                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*MyPoint,OrderTakeProfit(),0,Green);

                     return(0);

                    }

                 }

              }

           }

         else 

           {

            if(TrailingStop>0)  

              {                 

               if((OrderOpenPrice()-Ask)>(MyPoint*TrailingStop))

                 {

                  if((OrderStopLoss()>(Ask+MyPoint*TrailingStop)) || (OrderStopLoss()==0))

                    {

                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+MyPoint*TrailingStop,OrderTakeProfit(),0,Red);

                     return(0);

                    }

                 }

              }

           }

        }

     }

   return(0);

}


int TotalOrdersCount()

{

  int result=0;

  for(int i=0;i<OrdersTotal();i++)

  {

     OrderSelect(i,SELECT_BY_POS ,MODE_TRADES);

     if (OrderMagicNumber()==MagicNumber) result++;


   }

  return (result);

}


 
TraderPrado:

Olá Prado!

Você conseguiu ajustar seu código?
Estava fazendo um robô como seu, mas parei na mesma questão, porém, este que elaborou, ficou muito bom!

Quanto ao exato cruzamento das médias, você já definiu elas no iMA quando definiu os valor finais como analisar o candle 1 e 2 ou invés de 0 e 1.

Um ponto legar seria acrescentar o modificar ordem, pois se a média rápida cruza a lenta e depois ela volta, você poderia ter um prejuízo e modificando a ordem você muda a mão...

Uma coisa que não pesquisei e não sei do que se trata é quando você inseriu o “IdentificadorEA”, o que seria??
 
Qual função devo adicionar para definir um takeprofit pré selecionado por mim ???
 
//+------------------------------------------------------------------+
//|                                                        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                                                       |
//+------------------------------------------------------------------+
 
// + ----------------------------------------------- ------------------- + 
#property copyright  "Copyright 2019," 
#property link       "https://www.mql5.com" 
#property version    "1.00" 
#property strict 
#define IdentifierEA    101 

// --- Input parameters - parameters of the Expert Advisor that can be changed when the function is executed. 
extern   double Lots = 0.1 ; 
extern   int      MMlenta = 40 ; 
extern   int      MMrapida = 5 ; 
extern   int     StopLoss = 300 ; 
extern   int      TakeProfit = 30 ; 
extern   bool     MMfechar = false ;   // Close at the intersection of the MMs (true / false) 
extern   int Mild = 0 ; 
// extern int identifierEA = 12345; 

// --- 
datetime LastTradeBarTime; 

// + ----------------------------------------------- ------------------- + 
// | Expert initialization function | 
// + ----------------------------------------------- ------------------- + 
int   OnInit () 
  {
   // --- Required to control if we are in a new bar
    LastTradeBarTime = Time [ 1 ]; 
   
   // --- 
   return ( INIT_SUCCEEDED ); 
  } 
// + ---------------------------------------------- - ------------------- + 
// | Expert deinitialization function | 
// + ----------------------------------------------- ------------------- + 
void   OnDeinit ( const   int reason) 
  { 
   // --- If there are open trades, you have to close them 
   if ( OrdersTotal ()> 0 ) {CloseAllTrades ();} 
   
  }
// + ----------------------------------------------- ------------------- + 
// | Expert tick function | 
// + ----------------------------------------------- ------------------- + 
void   OnTick () 
  { 
   // --- Temporary variables, renewed every call of EA 
   double vMMrapida0;                 // Fast MM of the last 
   double vMMrapida1;                 // Fast MM of penultimate 
   double vMMlenta0;                  // slow MM of the last 
   double vMMlenta1;                  // slow MM of the penultimate bar 
   int response;                      // Variable that will get the terminal response when sending an order 
   
   // --- Checks if we are at the beginning of a bar and only if this is true 
   if (LastTradeBarTime == Time [ 0 ]) 
     { return ; } // This is not the first tick of a new slash, so exit 
   else 
      { 
      LastTradeBarTime = Time [ 0 ]; // to be continued 

      // Moving averages values ​​in the bar that just finished, and in the immediately
       preceding vMMrapida0 = iMA ( Symbol (), 0 , MMrapida, 0 , MODE_SMA, PRICE_CLOSE , 1 ); // Get the fast MM value of the bar that
       ends vMMrapida1 = iMA ( Symbol (), 0 , MMrapida, 0 , MODE_SMA , PRICE_CLOSE , 2 ); // Gets the value for the fast MM of the previous bar
       vMMlenta0 = iMA ( Symbol (), 0 , Mild, 0 , MODE_SMA , PRICE_CLOSE , 1 ); // Get the slow MM value of the bar that
       ends vMMlenta1 =iMA ( Symbol (), 0 , Mild, 0 , MODE_SMA , PRICE_CLOSE , 2 ); // Gets the value for the slow MM of the previous bar 
      
      
      int MMclose, answer, identifierEA; 

      --- // Check if there was a fast of the cross above the MM MM slow 
      if (vMMrapida1 <&& vMMlenta1 vMMrapida0> vMMlenta0) 
        { 
         // Checks if exist and open positions Should be closed 
         if ( OrdersTotal ()> 0 && MMclose ) {CloseAllTrades ();} 

         // Opens a long trade
          answer = OrderSend (Symbol (), OP_BUY, Lots, Ask, 3 , Ask - StopLoss * Point , Ask + TakeProfit * Point , "mm example buy" , identifierEA, 0 , clrBlue ); 
        } 

      // --- Checks if there was a cross of the fast MM MM below the slow 
      if (vMMrapida1> vMMlenta1 && vMMrapida0 <vMMlenta0) 
        { 
         // Checks if exist and open positions Should be closed 
         if ( OrdersTotal ()> 0 && }} {CloseAllTrades ();} 

         // Opens a short trade
          answer = OrderSend ( Symbol(), OP_SELL, Lots, Bid, 3 , Bid + StopLoss * Point , Bid - TakeProfit * Point , "mm example sell" , identifierEA, 0 , clrRed ); 
        } 
     } 
  } 
// + -------------------------------------------- --- ------------------- + 
// | Function that closes all existing trades | 
// + ----------------------------------------------- ------------------- + 
void CloseAllTrades () 
 // int identifierEA; 
  { 
   bool rec; 

   for ( int i = 0 ; i < OrdersTotal(); i ++) 
     { 
      if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES) == false ) { break ;} 

      // // The function will be close to that of this EA and the current symbol 
      if (OrderMagicNumber () == identifierEA && 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 | 
// + ----------------------------------------------- ------------------- +

try that

 

Olá pessoal,

Alguém ai tem um robô de duas Medias Móveis sem SL que abra apenas uma ordem de cada vez ?

 
ALPINO:

Olá pessoal,

Alguém ai tem um robô de duas Medias Móveis sem SL que abra apenas uma ordem de cada vez ?

Busque no CodeBase. Ha centenas de EAs gratuitos por la.

 
galera boa noite. Alguem poderia me ajudar a como colocar uma opção de True/False para que eu possa escolher se quero que o EA entre na confirmação do canfle após o cruzamento ou se ele entre logo após o cruzamento sem confirmação. Exemplo: Cruzou as duas médias ele entra no mesmo candle, opção false ativada. Cruzou e ele vai esperar o próximo candle para confirmar o cruzamento, opção true. Só confirmando, eu preciso mudar nos buffers certo ??
Razão: