¿Se puede resolver en principio la tarea en MQL4? - página 2

 

Dame el código, lo resolveremos para esta noche.

Puedes escribirlo en persona :)

 
tara:
Dame el código, lo resolveremos por la noche.

#property copyright "Copyright 2013, MetaQuotes Software Corp.
#enlace de propiedad "http://www.metaquotes.net"

//#include <WinUser32.mqh>
//int whwnd;
//#include <stdlib.mqh> // Biblioteca estándar
doble b;
doble por ciento;
double maxpercent = 0;
int timetoresume = 10;
int selecttime = 1;
cadena estado,estado1;
int total;
int magia[100];
int kol=0;
int tempkol =0;
//+------------------------------------------------------------------+
//| función de inicialización de expertos |
//+------------------------------------------------------------------+
int init()
{

return(0);
}
//+------------------------------------------------------------------+
//| función de desinicialización experta |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de inicio experto |
//+------------------------------------------------------------------+
int inicio()
{
// while(!IsStopped()) // hasta que el usuario.
/// { // ...no deja de ejecutar el programa
// RefreshRates();
b = Saldo de la cuenta()/100;
Porcentaje = Beneficio de la cuenta()/b;
si (maxpercent > percent) maxpercent = percent;
Timetoresume = TimeLocal();
if (percent*(-1) > 1) status = "Congelación activa";
Si no, estado = "En marcha";
total=Total de pedidos();
kol = 0;
for (int i=total; i>0; i--) { //asignar a cada elemento de la matriz el valor de cada orden abierta
OrderSelect (i-1,SELECT_BY_POS,MODE_TRADES);
magic[i] = OrderMagicNumber ();
// Imprimir ("Magia " + i+" " +magia[i];
}
for (int k = 1; k <= 1; k++){ // comparar la magia de la primera orden abierta con las siguientes
tempkol = magic[k];
for ( int l = 1; l <=total;l++){
if (tempkol != magic[l]) kol++;
}
}
if(kol >= 2){ // si más de 2 EAs ya han entrado en la operación
GlobalVariableSet ("Freeze1",200) ; // otros EAs deben escuchar estas variables globales
GlobalVariableSet ("Freeze2",200); // y no entrar en tratos, mientras el resto tiene tiempo de abrir órdenes
status1="test2"; // asesor GlobalVariableSet ("Freeze1",200) hace, habiendo esperado su turno
} //tomar una cola en la terminal
Comentario ( AccountProfit()
,"\n"
, "DrawDown " , NormalizeDouble (percent,1)*(-1), " % ", " MaxDrawDown " , NormalizeDouble (maxpercent,1)*(-1), " % "
, Timetoresume
,"\n"
",estado," ",porcentaje*(-1)
,"\n"
, "total del pedido ",total
,"\n"
, "OrderSymbol()," Magic ",OrderMagicNumber()," ",kol
,"\n"," ",status1
);
volver;
}

//+------------------------------------------------------------------+

No juzgues, la última vez que escribí un programa en Sinclair, en Basic cuando estaba en la escuela ....


 
Zakyza:


¿Es posible establecer un sistema de prioridades en MQL4, de manera que primero se ejecute el código del EA gestor y luego todos los demás EAs?


Por supuesto que es posible.

Organizar el trabajo de las EA según el esquema "maestro-esclavo".

 
avtomat:


Por supuesto que sí.

Organizar a los asesores maestros-esclavos para que trabajen de forma "maestra-esclava".


Por favor, dígame más acerca de cómo hacerlo. Los Asesores Expertos de Comercio pueden ser influenciados sólo por el cambio de la variable global y escuchan a esta variable GlobalVariableSet ("Freeze1",200) cuando mi "gerente" se digna a esperar su turno y escribir allí 200
 
Zakyza:

Por favor, dígame más acerca de cómo organizar esto. Asesores Expertos de comercio puede ser influenciado sólo por el cambio de valor de la variable global y que escuchan a esta variable GlobalVariableSet ("Freeze1",200) cuando mi "gerente" se digna, esperando su turno, para escribir 200 allí

¿Por qué su gerente, si es que lo es, espera algún tipo de turno?

Son los esclavos los que deben esperar a los suyos: el gerente ha escrito una prohibición de comercio en GV - se sientan, se quedan tranquilos (el esclavo ha comprobado la bandera global primer tick, si 'se sientan no bleep' - dijo JawolGerGeneral, y return(0))...

¿Por qué espera su gerente su turno para acceder a la bandera GV?

 
Todo lo hace un Asesor Experto )))) Puedes meter 100 pares en él ))))
 
artikul:
Todo lo hace un Asesor Experto )))) Puedes poner hasta 100 pares en él ))))

Bueno, no es eso de lo que estamos hablando...
 

maestro

//+------------------------------------------------------------------+
int deinit()
  {
      GlobalVariableSet(work,0);   // запрещение работы ведомым
   return(0);
  }
//+------------------------------------------------------------------+
.....

int start()
   .....

   work=GlobalVariableGet(work);

   if( work==0 && всё_хорошо )   GlobalVariableSet(work,1);   // разрешение работы ведомым

   if( work==1 && всё_плохо )    GlobalVariableSet(work,0);   // запрещение работы ведомым

// можно организовать систему запретов/разрешений любой сложности   

   .....

esclavo

.....

int start()


   work=GlobalVariableGet(work);

   if( work==0 )   { стоп } ;    // здесь возможны некоторые действия для завершения текущих процессов

   if( work==1 )   { работа };   // ведомым разрешена работа -- можно работать в нормальном режиме

.....

Espero haber sido claro.

 
avtomat:

maestro

esclavo

Espero haber sido claro.


Todo despejado, gracias.

Lo he probado así (es decir, prohibir y permitir según la situación), pero a mí me funciona de la siguiente manera:

Después de esta inicialización del maestro: int deinit().... // la prohibición del trabajo por parte de los esclavos es silenciosa, pero en cuanto el asistente se relaja ( si (número de majik idénticos <=2) ) y escribe en GlobalVariableSet(trabajo,1); // habilitando los esclavos , y hay 8 esclavos en 8 pares diferentes, consigue abrir en 4 - 6 pares en lugar de 2 como se especifica en la condición del maestroSe abren ANTES de que el maestro "entienda" que el "número de majestades idénticas" es significativamente mayor que 2. Después de eso, por supuesto, los otros esclavos están en silencio, pero ya no es abierto 2 copias como se desea, pero 4 - 6.

Según entiendo, el control se da a los EAs esclavos int start () después de que ejecute el código int start() y depende de int start( )de los EAs esclavos y de cuántas copias de cada par se abrirán antes del inicio del asistente y una global se vuelve prohibitiva. Por favor, corregidme si he entendido mal el algoritmo del terminal y la esencia del problema. ¡A grandes rasgos, así: si un maestro y un esclavo es más probable que funcione correctamente, pero los esclavos entonces 8-10 !

Por eso escribí, intenté hacer un bucle de inicio de maestro y hacer que se quedara encendido para siempre, pero mi terminal se colgó.

artmedia70: " ¿por qué su gestor, si es que lo es, espera algún tipo de cola? "Eso es lo que me gustaría saber.

 

¿Y por qué y para qué se hacen dos magos idénticos?

Las variables globales se pueden utilizar para asignar áreas mágicas no superpuestas a los EAs incluidos. Las comprobaciones y asignaciones correspondientes se realizan en init().

Además, podemos limitar el número de órdenes abiertas para cada símbolo especificándolo explícitamente o asignando un maestro, dependiendo de la situación general actual que el maestro debe controlar.

Esto significa que si el esclavo realiza una acción, tiene que informar al maestro. El amo, a su vez, debe dar su resumen, del que dependen las acciones (o la inacción) posteriores del esclavo.