Ajuda com código

 

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);

}


 
cleiton090:



//+------------------------------------------------------------------+
//|                                                        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                                                       |
//+------------------------------------------------------------------+
 
Vinicius de Oliveira:


Vlq irmao
 

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,


C
Vinicius de Oliveira:


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?