Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 31

 
Alternativamente, aconsejar cómo escribir esta función de eliminación en esta condición.
 
spoiltboy:
Alternativamente, dígame cómo escribir esta función de borrado en esta condición.

debe definir primero el ticket de la orden pendiente que se va a eliminar

si el ticket es nulo o indefinido - entonces no lo elimine

 
spoiltboy:

Esto es para diferentes órdenes. La función de eliminar uno por una condición, eliminar el otro sin una condición.

La pregunta es por qué en mi caso la función de borrado funciona correctamente sin una condición, pero si la pongo con una condición, genera un error cuando se produce la condición.

La condición debe ser corregida, no se puede hacer sin la condición, los registros ocuparán todo el disco duro
 
Renat Akhtyamov:

debe definir primero el ticketD y el ticketUP que se va a eliminar

Si el billete es nulo o indefinido, no se borra

Así se define, un ticketD, el otroticketUP .

¿O estoy confundiendo algo?

 
spoiltboy:

Así se define, un ticketD, el otroticketUP .

¿O estoy confundiendo algo?

¿Cómo se puede definir siticketUP ya está borrado?

Lo has borrado, actualiza ticketUP al estado que necesitas, en el que la condición de borrar el ticketUP no funcionará, y esta condición debe ser añadida al código también

 
Renat Akhtyamov:

¿Cómo se puede definir siel ticketUP ya ha sido eliminado?

Lo has borrado, actualiza ticketUP al estado que necesitas, en el cual la condición para borrar el ticket no funcionará, y esta condición también debe ser añadida al código.

Así, los pedidos conticketD, otroticketUP se crean primero (según la condición de ausencia), y después ya se borran.

if(BuyLimitCount()==0&& BuyCount()==0){
slB=NormalizeDouble(minpr1-puntosl*Punto,5);
tpB=NormalizeDouble(minpr1+puntostp*Punto,5);
int ticketUP=OrderSend(Symbol(),OP_BUYLIMIT, lotB, minpr1,3, slB, tpB,"", MagicB,0, Red);
if(ticketUP==-1)Print("ERROR OP_BUY"); elsePrint("OP_BUY OK");}

if(SellLimitCount()==0&& SellCount() ==0){
slS=NormalizeDouble(maxpr1+puntosl*Punto,5);
tpS=NormalizeDouble(maxpr1-puntostp*Punto,5);
int ticketD=OrderSend(Symbol(), ¡OP_SELLLIMIT, lotS, maxpr1,3, slS, tpS,"", MagicS,0, Blue);
if(ticketD==-1)Print("ERROR OP_SELL"); elsePrint("OP_SELL OK");}

if(x!=maxpr1){x=maxpr1;OrderDelete(ticketD);}

OrderDelete(ticketUP);

Si estoy confundido, ¿qué?

 
spoiltboy:

Así, primero se crean los pedidos conticketD, otroticketUP(según la condición de ausencia), y luego se borran.

if(BuyLimitCount()==0&& BuyCount()==0){
slB=NormalizarDoble(minpr1-puntosl*Punto,5);
tpB=NormalizarDoble(minpr1+puntotp*Punto,5);
int ticketUP=OrderSend(Symbol(),OP_BUYLIMIT, lotB, minpr1,3, slB, tpB,"", MagicB,0, Red);
if(ticketUP==-1)Print("ERROR OP_BUY"); elsePrint("OP_BUY OK");}

if(SellLimitCount()==0&& SellCount() ==0){
slS=NormalizarDoble(maxpr1+puntosl*Punto,5);
tpS=NormalizarDoble(maxpr1+puntosl*Punto,5);
int ticketD=OrderSend(Symbol(),OP_SELLLIMIT, lotS, maxpr1,3, slS, tpS,"", MagicS,0, Blue);
if(ticketD==-1)Print("ERROR OP_SELL"); elsePrint("OP_SELL OK");}

if(x!=maxpr1){x=maxpr1;OrderDelete(ticketD);}

OrderDelete(ticketUP);

¿Si confundo qué?

De nuevo tienes una orden sin condición:

OrderDelete(ticketUP);

¿Por qué no has cambiado el código?

Tómate un tiempo para "pensar" al menos y ordenarlo + leer lo que has escrito, los consejos que te han dado.

Por cierto, aquí hay trabajo independiente , si no puedes...

 
Renat Akhtyamov:

Así que de nuevo tienes una orden sin una condición:

OrderDelete(ticketUP);

¿Por qué no has cambiado el código?

Tómate un tiempo para "pensar" al menos y resolverlo + leer lo que te han escrito, los consejos que te han dado.

Por cierto, aquí hay trabajo por cuenta propia si no funciona...

Sin condición, porque así es como se produce la eliminación, y con condición, no. Así que escribió para indicar que no puedo. Puedes escribirlo de esta manera:

OrderDelete(ticketD);

OrderDelete(ticketUP);

Entonces cada tick borra las órdenes ya creadas en cada tick (según la condición de ausencia). Y si lo escribimos con la condición

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}

Entonces, cuando se produce la condición, escribe un error de borrado.

¿Cómo escribo la eliminación de los pedidos especificados en esta condición?

 
spoiltboy:

Es sin condición, porque así es como funciona el borrado, pero con condición no. Lo escribí así para señalar lo que no puedo hacer. Si lo escribes de esta manera:

OrderDelete(ticketD);

OrderDelete(ticketUP);

Entonces cada tick borra las órdenes ya creadas en cada tick (según la condición de ausencia). Y si lo escribimos con la condición

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}

Entonces, cuando se produce la condición, escribe un error de borrado.

¿Cómo debemos escribir la condición al borrar los pedidos especificados?


No se puede eliminar la condición para borrar los pedidos.

ticketUP y ticketD deben escribirse en las variables globales al abrir un ticket

GlobalVariableSet("ticketUP",ticketUP);

GlobalVariableSet("ticketD",ticketD);

y leer desde allí antes de borrar un ticket pendiente

ticketUP=GlobalVariableGet("ticketUP")

ticketD=GlobalVariableGet("ticketD")

Por cierto, mira allí (en global) - lo que tienes, lo que billete está escrito

Creo que después de eso todo funcionará como debería

 
Hola! Quien puede ayudar a resolver el problema, estoy escribiendo un viper para un array dinámico, aquí está el código de la clase:
class CArray
{  
private:
   template <typename T>
   T _array[];
   int _index;
   int _err;
   int _err_sys;
public:
   CArray(){_index = -1; _err = 0; _err_sys = 0;}
   ~CArray(){}
  // template <typename T>
   T operator[](int i){
      if((_index == -1) || (i < 0) || (i > _index)) {_err_sys = -1;}
      return (_array[i]);
   }
   T at(int i){  
      if((_index == -1) || (i < 0) || (i > _index)) {_err_sys = -1;}
      return (_array[i]);
   }
   void push_back(T value){
      _array[++_index] = value;
   }
};

parte del código del programa:

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

#include "Array.mqh"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
CArray *array;


int OnInit()
  {
  int b = 1;
   array = new CArray();
   array.push_back(b);
   int a = array.at(0);
  
//---
   return(INIT_SUCCEEDED);
  }
...

Tras intentar ejecutar el Asesor Experto con datos reales, se produce el siguiente error: error interno #-1005

¿Qué hago mal? Gracias de antemano.