Verificação de Velas Abertas

 

Oi, pessoal,

Sou bastante novo na codificação em mql4 e tenho realmente tentado fazer com que minha primeira EA funcione. Honestamente, eu gostaria de receber ajuda com o seguinte. É apenas uma travessia básica, mas, em vez de atravessar médias móveis, é apenas uma travessia de preços sobre uma média móvel.

Eu preciso de uma ordem para ser acionada em Candle Open se: (O preço atual da vela aberta é > da média móvel) e se (a vela anterior fechou abaixo da média móvel).

Até agora, eu tenho o seguinte código na área principal:


//+------------------------------------------------------------------+

int start()

{

//---

duplo PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,1);

corrente duplaSlow = iMA(NULL,0,SlowMa,SlowMaMaShift, SlowMaMethod, SlowMaAppliedTo,0);

duplo PreviousFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,1);

double CurrentFast = iMA(NULL,0,FastMa,FastMaMaShift, FastMaMethod, FastMaAppliedTo,0);

duplo PreviousPriceClose= iClose(NULL, 0, 1);

duplo CorrenteCandleOpen= iOpen(NULL, 0,0,0);

//----------------------O cálculo principal começa aqui


if(PreviousPriceClose<PreviousSlow && (CurrentCandleOpen>(CurrentSlow)))

if(OrdensTotal () == 0)

BuyTicket = OrderSend(Symbol(),OP_BUY, LotSize,CurrentCandleOpen, Slippage, Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), "Main Entry EA", 0,0,clrLimeGreen);

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

retorno(0);

return(0);

}

//+------------------------------------------------------------------+

O que quer que eu faça, parece que não consigo trabalhar, e não acho que estou fazendo algo bem aqui. Mais uma vez, eu realmente apreciaria a ajuda!

 
    

  double CurrentSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,0);   

Este valor está mudando enquanto a vela é atual

double CurrentCandleOpen= iOpen(NULL,0,0);

Isto não é

BuyTicket = OrderSend(Symbol(),OP_BUY, LotSize,CurrentCandleOpen, Slippage, Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), "Main Entry EA", 0,0,clrLimeGreen);

CurrentCandleOpen é pouco provável que seja um preço de entrada válido para muitas carraças

Se você tiver que usar esta lógica, calcule apenas uma vez quando uma nova barra for aberta.

Verifique os valores de retorno se o OrderSend falhar

 
GumRai:

Este valor está mudando enquanto a vela é atual

Isto não é

CurrentCandleOpen é pouco provável que seja um preço de entrada válido para muitas carraças

Se você tiver que usar esta lógica, calcule apenas uma vez quando uma nova barra for aberta.

Verifique os valores de retorno se o OrderSend falhar


Obrigado pela resposta rápida! Deixe-me ver se entendi isso corretamente:

  1. O CurrentSlow não vai funcionar realmente, porque ainda está se formando. Ok, tudo bem, eu posso usar o valor da média móvel que se formou para a vela anterior. Isso não deve ser um problema.
  2. Como CurrentCandleOpen não é um valor móvel...então estou assumindo que parte do código está correto?
  3. Como posso fazer isto funcionar, para que esteja suficientemente perto da CandleOpen?-- Você mencionou calcular apenas uma vez quando uma nova barra for aberta. Você poderia, por favor, expandir isso? Eu não sei bem como fazer isso.
Mais uma vez obrigado GumRai.

 
   static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      //Code to process the signal
     }

   
O código dentro dos colchetes só será executado ao primeiro sinal de uma nova barra
 
GumRai:
O código dentro dos colchetes só será executado no primeiro tique de uma nova barra

Obrigado pelo código! Atualizei o seguinte, conforme discutido anteriormente:

  1. Alterei o atual MA lento para Lento Anterior.
  2. Removido o CurrentCandleOpen com Ask. Sempre que eu usava CurrentCandleOpen, ao invés de Ask, ele não fazia nenhum negócio. Entretanto, quando substituí isso por Ask, funcionou, mas é claro que o Ask sempre que o Ask atravessa o MA, e não em Candle Open.

Mas depois disso, quando o coloquei em seu código como a seguir, ele não aceitava nenhuma negociação de novo. Eu inseri isto corretamente?

int start()
  {
//---
    
  double PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,1);     //1 at the end signifies that we want it on candle close
  double CurrentSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,0);     //1 at the end signifies that we want it on candle close

  double PreviousFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,1);     //1 at the end signifies that we want it on candle close
  double CurrentFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,0);     //1 at the end signifies that we want it on candle close
   
  double PreviousPriceClose= iClose(NULL, 0, 1);
  double CurrentPriceClose= iOpen(NULL, 0, 0);
  
//----------------------Main calculation starts here

 static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
   if(PreviousPriceClose<PreviousSlow && Ask>PreviousSlow)
      if(OrdersTotal () == 0)
         BuyTicket = OrderSend(Symbol(),OP_BUY, LotSize,Ask, Slippage, Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), "Main Entry EA", 0,0,clrLimeGreen);
   }
//--------------
   return(0);
   return(0);
  }
 

Por que colocar as ligações do iMA fora do novo código de barras? Isso significa que elas são chamadas a cada tique quando não são necessárias - ineficientes.

   static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      double PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod, SlowMaAppliedTo,1);
      double PreviousPriceClose=iClose(NULL,0,1);   //You can just use Close[1]
      if(PreviousPriceClose<PreviousSlow && Bid>PreviousSlow)
         if(OrdersTotal()==0)
            {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",0,0,clrLimeGreen);
            if(BuyTicket==-1)
               {
               //Error checking code
               }
     }

Não use Ask para comparar valores em um gráfico MT4, eles são baseados no preço do Bid

