Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 115

 

Chicos, aquí hay una pregunta - ¿cómo puedo poner los valores de las variables en una matriz unidimensional?

No lo mandes a ayudar - NO hay ejemplo para tal problema.


Digamos que hay una variable a, que cambia bajo ciertas condiciones.

Quiero un array para almacenar los 3 últimos valores de esta variable. ¿Cómo se implementa esto en mql4?


Estoy escribiendo int mas[3];

mas[]=a; dentro del bucle, después de una condición que cambie a,

El compilador da ']', pero nada funciona, aunque lógicamente debería. - expresión esperada, quiere que ponga alguna expresión desconocida dentro de los paréntesis en mas[]=a.

¿Tiene MQL4 alguna función que llene el array con un valor variable en cada iteración del bucle?


 
Igor Makanu:

Me disculpo por no encontrar el principio de la correspondencia, pero me gustaría aconsejar inmediatamente para evitar las condiciones complejas y los cálculos en ellos - esto hace que el código ilegible y, como consecuencia, complica la búsqueda de errores lógicos, yo escribiría su código como este:

Si entiendes lo que quiero decir, puedes modificar un poco más el código que te he dado, me refiero a ponerlo en una condición aparteif(OrderType()==OP_BUY....

Entonces será mucho más fácil encontrar errores lógicos, imho

Insertar después de cada OrderSend => return

o hacer una selección a través del interruptor :

switch ( OrderType() )
{ OP_BUY : { if (1) { .... break; }
             if (2) { .... break; }
           }
  OP_SELL : { if (3) { .... break; }
              if (4) { .... break; }
            }
}
 
Vladimir Tkach:

Probando esto y no funciona.

tiene pocos parámetros de entrada en su llamada al indicador personalizado - ¿cuántasvariables externas tiene el indicadorMorning Flat? (externo) - este es el número de parámetros que debe pasar cuando utilice iCustom

 
John Smith:
.....

Escribo int mas[3]=a; dentro del bucle después de la condición cuando cambia a,

pero nada funciona, aunque lógicamente debería hacerlo.

Aprenda a realizar todas las acciones paso a paso en lugar de todas a la vez.

Ejemplo :

int mas[3]={0}; // инициализация масива 

.....           // основной код
if ( найдена новая величина а )
{ mas[2]=mas[1];  // самая старая величина а
  mas[1]=mas[0];
  mas[0]=a;       // новая величина а
}
.....           // основной код
 
Igor Makanu:

tiene pocos parámetros de entrada en su llamada al indicador personalizado - ¿cuántasvariables externas tiene el indicadorMorning Flat? (externo) - este es el número de parámetros que debe pasar cuando utilice iCustom

Ya los he probado todos.

Lo he resuelto de otra manera. He insertado el código de cálculo de precios del indicador en mi Asesor Experto.

 
Igor Makanu:

La lógica del código es la misma, pero si divides las condiciones, es más rápido encontrar dónde está el error lógico, y en tu caso, si lo pones en una condición separada, consigues una optimización - la condición se comprobará una vez y no 4 veces:

en una condición separada, obtenemos una optimización del código - la condición se comprobará una vez y no 4 veces como en su ejemplo.

Compruebe la salida en el diario del Asesor Experto utilizando el

para el registro, de modo que pueda ver qué fragmento de código se ha ejecutado y con qué parámetros

Gracias por su respuesta. Dividir las condiciones hasta el límite. Comprobada la lógica con los comentarios. Resulta que el cierre de la posición se basa en las condiciones de la primera posición abierta. Significa que si primero abrimos una posición de Compra o Venta con la Condición 1 y luego se abre una segunda posición con la misma condición pero con la Condición 2, esta condición de cierre se ignora y la segunda posición se cierra también con la Condición 1 independientemente del otro número mágico. ¿Qué debo hacer?

 
Vladimir Tkach:

Ya los he revisado todos.

He resuelto el problema de otra manera. He pegado el código de cálculo de precios del indicador al Asesor Experto.

Me he dado cuenta de que iCustom() no se llama correctamente, debería ser así:

min=iCustom(Symbol(),0,"Morning Flat",StartHour,EndHour,TargetLevel,UpColor,DnColor,TargetUpColor,TargetDnColor,1,0);

Yo paso 7 parámetros al llamar al indicador, tú lo llamaste con 3 parámetros

Yo dejaría la llamada al indicador, pero modificaría el propio indicador: eliminaría las variables externas y los objetos gráficos del código del indicador


novichok2018:

He comprobado la lógica con los comentarios. Resulta que las posiciones se cierran según las condiciones de la primera posición abierta.

Enhorabuena. Vas por buen camino, pero es mejor en la fase de depuración imprimirlo en el diario (Print()) en lugar de en el comentario ( Commetn())

Muéstrame el código.

 
Igor Makanu:

Me he dado cuenta de que no has llamado correctamente a iCustom(), debería ser así:

Yo paso 7 parámetros al llamar al indicador, y tú lo llamaste con 3 parámetros

Yo dejaría la llamada al indicador, pero modificaría el propio indicador: eliminaría las variables externas y los objetos gráficos del código del indicador


Enhorabuena. Estás en el camino correcto, pero es mejor en la etapa de depuración para la salida en el diario (Print()) en lugar de en el comentario ( Commetn())

mostrar el código.

 int total=OrdersTotal();
      for(int i=OrdersTotal()-1;i>=0;i--)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if(TimeCurrent()>OrderOpenTime()+100)
           { 
            if(OrderType()==OP_BUY)
              {
               if(OrderMagicNumber==101)
                 {
                 if(MathAbs(WPR1)<5)
                 rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 
                 }
               if(OrderMagicNumber==111)
                 {
                  if(MathAbs(WPR1)<20) 
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 }
              }
                 
            if(OrderType()==OP_SELL)
              {
               if(OrderMagicNumber==222)
                 {
                  if(MathAbs(WPR1)>97.55)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 
                 }
               if(OrderMagicNumber==201)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 } 
              }
            }               
         }
       continue;  
      }   

He eliminado las huellas.

 
novichok2018:

He eliminado las huellas.

No conozco toda la lógica de su código, pero después de cada cierre de la orden definitivamente necesita salir del bucle a través de break; y en el siguiente tick necesita comprobar las órdenes en sus condiciones de nuevo - no sé cómo se comportaOrderSelect() después de que la orden se cierre - si la orden se cierra, entonces qué se selecciona, o hay un error?

Básicamente, tu problema es que quieres comprobar y cerrar todo a la vez en un solo bucle.

interruptor()

o hacer una función para cerrar la orden (hay funciones ya hechas para las órdenes https://www.mql5.com/ru/forum/131859/page2#434206 )

o utilice la pausa después de cerrar la orden en su código

Полезные функции от KimIV
Полезные функции от KimIV
  • 2008.03.11
  • www.mql5.com
В этой теме я буду выкладывать коды своих функций на языке программирования MQL4, приводить примеры их использования и отвечать на вопросы, связанн...
 
Igor Makanu:

No conozco toda la lógica de su código, pero después de cada cierre de una orden, definitivamente necesita salir del bucle a través de break; y en el siguiente tick necesita comprobar sus condiciones de nuevo - no sé cómo se comportaOrderSelect() después de que la orden se cierre - si la orden se cierra, entonces ¿qué se selecciona, o un error?

Básicamente, tu problema es que quieres comprobar y cerrar todo a la vez en un solo bucle.

interruptor()

o hacer una función para cerrar la orden (hay funciones ya hechas para las órdenes https://www.mql5.com/ru/forum/107476 )

o utilice la pausa después de cerrar la orden en su código

Gracias. Romper parece haber ayudado. Veremos qué pasa después.

Razón de la queja: