Discusión sobre el artículo "Libro de Recetas MQL5: Analizar Propiedades de Posición en el Probador de Estrategias de MetaTrader 5"
Buenas noches, por favor ayúdenme, en la función ComprobarNuevaBarra la variable estática nueva_barra se pone a cero en la primera línea, y luego la lógica de la función se basa en si es igual a cero o no. Podrían por favor decirme donde no entiendo?!?!!!!
bool CheckNewBar() { //--- Variable para la hora actual de apertura de la barra static datetime new_bar=NULL; //--- Matriz para obtener la hora actual de apertura de la barra static datetime time_last_bar[1]={0}; //--- Obtener la hora de apertura de la barra actual // Si hubo un error al recibir, lo reportaremos if(CopyTime(_Symbol,Period(),0,1,time_last_bar)==-1) { Print(__FUNCTION__,": Error al copiar la hora de apertura del bar: "+IntegerToString(GetLastError())+""); } //--- Si esta es la primera llamada a una función if(new_bar==NULL) { // Ajustar la hora new_bar=time_last_bar[0]; Print(__FUNCTION__,": Inicialización ["+_Symbol+"][TF: "+TimeframeToString(Period())+"][" +TimeToString(time_last_bar[0],TIME_DATE|TIME_MINUTES|TIME_SECONDS)+"]"); return(false); // Devolver false y salir } //--- Si la hora es diferente if(new_bar!=time_last_bar[0]) { new_bar=time_last_bar[0]; // Ajustar la hora y salir return(true); // Recuerda la hora y devuelve true } //--- Llegamos a este punto - por lo que la barra no es nueva, devolvamos false return(false); }
Buenas noches, por favor ayúdenme, en la función ComprobarNuevaBarra la variable estática nueva_barra se pone a cero en la primera línea, y luego la lógica de la función se basa en si es igual a cero o no. Podrían por favor decirme donde no entiendo?!?!!!!
La ayuda dice:
Las variables locales declaradas con la palabra clave static conservan sus valores durante todo el tiempo de existencia de la función. En cada nueva llamada a la función dichas variables locales contienen los valores que tenían en la llamada anterior.
Es decir, en una nueva llamada de la función CheckNewBar(), la variable new_bar conservará el valor recibido en la anterior llamada de la función, pero en la primera línea se le asignará un nuevo valor NULL...... y luego no me queda claro por qué todo esto y cómo funciona. Por favor, disipar mi confusión, lo más probable es que estoy en algún lugar estúpido, pero DONDE ?????
Buenas noches, por favor ayúdenme, en la función ComprobarNuevaBarra la variable estática nueva_barra se pone a cero en la primera línea, y luego la lógica de la función se basa en si es igual a cero o no. Podrían por favor decirme donde no entiendo?!?!!!!
Si he entendido bien la Ayuda, en la líneastatic datetimenew_bar=NULL; " Si no se especifican los valores iniciales, las variables de la clase de memoria estática toman valores iniciales cero". Así que no debería haberse inicializado con null en absoluto y entonces la lógica sería impecable. ¿O no?
Si he entendido bien la Ayuda, la líneastatic datetimenew_bar=NULL; " Si no se especifican valores iniciales, las variables estáticas de clase de memoria toman valores iniciales nulos". Así que no debería haberse inicializado con null en absoluto y entonces la lógica sería impecable. ¿O no?
Las variables DEBEN inicializarse siempre. Es una ley no escrita. Quien no la cumple, tarde o temprano comete errores muy difíciles de encontrar :)
Cómo funciona una variable estática:
//+------------------------------------------------------------------+ //|Prueba EA.mq5 //|Copyright © 2018, Vladimir Karputov || //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2018, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.000" //+------------------------------------------------------------------+ //| Función de inicialización experta| //+------------------------------------------------------------------+ int OnInit() { //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Función de desinicialización experta| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Función tick experto| //+------------------------------------------------------------------+ void OnTick() { //--- trabajamos sólo en el momento del nacimiento de nuevo bar static datetime PrevBars=0; Print("PrevBars ",PrevBars); datetime time_0=iTime(Symbol(),Period(),0); if(time_0==PrevBars) return; PrevBars=time_0; Print("New bar. PrevBars ",PrevBars); } //+------------------------------------------------------------------+
Imprimir en la pestaña Expertos. La primera entrada a OnTick() es la inicialización de una variable estática, una nueva barra.
2018.01.08 00:00:00 PrevBars 1970.01.01 00:00:00 2018.01.08 00:00:00 New bar. PrevBars 2018.01.08 00:00:00 2018.01.08 00:00:30 PrevBars 2018.01.08 00:00:00 2018.01.08 00:00:59 PrevBars 2018.01.08 00:00:00 2018.01.08 00:01:00 PrevBars 2018.01.08 00:00:00 2018.01.08 00:01:00 New bar. PrevBars 2018.01.08 00:01:00 2018.01.08 00:01:30 PrevBars 2018.01.08 00:01:00 2018.01.08 00:02:00 PrevBars 2018.01.08 00:01:00
Las variables DEBEN inicializarse siempre. Esta es una ley no escrita. Quien no la cumple, tarde o temprano comete errores muy difíciles de encontrar :)
Cómo funciona una variable estática:
Impresión en la pestaña Expertos. La primera entrada a OnTick() es la inicialización de una variable estática, una nueva barra.
OK, lo tengo, gracias por la respuesta concisa y muy lúcida.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Artículo publicado Libro de Recetas MQL5: Analizar Propiedades de Posición en el Probador de Estrategias de MetaTrader 5:
En esta ocasión presentaremos una versión modificada del Asesor Experto del artículo anterior "MQL5 Cookbook: Position Properties on the Custom Info Panel" (“Propiedades de Posición en el Panel de Información Personalizada”). Algunos de los aspectos a los que nos referiremos incluyen la obtención de datos de barras, la comprobación de eventos de barra nueva en el símbolo actual, la inclusión de una clase de trading de la Biblioteca Estándar a un archivo, la creación de una función para buscar señales de trading, y una función para ejecutar operaciones de trading, así como para terminar eventos de trading en la función OnTrade().
Autor: Anatoli Kazharski