Emulação de carrapatos de um EA/indicador - página 8

 
expertboss, você precisa mesmo de um servidor de 2008? Na minha opinião, as capacidades de 2003 são suficientes, e é menos exigente em recursos, o que significa que você pode escolher hardware mais barato.
 
Meat:

Se este seu relógio é um especialista (e não um indicador), então é muito provável que seja simplesmente em loop, portanto não tem problema em obter informações através de vários símbolos. Foi sobre isso que escrevi anteriormente, que não há realmente um grande problema com carrapatos no Expert Advisor, porque pode ser feito em loop. Mas com um indicador este número não vai funcionar.

Quanto aos diferentes sistemas operacionais, ainda é um mistério para mim. Como escrevi acima, funciona bem para mim no dia 7, mas outras pessoas não o têm por alguma razão. Provavelmente algo a ver com direitos de acesso...

A propósito, com relação às "bibliotecas de substituição", tente pegar os arquivos user32 e kernel32 do WinXP(2003) e colocá-los na pasta Experts\libraries naquele computador onde o Vista(2008) está instalado. E se funcionar? :) ...embora eu duvide...

Vou dizer diretamente sobre os carrapatos, estou do "seu lado", mas quanto ao relógio, a julgar pela sua resposta, você não entendeu meu pensamento, vou tentar com o código:

int init()

{

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

ObjectSet("ServerTime", OBJPROP_CORNER, 3);

ObjectSet("ServerTime", OBJPROP_XDISTANCE, 10);

ObjectSet("ServerTime", OBJPROP_YDISTANCE, 37);

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

retornar;

}

int start()

{

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

...

retornar;

}

Se houver apenas um símbolo na janela "Market Watch", para o qual é criado um gráfico, o tempo e a atualização do tempo também coincide com o tick no gráfico e de acordo com o trabalho do Expert Advisor. Se há vários símbolos na janela "Market Watch", então o pequeno relógio que exibe no cabeçalho "Market Watch : 22:59:58", esses relógios estão fazendo tic-tac quase o tempo todo, estão fazendo tic-tac em algum lugar e como a cotação mudou no meu par de moedas, meus relógios estão alinhados com esses. Essa é a minha idéia """" se todos esses tic-tac podem ser adicionados e aplicados à minha EA ou a uma janela onde a EA funciona"". e acabam com muito mais carrapatos do que apenas um par de citações.

Alexandre.

Não quero fazer loop de recursos ... Ou seja, combinar todos os carrapatos de todas as cotações em um único gráfico?

 

O que os faz pensar que isto é uma agressão? É apenas um lembrete dos princípios de cortesia. Antes de oferecer algo, você tem que colocar algo em troca. Se você não tem nada, você só pode perguntar e esta é a verdade.

Não sou muito experiente em sistemas de 64 bits, mas estou muito interessado neste tópico, mas como não posso fazer nada para ajudar aqui, tenho que perguntar às pessoas que sabem. Não vejo nada de vergonhoso nisso.

 
FAQ:

O que os faz pensar que isto é uma agressão? É apenas um lembrete dos princípios de cortesia. Antes de oferecer algo, você tem que colocar algo em troca. Se você não tem nada, você só pode perguntar e esta é a verdade.

Não sou muito experiente em sistemas de 64 bits, mas estou muito interessado neste tópico, mas como não posso fazer nada para ajudar aqui, tenho que perguntar às pessoas que sabem. Não consigo ver nada de errado nisso.


Acho que fiquei preso às minhas emoções, mas você é um moderador e tem cuidado com a boca, obrigado pela observação e vou tentar esfriar meu ardor.

Adeus. Alexandre.

 
expertboss:

Aqui está o pensamento """" se todos estes carrapatos podem ser somados e aplicados ao meu Expert Advisor ou à janela onde o Expert Advisor trabalha"""". acabaria com muito mais carrapatos do que apenas uma citação de um par.

Alexandre.

Não quero fazer loop de recursos ... Ou seja, você quer combinar todos os carrapatos de todas as citações em um único gráfico?

Uma EA só reage a seus próprios carrapatos, portanto não se pode "adicionar" nada. Há apenas duas opções: ou você define um timer (como eu sugeri), ou você executa em paralelo uma EA em loop em outro gráfico, que irá "marcar" sua EA. E, neste looped EA, você pode especificar as condições sob as quais ele "ticulará". Por exemplo, se o valor do TimeCurrent() tiver mudado, como no seu caso. Embora, mais uma vez, não vejo sentido em ter uma EA adicional, se a EA inicial (ou seja, seu relógio) puder fazer o mesmo.

 
Na verdade, imho, a solução para todos os problemas seria encontrar o endereço da função Iniciar na memória :) Então você poderia pensar em muitas coisas, até a execução de programas com várias etapas.
 
Eu enfrentei um problema com o seguinte plano quando o terminal não recebe ticks regulares e o timer está rodando respectivamente a EA está trabalhando através do código e em algum momento a EA começa a enviar pedidos falsos, por exemplo, para fechar o pedido, aí no final o servidor envia um erro geral "2" e depois um erro "3" e pode também dar pelo número do pedido, etc. Saí da situação desta maneira """""""""""" if (OrdersTotal()==0){Alert ("Nada para apagar");Sleep(1000);break;} // Se não houver ordens, saia do laço fechando """"""""""""" (sair enquanto), mas você sabe, é um pouco incorreto. Pergunta: é possível fazer algum tipo de comando ou operador (nem sei como chamá-lo) para suspender os tiques até recebermos uma resposta verdadeira do servidor (por exemplo, true=OrderClose (OrderTicket(),....) e depois, como de costume. Naturalmente, isto é um pedido, na medida do possível. Mais uma observação (notei isso no fim de semana) - se eu mudar o gráfico, ele voltará para a posição do gerador ou um tique regular, o botão "EAs" é liberado e não há ticks, mas o gráfico volta de qualquer forma, eu removi o EA do gráfico, tudo isso parou. Sv. Alexandre.
 
Meat:

De qualquer forma, aqui está a versão final da função:

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

Até onde eu entendo, você usa o comando PostMessageA(hwnd, RegisterWindowMessageA("MetaTrader4_Internal_Message"), 2, 1). Este comando emula carrapatos para o Expert Advisor (de acordo com a descrição em WinUser32.h). Para os indicadores, os ticks não são emulados e, conseqüentemente, o indicador não é atualizado. Infelizmente, não tenho WinXP para testes, mas se os carrapatos para o indicador são emulados em XP, fico surpreso.

Eu também verifiquei seu 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);

sob o debugger VisualStudio e o resultado que obtive na matriz do TimerCode não correspondeu de forma alguma aos resultados esperados. Você tem certeza de que este algoritmo não contém erros? Posso lhe dar o código e uma captura de tela do resultado. Se você quiser, podemos discutir isso em mais detalhes.

 

Embora este tópico não seja muito atual agora, mas acho que ainda há aqueles que não têm pressa em mudar para novas construções :) Portanto, se alguém não tiver um cronômetro em Win7/Win8, você deve desativar a ferramenta DEP ou adicionar esta função:

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

E, no 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);
}
Razão: