Troca de dados entre dois EAs funcionando em terminais diferentes - página 2

 

Uma vez que a EA trata do evento com base em um tick-by-tick, eu me acomodei a essa direção.

A diferença em escrever um e ler o outro a partir de um tick, em teoria no tick seguinte...

 

Ocorreu-me uma idéia, que tal trocar dados através do registro? Criar uma chave, apagar uma chave, todas as API's para isso parecem estar lá. Não sei quão lento é, mas parece que a parte que é acessada pelas aplicações pode sempre estar em RAM.

Já passou pela cabeça de alguém? Só funciona para terminais na mesma máquina.

Eu vou cavar nesta direção :-).

 
Andres писал(а) >>

Ocorreu-me uma idéia, que tal trocar dados através do registro? Criar uma chave, apagar uma chave, todas as API's para isso parecem estar lá. Não sei quão lento é, mas parece que a parte que é acessada pelas aplicações pode sempre estar em RAM.

Já passou pela cabeça de alguém? Só funciona para terminais na mesma máquina.

Eu vou cavar nesta direção :-).

Por favor, me dê um link para API para trabalhar com o registro.

Até agora, estou considerando a variante baseada na troca de informações através de arquivos em disco. Ambos os terminais funcionam no mesmo computador, é claro.

Fiz alguns testes e me parece que a velocidade é mais do que suficiente para trocar dados entre terminais em menos de 1 segundo, o que eu acho que é suficiente para gerenciar ambas as contas (BUY e SELL).

Embora eu tenha estado muito ocupado no trabalho ultimamente, por isso não tenho lidado com este problema por um par de semanas.

Embora eu já tenha pedido a um colega programador antes, ele me alertou para não mexer com o registro para resolver o problema. Ele me aconselhou vivamente a usar o compartilhamento de arquivos no disco rígido.

Foi aí que parei por enquanto. Assim que eu tiver tempo livre suficiente, vou tentar realizar esta variante com arquivo.

 

http://yandex.ru/yandsearch?text=CreateFileMapping&stpar2=%2Fh0%2Ftm123%2Fs1&stpar4=%2Fs1

A conveniência é que há uma referência à memória compartilhada na dll.

Este endereço pode ser usado como endereço de estrutura. além disso, sua imaginação é o único limite :)

 
solandr >> :

Por favor, me dê um link para um API para trabalhar com o registro.

Exemplo de leitura a partir do registro.

 

Já escrevi uma pequena biblioteca, e meus EAs já estão mudando as informações através do registro. Na verdade, eles são trocados através da RAM, não há leitura-escrita em disco que eu não observe. No MSDN está escrito que é melhor não enfiar mais do que algumas centenas de Kb de dados no registro.

A biblioteca é configurada de tal forma, que todas as chaves e parâmetros são criados na área de registro temporário e não são escritos no registro permanente. Depois de reinicializar estas chaves, elas se foram.

MAS, a biblioteca funciona apenas com parâmetros de corda, com não mais de 255 caracteres (limitação em MQL). Mas isto é o suficiente. Em geral, os parâmetros no registro podem ser de diferentes tipos, não apenas strings, mas por enquanto outros tipos não são necessários na minha opinião. Neste momento tenho dois EAs trocados através do registro, mas pode haver mais :-). Outra coisa boa é que em Win API é possível conectar-se ao registro da rede. Se alguém precisar trocar informações entre EAs rodando em computadores diferentes na mesma rede, pode olhar nesta direção. Na minha opinião, é rápido, simples e confiável, e sem nenhuma dll e arquivos. Você coloca um cordel, você recebe um cordel.

#include "RegLib.mqh"

int hKey;

int init()
{
   // инициализируем дефайны
   InitRegDefines();

   // создаём тестовый ключ
   hKey = CreateKey( HKEY_CURRENT_USER, "!MT4TestKey" );

   // создаём поля по умолчанию
   SetStringValue( hKey, "Bid", "0.0" );
   SetStringValue( hKey, "Ask", "0.0" );

   return( 0 );
}

int start()
{
   // записываем цены в реестр
   SetStringValue( hKey, "Bid", DoubleToStr( Bid, Digits ) );
   SetStringValue( hKey, "Ask", DoubleToStr( Ask, Digits ) );

   // получаем цены в виде строк из реестра
   string BidStr = GetStringValue( hKey, "Bid" );
   string AskStr = GetStringValue( hKey, "Ask" );

   // выводим цены из реестра
   Print( "Bid = ", BidStr, " ", "Ask = ", AskStr );
}

int deinit()
{
   // закрываем ключ
   CloseKey( hKey );
   
   return( 0 );
}
Arquivos anexados:
reglib.zip  4 kb
 
Andres писал(а) >>

Ocorreu-me uma idéia, que tal trocar dados através do registro? Criar uma chave, apagar uma chave, todas as API's para isso parecem estar lá. Não sei quão lento é, mas parece que a parte que é acessada pelas aplicações pode sempre estar em RAM.

Já passou pela cabeça de alguém? Só funciona para terminais na mesma máquina.

Eu vou cavar nesta direção :-).

Você também pode tentar martelar um prego com uma lâmpada. Funciona para algumas pessoas.

 
Integer >> :

Você também poderia tentar martelar um prego com uma lâmpada. Algumas pessoas podem fazer isso.

Mas é lindo, você não acha? Você também poderia tentar usar variáveis de SO.

 
granit77 писал(а) >>

Mas é lindo, você não concorda? Você também poderia tentar usar variáveis de SO.

Você também poderia tentar ajustar o tempo do sistema.

 
:))))))))))))))
Razão: