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

 
evillive:

¿Por qué habría una variable adicional? La comprobación directa funciona bien:

Se debe crear una variable cuando se quiera ver el valor de una función desde diferentes puntos del programa, para no tener que llamarla varias veces.
La variable está pensada para facilitar la comprensión de un recién llegado. ¿Está claro ahora para qué sirve?
 
Vinin:
Vuelve a comprobarlo más a menudo. Habrá menos preguntas. Habrá un mejor conocimiento.
Ignora.
 

Buenas tardes. Necesito cerrar de alguna manera una posición al final del día (puramente Expert Advisor; barras diarias). La modelización se realiza por aperturas o por garrapatas. Es decir, o bien nos conformamos con las aperturas o damos tumbos tratando de analizar los días anteriores en algún marco temporal de 15 minutos y captar el principio y el final del actual. ¿Hay alguna solución a este problema? Veo varias opciones virtuales-hipotéticas:

1) Hacking: cerrar una posición a cualquier precio y en cualquier momento. Supongamos que es injusto, pero podríamos simplemente cerrar la posición al precio requerido sin perversión.

2) Para simular la apertura y el cierre dentro de una barra. Es decir, primero un tick de apertura y luego un tick de cierre.

3) Establecer una orden que se cierre automáticamente a una hora determinada (por ejemplo, al final del día).

Se agradecería cualquier ayuda. Gracias.

 

¿Un error?

int OnInit()
  {
   int subwindow = ChartWindowFind(ChartID(),WindowExpertName());
   Print("Подокно запрашиваемого индикатора: ",subwindow);
   
   return(INIT_SUCCEEDED);
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   return(rates_total);
  }


2015.04.13 20:51:10.710 indi AUDJPY,H1: Subtrama del indicador solicitado: -1


 
tuner:

¿Un error?


2015.04.13 20:51:10.710 indi AUDJPY,H1: Subtrama del indicador solicitado: -1


No, no es un error.

Valor de retorno.

Número de subventana en caso de éxito. El cero indica la ventana principal del gráfico. En caso de fallo devuelve -1.

 
AlexeyVik:

No, no es un error.


¿Cuál es el fallo si a la función se le pasa el ID del gráfico actual donde se está ejecutando el indicador y el nombre del indicador actual que se está ejecutando en el gráfico actual?
 
tuner:
¿Cuál es el fallo si la función pasa el ID del gráfico actual, en el que se está ejecutando el indicador, y el nombre del indicador actual que se está ejecutando en el gráfico actual?

Si te entiendo bien y necesitas el número de subventana en la que funciona el código de prueba de tu indicador adjunto, entonces, según la descripción de la función, es mejor aplicar su segunda versión.

Código de prueba (he añadido algunas líneas al tuyo):

#define  LINE    __LINE__,": "
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   int subwindow=ChartWindowFind(ChartID(),WindowExpertName());
   Print(LINE,"Подокно запрашиваемого индикатора: ",subwindow);
   
   int subwindow1=ChartWindowFind();
   Print(LINE,"Подокно запрашиваемого индикатора: ",subwindow1);

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   return(rates_total);
  }
//+------------------------------------------------------------------+

La ayuda de la función ChartWindowFind( ) tiene un buen ejemplo todavía sobre este tema (en términos de comentarios allí también):

//+------------------------------------------------------------------+
//| Сообщает номер окна графика с указанным индикатором              |
//+------------------------------------------------------------------+
int GetIndicatorSubWindowNumber(long chartID=0,string short_name="")
  {
   int window=-1;
//--- 
   if((ENUM_PROGRAM_TYPE)MQLInfoInteger(MQL_PROGRAM_TYPE)==PROGRAM_INDICATOR)
     {
      //--- функция вызвана из индикатора,имя не требуется
      window=ChartWindowFind();
     }
   else
     {
      //--- функция вызвана из эксперта или скрипта
      window=ChartWindowFind(0,short_name);
      if(window==-1) Print(__FUNCTION__+"(): Error = ",GetLastError());
     }
//---
   return(window);
  }
 
DiPach:

Si te entiendo bien y necesitas el número de subventana en la que funciona el código de prueba de tu indicador adjunto, entonces, según la descripción de la función, es mejor aplicar su segunda versión.

Código de prueba (he añadido algunas líneas al tuyo):

La ayuda de la función ChartWindowFind( ) tiene un buen ejemplo todavía sobre este tema (en términos de comentarios allí también):

Gracias por el consejo, pero tengo una tarea ligeramente diferente, debido a la cual el uso de la 2ª variante de la función no tiene sentido: quiero contar el número de indicadores con un nombre especificado en todos los gráficos abiertos de la terminal. La tarea ya está resuelta, pero quiero simplificar el código resultante utilizandoChartWindowFind() de la primera variante pero resulta que esta función no funciona no sólo con otras ventanas sino incluso con la actual.
 

¡Buenas noches!

No lo entiendo: en la función de inicio, el compilador exige "return" - la función debe devolver un valor".

¿Qué valor debe devolver en este caso?

int inicio()
{
si (¡Pedidos!=0||Ord > 0)
{
CritCloseBuy();
CritCloseSell();
}
si no
{
CritOpen();
}
return;
}

¿Podría ser esta la razón por la que OrderClose() no ve una posición abierta?

 
rapid_minus:

¡Buenas noches!

No lo entiendo: en la función de inicio, el compilador exige "return" - la función debe devolver un valor".

¿Qué valor debe devolver en este caso?

int inicio()

¿Puede ser esta la razón por la que OrderClose() no ve una posición abierta?

hacer void start() y no habrá error