[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 404

 
hoz:
1. Bueno, si llegaron nuevos datos, esto es lo que necesitamos, ¿no?
2. Bueno, sí, necesitamos datos de la barra 0, por supuesto. MarketInfo() extrae los datos de la barra cero, eso es todo. Entonces, ¿por qué compararlo con otra cosa?

3. aunque haya un agujero en la historia, no afectará a los cálculos actuales. Habría tenido un impacto en el momento en que el agujero estaba allí. ¡Es decir, si obtenemos la Ask actual, no nos importa realmente lo que eran los precios hace varias barras (me refiero no formalmente, sino en lo que se refiere al momento actual con respecto a una determinada variable de mercado, porque la función RefreshRates() hará el truco con respecto al momento actual en el tiempo en la barra 0-th!

Por supuesto, he profundizado, pero quiero entender cómo comportarme mejor.

4. Tú, Vadim, me has dicho que he escrito mal la función de arriba:

double fGet_TradePrice(int fi_price,       // Цена: 0 - Bid; 1 - Ask
                       string fs_symbol)   // валютная пара
{
 double ld_price = 0.0;
   
switch (fi_price)
 {
  case 0:
   {
    if (fs_symbol == Symbol())
     {
      RefreshRates(); // Зачем этот тормоз без обработки возвращаемого значения?
      ld_price = Bid;
     }
    else ld_price = MarketInfo(fs_symbol, MODE_BID); // <-- Этого достаточно.
   } 
  case 1:
   {
    if (fs_symbol == Symbol())
     {
      RefreshRates(); // Зачем этот тормоз без обработки возвращаемого значения?
      ld_price = Ask;
     }
    else ld_price = MarketInfo(fs_symbol, MODE_ASK); // <-- Этого достаточно.
   }
 }
if (ld_price != 0) return(ld_price); // Некорректно! Что функция будет возвращать, если цена равна нулю?
}

En su opinión, ¿qué tiene de malo?

1. ¿Si no hay datos, pero no sabemos nada al respecto? Devuelve FALSE. ¿Cómo debe evaluarse esto? ¿No hay datos o hay un error, o todavía hay datos?
2. Tienes que conciliar para resolver el problema del primer punto.
3. No se tiene en cuenta la dinámica del proceso. Encienda el ordenador, el terminal. Parece que todos los datos han llegado. Todo convergió en la barra de cero. Las señales se encuentran. El trato está hecho. Resulta que no llegaron todos los datos. 5 minutos después tenemos las barras que faltan con los números 1,2,3,4,5. La señal desapareció. ¿Qué hacer?

4. Lo he marcado en rojo. Todavía no se gestiona un posible error de elección de un identificador erróneo en el interruptor. Más arriba escribí cómo debe hacerse.

Es inútil llamar a RefreshRates() sin esperar el resultado. Puede fallar durante mucho tiempo.

 
Hola a todos. Tengo una pregunta de este tipo. Opero en varias cuentas (dos en una empresa de corretaje y una en otra), por lo que utilizo el copiador Best, es muy conveniente. Se instala en una cuenta (el exportador) en cualquier gráfico y se copia en otras cuentas (importadores), donde este EA también se instala en el mismo gráfico (si lo pones, en el importador, en varios gráficos, abrirá otras tantas órdenes). Una vez que quería comprobar el trabajo con él en una de las empresas de corretaje y establecer una cuenta de demostración), en un momento maravilloso se puso espontáneamente en varios gráficos y, por supuesto, abrió como muchas órdenes. Entonces no le presté mucha atención y pensé que era un fallo de este terminal de la empresa de corretaje. Luego operé durante mucho tiempo en las cuentas mencionadas anteriormente y no pasó nada de eso. Pero ayer justo durante el lanzamiento de la noticia tal situación ocurrió de nuevo en una de las cuentas (para otra empresa de corretaje, no la que tiene el exportador instalado). En 6 gráficos se colocaron automáticamente asesores y lo más interesante fue que se abrieron 16 órdenes en un símbolo. ¿Por qué ocurre esto y cuál es la razón? ¿Es una desventaja del propio Asesor Experto o alguna otra razón? ¿Hay alguna forma de arreglarlo? Gracias de antemano.
 
// Зачем этот тормоз без обработки возвращаемого значения?

¿Quién hace esa pregunta?
 
hoz:

En su opinión, ¿qué tiene de malo?


No está mal, sólo está embarrado.

Finalizando:

 if (ld_price != 0)
return (ld_price); 

Si ld_price = 0, la función devolverá 0 por sí misma. Por lo tanto, no es necesario realizar ninguna comprobación.

Esta es una avería:

 if (fs_symbol == Symbol())
         {
             RefreshRates();
             ld_price = Bid;
         }
         else
             ld_price = MarketInfo(fs_symbol, MODE_BID);

También es innecesario. Puede utilizar MraketInfo() en todos los casos.

Al final, la función se convierte en una función MarketInfo() pura (si se eliminan todas las cosas innecesarias).

 

En principio, teóricamente, estos son los lugares adecuados:

RefreshRates();
ld_price = Bid;
RefreshRates();
ld_price = Ask;

No nos importa lo que devuelva RefreshRates(), lo importante es que las variables Ask y Bid tengan los últimos valores conocidos por la terminal.

 

¡Hola!

¿A qué se deben los diferentes resultados del probador para el mismo EA?

El periodo probado, el par de divisas y el marco temporal son los mismos, pero los resultados obtenidos hoy son muy diferentes a los anteriores, el EA ha dejado de abrir posiciones largas.

Si la culpa es de las cotizaciones del terminal o es el fin de semana, no lo sé. ¿Quizás los entendidos puedan abrirme los ojos a la razón obvia?

 
skyjet:

¡Hola!

¿A qué se deben los diferentes resultados del probador para el mismo EA?

El periodo probado, el par de divisas y el marco temporal son los mismos, pero los resultados obtenidos hoy son muy diferentes a los anteriores, el EA ha dejado de abrir posiciones largas.

Si la culpa es de las cotizaciones del terminal o es el fin de semana, no lo sé. ¿Quizás los entendidos puedan abrirme los ojos a la razón obvia?


Incluso dos pruebas seguidas, una tras otra, pueden ser diferentes, y de forma muy notable. El broker cambia el spread y la prueba se hace con un spread diferente. Un cambio de un punto es suficiente.

Si hubo una prueba anterior hace mucho tiempo, tal vez los ajustes se hayan aflojado.

 
Zhunko:

1. ¿Si no hay datos y al mismo tiempo hay todos estos datos, pero no sabemos nada de ellos? Devuelve FALSE. ¿Cómo debe interpretarse esto? ¿No hay datos o hay un error, o hay datos?

No te entiendo. Vamos por orden... Llamamos a RefreshRates(), no llegaron datos... Pero hay datos. Lo que tenemos aquí es un desastre. Si los datos no llegaron, los datos no estarán disponibles o los datos no han sido actualizados porque la variable del mercado no ha cambiado... Sólo hay dos opciones.

Si devuelve TRU después de llamar aRefreshRates(), entonces los datos han sido actualizados. Y si devuelve FELS, entonces o no han actualizado, porque hay un error o no han actualizado, porque los datos son frescos y no necesitan ser actualizados.

Por lo tanto, entiendo que esto se puede ver de la siguiente manera:RefreshRates() comprueba los datos, si los datos no son nuevos, no actualiza aquellos datos que no son nuevos, es decir, que no han cambiado, y si son nuevos, los actualiza. Así que sólo puede confiar en la bandera devuelta porRefreshRates(). ¿Tiene alguna otra opción?

Zhunko:

2. Es necesario conciliar para resolver el problema del primer punto.

Tú lo has dicho:

Concilio los datos del servidor (MarketInfo()) con la barra cero. Esperando que sean los mismos.

Bueno MarketInfo() está tirando de la barra cero como es... ¿Qué quieres decir con lo anterior?

Zhunko:

3. No se tiene en cuenta la dinámica del proceso. Encendió el ordenador, el terminal. Parece que todos los datos han llegado. Todo convergió en la barra cero. Las señales se encuentran. El trato está hecho. Resulta que no llegaron todos los datos. 5 minutos después tenemos las barras que faltan con los números 1,2,3,4,5. La señal desapareció. ¿Qué hacer?

He decidido actualizarlo de nuevo. ¿Pero qué pasa si llamamos a RefreshRates() y actualiza los datos lentamente? Es decir, algunos de los cálculos se realizarán con algunos datos del mercado, y otros con otros datos... ¿Y entonces qué?

Zhunko:

4. Marcada en rojo. Además, no se gestiona un posible error de selección del identificador equivocado en el interruptor. He escrito más arriba cómo se debe manejar.

Es inútil llamar a RefreshRates() sin esperar el resultado. Puede fallar durante mucho tiempo.

Hm. Bueno, si lo esperamos, la cita puede cambiar... ¿Hay una vía de doble sentido aquí?

RefreshRates(); // ¿Por qué este freno sin procesar el valor de retorno?

Lo mencionas varias veces, pero todavía no hay nada concreto. Es decir, por mucho que vea que esta función se utiliza habitualmente, es justo antes del código donde se utilizan las variables de datos del mercado y ya está. Realmente no piensan en ello. Pero pensé en ello y decidí averiguar cómo hacerlo bien. Para saber con certeza que tal o cual enfoque es realmente correcto y que funcionará en todas las condiciones normales.

Entonces, Vadim, ¿qué quieres decir con esta expresión?

"

¿Por qué este freno sin procesar el valor de retorno?"

¿Cómo se pueden procesar? Escribí mi lógica arriba, pero no obtuve respuesta. Lo he descrito con bastante precisión y sin variantes.

 
Integer:


No está mal, sólo está embarrado.

Finalizando:

if (ld_price != 0)
    return (ld_price); 

Si ld_price = 0, la función devolverá 0 por sí misma. Por lo tanto, no es necesario realizar ninguna comprobación.

¿Por qué iba a hacerlo? Sólo hay que añadir else, para que la función devuelva algún otro valor, que significaría "Sin precio". Parece lógico. Cuando lancé la función, pensaba más en la lógica previa, luego no me fijé en su final. Y no entiendo por qué la función 0 devuelve 0 por sí misma...
Entero:


Ese es el desglose:

if (fs_symbol == Symbol())
{
    RefreshRates();
    ld_price = Bid;
}
else
    ld_price = MarketInfo(fs_symbol, MODE_BID);

Tampoco es necesario. Puede utilizar MraketInfo() en todos los casos.

Al final, la función se convierte en una función MarketInfo() pura (si se eliminan todas las cosas innecesarias).


Y entonces, ¿para qué preguntar (si hablamos específicamente del precio de compra), si siempre podemos usar MarketInfo(fs_symbol, MODE_ASK)? Al fin y al cabo, si lo miras así, remitiéndote a Ask, no puedes estar seguro de que sea preciso en este momento...
 
Integer:

No importa lo que devuelva la función RefreshRates(), lo importante es que las variables Ask y Bid tengan los últimos valores conocidos por la terminal.


Prácticamente, necesitamos algo más, por lo que entiendo. Y necesitamos el último servidor de Ask y Bid y no los terminales locales. ¿Verdad?

Por eso inicié una discusión aquí, para entender de una vez por todas cómo organizarlo de forma más lógica y correcta. Pues en teoría esto es correcto, pero en la práctica...