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

 
Anatoliy Ryzhakov:
Hola. Me pueden decir cómo devolver el valor del tipo de la penúltima orden en el historial.

Tienes que encontrar la hora de la última orden cerrada y luego buscar órdenes con una hora de cierre máxima, pero menor que la última hora memorizada, esto es lo que hice:

https://www.mql5.com/ru/forum/247136#comment_7555643

en mi ejemplo se buscó el ticket, habría que devolver el tipo de pedido en lugar del ticket, o sabiendo el ticket del pedido, se puede averiguar su tipo...

История ордеров
История ордеров
  • 2018.05.24
  • www.mql5.com
Всем привет! Столкнулся с проблемой... сделал робота, который читает историю и открывает сделку...
 

¿Es posible aplicar una plantilla a una función exportable para ser exportada de c++ a mql4?

He creado un archivo de tipo regular con extensión "srp" y he escrito allí una función primitiva.

#define  MT4_EXPFUNC extern "C++" __declspec(dllexport)
MT4_EXPFUNC  int __stdcall  add(int a=0, int b=0)//stdcall //cdecl
{return (18);}

Luego he creado un archivo con extensión "def" y he especificado el nombre de la función a exportar

LIBRARY "dllmt42"
EXPORTS
add

Luego lo pasé por Build - Build Solution.
Quiero aplicar una plantilla a mi función porque vamos a desarrollar funciones que trabajan con arrays y no pueden prescindir de una plantilla.

#define  MT4_EXPFUNC extern "C++" __declspec(dllexport)
template<typename T>MT4_EXPFUNC  int __stdcall  add(T a=0, T b=0){ return (18);}

T se pone de relieve, pero escribe que hay un error consejo de ayuda y es posible, trató de reorganizar? Además, ¿cómo se llamará a esta función, si es posible, desde el lado de mql4?




 
Roman Shiredchenko:

busque en el código base - en MT4 definitivamente fueron...

Justo en la primera página, en este hilo.

 

Buenas noches. En el proceso de estudio y aprendizaje de MT5 tratando de poner en práctica una tarea generalmente no es difícil, pero poca experiencia y las lagunas en el conocimiento....... en general no funciona, por favor ayuda y asistencia.

Tengo un indicador y un asesor experto, ambos con código abierto, ambos del mismo autor (Artem Trishkin, respeto y elogio). Estoy tratando de pedir al indicador que obtenga la dirección real en el momento de preguntar. El indicador muestra esta dirección con flechas hacia arriba o hacia abajo. La dirección obtenida será utilizada por el Asesor Experto como señal o como filtro, pero aún está lejos.

Tengo el mango del indicador pero los valores de los datos de las flechas del indicador son un lío y no puedo descifrarlos.

No he cambiado el indicador. He añadido OnInit en mi Asesor Experto:

   CrossAD = iCustom(asymbol.Name(), _Period, "iCrossAD");
   if (CrossAD == INVALID_HANDLE)
   {
      Print("Не удалось создать описатель индикатора iCrossAD!");
      return(INIT_FAILED);
   }
      else Print("Хендл iCrossAD = ",CrossAD);

He añadido OnTick:

   int n=0;
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find || ArraySize(Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
      }
      else 
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Buy_index  = n;
         Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find || ArraySize(Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 3-го буфера индикатора iCrossAD, error code %d",GetLastError());
      }
      else 
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Sell_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Sell_index  = n;
         Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);

Por supuesto, he descrito e iniciado los correspondientes overpens, arrays, definidos como timeseries y td......

Utiliza el comentario y la impresión para comprobarlo. No inmediatamente, pero no hay errores, sólo un par de advertencias, no entiendo. Pero lo principal - los parámetros están definidos incorrectamente. A pesar de la condición de abajo, el número máximo para el doble para la flecha hacia arriba y algún número negativo para la flecha hacia abajo se emiten.

if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)break;
и
if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)break;
 
Aquí están los archivos
Archivos adjuntos:
 
Sergey Voytsekhovsky:
Aquí están los archivos

Empezaría por probar la obtención de datos del indicador con un simple EA de prueba, en lugar de tomarlo de un artículo con muchas características innecesarias para la prueba.

Basta con crear un simple Asesor Experto en el Asistente MQL y utilizarlo para practicar el uso de iCustom()

 
Sergey Voytsekhovsky:

Buenas noches. En el proceso de estudio y aprendizaje de MT5 tratando de poner en práctica una tarea generalmente no es difícil, pero poca experiencia y las lagunas en el conocimiento....... en general no funciona, por favor ayuda y asistencia.

Tengo un indicador y un asesor experto, ambos con código abierto, ambos del mismo autor (Artem Trishkin, respeto y elogio). Estoy tratando de usar el EA para pedirle al indicador que obtenga la dirección actual en el momento de preguntar. El indicador muestra esta dirección con flechas hacia arriba o hacia abajo. La dirección obtenida será utilizada por el Asesor Experto como señal o como filtro, pero aún está lejos.

Tengo el mango del indicador pero los valores de los datos de las flechas del indicador son un lío y no puedo descifrarlos.

No he cambiado el indicador. He añadido OnInit en mi Asesor Experto:

He añadido OnTick:

Por supuesto, he descrito e iniciado los overpens adecuados, arrays, definidos como timeseries y td......

Utiliza el comentario y la impresión para comprobarlo. No inmediatamente, pero no hay errores, sólo un par de advertencias, no entiendo. Pero lo principal - los parámetros están definidos incorrectamente. A pesar de la condición que se indica a continuación, se imprime el número máximo para el doble de la flecha hacia arriba y algún número negativo para la flecha hacia abajo.

Artyom ha dicho correctamente y sólo voy a señalar la falta de necesidad de una comparación

if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find || ArraySize(Buf_Arrow_Buy) != period_find)

Si CopyBuffer devuelve el número de elementos copiados en el array, entonces el tamaño del array será exactamente ese. En consecuencia, la parte resaltada de la condición simplemente duplica la primera.

Y una reflexión en voz alta: no he mirado el código del indicador y del EA, así que puedo estar equivocado. ¿Está seguro de que debe haber una señal en el rango period_find?

 
Alexey Viktorov:

Artem dijo correctamente, y yo sólo señalaré lo innecesario de una comparación

Si CopyBuffer devuelve el número de elementos copiados en el array, entonces el tamaño del array será exactamente ese. En consecuencia, la parte seleccionada de la condición simplemente duplica la primera.

Estoy pensando en voz alta: no he comprobado el código del indicador y del Asesor Experto, así que puedo estar equivocado. ¿Está seguro de que debe haber una señal en el rango period_find?

Sí, es como un filtro: la frecuencia de las señales depende de él.

 
Artyom Trishkin:

Comenzaría con una prueba de obtención de datos del indicador con un simple EA de prueba, en lugar de tomarlo de un artículo con un montón de funciones innecesarias para la prueba.

La función iCustom() será más conveniente para usted.

Gracias, buen consejo, lo haré, al menos será más cómodo.

Lo empezaré hoy mismo.
 

¿Puede decirme qué pasa con el racionamiento del lote?

double lot_=0.01;
double minlot=0.10;
double LotNormalize(double lot_)
  {
   if(minlot==0.001)
     {
      return(NormalizeDouble(lot_,3));
     }
   if(minlot==0.01)
     {
      return(NormalizeDouble(lot_,2));
     }
   if(minlot==0.10)
     {
      return(NormalizeDouble(lot_,1));
     }

   return(NormalizeDouble(lot_,0));
  }
Razón de la queja: