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

 
Ihor Herasko:

OrderSelect() se ejecuta dentro del terminal, no hay ninguna petición al servidor. Por lo tanto, no hay nada malo en acceder a la lista de órdenes en cada tic. La mayoría de los Asesores Expertos hacen esto.

Y tu pregunta sobre la matriz está relacionada con la arquitectura del programa. En el caso de un EA complejo que opera con una gran cantidad de órdenes, esto es absolutamente necesario. Si el Asesor Experto opera con una sola orden con lógica simple, la matriz es redundante.

Sólo cabe mencionar el hecho de que aunque tengamos un array de pedidos, no podemos prescindir de llamar a OrderSelect(). Al fin y al cabo, tenemos que comprobar en cada tick si la orden sigue existiendo o no. También se pueden cambiar sus parámetros.

Gracias.
 
Rustam Bikbulatov:

Chicos, ¡díganme cómo tratar y por dónde empezar!

Ejemplo: Tengo 15 órdenes con un lote de 0,01. Necesito cerrar alguna(s) operación(es) con un tamaño de lote de 0,07 en algún momento.

Mi pregunta es, ¿cómo puedo cerrar 7 órdenes o 0,07 en un OrderClose(...)?

Si pongo 0,07 a la vez no ve las operaciones con volumen 0,01.

Soy nuevo en la programación.


    int countS = 3;
   if(LastTime!=iTime(NULL,1,0)){
      for(int i=OrdersTotal()-1; i>=0; i--){
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
        if(OrderSymbol()==Symbol() && OrderMagicNumber()==321){ 
         if(OrderType()==OP_SELL){
           irvb=OrderClose(OrderTicket(),0.01,Ask,3,CLR_NONE);
           LastTime=iTime(NULL,1,0); countS--; if(countS==0)break;   
          }}}}} 

He recibido un consejo sobre cómo hacer un contador en forma decountS .

Debería cerrar tres operaciones de 0,01 lotes por minuto. Ahora, tenemos la pregunta de cómo convertirlo para que todos los pedidos se calculen en orden.

Si establecemosfor(int i=OrdersTotal()-1; i>=0; i--){ se contarán los últimos pedidos en orden,

Si for(int p=0; p<OrdersTotal(); p++){ se pasa del primer al primer pedido.

El contador funciona, pero cuando el LOB es 0,15, por ejemplo, no cierra 0,03 lotes, sino que cierra 0,01 lotes cada minuto.

¿Qué aconsejaría añadir?

¿Cómo puedo hacer que se cierre una parte del lote total independientemente del número y tamaño de las órdenes?
 
Rustam Bikbulatov:


Un consejo sobre cómo hacer un contador decuentas .

Debería haber tres operaciones de 0,01 lotes cerradas por minuto. Ahora tengo la duda de cómo convertirlo para que todos los pedidos se cuenten en orden.

Si establecemosfor(int i=OrdersTotal()-1; i>=0; i--){ se contarán los últimos pedidos en orden,

Si for(int p=0; p<OrdersTotal(); p++){ entonces pasa del primer al primer pedido.

El contador funciona, pero cuando el tamaño del lote, por ejemplo, es de 0,15, no cierra 0,03 lotes, sino que cierra 0,01 lotes cada minuto.

¿Qué aconsejaría añadir?

¿Cómo puedo hacer que se cierre una parte del lote total independientemente del número y tamaño de las órdenes?

Al configurar este problema (muy extraño, por cierto), es necesario trabajar con la lista de "Historial de cuentas". En cada nueva iteración, debemos recorrer esta lista y encontrar las órdenes que se cerraron durante el minuto actual y sumar su volumen. Si no hay suficiente volumen, entonces clasifícalo como sea necesario (así que no preguntes cómo, es cosa tuya) y toma un solo pedido. Ciérralo en 0,01. En la siguiente iteración, empieza de nuevo.

 
Ihor Herasko:

Al establecer dicha tarea (muy extraña, por cierto), hay que trabajar con la lista "Historial de cuentas". En cada nueva iteración, recorre esta lista y encuentra las órdenes que se han cerrado durante el minuto actual, sumando su volumen. Si no hay suficiente volumen, entonces clasifícalo como sea necesario (así que no preguntes cómo, es tu decisión) y toma un solo pedido. Para cerrarlo en 0,01. En la siguiente iteración todo de nuevo.

Lo intentaré. Gracias.

 
harbor:
no se puede configurar el envío de correo desde el terminal
No consigo que funcione con myl.ru pero ahora lo he configurado de la misma manera y no envía el mensaje de prueba.
¿alguien se ocupó de ello?

si para usted (no para la venta) entonces el tratamiento adecuado para los problemas de correo es :

1) Conseguir un correo en localhost que se encargue del reenvío, garantice la entrega y no se complique con la autorización y la protección antispam. De lo contrario, los EA acabarán rápidamente en todo tipo de listas negras.
Esto no es difícil - hay un smtp incorporado de win y libre con ajustes simples, en una pizca usted puede script usted mismo :-)

2) Utilice una alternativa a SendMail() . Para controlar todo el proceso, para enviar informes más inteligentes, con etiquetas, banderas, opcionalmente en html y con imágenes.

Al combinar 1+2 se obtiene un total de 3 :-) por lo que es una solución sensata y estable.

