Verificação de Velas Abertas - página 3

 
  1. O código foi escrito 600 pré-construído. Não é possível usar pontos em nomes variáveis desde fevereiro de 2014. Basta substituir por sublinhados.
  2. Aqui está um exemplo de código independente de direção
    double DIR, OOP, OCP, ISL;  int OP;
    
    if(     Bid > High[1]){
       DIR = +1; OOP = Ask; OCP = Bid; OP = OP_BUY;
    }
    else if(Bid <  Low[1]){
       DIR = -1; OOP = Bid; OCP = Ask; OP = OP_BUY;
    }
    else return;
    
    ISL = OCP -DIR* pips_to_change( extISL_Pips );
    ... OrderSend(...);
    Basta trocar Ask/Bid por preços de abertura/fecho e escrever tudo o resto como se fosse uma compra: A ISL está abaixo da OCP (OCP - ISL) e o -DIR* muda o sinal para uma venda.
    Se você precisar de uma comparação (A > B) use (A - B) *DIR> 0 para reverter a comparação para uma venda.
 
GumRai:

Parece que você tem a idéia.

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

Ei GumRai,

Já faz um tempo desde que coloquei aqui uma atualização, mas tenho trabalhado fora no código e finalmente o terminei - doloroso ao trabalhar 10 horas por dia. No entanto, tenho duas questões principais. 1) Não importa o que eu faça, ele gera um código de erro: "Unknown ticket XYZ for OrderCloseFunction" e 2) Eu fiz um save-as do arquivo, (chamado USDCAD, outro EURUSD), com números mágicos diferentes, etc., mas ainda assim é preciso apenas uma troca de cada vez - e não trata os pares independentemente. Na verdade, ele também cria um erro "bilhete inválido para OrderCloseFunction".

Tentei pesquisar isto no Google, mas sem sucesso. Gostaria muito se você pudesse me guiar na direção certa com isto. O que estou fazendo de errado?

#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

//part with the extern int stating the terms of the MA removed to reduce space.

int MagicNumber = 1234;
int MagicNumber2 = 2345;
double Pips;
int BuyTicket;
int SellTicket;
int CloseTicket;
int CloseSellTicket;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   double Ticksize = MarketInfo(Symbol(), MODE_TICKSIZE);
   if (Ticksize == 0.00001 || Ticksize == 0.001)
   Pips = Ticksize*10;
   else Pips = Ticksize;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
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);
      double PreviousPriceClose2=iClose(NULL,0,2);
      if((iOpen(NULL,0,1)<PreviousSlow && 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",MagicNumber,0,clrLimeGreen);
        }
        
      else
      for(int i = OrdersTotal()-1; i >= 0; i--) 
         {
         if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(iClose(NULL, 0,0)<PreviousSlow)
        {
          CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
         }
         }
      if((iOpen(NULL,0,1)>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
        {
         if(OrdersTotal()==0)
            SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Entry EA",MagicNumber2,0,clrLimeGreen);
        }
      else
      for(i = OrdersTotal()-1; i >= 0; i--) 
         {
         if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if(iClose(NULL, 0,1)>PreviousSlow)
        {
          CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
              }
     }
     }
    return(0);
    return(0); 
    }
//--------------

  

Muito obrigado de antemão!

 

Nunca use OrderTotal()==0 como condição para entrar em negociações

Isso significa que se uma negociação foi aberta manualmente ou por outra EA ou pela mesma EA anexada a outro símbolo gráfico, somente 1 negociação pode ser aberta.

Você tem a variável Global BuyTicket, inicialize-a para -1

int BuyTicket=-1;

      if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if(BuyTicket==-1)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),
                                "Main Entry EA",MagicNumber,0,clrLimeGreen);
        }

Não faça loop através dos pedidos antes de fechar, é desnecessário

else
if(OrderSelect(BuyTicket,SELECT_BY_TICKET))
  {
   if(OrderCloseTime()==0)
     {
      if(Close[0]<PreviousSlow)
        {
         bool  CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
         if(CloseTicket)
            BuyTicket=-1;
        }
     }
   else
      BuyTicket=-1;  //Order has closed so reset variable
  }

Agora, ao usar variáveis declaradas globalmente para números de bilhetes, pode haver problemas se o terminal for desligado e reiniciado por algum motivo

Portanto, declare uma nova variável de escopo global

 bool Recovery=true;

  
  if(Recovery)
     {
     //loop through open orders and check for magic number, symbol and type
     //if you find a buy order with the magic number and symbol
     BuyTicket=OrderTicket();
     //if you find a sell order with the magic number and symbol
     SellTicket=OrderTicket();
     Recovery=false;
     }

Eu digitei isto rapidamente, então posso ter cometido erros, mas é o suficiente para lhe dar a idéia

 
GumRai:


A razão pela qual eu tinha colocado o laço ali foi porque o que eu notei foi que quando fechava a venda, não acionava a compra por algum motivo.

Fui em frente e fiz as mudanças necessárias...mas algo ainda parece estar errado. Não está demorando muito agora, e gera código de erro de bilhete inválido, e erro OrderClose 4051. Alguma sugestão sobre o que ainda está errado aqui?

O estranho é que, tanto no código anterior, como no atual (apenas para a venda), levou as negociações razoavelmente bem (se eu apenas a implementei em um gráfico).

Eu não pensei que isto teria sido tão difícil haha! Suponho que estava enganado quando pensei que era uma coisa muito simples e direta... comprar quando a vela cruza e abre acima de MA, fechar e vender quando a vela cruza e vai abaixo de MA.


if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if(BuyTicket==-1)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",MagicNumber,0,clrLimeGreen);
        }
        
      else
      if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
      {
      if(OrderCloseTime()==0)
      {
       if(Close[0]<PreviousSlow)
        {
          bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
          if(CloseTicket)
            BuyTicket=-1;
            }
         }
         else
            BuyTicket= -1;
            }
            
      if((iOpen(NULL,0,1)>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
        {
         if(SellTicket==-1)
            SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Entry EA",MagicNumber2,0,clrLimeGreen);
        }
      else
       if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
       {
         if(Close[0]>PreviousSlow)
        {
        bool  CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
              if(CloseSellTicket)
                  SellTicket=-1;
                     }
         }
         else
            SellTicket= -1;
            }
            
    return(0);
    return(0); 
    }
 

Sinto muito, mas realmente não sei o que você está tentando fazer.

if(OrderSelect(SELECT_BY_POS,MODE_TRADES))

Não seleciona nenhum pedido. O código sequer é compilado?

      if(OrderCloseTime()==0)
      {
       if(Close[0]<PreviousSlow)
        {
          bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
          if(CloseTicket)
            BuyTicket=-1;
            }
         }
         else
            BuyTicket= -1;

Aqui o outro se aplica se(OrderCloseTime()==0) for falso

       if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
       {
         if(Close[0]>PreviousSlow)
        {
        bool  CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
              if(CloseSellTicket)
                  SellTicket=-1;
                     }
         }
         else
            SellTicket= -1;

Aqui se aplica se a OrderSelect falhar, o que certamente faz

 
GumRai:

Sinto muito, mas realmente não sei o que você está tentando fazer.

Não seleciona nenhum pedido. O código sequer é compilado?

Aqui o outro se aplica se(OrderCloseTime()==0) for falso

Aqui se aplica se a OrderSelect falhar, o que certamente faz

Desculpe, a culpa é toda minha. Eu não li/aplicar corretamente suas sugestões; muito obrigado por indicá-las. Eu fiz isso corretamente aqui. Nenhum erro foi gerado no relatório. A única coisa é que agora, às vezes, está inserindo várias ordens de compra e venda, o que impede o fechamento de negócios no momento certo.

Editar: Para ser mais preciso, só se sai no SL e TP, não quando o preço cruza o outro lado do MA. Isto tem algo a ver com o bool?

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]
      if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if(BuyTicket==-1)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",MagicNumber,0,clrLimeGreen);
        }
      else
      if(OrderSelect(BuyTicket,MODE_TRADES))
      {
         if(OrderCloseTime()==0)
         {
          if(Close[0]<PreviousSlow)
           {
             bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
             if(CloseTicket)
               BuyTicket=-1;
               }
            }
            else
               BuyTicket= -1; //Order has closed so reset variable
               }
            
      if((iOpen(NULL,0,1)>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
        {
         if(SellTicket==-1)
            SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Entry EA",MagicNumber2,0,clrLimeGreen);
        }
      else
       if(OrderSelect(SellTicket,MODE_TRADES))
       {
         if(Close[0]>PreviousSlow)
        {
        bool CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
              if(CloseSellTicket)
                  SellTicket=-1;
                     }
         }
         else 
            SellTicket= -1; //Order has closed so reset variable
            }
    return(0);
    return(0); 
    }
 
if(OrderSelect(BuyTicket,MODE_TRADES))
Isto não seleciona uma profissão, por favor siga o exemplo que lhe dei e faça-o corretamente
 
GumRai:
Isto não seleciona uma profissão, por favor, siga o exemplo que lhe dei e faça-o corretamente

Eu me sinto... realmente estúpido. rs. Obrigado por achar isso!!

1) Faltam duas coisas...agora cria um código de erro de OrderClose 4108. Devo postar o código de novo? É o mesmo que o anterior com a correção que você havia declarado. Mas ele entra e sai conforme as regras.

2) E não entra curto imediatamente assim que fecha a posição longa, como mostrado na figura. A seta verde para baixo mostra onde ela deveria ter entrado em posição curta. Ela pegou uma compra, e a fechou com prejuízo uma vez que fechou abaixo do MA amarelo. Aqui, deveria ter entrado em posição curta. Como eu posso fazer um loop disto?

Muito obrigado, GumRai. Honestamente, eu não teria chegado a lugar nenhum tão perto sem sua ajuda.

deveria ter ficado curto aqui

 
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]
      if(BuyTicket==-1)
        {
         if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
           {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",MagicNumber,0,clrLimeGreen);
           }
        }
      else
      if(OrderSelect(BuyTicket,SELECT_BY_TICKET))
        {
         if(OrderCloseTime()==0)
           {
            if(Close[0]<PreviousSlow)
              {
               bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
               if(CloseTicket)
                  BuyTicket=-1;
              }
           }
         else
            BuyTicket=-1; //Order has closed so reset variable
        }

      if(SellTicket==-1)
        {
         if((iOpen(NULL,0,1)>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
           {
            SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Entry EA",MagicNumber2,0,clrLimeGreen);
           }
        }
      else
      if(OrderSelect(SellTicket,SELECT_BY_TICKET))
        {
         if(OrderCloseTime()==0)
           {
            if(Close[0]>PreviousSlow)
              {
               bool CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
               if(CloseSellTicket)
                  SellTicket=-1;
              }
           }
         else
            SellTicket=-1; //Order has closed so reset variable
        }
     }
   return(0);
  }

Pequena mudança, pois estava verificando o fechamento de um pedido quando não havia nenhum.

De acordo com o código, não há motivo para que uma venda seja aberta imediatamente, uma compra é fechada.

A condição para sair de uma compra não é a mesma que as condições para abrir uma venda .

Lembre-se que como você só está verificando na vela aberta, Fechar[0] será o valor da oferta do primeiro tick recebido para a vela.

 
GumRai:

Pequena mudança, pois estava verificando o fechamento de um pedido quando não havia nenhum.

De acordo com o código, não há motivo para que uma venda seja aberta imediatamente, uma compra é fechada.

A condição para sair de uma compra não é a mesma que as condições para abrir uma venda .

Lembre-se que como você só está verificando na vela aberta, Fechar[0] será o valor da oferta do primeiro tick recebido para a vela.

Santo! Você conseguiu! Obrigado mais uma vez e mais uma vez GumRai. Você é o melhor.

Não posso fazer o teste agora, mas uma vez que os mercados estejam abertos, acho que devo ser capaz de usar isto então, com os outros pares, desde que eu tenha magias diferentes na demonstração.

Razão: