[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 1084

 
khorosh:

Sería más exacto decirlo así:



Eso es aún más cierto y ahora funciona:

//--------------------------------------------------------------------
int start() // Спец. функция start
{
if(Fun_New_Bar())//проверка наличия нового бара
return; // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
Alert("Сформировался новый бар"); // Вывод на экран
}
}
//--------------------------------------------------------------------

 
Y por cierto, ¿por qué resalto el código como código cuando escribo un comentario y es del mismo color? ¿O debo resaltarlo como qué, para que parezca un código real en color?
 
kolyango:

Lo he probado en M1 y el mensaje no aparece tras la formación de la siguiente barra. ¿Significa esto que no funciona?


Y no funcionará: no has escrito el programa correctamente. Eso es porque no tienes ni idea de cómo funcionará tu propio código. Vamos a desglosarlo. Cuerpo de asesores expertos:

int start(){ // Спец. функция start
  if(Fun_New_Bar()){ //проверка наличия нового бара
    Alert("Сформировался новый бар"); // Вывод на экран
  }
  return(0); // Выход из start()
}

Llega un nuevo tick y se llama a la función Fun_New_Bar(). Si devuelve true al programa principal, aparecerá una Alerta. En caso contrario, el EA finaliza su trabajo con un retornado y espera un nuevo tick. Todo se repite en un nuevo tic.

¿Dice que el código no funciona? Ahora mira lo que tienes en tu subprograma.

bool Fun_New_Bar(){ // Ф-ия обнаружения нового бара
  static datetime New_Time=0; // Время текущего бара
  bool New_Bar=false; // Нового бара нет
  if(New_Time!=Time[0]){ // Сравниваем время
    New_Time=Time[0]; // Теперь время такое
    New_Bar=true; // Поймался новый бар
  }
}

Se declara una función booleana. Como es una función y no un procedimiento, debe devolver algo al programa principal desde el que se llama. Como la función es booleana, debería devolver un valor booleano. ¿Dónde tienes una cadena que devuelva algo al programa principal? Esto significa que al inicio del programa, dado que no se devuelve nada de la función, los paréntesis de la expresión if(Fun_New_Bar()) siempre serán falsos y la alerta nunca aparecerá.

Vayamos más allá. ¿Por qué has declarado datetime New_Time=0; como estático? ¿Cuál es su razonamiento? Has declarado una variable e inmediatamente la has inicializado con cero. En el siguiente tick, ocurrirá lo mismo: la variable será declarada e inicializada por cero de nuevo. If(New_Time!=Time[0]){ Esta línea comprueba si el valor de la variable no es igual a la hora actual. Bueno, sí, la variable tiene cero, pero el tiempo actual no es cero. La condición se cumple, el valor del tiempo actual se escribe en la variable, el parámetro New_Bar se convierte en verdadero. En el siguiente tick , Nueva_Hora no será igual a Hora[0] de nuevo , volverá a comprobar con éxito la desigualdad y se ejecutarán las dos operaciones siguientes. En otras palabras, al comprobar la condición if(New_Time!=Time[0]), la expresión entre paréntesis será verdadera en cada tick. SIEMPRE. Lo que nos lleva a preguntarnos, si siempre es cierto, ¿por qué demonios debería estar este cheque aquí? ¿Tal vez deberíamos eliminarlo? ¿Por qué debemos asignar New_Time=Time[0] y New_Bar=true, si estas dos variables no se utilizan en ninguna parte? ¿Por qué demonios necesitamos estas dos asignaciones? ¿Quieres jugar? ¿O es que te da pereza pensar?

 

¿Cómo puedo hacer que una variable global esté disponible para un EA que se ejecuta en un segundo terminal MT4 que se está ejecutando?

 
DhP:

¿Cómo puedo hacer que una variable global esté disponible para un EA que se ejecuta en un segundo terminal MT4 que se está ejecutando?


A través de una api, o a través de un documento de texto.
 
drknn:

A través de una api, o a través de un documento de texto.

¿Cómo?
 
DhP:

¿Cómo?

A través de la api no sé cómo - he leído que es posible. A través de un documento de texto - es necesario escribir una dll en un lenguaje diferente a MQL4. Por ejemplo, en Delphi o C++. La dll tiene que ser capaz de acceder al archivo situado fuera del terminal. Es bastante factible. Más adelante, todo está claro: el Asesor Experto introduce un nuevo valor de la variable global en un documento de texto, y el otro Asesor Experto lo lee desde allí. La DLL da acceso al documento de texto a ambos Asesores Expertos. Estas preguntas ya se han planteado aquí. La gente ha preguntado algo así como cómo hacer que los EAs trabajen juntos en dos canales diferentes...
 
kolyango:

Eso es aún más cierto y funciona ahora:

No lo hace - su Alerta le avisará en cada tic, no una vez en el primer tic de una nueva vela.
 
kolyango:



Esto es aún más correcto y ahora funciona:

//--------------------------------------------------------------------
int start() // Спец. функция start
{
if(Fun_New_Bar())//проверка наличия нового бара
return; // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
Alert("Сформировался новый бар"); // Вывод на экран
}
}
//--------------------------------------------------------------------


La función no es mía, la adquirí en Internet pero no la he utilizado. Ahora lo he mirado bien: falta un operador.

Esta es la forma correcta de hacerlo:

int start() // Спец. функция start
{
 if(Fun_New_Bar())//проверка наличия нового бара
   {
    Alert("Сформировался новый бар"); // Вывод на экран
   }
return(0); // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{                  // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
}
return(New_Bar);
}
 
drknn:

A través de una api no sé cómo - he leído que es posible. A través de un documento de texto - es necesario escribir un dll en un lenguaje diferente a MQL4. Por ejemplo, en Delphi o C++. La dll tiene que ser capaz de acceder al archivo situado fuera del terminal. Es bastante factible. Más adelante, todo está claro: el Asesor Experto introduce un nuevo valor de la variable global en un documento de texto, y el otro Asesor Experto lo lee desde allí. La DLL da acceso al documento de texto a ambos Asesores Expertos. Estas preguntas ya se han planteado aquí. La gente preguntaba algo así como cómo hacer que los EA funcionen juntos en dos canales diferentes...

Gracias, lo buscaré...
Razón de la queja: