Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 78

 
Por favor, responda en orden de prioridad. Tengo un indicador que se muestra mediante un gráfico de barras. Al unirse o después de volver a conectarse muestra un valor de op-penny. He establecido la condición en el primer inicio para restablecer la celda 0 de la matriz. Y lo puse en inite - no ayudó. Lo he reiniciado en el arranque - ok. (Puse la condición al principio: if(GetLastError()==6)zas[0]=0.0; - no ayuda.
 
dikson1976-1:
Por favor, responda en orden de prioridad. Tengo un indicador que se muestra mediante un gráfico de barras. Al unirse o después de volver a conectarse muestra un valor de op-penny. He establecido la condición en el primer inicio para restablecer la celda 0 de la matriz. Y lo puse en inite - no ayudó. Lo he reiniciado en el arranque - ok. (Puse la condición al principio: if(GetLastError()==6)zas[0]=0.0; - no ayuda.

No puedo prescindir del código.
 

Dozol:



Intente revisar las órdenes en orden inverso.

 for(i=OrdersTotal()-1;i>=0;i--)
      {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         {
     // и тд
         }
       }
 
Lo manejé yo mismo. Tómatelo con calma. Gracias a todos.
 
Dozol:

Amigos, ayúdenme. Necesito cerrar todas las órdenes de un par de divisas seleccionado. Esto es lo que escribí (parte del código de EA):

int Zakrit_vse() ...

Utiliza el SRC para pegar el código en el foro

Lo pegaré aquí, tal vez encuentren algo interesante para ustedes:

int Zakrit_vse()
{  
if (OrdersTotal()>0)
{  for (int i=OrdersTotal()-1; i>=0; i--)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderSymbol()!=Symbol()) continue;
      
         //--- Close pending orders
         if (OrderType()==OP_BUYLIMIT  ||
             OrderType()==OP_BUYSTOP   ||
             OrderType()==OP_SELLLIMIT ||
             OrderType()==OP_SELLSTOP)         
         {  
            OrderDelete(OrderTicket(),CLR_NONE)
            Prov_oshibok();
            return(0);
         }
         
         //--- Close opened position BUY
         if (OrderType()==OP_BUY)
         {
            RefreshRates();
            OrderClose(OrderTicket(),OrderLots(),Bid,100,CLR_NONE);
            Prov_oshibok();
            return(0);
         }
         //--- Close opened position SELL
         if (OrderType()==OP_SELL)
         {
            RefreshRates();
            OrderClose(OrderTicket(),OrderLots(),Ask,100,CLR_NONE);
            Prov_oshibok();
            return(0);
         }
}  }  }
}
 
Dozol:

Amigos, ayúdenme. Necesito cerrar todas las órdenes en un par de divisas seleccionado. Esto es lo que he escrito (parte del código del EA):


Por qué reinventar la rueda cuando ya se ha inventado todo antes. Por ejemplo. No olvides esto.
 

¡Ayuda! Tengo un código para un indicador de canal externo (cuando se alcanza el límite superior del canal, la operación se abre para vender - se cierra cuando se alcanza el límite inferior, para comprar en orden inverso). Por razones desconocidas, no abre las operaciones, no encuentro el error. Funciona perfectamente con otro indicador de canal. Me gustaría especificar de inmediato que todos los búferes están ajustados.

Se adjunta el código.

extern double Lots = 0.1;
extern string Comentario = "TMA Canal2";
external int Beneficio = 20;
extern int StopLoss = 20;
extern int Deslizamiento = 2; // deslizamiento
extern int Magia = 124;

cadena externa Indi = "Datos del indicador";
extern string TimeFrame = " marcotemporal actual;
extern int TMAPeriod = 56;
extern int Precio = PRICE_CLOSE;
extern double ATRMultiplier = 2.0;
extern intTRPeriod = 100;
extern double TrendThreshold = 0,5;
extern bool ShowCenterLine = false;

doble PriceHigh, PriceLow, SL, TP;
int ticket;

//+------------------------------------------------------------------+
//| función de inicialización de expertos |
//+------------------------------------------------------------------+
int init()
{
if (Digits ==3 || Digits ==3) // para un corredor de cinco dígitos
{
TakeProfit *= 10;
StopLoss *= 10;
Deslizamiento *= 10;
}
return(0);
}

//+------------------------------------------------------------------+
//| Calcular las posiciones abiertas |
//+------------------------------------------------------------------+
int CalcularPedidosActualizados(símbolo de cadena)
{
int compras=0,ventas=0;
//----
for(int i=0;i<TotalPedidos();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==124)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) vende++;
}
}
//---- volumen de pedidos de devolución
if(compras>0) return(compras);
Si no es así, return(-sells);
}

//+------------------------------------------------------------------+
//| Comprueba las condiciones de las órdenes abiertas |
//+------------------------------------------------------------------+
void CheckForOpen()
{
doble PrecioAlto, PrecioBajo;
int ticket;
//---- ir a negociar sólo para los primeros tics de la nueva barra
if(Volumen[0]>1) return;

PriceHigh = iCustom (Symbol(), 0, "TMALine", TimeFrame, TMAPeriod, Price, ATRMultiplier, ATRPeriod, TrendThreshold, ShowCenterLine, 1, 0);
PriceLow = iCustom (Symbol(), 0, "TMALine", TimeFrame, TMAPeriod, Price, ATRMultiplier, ATRPeriod, TrendThreshold, ShowCenterLine, 2, 0);


if(Open[1]>PriceHigh || Close[1]>PriceHigh | High[1]>PriceHigh && Ask<=PriceHigh)

{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0, "TMA Canal2",124,0,Red);
volver;
}
//---- comprar condiciones
if(Open[1]<PriceLow | Close[1]<PriceLow | Low[1]<PriceLow && Bid>=PriceLow)

{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0, "TMA Canal2",124,0,Blue);
volver;
}
//----
}
//+------------------------------------------------------------------+
//| Comprueba las condiciones de cierre de la orden |
//+------------------------------------------------------------------+
void CheckForClose()
{
doble PrecioAlto, PrecioBajo;
//---- ir a negociar sólo para los primeros tics de la nueva barra
if(Volumen[0]>1) return;

PriceHigh = iCustom (Symbol(), 0, "TMALine", TimeFrame, TMAPeriod, Price, ATRMultiplier, ATRPeriod, TrendThreshold, ShowCenterLine, 1, 0);
PriceLow = iCustom (Symbol(), 0, "TMALine", TimeFrame, TMAPeriod, Price, ATRMultiplier, ATRPeriod, TrendThreshold, ShowCenterLine, 2, 0);

for(int i=0;i<TotalPedidos();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=124 | OrderSymbol()!=Symbol()) continuar;
//---- comprobar el tipo de orden
if(OrderType()==OP_BUY)
{
if(Open[1]>PriceHigh || Close[1]>PriceHigh | High[1]>PriceHigh) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
romper;
}
if(OrderType()==OP_SELL)
{
if(Open[1]<PriceLow | Close[1]<PriceLow | Low[1]<PriceLow) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
romper;
}
}
//----
}

//+------------------------------------------------------------------+
//| Función de inicio |
//+------------------------------------------------------------------+
void start()
{
//---- comprobar el historial y el comercio
if(Bars<100 || IsTradeAllowed()==false) return;
//---- calcular las órdenes abiertas por el símbolo actual
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
//----
}
//+------------------------------------------------------------------+

 
ZahvatkiN:

Soy nuevo en mql4, sé cómo trabajar con SL y TP, pero tengo un problema cuando necesito cerrar órdenes por señal de contador del indicador. No entiendo bien cómo funciona la función OrderSelect(). Sé que para buscar una orden se utiliza un ciclo, está en el código, pero en el proceso de negociación resulta que la orden se acaba de abrir e inmediatamente se cierra, porque las condiciones de apertura de una compra coinciden con las condiciones de cierre de una venta y cómo explicarlo que esto no debe hacer no lo entiendo.

El botón SRC se utiliza para pegar el código.

Tal y como lo has escrito, ¡haz también añadidos utilizando la Documentación!

Si ha copiado, póngase en contacto con el autor para que lo revise o para trabajar.

 


Añadiré una vez más. Cuántas veces te he dicho que uses el botón de la línea superior para insertar el código

Y es conveniente ceñirse a los estilos de escritura de código.... Deseable, pero no imprescindible. Pero la mayoría de la gente es más propensa a responder con un código fácil de entender.

 

Soy nuevo en mql4, sé cómo trabajar con SL y TP, pero tengo un problema cuando necesito cerrar órdenes por una señal de indicador inverso. no tengo idea de cómo funciona OrderSelect(). Sé que el bucle sirve para buscar órdenes, está en el código, pero en el proceso de negociación resulta que la orden se acaba de abrir e inmediatamente se cierra, porque las condiciones de apertura de una compra coinciden con las condiciones de cierre de la venta y cómo explicarlo que esto no debe hacer no lo entiendo, por favor explíquelo.

borilunad gracias por el consejo, rehecho, luego también puedes borrar ese mensaje con la cita para no saturar.

if(buy1sOpen())
         {
         OrderSend(Symbol(), OP_BUY, lots, Ask, Slippage, 0, 0, "", magic, 0, Blue);
         }
      if(sell1sOpen()) 
         {
         OrderSend(Symbol(), OP_SELL, lots, Bid, Slippage, 0, 0, "", magic, 0, Red);
         }
         
      for(int i=0; i<OrdersTotal(); i++)
         {
         OrderSelect(i,SELECT_BY_POS);
         if(buy1sClose()) 
           {
           OrderClose(i, lots, Ask, Slippage, Blue);
           }
         if(sell1sClose()) 
           {
           OrderClose(i, lots, Bid, Slippage, Red);
           }
         }
         
      }
   }
bool buy1sOpen()
   {
   Sm1=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_MAIN,1);
   Ss1=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_SIGNAL,1);
   Sm2=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_MAIN,2);
   Ss2=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_SIGNAL,2);
   if(Sm1>Ss1 && Sm2<Ss2 && Sm1<30)
      return(true);
      return(false);
   }
bool sell1sOpen()
   {
   Sm1=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_MAIN,1);
   Ss1=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_SIGNAL,1);
   Sm2=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_MAIN,2);
   Ss2=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_SIGNAL,2);
   if(Sm1<Ss1 && Sm2>Ss2 && Sm1>70)
      return(true);
      return(false);
   }
bool buy1sClose()
   {
   Sm1=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_MAIN,1);
   Ss1=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_SIGNAL,1);
   Sm2=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_MAIN,2);
   Ss2=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_SIGNAL,2);
   if(Sm1<Ss1 && Sm2>Ss2 && Sm1>70)
      return(true);
      return(false);
   }
bool sell1sClose()
   {
   Sm1=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_MAIN,1);
   Ss1=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_SIGNAL,1);
   Sm2=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_MAIN,2);
   Ss2=iStochastic(NULL,0,13,5,5,MODE_SMA,0,MODE_SIGNAL,2);
   if(Sm1>Ss1 && Sm2<Ss2 && Sm1<30)
      return(true);
      return(false);
   }
Razón de la queja: