OrderClose no funciona - página 2

 
chuale:

Hola a todos,


Ahora inserto el ticket y los lotes en el OrderClose sin usar OrderTicket() y OrderLots() pero tampoco cierra la orden. Por favor, ayuda.



Hay un par de cosas que has hecho mal. Asumo que quiere que este EA trabaje en pares JPY en el marco de tiempo M1. ¿Quiere colocar órdenes sólo en la nueva barra y cerrar órdenes sólo en la nueva barra o quiere entrar en la nueva barra y salir si se cumplen las condiciones? Esto es lo que pienso:

Primero cuenta las órdenes con OrdersTotal().

Luego calcula tus variables

Si hay órdenes en el mercado comprueba si tienen que ser cerradas

Si no hay órdenes en el mercado, comprueba si se cumplen las condiciones de entrada.

Hazme saber si tienes alguna pregunta.

//+------------------------------------------------------------------+
//|                                                 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);
  }
//+------------------------------------------------------------------+
Archivos adjuntos:
 
GumRai:


El ticket es una variable local, por lo que la próxima vez no tendrá el mismo valor

Poner fuera de las funciones para hacerlo Globalscope

 
   total=OrdersTotal();

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

comprueba correctamente qué oficios tienes

busque el símbolo correcto y el número mágico correcto

con un bucle de orden puede seleccionar la operación correcta para cerrarla

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

.

con tu método

pierdes el valor del ticket en el momento en que reinicias tu PC así que

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

falla .....

 
chuale:

¿Por qué has citado mi post y luego no has añadido ningún comentario?
 
Gracias GumRai. Ahora sé que el número de ticket sigue cambiando según los ticks, así que ¿cómo obtener el número de ticket de la orden abierta? ¿Tengo que usar OrderTicket()?
 
chuale:
Gracias GumRai. Ahora sé que el número de ticket sigue cambiando según los ticks, así que ¿cómo obtener el número de ticket de la orden abierta? ¿Tengo que utilizar OrderTicket()?

Si usas OrderTicket() entonces asegúrate de usar OrderSelect() primero y también asegúrate de que es la operación que quieres cerrar.
 
chuale:
Gracias GumRai. Ahora sé que el número de ticket sigue cambiando de acuerdo a los ticks, así que ¿cómo obtener el número de ticket de la orden abierta? Tengo que usar OrderTicket() ¿verdad?


Hola Chuale,

Aquí hay una manera fácil de seleccionar sus órdenes y cerrar las órdenes por símbolo y 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:
Ahora sé que el número de ticket cambia según los ticks, así que ¿cómo obtener el número de ticket de la orden abierta? ¿Tengo que usar OrderTicket()?


Hola de nuevo Chuale,

Estuve jugando con tu idea en el USDJPY y no pude obtener resultados positivos sin algunos cambios.Aquí hay una muestra de mis resultados en el USDJPY en el gráfico M1 :

USDJPY en M1

¿Intentó utilizarlo en un par diferente?

La salida en la barra3 < -1 o en la barra3 > 1 no dio resultados positivos.

 
deVries:

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

comprueba correctamente qué oficios tienes

busque el símbolo correcto y el número mágico correcto

con un bucle de orden puede seleccionar la operación correcta para cerrarla

.

con tu método

pierdes el valor del ticket en el momento en que reinicias tu PC así que

falla .....


Si te refieres a que no es la mejor manera de cerrar una orden estoy de acuerdo pero si el tipo no quiere usar OrderSelect (o no sabe cómo) y no deja ninguna orden abierta en el mercado funciona.

Aquí tratamos de ayudarnos mutuamente y tu respuesta no ha servido de nada, no le has enseñado a usar la función Order Select y su EA no funciona mejor ahora debido a tu comentario.

La próxima vez que quieras ayudar, hazlo de la manera correcta, pon el código correcto para que otros puedan aprender algo.

 
thrdel:


Hay un par de cosas que hiciste mal. Asumo que quiere que este EA trabaje en pares JPY en el marco de tiempo M1. ¿Quiere colocar órdenes sólo en la nueva barra y cerrar órdenes sólo en la nueva barra o quiere entrar en la nueva barra y salir si se cumplen las condiciones? Esto es lo que pienso:

Primero cuenta los pedidos con OrdersTotal().

Luego calcula tus variables

Si hay órdenes en el mercado comprueba si tienen que ser cerradas

Si no hay órdenes en el mercado, comprueba si se cumplen las condiciones de entrada.

Hazme saber si tienes alguna duda.