[¡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 1085

 
khorosh:

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

La forma correcta es esta:


¡Otra vez te equivocas! El EA volverá a pitar en cada tick, porque Fun_New_Bar() siempre devolverá true. La pregunta es ¿por qué necesitamos Fun_New_Bar() si siempre devuelve true?
 
drknn:


Y no funcionará - debes haber escrito el programa incorrectamente. Y eso es porque no tienes ni idea de cómo funcionará tu propio código. Vamos a desglosarlo. El cuerpo del Asesor Experto:

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 por retorno 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.

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?


Prueba este código. Parece que funciona, pero a ver si está bien o mal. Si algo está mal, corríjalo:

//--------------------------------------------------------------------
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("Сформировался новый бар"); // Вывод на экран
}
}
//--------------------------------------------------------------------

 
kolyango:


Prueba este código. Parece que funciona, sólo hay que ver si está bien o mal:

No, no lo es - lo tengo todo explicado para ti. ¿No entiendes nada?
 

kolyango: Te mostraré el código correcto. Mira.

//+------------------------------------------------------------------+
//|                                                            0.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""

int MyChandle;// количество свеч на графике
//+------------------------------------------------------------------+
//|                  Блок инициализации                                |
//+------------------------------------------------------------------+
int init(){
  MyChandle=0;// ну или можно вот так : MyChandle=Bars;

  return(0);
}
//+------------------------------------------------------------------+
//|                  Блок деинициализации                              |
//+------------------------------------------------------------------+
int deinit(){
  if (!IsTesting()){
    Comment("");
    Print("Советник деинициализирован (выключен совсем)");
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Старт работы советника                            |
//+------------------------------------------------------------------+
int start(){
  if(MyChandle<Bars){
   Alert("Было свеч = ", MyChandle," Стало свеч = ",Bars);

   MyChandle=Bars;
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                       |
//+------------------------------------------------------------------+
 
drknn:
No, eso no es correcto - Tengo ese código todo deletreado para ti. ¿No entiendes nada?


Pero mira, ¡parece que funciona correctamente! Lo he comprobado en el marco temporal M1:

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);
}

 
kolyango:


Pero mira, ¡parece que funciona correctamente! Lo comprobé en el marco temporal M1:



Mira, puedes leer, o no - te lo dije arriba - no es el código correcto - señalará en cada tick, no una vez en una nueva vela. Ver arriba - Te he dado el código correcto. ¿Qué más no necesitas para ser feliz? ¿Para saber por qué su código es incorrecto? Ya lo he explicado, está mal porque todo el tiempo la subrutina devuelve true y sólo true. La alerta aparecerá en cada tic. La programación no es un juego de adivinanzas: hay que pensar.
 
drknn:

¡Otra vez te equivocas! El EA volverá a pitar en cada tick, ya que Fun_New_Bar() siempre devolverá true. La pregunta es ¿por qué demonios necesitamos Fun_New_Bar() si siempre devuelve true?
Funciona correctamente - lo he comprobado en el gráfico. Cuando
New_Time=Time[0]

функция Fun_New_Bar() не будет возвращать истину
 
drknn:

kolyango: Te mostraré el código correcto. Mira.

Y la variante que utiliza Bares es menos preferible, porque el valor de Bares puede cambiar no sólo por la aparición de una nueva barra.
 

drknn:
... Программирование - это не игра в угадайки - тут думать надо...

... Bueno, al menos a veces... :-)))

 
khorosh:
Y la variante que utiliza Bars es menos preferible, porque el valor de Bars puede cambiar no sólo por la aparición de una nueva barra.


Entonces, acláreme: ¿puede cambiar el número de velas en el gráfico en relación con algo más que la aparición de una nueva barra? :)))))

Oh, sí, eso es, la carga de la historia. :) De todos modos, su función será pitar en cada tictac - no recuerda la hora correctamente.

Razón de la queja: