Preguntas sobre el MQL4 - página 7

 
En algún lugar del foro los desarrolladores han escrito con cierto detalle cómo funciona init/deinit. ¿Tal vez alguien pueda proporcionar un enlace?
 
Hola a todos, aquí hay una pregunta:
Hice una DLL en Delphi, la llamo desde MT4. Todo funciona excepto los parámetros simples pasados por referencia. En Delphi, declarado como sigue:

procedure Test2(var i: integer); stdcall;
begin
if addr(i) = nil then ShowMessage('What the hell?');
end;

stop to call it as

#import "DLL1.dll"
void Test2(int& i);

Llamo a
int init() {
int x = 5;
Test2(x);
return(x);
}

cuando se llama, una referencia a la variable integer debería estar en la pila, pero null está ahí
así que ¿cómo pasar un parámetro int por referencia?
Al pasar arrays, el valor del array se pasa por referencia

usando
MetaEditor 4.00 build 183
MetaTrader 4.00 build 186

una pregunta más: si paso una cadena como referencia, ¿cuál es el tamaño del buffer de la cadena?

una pregunta más:
Si paso una cadena como resultado de una función, ¿dónde debe asignarse el área de memoria para la cadena? ¿Debo pasar un puntero a una variable global en la DLL? En este caso, ¿puedo estar seguro de que la DLL no será llamada desde diferentes hilos simultáneamente en cualquier modo de metatrader?

Gracias de antemano
 
la implementación actual es tal que sólo se pueden pasar parámetros por referencia dentro de un mismo código fuente. la excepción son los arrays. si se pasa un array a la dll, se pueden cambiar los valores de sus elementos y estos cambios estarán disponibles en la función que llama. es decir, se puede pasar un array muy pequeño.
 
Cómo implementar esto en MQL4
al comienzo del día establecer dos órdenes pendientes
Una vez que uno (cualquier) disparó - el segundo se elimina
Cinco minutos antes del cierre de la barra (digamos un diario) para cerrar el disparado (si no se cerró por SL o TP)
Si no se disparó ninguna orden pendiente, cinco minutos antes de cerrar la barra eliminar ambos
Muchas gracias
 
1) Si paso la cadena como referencia, ¿cuál es el tamaño del búfer de recepción de la cadena?

2) Si paso la cadena como resultado de una función, ¿dónde debe asignarse el área de memoria para la cadena? ¿Debo pasar un puntero a una variable global en la DLL? En este caso, ¿puedo estar seguro de que la DLL no será llamada desde diferentes hilos simultáneamente en cualquier modo del metatrader?

Gracias de antemano
 
Cómo implementar esto en MQL4 <br/ translate="no"> Al principio del día establecer dos órdenes pendientes
Cuando uno (cualquier) desencadenado - el segundo se elimina
Cinco minutos antes del cierre de la barra (digamos un diario) para cerrar el desencadenado (si no se cerró por SL o TP)
Si no hay orden pendiente desencadenado, cinco minutos antes de cerrar la barra de eliminar ambos
Gracias de antemano

Se establecen las órdenes pendientes en el momento adecuado (eso es fácil). Y empiezas a comprobar los pedidos. Tan pronto como aparezca una orden de compra o de venta, se trabaja en la eliminación de la orden pendiente (aún más fácil). Y luego, en el momento adecuado, trabajar para cerrar todas las órdenes (esto es fácil).
 
Как в MQL4 реализовать такое
в начале дня устанавливаем два отложенных ордера
После того как один(любой) сработал - второй удаляется
За пять минут до закрытия бара(допустим дневного) закрыть сработавший (если он не был закрыт по SL или TP)
Если ни один отложенный ордер не соработал то за пять минут до закрытия бара удаляем их обоих
Заранее спасибо

Así es como se implementa, se ponen órdenes pendientes en el momento adecuado (es fácil). Y entonces empiezas a comprobar los pedidos. En cuanto aparezca una orden de compra o de venta, trabaje eliminando la orden pendiente (esto es aún más fácil). Y luego, en el momento adecuado, trabajar para cerrar todas las órdenes (es muy fácil).


He pedido un código que funcione (quizás alguien lo haya implementado).
Todo lo que he hecho no ha funcionado... El proceso de odrerdelete es algo confuso.
Otra pregunta: a veces el precio se congela (no hay ticks) durante algunos minutos, es decir, no podemos cerrar una orden ya que el cuerpo de int start() no se ejecuta, aunque se reciben ticks para otros símbolos, ¿es posible pasar el valor de Curetime de cualquier símbolo con ticks?
En pocas palabras, el valor de Curetime prácticamente no debería congelarse
 
Lo que quieres hacer es el ABC. Si no se entiende cómo funcionan los operadores básicos, no se puede entrar en materia. Y puedes cerrar todas las órdenes desde cualquier gráfico. Puedes hacerlo así:
 cnt=0; while(cnt<1) { if(OrdersTotal()<1)break; OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); cmd=OrderType(); for(z=0;z<3;z++) { RefreshRates(); if(cmd==2||cmd==3|cmd==4|cmd==5)result=OrderDelete(OrderTicket()); 
     if(cmd==0) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),5,CLR_NONE); if(cmd==1) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),5,CLR_NONE); if(result) break;Sleep(1000); } Sleep(10000); }
 
Lo que quieres hacer es el ABC. Si no se entiende cómo funcionan los operadores básicos, no se puede entrar en el fondo. Y puedes cerrar todas las órdenes desde cualquier gráfico. Puedes hacerlo así:<br/ translate="no">
 cnt=0; while(cnt<1) { if(OrdersTotal()<1)break; OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); 
    cmd=OrderType(); for(z=0;z<3;z++) { RefreshRates(); if(cmd==2||cmd==3||cmd==4|cmd==5)result=OrderDelete(OrderTicket()); 
     if(cmd==0) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),5,CLR_NONE); if(cmd==1) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),5,CLR_NONE); if(result) break;Sleep(1000); } Sleep(10000); }



¿Y qué hace este fragmento de código?
Elimina las dos órdenes pendientes que aún no se han activado
 
Le pediste que destruyera todos los pedidos cinco minutos antes de que cerrara el bar, así que los anotará todos. Sólo hay que ajustar la hora correctamente. Y utilizar otras piezas de código para cerrar órdenes innecesarias. ¿O quiere que le escriban todo el programa?