más sobre el envío de correo : https://www.mql5.com/ru/blogs/post/718364

-----

Si necesita ayuda sobre aspectos específicos de la configuración de SendMail y MT, adjunte capturas de pantalla, extractos del código fuente, diagnósticos de errores...
Así que no es sólo un "golpe subterráneo"

TradeBiff - отправка почты со скриншотами
TradeBiff - отправка почты со скриншотами
  • 2018.05.19
  • Maxim Kuznetsov
  • www.mql5.com
Очень важно получать детальные оповещения о действиях любого робота. Универсальный способ оповещений - это отправка почты. TradeBiff будет следить за изменениями и отправлять вам необходимые отчёты. Таким образом у вас в почтовом ящике получится хороший торговый журнал. Постановка задачи Ставим себя на место заказчика и формулируем задачу...
 
¿Entiendo correctamente que"TimeCurrent()" devolverá la hora del último tick cuando sea llamado desde una función de usuario?
 
Asa saas:
¿Entiendo correctamente que "TimeCurrent()" devolverá la hora del último tick cuando sea llamado desde una función de usuario?

 

¡Saludos!


Se puede acceder a una orden mediante el comandoOrderSelect por su número.

Pregunta, ¿es posible conocer de antemano los números de los pedidos existentes, para no pasar por todos? Por ejemplo, podemos memorizar este número al abrir un nuevo pedido.

Entiendo que este número se asigna por orden a partir del 1. ¿Cuáles son los posibles matices?

Muchas gracias.

 
Decromor:

Saludos.


Se puede acceder a una orden mediante el comando OrderSelect por su número.

Pregunta, ¿es posible conocer de antemano los números de los pedidos existentes, para no pasar por todos? Por ejemplo, podemos memorizar este número al abrir un nuevo pedido.

Entiendo que este número se asigna por orden a partir del 1. ¿Cuáles son los posibles matices?

Muchas gracias.

PedirEnviar
OrderSelect

 

Me rompí el cerebro, ¡ayuda por favor!

He escrito una unidad de cálculo de correlación. Pero OANDA e investing.com dan resultados completamente diferentes. Es curioso, ¡tampoco coinciden!

¿En qué me equivoco?


El par de divisas actual - EURUSD, compruebo la correlación con GBPUSD.


extern string SubSymbol = "GBPUSD";

extern int correlation_time = 24; // cuántas horas hay que comprobar la correlación de los pares de divisas seleccionados

.....

// ------------------------ bloque de cálculo de la correlación --------------------------------------

int periodo = 15;

int número_de_barras = MathRound(tiempo_de_correlación*60/periodo);

double símbolo_avg = 0;

double símbolo_avg = 0;

doble símbolo_precio[], doble subsímbolo_precio[];

doble x,y;

int j;

int desplazamiento = 0;

ArrayResize(precio_símbolo, número_de_barras);

ArrayResize(subsymbol_price, bars_number);

for (j=0; j < número_de_barras; j++)

{

symbol_price[j] = (iHigh(NULL,period,j+shift) - iLow(NULL,period,j+shift))/2;

subsymbol_price[j] = (iHigh(SubSymbol,period,j+shift) - iLow(SubSymbol,period,j+shift))/2;

symbol_avg = symbol_avg + symbol_price[j];

subsymbol_avg = subsymbol_avg + subsymbol_price[j];

}

symbol_avg = symbol_avg/bars_number;

subsymbol_avg = subsymbol_avg/número de barras;

double ss_xx = 0;

double ss_xy = 0;

double ss_yy = 0;

for (j=0; j < número_de_barras; j++)

{

x = precio_del_símbolo[j] - valor_del_símbolo;

y = subsímbolo_precio[j] - subsímbolo_avg;

ss_xy = ss_xy + x*y;

ss_xx = ss_xx + x*x;

ss_yyy = ss_yy + y*y;

}

doble correlación = ss_xy/MathSqrt(ss_xx*ss_yyy);

Alerta(correlación, " ", número_de_barras);

ArrayFree(symbol_price);

ArrayFree(subsymbol_price);

// ------------------------ fin del bloque de cálculo de la correlación ---------------------------------