Verifique a existência de erros se o OrderSend falhar.

Você pode não receber muitos casos em que o primeiro tique de uma nova barra está acima de um MA quando o último tique da barra anterior estava abaixo dela.

 

Muito obrigado, GumRai. Agradeço sinceramente a ajuda.

Seu código funciona como um encanto. Eu ainda estou tentando aprender as cordas aqui, e vi o iMA sendo colocado por conta própria, assim separadamente. Em vez disso, seguirá seu método.

***O IMA se faz de cabeça****.

Vou retrabalhar meu código. Sua última linha apontou a falha no que eu queria e no que eu realmente codifiquei.

O que eu realmente preciso fazer é:

  • A vela do passo 1 se fecha abaixo de MA,
  • passo 2: Vela cruza e fecha acima de MA
  • Passo 3: entrar no comércio com vela nova aberta.

Última pergunta, e eu acho que já entendi...

para a etapa 1 acima, o iMA, o SlowMaShift seria 2 correto? Já que são 2 barras atrás? e o iClose seria: iClose(NULL,0,2) para essa comparação correta?

 

Parece que você tem a idéia.

Modifique e poste seu código e eu ou outra pessoa comentaremos sobre ele.

 
GumRai:

Parece que você tem a idéia.

Modifique e poste seu código e eu ou outra pessoa comentaremos sobre ele.

Consegui fazer com que funcionasse! Obrigado GumRai.
Agora estou fazendo o mesmo, mas usando as regras opostas para tomar o curto prazo. Independentemente disso funciona bem, mas eu não sei como usar a função OrderCloseBy para que se o longo estiver aberto, e o curto acione, ele feche o longo principalmente porque eu não tenho idéia de como encontrar o bilhete de pedido... Eu tentei contornar a função OrderCloseBy fazendo o seguinte:

int start()
  {
//---
 static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      double PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod, SlowMaAppliedTo,1);
      double PreviousSlow2 = iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod, SlowMaAppliedTo,2);
      double PreviousPriceClose=iClose(NULL,0,1);   //You can just use Close[1]
      double PreviousPriceClose2=iClose(NULL, 0,2);
      if(PreviousPriceClose2<PreviousSlow2 && PreviousPriceClose>PreviousSlow && Bid>(PreviousSlow+PipsBeforeEntry*Pips))
         if(OrdersTotal()==0)
            {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",0,0,clrLimeGreen);
      if(PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow)
         if(OrdersTotal()==1)
         {
            OrderClose(BuyTicket,LotSize,Ask,Slippage,clrPink) && OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Sell EA",0,0,clrAliceBlue);
                  }
         if(OrdersTotal()==0)
         {
            OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Sell EA",0,0,clrAliceBlue);
            }
     }
//--------------
   return(0);
   return(0);
  }
  return(0);
  }
 
      if(PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow)
         if(OrdersTotal()==1)

não pode ser satisfeita, pois está dentro do bloco de condições

         if(OrdersTotal()==0)

   static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      double PreviousSlow=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1);
      double PreviousSlow2=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,2);
      double PreviousPriceClose=iClose(NULL,0,1);   //You can just use Close[1]
      double PreviousPriceClose2=iClose(NULL,0,2);
      if(PreviousPriceClose2<PreviousSlow2 && PreviousPriceClose>PreviousSlow && Bid>(PreviousSlow+PipsBeforeEntry*Pips))
        {
         if(OrdersTotal()==0)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",0,0,clrLimeGreen);
        }
      else
      if(PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow)
        {
         if(OrdersTotal()==1)
           {
            OrderClose(BuyTicket,LotSize,Ask,Slippage,clrPink);
            OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Sell EA",0,0,clrAliceBlue);
           }
         else
         if(OrdersTotal()==0)
           {
            OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Sell EA",0,0,clrAliceBlue);
           }
        }
     }

Acho que o acima exposto é mais como você pretendia

Você deve verificar os códigos de retorno de erro

 
GumRai:

Acho que o acima exposto é mais como você pretendia

Você deve verificar os códigos de retorno de erro

Obrigado pelo código... infelizmente, não funcionou realmente, já que agora entra mais de uma vez em um curto espaço de tempo. Eis o que tentei fazer em vez disso - estou quebrando-o separadamente - entrada e saída longas, e depois criarei o oposto para entrada e saída curtas. Será mais manejável para mim e um pouco mais fácil de ajustar. Estou trabalhando para conseguir apenas a parte longa de entrada e saída para baixo primeiro. Mas de alguma forma, isto não é fechar negócios quando a vela se fecha abaixo da Média Móvel para o curto. Alguma idéia do que eu estou fazendo de errado? Isso dá um erro: O valor de retorno de "OrderClose" deve ser verificado. Procurei uma solução no Google durante toda a manhã, mas parece que não funciona.

   static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      double PreviousSlow=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1);
      double PreviousSlow2=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,2);
      double PreviousPriceClose=iClose(NULL,0,1);   //You can just use Close[1]
      double PreviousPriceClose2=iClose(NULL,0,2);
      if(PreviousPriceClose2<PreviousSlow2 && PreviousPriceClose>PreviousSlow && Bid>(PreviousSlow+PipsBeforeEntry*Pips))
        {
         if(OrdersTotal()==0)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",0,0,clrLimeGreen);
        }
      else
      if(PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow && Bid<PreviousSlow)
        {
          OrderClose(BuyTicket,LotSize,Ask,Slippage,clrPink);
          
        }
     

Atualização: Eu me livrei do código de erro, mas o ticket de fechamento ainda não parece funcionar. Tudo que eu quero é que feche a compra uma vez que a vela atravesse e feche abaixo do MA.