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

 

¡Hola camaradas!

MT5 tiene unas herramientas maravillosas y muy útiles "Impulse Elliott Wave" y "correcting Elliott Wave".

La pregunta es: ¿Puedo integrar estas herramientas de MT5 en MT4?

Opero en MT4. No es muy conveniente pasar a MT5 para el análisis.

O bien: ¿Cuáles son las otras formas de resolver el problema?

 
Buenas tardes, el lenguaje tiene un parámetro de mercado como MarketInfo(Symbol(), MODE_TICKVALUE). ¿Puede describir en términos generales cómo se calcula este valor?
 
mql_writer:
Buenas tardes, el lenguaje tiene un parámetro de mercado como MarketInfo(Symbol(), MODE_TICKVALUE). ¿Puede describir en términos generales cómo se calcula este valor?

¡Este es el valor del cambio mínimo de precio (1 pip) en la divisa del depósito a 1,00 de lote! El cálculo es muy fácil: 1,00(lote)/1,36030(cotización actual del euro) = 0,7351 en euros.
 
borilunad:

¡Este es el valor de la variación mínima del precio (1 pip) en la moneda de depósito a 1,00 de lote! Calculado de forma muy sencilla: 1,00(lote)/1,36030(cotización actual del euro) = 0,7351 en euros.

Excepto que una solicitud a través de marketinfo devuelve de alguna manera 10 para todos los pares excepto los pares de yenes ))))


¿De dónde has sacado esta fórmula?

 
evillive:

excepto que una consulta a través de marketinfo devuelve de alguna manera 10 para todos los pares excepto los pares de yenes ))))


¿De dónde has sacado esta fórmula?


Hago todas las fórmulas yo mismo y ahora lo tomé de mi carta.

Y este es de Doki:

MODE_TICKVALUE.

16

Tamaño del cambio mínimo del precio del símbolo en la moneda del depósito

Los cálculos no se comparten.

 
borilunad:


Hago todas las fórmulas yo mismo y ahora las he obtenido de mi carta.

Y esto es de los muelles:

MODE_TICKVALUE

16

Tamaño de la variación mínima del precio del instrumento en la moneda del depósito

Los cálculos no se comparten.


Aunque para un lote de 1 eurodólar 1 pip cuesta realmente 10 dólares, así que está bien.

Y los cálculos no deben compartirse sólo con quienes se avergüenzan de mostrarlos.

Sí, en este caso la fórmula debería ser correcta - MODE_TICKVALUE = MODE_LOTSIZE * MODE_TICKSIZE - para el euro, la fórmula para los cruces y el yen es un poco diferente

 
Top2n:


Para ser sincero, no he descubierto cómo aplicarlo. Falta un milímetro, es una pena parar cuando está casi terminado.

Tarea, no escribir el precio en el array si el objeto tiempo(2º parámetro+3600seg>actual)||(1º parámetro tiempo - 2º parámetro tiempo)<3600seg )

¿Por qué emular un error?

Un error es la señal de que, por alguna razón relacionada con las limitaciones/fallas del sistema, el algoritmo no pudo ejecutarse y obtener un resultado con algunas garantías (naturalmente limitadas, pero - ). La función FillAndPrint() muestra de forma elocuente lo que significa una situación de error y lo que no. Cuando se produce un error, ni siquiera intenta imprimir el resultado. Si no hay ningún error, el resultado es fiable. Así es como debe construirse la lógica "error/no error".

Pero aquí tenemos que modificar el algoritmo: también tenemos que aplicar un filtro adicional.

Así que hay que hacerlo:

/******************************************************************************/
bool AddValueIfFiltered(double &array[], const string name) {
#define MIN_SECS_BETWEEN_PRICE1_AND_PRICE2 3600
#define MAX_SECS_AFTER_PRICE2              3600

  const datetime dt1 = (datetime)ObjectGet(name, OBJPROP_TIME1);
  const datetime dt2 = (datetime)ObjectGet(name, OBJPROP_TIME2);
  const datetime dt = TimeCurrent();

  Print("name = ", name, ", dt = ", dt, ", dt1 = ", dt1, ", dt2 = ", dt2);

  if (dt <= dt2 + MAX_SECS_AFTER_PRICE2 && dt1 + MIN_SECS_BETWEEN_PRICE1_AND_PRICE2 <= dt2) { // Фильтруем, прежде чем попытаться добавить
    if (!AddValue(array, ObjectGetValueByShift(name, 1))) { // Пытаемся добавить
      return false; // Ошибка, значение не добавлено
    }
  }

  return true; // Нет ошибки, значение, если удовлетворило условию фильтра, добавлено к массиву
}

/******************************************************************************/
bool AddValueIfFound(double &array[], const string name) {
  const int type = ObjectType(name);

  if (type == OBJ_TREND) {
    switch ((color)ObjectGet(name, OBJPROP_COLOR)) { // Тип color допустимо использовать в switch
    case Goldenrod:
    case Gainsboro:
    case White:
      if (!AddValueIfFiltered(array, name)) { // Пропускаем через фильтр
        return false;
      }
    }
  }

  return true; // Нет ошибки, значение, если найдено, добавлено к массиву
}

Primero "filtramos" por tipos de objetos y parámetros, seleccionando sólo los objetos que necesitamos de entre todos los disponibles, y luego aplicamos un filtro adicional. Es más o menos como lo haría una persona. Eso es lo que haría una persona, ¿no?

Para cada una de estas pequeñas subtareas, necesitamos una función distinta.

Los números no deben estar en las expresiones, excepto en casos muy especiales, por ejemplo, si es necesario duplicar, y esta duplicación está en la naturaleza del algoritmo. Entonces el número 2 se puede utilizar directamente en las expresiones. Y en otros casos muy raros.

En otros casos, se debe utilizar la mnemotecnia. En primer lugar, mejoran en gran medida la comprensión de lo que ocurre en un lugar determinado y, por tanto, ayudan a reducir la probabilidad de cometer un error. Y en segundo lugar, el valor en sí se establece en un solo lugar y es fácil cambiarlo si es necesario, y será imposible cometer un error en comparación con el caso en el que el número se utiliza repetidamente en el algoritmo, y sin utilizar mnemotécnicos tienen que corregir los números en varios lugares del algoritmo.

Resultado de la carrera:

02:08:46 Script 2 EURUSDm,H1: loaded successfully
02:08:46 2 EURUSDm,H1: initialized
02:08:46 2 EURUSDm,H1: Sell:
02:08:46 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06.24 22:09:02, dt1 = 2014.06.24 10:00:00, dt2 = 2014.06.24 17:00:00
02:08:46 2 EURUSDm,H1: Найдено объектов: 0
02:08:46 2 EURUSDm,H1: Buy:
02:08:46 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06.24 22:09:02, dt1 = 2014.06.23 09:00:00, dt2 = 2014.06.24 16:00:00
02:08:46 2 EURUSDm,H1: Найдено объектов: 0
02:08:46 2 EURUSDm,H1: uninit reason 0
02:08:46 Script 2 EURUSDm,H1: removed

No se encuentra ni un solo objeto. Aumente los valores de ambas mnemotecnias 10 veces hasta llegar a 36000 (10 horas), y ejecute de nuevo:

02:09:03 Script 2 EURUSDm,H1: loaded successfully
02:09:03 2 EURUSDm,H1: initialized
02:09:03 2 EURUSDm,H1: Sell:
02:09:03 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06.24 22:09:14, dt1 = 2014.06.24 10:00:00, dt2 = 2014.06.24 17:00:00
02:09:03 2 EURUSDm,H1: Найдено объектов: 0
02:09:03 2 EURUSDm,H1: Buy:
02:09:03 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06.24 22:09:14, dt1 = 2014.06.23 09:00:00, dt2 = 2014.06.24 16:00:00
02:09:03 2 EURUSDm,H1: Найдено объектов: 1
02:09:03 2 EURUSDm,H1: Price[0] = 1.35869
02:09:03 2 EURUSDm,H1: uninit reason 0
02:09:03 Script 2 EURUSDm,H1: removed

Una tendencia ya ha "pasado" el filtro. Ahora restauramos el valor del primer mnemónico a 3600 y ejecutamos:

02:09:12 Script 2 EURUSDm,H1: loaded successfully
02:09:12 2 EURUSDm,H1: initialized
02:09:12 2 EURUSDm,H1: Sell:
02:09:12 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06.24 22:09:26, dt1 = 2014.06.24 10:00:00, dt2 = 2014.06.24 17:00:00
02:09:12 2 EURUSDm,H1: Найдено объектов: 1
02:09:12 2 EURUSDm,H1: Price[0] = 1.36152
02:09:12 2 EURUSDm,H1: Buy:
02:09:12 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06.24 22:09:26, dt1 = 2014.06.23 09:00:00, dt2 = 2014.06.24 16:00:00
02:09:12 2 EURUSDm,H1: Найдено объектов: 1
02:09:12 2 EURUSDm,H1: Price[0] = 1.35869
02:09:12 2 EURUSDm,H1: uninit reason 0
02:09:12 Script 2 EURUSDm,H1: removed

Podemos ver que ahora ambas líneas de tendencia han "pasado" el filtro. Por cierto, recomiendo depurar todas las ramas (partes) del programa de tal manera, no sólo una rama.

Para ayudarte a formalizarlo de alguna manera, intentaré explicarlo de esta manera. Un programa es aparentemente como un plan.

Cada elemento principal del plan puede desglosarse en elementos de un subplan más pequeño. Los más pequeños en otros aún más pequeños. Los puntos de los subplanes más pequeños se ejecutan directamente.

Cada plano, subplano e incluso los puntos de los subplanos más pequeños corresponden a funciones del programa. Los elementos de los subplanos más pequeños corresponden a funciones "finales" que sólo llaman a funciones del sistema, o incluso no las llaman en absoluto, por ejemplo, AddValue() o DiffInSecs() son ejemplos en la discusión anterior. Los elementos del subplano de arriba corresponden a las funciones que llaman a las funciones que implementan los elementos del subplano de abajo. En las comentadas anteriormente, son MassTrendNumber(), AddValueIfFound(), AddValueIfFiltered(). Las funciones de "bajo nivel" no deben llamar a funciones de "alto nivel", y las funciones de "alto nivel" básicamente no deben saltar varios niveles hacia abajo, es decir, sólo deben llamar a funciones básicamente del nivel inferior. Esta norma es mucho más estricta para los "niveles bajos" que para los "niveles altos".

Intenta construir tus programas organizando las acciones en ellos como funciones (cortas) enlazadas por este tipo de estructura de árbol, en el sentido de quién llama a quién.

Este programa tiene un árbol degenerado: una rama que se "ramifica" varias veces. Y se "ramifica" no en dos pequeñas ramas sino en una. Pero se puede ver el punto de que las funciones de "alto nivel" llaman sistemáticamente a las de "bajo nivel". En esta modificación, he insertado un nivel más en esta estructura, otra "rama no ramificada" - AddValueIfFiltered().

 
Perdón por no haber visto el hilo enseguida.
https://www.mql5.com/ru/forum/152102 Tengo una pregunta
 
borilunad:

¡Todo es correcto! Con una cotización de 4 dígitos siempre era 1, y conuna cotización de 5 dígitos ahora es 10, porque hay 10 veces más pips (y menos profundos). Y el valor de un tick mínimo debe calcularse a partir del precio actual.

Ahora tengo 4 dígitos, en ewardollar a 1 lote 1 punto cuesta 10 dólares y siempre ha sido así. Para los cruces el coste será de 8 a 16, la fórmula es un poco más complicada allí.

Por ejemplo, para la libra euro marketinfo ha devuelto 16,984, el tipo de cambio libra-dólar = 1,6984, es decir, 1 pip de la libra euro vale 1 libra, multiplicado por el valor en puntos de la libra-dólar, que siempre es 10,0 (100000 * 0,0001 = 10,0 o 100000 * 0,00010 = 10,0 - lo que uno quiera).


Todos estos cálculos son correctos sólo si su cuenta está en dólares:

En este caso, para xUSD (EURUSD, GBPUSD, etc.) tickvalue = lote*punto = 100000*0,0001 = 10,0

para USDx (USDCHF, USDJPY etc) tickvalue = lote*punto/Oferta = 100000*0.01/101.93 = 9.8107

para xUSD/yUSD (EURGBP) tickvalue = Bid(yUSD)*lot*point = 1.6980*100000*0.0001 = 16.98

para los cruces xUSD/USDy (EURJPY) tickvalue = lote*punto/Bid(USDy) = 100000*0.01/101.91=9.8126

 
evillive:

Ahora tengo 4 dígitos, en ewardollar a 1 lote 1 punto cuesta 10 dólares y siempre ha sido así. Para los cruces el coste será de 8 a 16, la fórmula es un poco más complicada allí.

Por ejemplo, para la libra euro marketinfo ha devuelto 16,984, el tipo de cambio del evodólar = 1,3604, el tipo de cambio libra-dólar = 1,6984, es decir, 1 pip de la libra euro vale 1 libra, multiplicado por el valor en puntos de la libra-dólar, que siempre es 10,0 (100000*0,0001 = 10,0 o 100000*0,00010 = 10,0 - lo que uno quiera).




El mío es sencillo y práctico. Y en el momento en que había una cotización de 4 dígitos, todavía no había escrito programas, así que no puedo juzgar. :)

¡Buenas noches!