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

 
Craft:


Anatoly, muchas gracias, es una pena que no se pueda insertar un icono aquí, como en Skype con un lazo. Todo es sencillo y elegante. Entiendo por la comunicación con otros programas de análisis técnico que debería ser así, pero aún estoy sin práctica en el trabajo con mql. Gracias por el consejo de marcar en el método - lo resolveré.

Para mi último consejo ¿cómo evitar la colocación de múltiples órdenes en una barra por este EA? Ya he recibido consejos de personas amables pero no han servido de nada.

He intentado resolver tu problema y esto es lo que he obtenido. Pero lo primero es lo primero.

¿Quién es culpable y qué hacer? O de dónde vienen las piernas...

En su Asesor Experto, se utilizan diferentes configuraciones del indicador C CI para abrir una posición (y respectivamente, para cerrar la anterior). Tienes diferentes configuraciones para comprar y diferentes configuraciones para vender. Por lo que he entendido, este es el truco. Por ejemplo, en las tendencias alcistas, es más rentable utilizar configuraciones menos sensibles a la compra, para permitir que los beneficios "crezcan" (es decir, tiene sentido mantener la posición (es decir, tiene sentido mantener una posición en una tendencia durante más tiempo). Mientras que la venta (tendencia alcista) requiere una configuración más sensible para permitir una entrada/salida rápida, por ejemplo, cuando se trata de atrapar una corrección (y por lo tanto permanecer en el mercado con una posición contra tendencia durante menos tiempo). Todo es muy lógico y la idea tiene sentido, pero hay un punto sutil sobre este sistema - ¿qué hacer si dos señales opuestas se producen simultáneamente debido a las diferencias en la configuración (de hecho, para el terminal son dos indicadores)?

Sobre las flechas azules...

El Asesor Experto en una barra recibe una señal de compra y de venta al mismo tiempo, y como escribí arriba, cuando se abre una posición se debe cerrar la opuesta. En este caso, se da la señal de compra y se cierra la señal de venta, porque no hay venta en el momento en que se da la señal de compra, el asesor abre la COMPRA. En el siguiente tick, se genera la señal contraria, de venta, y por tanto se cierra la compra recién abierta. Otra observación, ¿has notado que sólo la compra (muchas flechas azules) se "tambalea"? La implementación de los métodos de compra/venta, por lo que entendí, está tomada del tutorial, pero hay una característica, que después de la finalización de la operación, la salida del método start() por el operador return, es decir, para un tick sólo puede haber una apertura/cierre. Así, cuando obtengo una "señal doble", se cierran todas las operaciones (primero se describe el cierre del bloque ), luego se bloquea la apertura de las operaciones, y en ella se describe primero la compra!!!, y después de la compra, se sale de start(), para que al asesor no le dé tiempo a llegar a las ventas :))) y hace un bucle hasta que obtiene una orden simple "normal".

Sobre los métodos de solución...

Hay varias formas de resolver este problema.
1. El de toda la vida.
Para empezar puedes "matar" la idea, y simplemente establecer los mismos parámetros para las compras y las ventas y el problema desaparecerá por sí solo.

2. Complicado.
El algoritmo para determinar la tendencia principal debe ser escrito en el Asesor Experto, y, en consecuencia, se deben establecer diferentes "pesos" de las operaciones. Por lo tanto, cuando llegan señales opuestas, se debe dar preferencia a la que tiene un mayor "peso" (es decir, la que es tendencial).

3. sin título.
Cuando se reciben señales multidireccionales...
No hacer nada.

if(Opn_B && Opn_S)return;

Esta es exactamente la opción que aparece en el archivo adjunto.
Espero haber explicado todo con claridad.
Buena suerte :)))

Archivos adjuntos:
11_3_1.mq4  13 kb
 

El post de Volfram ha sido borrado por multiplicarse en varios hilos.

Volfram, ha creado su propio hilo específicamente para este propósito. Ya te han contestado; ¿no es suficiente?

P.D. Déjame contarte un secreto, Volfram: la ausencia de interés evidente en tu idea sugiere implícitamente que no es digna de atención. En consecuencia, nadie estaba dispuesto a aplicarlo "a cambio de una cuota".

 
ToLik_SRGV:

2. Complicado.
Deberíamos integrar el algoritmo de determinación de la tendencia principal en el Asesor Experto y dar diferentes "pesos" a las operaciones en consecuencia. Por lo tanto, cuando llegan señales opuestas, se debe dar preferencia a la que tiene un mayor "peso" (es decir, la que es tendencial).

3. sin título.
Al recibir señales dirigidas de forma diferente...
No hacer nada.

Esta es exactamente la opción en el archivo adjunto a continuación.
Espero haber explicado todo con claridad.
Buena suerte :)))

Puedo añadir mi hito también... :)

También empecé con un libro de texto. Puede hacerlo más sencillo: basta con eliminar el cierre de compra en una señal de venta y el cierre de venta en una señal de compra, es decir, no utilizar el swing trading, que se implementó en el tutorial de Sergey Kovalev... El seguimiento de las posiciones no debe ser realizado por el billete, sino por el mago. Al principio lo hice y probé mis ideas en silencio. Luego he escrito mis propias funciones para el trabajo...

ZS. No he mirado el código, así que podría estar equivocado sobre este EA...

 

No sé cómo encontrar el extremo de una función

Tengo un array de datos que almacena valores:

cómo encontrar las fracturas - extremas utilizando una matriz de datos de 250 elementos y almacenar sólo los números de los elementos donde se encuentran estos extremos

 

Chicos, tengo esta pregunta:

La función de detección de la tendencia establece explícitamente que si la CA de la primera barra es mayor que la CA de la segunda barra (es decir, que aumenta), pero la tendencia es bajista (otros índices se muestran a la baja), entonces en este caso devuelve cero, es decir, no hay tendencia bajista... Pero el EA se obstina en ignorarlo, ¿cuál puede ser la razón?


La función de la inversión de la tendencia:

int Trend_BBOsMA (string sy, int tf)
{
   if (sy=="" || sy=="0") sy=Symbol();
double
   BB    =iCustom(sy,tf,"BB_MA",13,13,0,1),
   OsMA  =iOsMA  (sy,tf,9,21,5,PRICE_CLOSE,1),
   AC1   =iAC(sy,tf,1),
   AC2   =iAC(sy,tf,2),
   AC3   =iAC(sy,tf,3);
   
   if (BB>0 && OsMA>0 && AC1>AC2) return(1);
   if (BB<0 && OsMA<0 && AC1<AC2) return(-1);
   else return(0);
}

Comprobación de las acciones de apertura (al principio, comprobación de la tendencia, a la que no reacciona: trH1 y trM15 ) - más experimentos con las condiciones, no importa, pero el código funciona...

//============================================================================================== 
   // Доливка 1
//==============================================================================================  
//------------------------- Покупка 1 ------------------------   
   if (AddPose1 &&
         trH1==1 &&                  // Если часовой и 
         trM15==1 &&                 // пятнадцатиминутный тренды восходящие
         Mom5_1>Mom5_2 &&              // найден разворот
         Mom5_2<=Mom5_3 &&             // Моментума
//         Mom5_2<=100.0 &&
//         DeM5_1<=0.6 &&                  // и Демаркер в зоне перепроданности
//         AC1>AC2 &&                    // Ускорение вверх ----------------------- ВОТ ЗДЕСЬ УБРАЛ
         SecondsAfterOpenLastPos(NULL, OP_BUY, 511)>=4*60
      )
         {
            Magic=511;          // Задаём магик... 
            Lots=GetSizeLot();
            divider=1;
//            if (trH1==10 || trM15==10) divider=2;
            Lots_New=NormalizeLot(Lots/divider, true, NULL);
            New_Comm="Buy_M5_Стратегия_1_Доливка1";   // Задаём комментарий для позиции
            OpenPosition(NULL, OP_BUY, Lots_New, 0, 0, Magic, New_Comm);
         }
//------------------------- Продажа 1 ------------------------   
   if (AddPose1 && 
         trH1==-1 &&                 // Если часовой и 
         trM15==-1 &&                // пятнадцатиминутный тренды нисходящие
         Mom5_1<Mom5_2 &&              // найден разворот
         Mom5_2>=Mom5_3 &&             // Моментума
//         Mom5_2>=100.0 &&
//         DeM5_1>=0.4 &&                  // и Демаркер в зоне перекупленности
//         AC1<AC2 &&                    // Ускорение вниз ------------------------ ВОТ ЗДЕСЬ УБРАЛ
         SecondsAfterOpenLastPos(NULL, OP_SELL, 511)>=4*60
      )
         {
            Magic=511;          // Задаём магик... 
            Lots=GetSizeLot();
            divider=1;
//            if (trH1==-10 || trM15==-10) divider=2;
            Lots_New=NormalizeLot(Lots/divider, true, NULL);
            New_Comm="Sell_M5_Стратегия_1_Доливка1";   // Задаём комментарий для позиции
            OpenPosition(NULL,OP_SELL,Lots_New,0,0,Magic,New_Comm);
         }
//==============================================================================================

¿Tal vez alguien vea algo que yo no pueda ver? Gracias.

 
La captura de pantalla no muestra el indicador BB_MA. Y no hay comprobaciones de la dirección de la tendencia en el código superior. La variable BB siempre contendrá un valor. Según tengo entendido, el indicador BB_MA es una media móvil. Para determinar la dirección de la media móvil hay que tener 2 valores en diferentes velas, por ejemplo en la primera y segunda vela y comparar estos valores entre sí. Por lo tanto, podemos decir que el código superior realiza su tarea sólo parcialmente.
 
IgorM:

No sé cómo encontrar el extremo de una función

Tengo un array de datos que almacena valores:

cómo encontrar las fracturas - extremas utilizando una matriz de datos de 250 elementos y almacenar sólo los números de los elementos donde se encuentran estos extremos


Creamos un bucle en el que recorremos los valores del array. Comparamos el valor de la celda anterior del array con el valor de la celda actual. Si es mayor, se pasa a la siguiente iteración del bucle. En resumen, continuamos el bucle mientras se incremente el valor de cada celda posterior del array. En cuanto el valor es menor que el anterior, almacenamos el número de la celda anterior en una matriz pre-declarada, porque se ha producido una ruptura de la tendencia - hemos encontrado el pico. Ahora la tendencia es a la baja. Ahora ejecutamos la búsqueda hasta que en la siguiente celda encontremos un valor mayor que el anterior. Una vez que esto ocurre, el número de la celda anterior se almacena en una matriz predefinida, porque se ha producido una inversión de la tendencia: hemos encontrado el fondo de la depresión. Puedes poner números en diferentes matrices, para filtrar los picos de las caídas. En resumen, después de recorrer todos los valores de la matriz, obtenemos datos ordenados (buscando los números de las celdas en una/dos otras matrices)
 
drknn:

Establecemos un bucle, en el que recorremos los valores del array. Comparamos el valor de la celda anterior del array con el valor de la celda actual. Si es mayor, se pasa a la siguiente iteración del bucle. En resumen, continuamos el bucle mientras se incremente el valor de cada celda posterior del array. En cuanto el valor es menor que el anterior, almacenamos el número de la celda anterior en una matriz pre-declarada, porque se ha producido una ruptura de la tendencia - hemos encontrado el pico. Ahora la tendencia es a la baja. Ahora ejecutamos la búsqueda hasta que en la siguiente celda se encuentre un valor mayor que el anterior. Una vez que esto ocurre, el número de la celda anterior se almacena en una matriz predefinida, porque se ha producido una inversión de la tendencia: hemos encontrado el fondo de la depresión. Puedes poner números en diferentes matrices, para filtrar los picos de las caídas. En definitiva, tras recorrer todos los valores del array, obtendremos datos ordenados (números de celdas en uno/dos otros arrays)

sí, así que tenemos que tratar mientras - que es hasta el primer pico, y luego ........ - No puedo entenderlo.
 
drknn:
La captura de pantalla no muestra el indicador BB_MA. Y no hay comprobaciones de la dirección de la tendencia en el código superior. La variable BB siempre contendrá un valor. Por lo que he entendido el indicador BB_MA es una media móvil. Para determinar la dirección de la media móvil hay que tener 2 valores en diferentes velas, por ejemplo en la primera y segunda vela y comparar estos valores entre sí. Así que podemos decir que el código superior sólo cumple parcialmente su propósito.

No, BB_MA es el Bears&Bulls_MA para abreviar. Suma los valores de los toros y los osos y los emite como un histograma, algo así como McDuck o similar. Siempre que el histograma está por encima de cero es una tendencia al alza, cuando está por debajo es una tendencia a la baja...

Por lo tanto, comprobar la dirección de la tendencia es:

if (BB>0 && OsMA>0 && AC1>AC2) return(1);

para UP y

if (BB<0 && OsMA<0 && AC1<AC2) return(-1);

para DOWN, bien y

 else return(0);

para el piso.

Es decir, la función devuelve 1 si Bears&Bulls_MA es superior a cero, OsMA es superior a cero y el valor de la primera barra AC es mayor que el valor de la segunda barra AC,

y viceversa para la tendencia a la baja. Bueno, para el plano, todas las demás diferencias en los gráficos (por ahora..., más tarde, cuando lo solucione, conectaré la comprobación del movimiento con la aceleración/deceleración y la inversión).

Lasposiciones deben abrirse sólo cuando haya una "tendencia al alza" o "tendencia a la baja" inequívoca... Básicamente, todo funcionaba, hasta que añadí AC para controlar la velocidad del movimiento de las divisas, para excluir (parcialmente) la apertura de posiciones al final del movimiento, en el agotamiento de la tendencia o la corrección.

Hasta ahora no está funcionando... y exactamente AC.

 
IgorM:

sip por lo que tenemos que tratar por mientras - que es hasta el primer pico y luego ........ - No puedo entenderlo.

No - el bucle debe hacerse a través de for. Voy a tratar de hacer un guión. La idea es realmente factible.
Razón de la queja: