Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1245

 
Denis Diakonov:

no, por ejemplo, pasar primero el caso 1, luego el caso 2, etc.

Los casos ejecutan una orden de apertura

El pedido se abre en más de un sitio. Hay que pensar exactamente como se piensa en este código, y es difícil.

 
Si hay un ciclo dentro del OnTick de un EA que lleva una cantidad de tiempo decente, ¿se ejecutará completamente o la llegada de un nuevo tick lo interrumpirá todo?
 
Alexey Viktorov:

Hay más de un hueco. En un código así, hay que pensar exactamente como se piensa, y eso es difícil.

      case 2 : // кейс для открытия Sell по AUD/USD
               if(TimeServer() == true)                                     
               {
                  if(Symbol() == AUDUSD)
                  {
                  RefreshRates();
                  Open_Order = OrderSend("AUDUSD",OP_SELL,lot,Bid,0,0,0); 
                  Alert("Тикет открытого ордера ", Open_Order, GetLastError());
//-------------------------------------------------------------------------------------------------------------
// другая функция
//-------------------------------------------------------------------------------------------------------------

int AUDUSD_Analizing()
{    
   if(AUDUSD_Prices_new > AUDUSD_Prices_old)
   {
      s1 = AUDUSD_Prices1;
      s2 = AUDUSD_Prices2;
      s3 = s1 - s2;    
      if(raznica > s5)
      {
         Alert("--- ВРЕМЯ ОТКРЫВАТЬ ОРДЕР НА ПОКУПКУ ---");
вот в этом месте мне необходимо обратиться к case 2 - вызвать его запуск на исполнение, затем
отсюда же необходимо обратиться к case 5 (к примеру), case 9, case 16 и т.д.

и только потом завершить исполнение данной функции и вернуться в старт
 
Yevhenii Levchenko:
Si hay un bucle dentro del OnTick del EA que lleva una cantidad de tiempo decente, ¿se ejecutará completamente o la llegada de un nuevo tick interrumpirá todo eso?

Yo tampoco entiendo, en mi caso se abre el bucle y no se abren todas las órdenes, algunas se abren dos veces y otras se saltan, entiendo que un nuevo tick desencadena el inicio y el código suspende su ejecución y vuelve a funcionar

 
Denis Diakonov:

Entiendo que un nuevo tick desencadena un inicio y el código pausa su ejecución y comienza a ejecutarse de nuevo

no te lo inventes.

leer la ayuda, está claramente escrito allí que si hay cálculos complejos en EA, la nueva garrapata se saltará

en algún lugar del artículo sobre las funciones de manejo de eventos o tal vez en las operaciones comerciales o en RefreshRates

busque un error lógico en su código


HH: switch() - no se usa case para condiciones lógicas complejas, mejores combinaciones de if() else - así se obtienen ramas lógicas más inequívocas

 
Igor Makanu:

no te lo inventes.

lea la ayuda, dice claramente que si hay cálculos complejos en el EA, se saltará el nuevo tick

en algún lugar del artículo sobre las funciones de manejo de eventos o tal vez en las operaciones comerciales o en RefreshRates

busque un error lógico en su código


SZY: switch() - no se utiliza case para condiciones lógicas complejas, mejores combinaciones de if() else - así se obtienen ramas lógicas más inequívocas

Sí, gracias, ya he decidido escribir todo a través de if-else también

 
Denis Diakonov:

¿Por qué has añadido el interruptor aquí? Es más fácil introducir la dirección de la operación y el número de aperturas necesarias en la función y abrir tantas aperturas como se especifique en el bucle.

Por eso digo que entender su lógica está más allá de mi mente. ¿Por qué tanto lío?

 
Alexey Viktorov:

¿Por qué has añadido el interruptor aquí? Es más fácil introducir la dirección de la operación y el número de aperturas necesarias en la función y abrir tantas aperturas como se especifique en el bucle.

Por eso digo que entender su lógica está más allá de mi mente. ¿Por qué tanto lío?

Bueno, mi código acaba de aumentar de tamaño, y pensé que sería mucho más fácil.

En realidad, sería más sencillo y compacto si tuviéramos la oportunidad de llamar a case tantas veces como quisiéramos durante la ejecución de una función.

No necesito abrir operaciones similares en un bucle y se abren para diferentes símbolos simultáneamente (en la medida de lo posible) al producirse una señal.

caso 1 - compra de audusd

caso 5 - compra de gbpusd

caso 9 - compra de eurusd

etc.

En el primer caso tengo una hoja con el caso y la segunda con el análisis, si interactuaran serían 500 líneas.

La segunda variante implica prescribir una apertura de orden específica dentro de la función con análisis y el total de líneas sería de 1200+, lo que acabaría afectando a la velocidad de ejecución del programa

 

¿Puede ayudarme, por favor? El Asesor Experto utiliza el indicador Envelopes con cálculo dinámico de la desviación. Pero cuando se visualiza en el gráfico muestra toda la dinámica de la desviación del indicador en todas las barras anteriores.

envolturas dinámicas

1. ¿Hay alguna manera de hacer que el indicador dibuje correctamente? Es decir, dibujaría el indicador con su desviación sólo en su propia barra.

2. ¿Cómo puedo desactivar el dibujo del indicador en un Asesor Experto, dejando sólo sus cálculos? Quiero activar para desactivar el dibujo del indicador en la configuración de expertos )

 
Denis Diakonov:

Pues bien, al final mi código no ha hecho más que aumentar de tamaño, mientras que yo pensaba que sería más sencillo.

De todos modos, si fuera posible llamar a case tantas veces como sea necesario durante la ejecución de una función, sería más fácil y el código sería más compacto.

No necesito abrir operaciones similares en un bucle y se abren para diferentes símbolos simultáneamente (en la medida de lo posible) al producirse una señal.

caso 1 - compra de audusd

caso 5 - compra de gbpusd

caso 9 - compra de eurusd

etc.

En el primer caso tengo una hoja con el caso y la segunda con el análisis, si interactuaran serían 500 líneas.

La segunda variante implica prescribir una apertura de orden específica dentro de la función con análisis y el total de líneas sería de 1200+, lo que en definitiva afectaría a la velocidad de ejecución del programa

¿Con qué estás escribiendo tantas líneas de código? Aquí está uno de mis últimos EA, funciona con un conjunto de valores en FORTS

sinput  string            Symbols           = "GAZP,LKOH,CHMF,MVID";  //  Символы для торговли через запятую

Cuantos más valores se coticen, más se negociarán. Y este EA con control de dos timeframes de trading, con trailing y por supuesto con análisis, sólo 326 líneas.

Si desea utilizar el interruptor, no tiene que añadir la apertura de la posición en cada variante. Basta con especificar el nombre del símbolo, el tipo de operación comercial y el

string symb;
ENUM_ORDER_TYPE ordType;
switch(???)
{
 case 1
  symb = "audusd";
  ordType = OP_BUY;
 break;
 case 5
  symb = "gbpusd";
  ordType = OP_BUY;
 break;
 case 9
  symb = "eurusd";
  ordType = OP_BUY;
 break;
}
// И дальше получение цен, определение СЛ и ТП с последующем открытием ордера.

Pero sería mejor, en mi opinión, envolverlo todo en una función definida por el usuario.

void openOrder(string symb, ENUM_ORDER_TYPE ordType)
 {
  // Символ и тип ордера передаётся при вызове функции. Здесь достаточно получить соответствующие цены и открыть ордер.
 }
Razón de la queja: