Emulación de ticks de un EA/indicador - página 8

 
expertboss, ¿necesitas siquiera un servidor 2008? En mi opinión, las capacidades de 2003 son suficientes, y es menos exigente en cuanto a recursos, lo que significa que puedes elegir un hardware más barato.
 
Meat:

Si este reloj tuyo es un experto (no un indicador), entonces lo más probable es que simplemente esté en bucle, por lo que no tiene ningún problema para obtener información a través de múltiples símbolos. Esto es lo que escribí antes, que realmente no hay un gran problema con las garrapatas en el Asesor Experto, porque se puede hacer un bucle. Pero con un indicador este número no funcionará.

En cuanto a los diferentes sistemas operativos, sigue siendo un misterio para mí. Como escribí arriba, a mí me funciona bien en el 7, pero a otras personas no les funciona por alguna razón. Tal vez tenga algo que ver con los derechos de acceso...

Por cierto, con respecto a las "bibliotecas de reemplazo", trate de tomar los archivos user32 y kernel32 de WinXP(2003) y péguelos en la carpeta Experts\libraries en ese equipo donde está instalado Vista(2008). ¿Y si funciona? :) ...aunque lo dudo...

Lo diré directamente sobre los ticks, estoy de "tu lado" pero en cuanto al reloj, a juzgar por tu respuesta, no has entendido mi pensamiento lo intentaré con el código:

int init()

{

ObjectCreate("ServerTime", OBJ_LABEL, 0,0,0,0;)

ObjectSet("ServerTime", OBJPROP_CORNER, 3);

ObjectSet("ServerTime", OBJPROP_XDISTANCE, 10);

ObjectSet("ServerTime", OBJPROP_YDISTANCE, 37);

ObjectSetText("ServerTime", "", 20, "Arial", Verde);

volver;

}

int inicio()

{

ObjectSetText("ServerTime", TimeToStr( TimeCurrent(), TIME_SECONDS ));

...

volver;

}

Si sólo hay un símbolo en la ventana "Market Watch", para el que se crea un gráfico, la hora y la actualización de la hora también coincide con el tick en el gráfico y, en consecuencia, con el trabajo del Asesor Experto. Si hay varios símbolos en la ventana "Market Watch", entonces el pequeño reloj que se muestra en el encabezado "Market Watch : 22:59:58", esos relojes están haciendo tictac casi todo el tiempo, están haciendo tictac en algún lugar y como la cotización ha cambiado en mi par de divisas entonces mis relojes están alineados con esos. Esa es mi idea """" si estos todos los tictacs pueden ser agregados y aplicados a mi EA o a una ventana donde el EA trabaja". terminaría con muchas más garrapatas que la cotización de un par.

Alexander.

No quiero poner en bucle los recursos... ¿Es decir, combinar todos los ticks de todas las cotizaciones en un solo gráfico?

 

¿Qué les hace pensar que esto es una agresión? Es simplemente un recordatorio de los principios de cortesía. Antes de ofrecer algo, hay que poner algo a cambio. Si no tienes nada solo puedes pedir y esta es la verdad.

No tengo mucha experiencia en sistemas de 64 bits pero me interesa mucho este tema, pero como no puedo hacer nada para ayudar aquí tengo que preguntar a la gente que sabe. No veo nada vergonzoso en ello.

 
FAQ:

¿Qué les hace pensar que esto es una agresión? Es simplemente un recordatorio de los principios de cortesía. Antes de ofrecer algo, hay que poner algo a cambio. Si no tienes nada solo puedes pedir y esta es la verdad.

No tengo mucha experiencia en sistemas de 64 bits pero me interesa mucho este tema, pero como no puedo hacer nada para ayudar aquí tengo que preguntar a la gente que sabe. No veo nada malo en ello.


Supongo que me dejé llevar por mis emociones, pero eres un moderador y cuidas tu boca, gracias por el comentario y trataré de enfriar mi ardor.

Adiós. Alexander.

 
expertboss:

Aquí está el pensamiento """" si estas todas las garrapatas se pueden sumar y aplicar a mi Asesor de Expertos o la ventana donde el Asesor de Expertos funciona"" y terminar con muchas más garrapatas que un presupuesto para un solo par.

Alexander.

No quiero poner en bucle los recursos... Es decir, ¿quieres combinar todos los ticks de todas las cotizaciones en un solo gráfico?

Un EA sólo reacciona a sus propios ticks, por lo que no se puede "añadir" nada. Sólo hay dos opciones: o bien se establece un temporizador (como he sugerido), o bien se ejecuta en paralelo un EA en bucle en otro gráfico, que "marcará" su EA. Y en este EA en bucle, puede especificar las condiciones en las que se "marcará". Por ejemplo, si el valor de TimeCurrent() ha cambiado, como en su caso. Aunque, de nuevo, no veo el sentido de tener un EA adicional, si el EA inicial (es decir, su reloj) puede hacer lo mismo.

 
En realidad, la solución a todos los problemas sería encontrar la dirección de la función Start en la memoria :) Entonces se podría pensar en muchas cosas, hasta la ejecución de programas multihilo.
 
Me enfrenté a un problema con el siguiente plan cuando el terminal no recibe ticks regulares y el temporizador está funcionando respectivamente EA está trabajando a través del código y en algún momento el EA comienza a enviar solicitudes falsas, por ejemplo, para cerrar la orden, allí resulta que al final el servidor envía un error general "2", entonces el error "3" y también puede dar por el número de orden, etc. Salí de la situación de esta manera """""""""""" if (OrdersTotal()==0){Alert ("Nothing to delete");Sleep(1000);break;} // Si no hay órdenes, sale del bucle cerrando """"""""""""" (exit while), pero ya sabes, es un poco incorrecto. Pregunta: es posible hacer algún tipo de comando u operador (no sé ni cómo llamarlo) para suspender los ticks hasta que obtengamos una respuesta del servidor true (por ejemplo true=OrderClose (OrderTicket(),....) y luego como siempre. Por supuesto, esto es una petición, en la medida de lo posible. Una observación más (me he dado cuenta el fin de semana) - si desplazo el gráfico, vuelve a la posición del generador o a un tick normal, se suelta el botón "EAs" y no hay ticks, pero el gráfico vuelve de todas formas, he quitado el EA del gráfico, todo esto ha parado. Sv. Alexander.
 
Meat:

De todos modos, aquí está la versión final de la función:

// push ebp; move ebp,esp; push 01; push 02; push MT4InternMsg; push hWnd; mov eax,PostMsgAddr; call eax; pop ebp; ret 0010;

Según tengo entendido, se utiliza el comando PostMessageA(hwnd, RegisterWindowMessageA("MetaTrader4_Internal_Message"), 2, 1). Este comando emula los ticks para el Asesor Experto (según la descripción en WinUser32.h). En el caso de los indicadores, los ticks no se emulan y, en consecuencia, el indicador no se actualiza. Desgraciadamente, no tengo WinXP para hacer pruebas, pero si los ticks del indicador están emulados en XP, me sorprende.

También he comprobado su algoritmo

  for (int i=0;  i<ArraySize(value);  i++)
    for (int j=0;  j<len[i];  j++, byte++)
      TimerCode[byte/4] |= value[i]>>(8*j)&0xFF<<(byte%4*8);

bajo el depurador VisualStudio y el resultado que obtuve en el array TimerCode no se correspondía en absoluto con los resultados esperados. ¿Está seguro de que este algoritmo no contiene errores? Te puedo dar el código y una captura de pantalla del resultado. Si quiere, podemos discutirlo con más detalle.

 

Aunque este tema no es muy actual ahora, pero creo que todavía hay quienes no tienen prisa por cambiar a las nuevas construcciones :) Por lo tanto, si alguien no tiene temporizador de tic en Win7/Win8, debe desactivar la herramienta DEP o añadir esta función:

#import "kernel32.dll"
  bool  VirtualProtect(int lpAddress[], int dwSize, int flNewProtect, int& lpflOldProtect[]);

Y al final esta variante:

int SetMyTimer(int interval=1000, int timerId=0)
{    
  int MT4InternMsg= RegisterWindowMessageA("MetaTrader4_Internal_Message");
  int hWnd= WindowHandle(Symbol(),Period());
  int PostMsgAddr= GetProcAddress(GetModuleHandleA("user32.dll"),"PostMessageA");
  if (PostMsgAddr==0 || hWnd==0) return(0);
  static int TimerCode[7];  ArrayInitialize(TimerCode,0);
  int oldprotect[1]; 
  VirtualProtect(TimerCode, ArraySize(TimerCode)*4, 0x40, oldprotect);  // PAGE_EXECUTE_READWRITE
  // push ebp; move ebp,esp; push 01; push 02; push MT4InternMsg; push hWnd; mov eax,PostMsgAddr; call eax; pop ebp; ret 0010;    
  int bytes[]={ 0x55, 0x8B,0xEC, 0x6A,01, 0x6A,02, 0x68,0000, 0x68,0000, 0xB8,0000, 0xFF,0xD0, 0x5D, 0xC2,0x10 };
  int len[]=  { 1,    1,   1,    1,   1,  1,   1,  1,   4,    1,   4,    1,   4,    1,   1,    1,    1,   2 };
  bytes[8]=MT4InternMsg;  bytes[10]=hWnd;  bytes[12]=PostMsgAddr;
  int nbyte=0;  
  for (int i=0;  i<ArraySize(bytes);  i++)
    for (int j=0;  j<len[i];  j++, nbyte++)
      TimerCode[nbyte/4] |= bytes[i]>>(8*j)&0xFF<<(nbyte%4*8);
  timerId= SetTimer(hWnd, timerId, interval, TimerCode);
  return (timerId);
}