OrderClose no funciona - página 5

 
Gracias GumRai
 

Hola,


Adjunto el EA a algunos gráficos de divisas diferentes. El EA abrirá muchas órdenes en un solo gráfico si se cumplen las condiciones. ¿Qué codificación para asegurar sólo una orden por gráfico?

 
chuale:

Hola,


Adjunto el EA a algunos gráficos de divisas diferentes. El EA abrirá muchas órdenes en un solo gráfico si se cumplen las condiciones. ¿Qué codificación para asegurar sólo una orden por gráfico?


Haga un bucle a través de las órdenes abiertas y compruebe el número mágico y el símbolo.

Si ya hay una orden abierta, no abra más.

PS. Deberías haber iniciado un nuevo hilo, ya que tu pregunta no está relacionada de ninguna manera con el título del hilo :)

 
chuale:

Hola thrdel,

¿Se refiere Time[0] al tiempo de la barra 0? ¿Existe Time[1], Time [2], etc.? He intentado buscar en Google pero no hay mucha información en Internet. Además, si adjunto este EA a dos pares de divisas, ¿significa que OrderSelect sólo selecciona las órdenes en el propio gráfico o todas las órdenes en el terminal?




Time[0] es el tiempo en que la barra actual ha comenzado. Sí, Time[1] es la hora en que comenzó la barra anterior y así sucesivamente.

Si desea ejecutar el mismo EA en más de un gráfico, debe asegurarse de que la variable "MagicMunber" sea diferente para cada EA, incluso si tiene el mismo símbolo en diferentes gráficos.

Entonces los EAs no interferirán con las órdenes de los demás.

OrderSelect() no obtiene el valor del gráfico sino del servidor.

La información sobre su cuenta y órdenes se almacena en el servidor y es por eso que cuando usted apaga su computadora, su orden stop o tp se sigue ejecutando.

 
chuale:

Hola thrdel,


¿Por qué recibo este mensaje de advertencia "conversión implícita de 'número' a 'cadena' postin forum.mq4 69 61" para la codificación " if(ticket<0)Print("Error OP_BUY order failed, error: "+GetLastError());"?


Si quieres mostrar una variable doble con Comment() o si quieres imprimir con Print(), tienes que convertirla a cadena con la función DoubleToString().

Para las variables int la conversión es obvia por lo que si no usas IntToString () para hacerlo, seguirá compilando y funcionando ya que es tan obvio.

 
chuale:

Hola,


Adjunto EA a algunos gráficos de divisas diferentes. El EA abrirá muchas órdenes en un solo gráfico si se cumplen las condiciones. ¿Qué codificación para asegurar sólo una orden por gráfico?


Hola Chuale,

He hecho un par de cambios a su EA para que funcione.

MagicNumber es una variable que tiene que asegurarse de que es diferente en cada gráfico.

Si quieres que te explique por qué y cómo funcionan los cambios, envíame un mensaje y estaré encantado de ayudarte si puedo.

Puedes hacer algunas pruebas tú mismo y ver cómo funciona, yo lo probé en el USDJPY.

La variable Max y Min están reemplazando el valor 1 y -1 en su condición para que pueda optimizar y ver si otros valores funcionan mejor .


if(bar2 <-1) //changed to 
if(bar2 < Min
if(bar2 > 1) //changed to 
if(bar2 > Max

¿Sabes cómo optimizar los parámetros?

Si usted tiene alguna pregunta hágamelo saber o pm.

Aquí está el código:

//+------------------------------------------------------------------+
//|                                                 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=150;
extern double   Lots=0.1;
extern double   StopLoss=300;
extern int      Max = 6;
extern int      Min = -9;
extern int      MagicNumber = 12345;
extern int      Slip  = 3;
double     bar1;
double     bar2;
double     bar3;
double     bar3max,bar3min;
int        myTrades,ticket;
datetime   previousTime;
int        xMultiply;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

//---
if(Digits==3) xMultiply=100;
if(Digits==5) xMultiply=10000;
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
 
   myTrades = CountTrades();
//
   bar1=(iClose(Symbol(),0,2)-iClose(Symbol(),0,3))*xMultiply;
   bar2=(iClose(Symbol(),0,1)-iClose(Symbol(),0,2))*xMultiply;
   bar3=(iClose(Symbol(),0,0)-iClose(Symbol(),0,1))*xMultiply;
   //
   if(myTrades>0)
     {
      if(bar3<Min) CloseThisSymbolAll("OP_BUY");
      if(bar3>Max) CloseThisSymbolAll("OP_SELL");
     }
  //
   if(Time[0]==previousTime) return(0);    
   previousTime=Time[0];          
   //
   if(myTrades<1)
     {
      if(bar2>1)
        {
         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()); 
         return(0);
        }
      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(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(string direction)
  {
  string dir = direction;
   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 && dir == "OP_BUY")OrderClose(OrderTicket(),OrderLots(),Bid,Slip,Blue);
         if(OrderType()==OP_SELL&& dir == "OP_SELL")OrderClose(OrderTicket(),OrderLots(),Ask,Slip,Red);
        }
     }
  }
//========================================================================
 

Hola thrdel,


Muchas gracias. Eres muy amable y útil. Voy a ir a través de su codificación en primer lugar. Gracias de nuevo.

 

Hola Thrdel,

Eso significa que tengo que probar con diferentes valores de Max y Min para cada backtest con el fin de determinar cuál es el valor más optimun?

Gracias