OrdemFechar não funciona - página 2

 
chuale:

Olá a todos,


Agora eu inseri bilhete e Lotes no OrderClose sem usar OrderTicket() e OrderLots() mas não fechou o pedido também. Por favor, ajude-me.



Há algumas coisas que você fez errado. Presumo que você queira que este EA trabalhe em pares JPY em M1 no período de tempo. Você quer fazer pedidos somente em bar novo e fechar pedidos somente em bar novo ou você quer entrar em bar novo e sair se as condições forem cumpridas? Eis o que eu penso:

Primeiro você conta os pedidos com OrdersTotal().

Em seguida, calcule suas variáveis

Se houver ordens no mercado, verifique se elas têm de ser fechadas

Se não houver ordens no mercado, verificar se as condições de entrada são atendidas.

Informe-me se você tiver alguma dúvida.

//+------------------------------------------------------------------+
//|                                                 chuale_test1.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.abc.com"
#property version   "1.00"
#property strict

extern double   TakeProfit=500;
extern double   Lots=0.1;
extern double   StopLoss=300;

double     bar1;
double     bar2;
double     bar3;
int        total,ticket;
datetime   previousTime;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

//---

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
   total=OrdersTotal();
/*
  counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
  IndicatorCounted() is actually for indicators not EA
  
   */

   bar1=(iClose(Symbol(),PERIOD_M1,2)-iClose(Symbol(),PERIOD_M1,3))*100;
   bar2=(iClose(Symbol(),PERIOD_M1,1)-iClose(Symbol(),PERIOD_M1,2))*100;
   bar3=(iClose(Symbol(),PERIOD_M1,0)-iClose(Symbol(),PERIOD_M1,1))*100;
   /*
   Comment("Bar1 = "+DoubleToString(bar1,Digits)+"\n"+
           "Bar2 = "+DoubleToString(bar2,Digits)+"\n"+
           "Bar3 = "+DoubleToString(bar3,Digits)+"\n"
           );
   */
//Close any orders if conditions are met
   if(total>0)
     {
      if(bar3<-1) OrderClose(ticket,OrderLots(),Bid,3,Green);
      if(bar3>1) OrderClose(ticket,OrderLots(),Ask,3,Red);
     }
   if(Time[0]==previousTime) return(0);         //EA will not go past this point unless it is a new bar
   previousTime=Time[0];                        // If it was a new bar , it's old now but continue to the end
// if no order open and new bar
   if(total<1)
     {
      if(bar2>1)// if condition met
        {
         //place buy order
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Chua EA",12345,0,Green);
         if(ticket<0)Print("Error OP_BUY order failed. error : "+GetLastError()); // if returned ticket is -1 OrderSent failed
         return(0);
        }
      // or if conditions for sell met
      if(bar2<-1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid+-TakeProfit*Point,"Chua EA",12345,0,Red);
         if(ticket<0)Print("Error OP_SELL order failed. error : "+GetLastError());
         return(0); //return to start
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
Arquivos anexados:
 
GumRai:


bilhete é uma variável local, portanto, no próximo tick, não terá o mesmo valor

Colocado fora das funções para torná-lo Globalscope

 
   total=OrdersTotal();

?????? ..... inútil

verifique corretamente quais os negócios que você tem

procurar o símbolo certo e o número mágico certo

com uma carteira de pedidos você pode então selecionar o comércio certo para fechar com

OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Green);

.

com seu método

você perde o valor do bilhete no momento em que reinicia seu pc, então

   if(total>0)
     {
      if(bar3<-1) OrderClose(ticket,OrderLots(),Bid,3,Green);
      if(bar3>1) OrderClose(ticket,OrderLots(),Ask,3,Red);
     }

falha .....

 
chuale:

Por que você citou meu post e depois não acrescentou nenhum comentário?
 
sim, pode fechar agora. obrigado GumRai. agora eu sei que o número do ticket continua mudando de acordo com os ticks, então como obter o número do ticket do pedido aberto? Eu tenho que.usar OrderTicket() certo?
 
chuale:
sim, pode fechar agora. obrigado GumRai. agora eu sei que o número do ticket continua mudando de acordo com os ticks, então como obter o número do ticket do pedido aberto? Eu tenho que.usar OrderTicket() certo?

Se você usar OrderTicket(), certifique-se de usar OrderSelect() primeiro e certifique-se também de que é o comércio que você deseja fechar.
 
chuale:
sim, pode fechar agora. obrigado GumRai. agora eu sei que o número do ticket continua mudando de acordo com os ticks, então como obter o número do ticket do pedido aberto? Eu tenho que.usar OrderTicket() certo?


Olá Chuale,

Esta é uma maneira fácil de selecionar seus pedidos e fechar os pedidos por símbolo e por número mágico :

//+------------------------------------------------------------------+
//|                                                 chuale_test1.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.abc.com"
#property version   "1.00"
#property strict

extern double   TakeProfit=500;
extern double   Lots=0.1;
extern double   StopLoss=300;
extern int      MagicNumber = 12345;
extern int      Slip  = 3;
double     bar1;
double     bar2;
double     bar3;
int        myTrades,ticket;
datetime   previousTime;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

//---

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
   myTrades = CountTrades();//Count trades function counts this EA trades only
//
   bar1=(iClose(Symbol(),PERIOD_M1,2)-iClose(Symbol(),PERIOD_M1,3))*100;
   bar2=(iClose(Symbol(),PERIOD_M1,1)-iClose(Symbol(),PERIOD_M1,2))*100;
   bar3=(iClose(Symbol(),PERIOD_M1,0)-iClose(Symbol(),PERIOD_M1,1))*100;

//Close any orders if conditions are met
   if(myTrades>0)
     {
      if(bar3<-1) CloseThisSymbolAll();
      if(bar3>1) CloseThisSymbolAll();
     }
   if(Time[0]==previousTime) return(0);         //EA will not go past this point unless it is a new bar
   previousTime=Time[0];                        // If it was a new bar , it's old now but continue to the end
// if no order open and new bar
   if(myTrades<1)
     {
      if(bar2>1)// if condition met
        {
         //place buy order
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Chua EA",MagicNumber,0,Green);
         if(ticket<0)Print("Error OP_BUY order failed. error : "+GetLastError()); // if returned ticket is -1 OrderSent failed
         return(0);
        }
      // or if conditions for sell met
      if(bar2<-1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid+-TakeProfit*Point,"Chua EA",MagicNumber,0,Red);
         if(ticket<0)Print("Error OP_SELL order failed. error : "+GetLastError());
         return(0); //return to start
        }
     }
   return(0);
  }
//========================================================================
int CountTrades()
{
int count=0;
int trade;
for(trade=OrdersTotal()-1;trade>=0;trade--)
   {
   OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
   if(OrderSymbol()!=Symbol() || OrderMagicNumber() != MagicNumber)
   continue;
   if(OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber)
   if(OrderType()==OP_SELL || OrderType()==OP_BUY)
   count++;
   }
return(count);
}
//========================================================================
void CloseThisSymbolAll()
  {
   int trade;
   for(trade=OrdersTotal();trade>=0;trade--)
     {
      OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()!=Symbol()) continue;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
        {
         if(OrderType()==OP_BUY)OrderClose(OrderTicket(),OrderLots(),Bid,Slip,Blue);
         if(OrderType()==OP_SELL)OrderClose(OrderTicket(),OrderLots(),Ask,Slip,Red);
        }
      //Sleep(1000);
     }
  }
//========================================================================
 
chuale:
sim, pode fechar agora. obrigado GumRai. agora eu sei que o número do ticket continua mudando de acordo com os ticks, então como obter o número do ticket da ordem aberta? Eu tenho que.usar OrderTicket() certo?


Olá novamente Chuale,

Eu estava brincando com sua idéia sobre USDJPY e não consegui obter resultados positivos sem algumas mudanças. Aqui está uma amostra dos meus resultados sobre USDJPY no gráfico M1 :

USDJPY na M1

Você pretendia usá-lo em um par diferente?

Saída em bar3 < -1 ou bar3 > 1 não retornou resultados positivos.

 
deVries:

?????? ..... inútil

verifique corretamente quais os negócios que você tem

procurar o símbolo certo e o número mágico certo

com uma carteira de pedidos você pode então selecionar o comércio certo para fechar com

.

com seu método

você perde o valor do bilhete no momento em que reinicia seu pc, então

falha .....


Se você quer dizer que não é a melhor maneira de fechar uma ordem, concordo, mas se o cara não quer usar OrderSelect (ou não sabe como) e não deixa nenhuma ordem em aberto no mercado, ele funciona.

Tentamos nos ajudar aqui e sua resposta não ajudou um pouco, você não lhe mostrou como usar a função Order Select e sua EA não está funcionando melhor agora devido a seu comentário.

Da próxima vez que você quiser ajudar, faça-o da maneira correta, coloque o código certo para que outros possam realmente aprender alguma coisa .

 
thrdel:


Há algumas coisas que você fez de errado. Presumo que você queira que esta EA trabalhe em pares JPY em M1 no período de tempo. Você quer colocar ordens somente em novos bares e fechar ordens somente em novos bares ou você quer entrar em novos bares e sair se as condições forem atendidas? Eis o que eu penso:

Primeiro você conta as ordens com OrdersTotal().

Em seguida, calcule suas variáveis

Se houver ordens no mercado, verifique se elas têm de ser fechadas

Se não houver ordens no mercado, verifique se as condições de entrada são atendidas.

Informe-me se você tiver alguma dúvida.

Razão: