Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1220

 
HistorySelect(xxx,TimeCurrent()+1)

Um segundo é muitas vezes a perda da última troca/ordem sobre o real. Por exemplo, em muitas brechas, uma ordem vai para execução pelo tempo TTL, que pode ser de cinco segundos. Se não for executada em cinco segundos, a ordem é um redireccionamento. Ou é executado, mas em três segundos.

No caso, se não houvesse ticks desde a aceitação até à execução, tal chamada HistorySelect não receberá informação sobre a mesma.


Talvez, o TimeCurrent deva ser igual a MathMax(LastOrder_time, MarketWatch_Time). Então a HistorySelect estará correcta. Mas a TimeCurrent pode ser demasiado cara.


A propósito, tal esquema de trabalho HistorySelect irá saltar um pouco da história dos ofícios.

void OnStart()
{
  static MqlTick PrevTick = {0};
  
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
  {
    if (HistorySelect(PrevTick.time, INT_MAX))
      // Учитываем новые ордера/сделки в Истории торгов

    PrevTick = Tick;  
  }
}

Embora, à primeira vista, tudo seja claro.


Escrever um DealsTotal() barato não é fácil em MT5. Não é elementar (e gratuito) EncomendasHistóriaTotal() em MT4.

 

pensamentos em voz alta, sem reivindicação de relevância ou competência:


fxsaber:

Se não houvesse carrapatos desde a aceitação até à execução, tal chamada à HistorySelect não obterá informações sobre a mesma.

Não vai resolver este problema, o modelo de servidor - terminal - interacção MQL foi originalmente concebido

Ainda não cheguei ao ponto de verificar em MT5, mas em MT4 sei com certeza que há situações, quando há alterações de preços no nosso símbolo na janela de observação do mercado, mas pode não haver ticks ou menos do que há em ЕА


ok, não importa, por isso funciona, basta escolher na decisão TS, o que acontece à encomenda na ausência de informação do servidor a partir do momento em que envia a encomenda - ou seja, a encomenda será definida ou rejeitada a priori, e recebeu a resposta para confirmar esta decisão preliminar ou cancelar - ou seja, trabalhar com informação não confirmada ou ainda esperar pela resposta do servidor - esta oferta MQ e provavelmente não se adequará


fxsaber:

Não é fácil usar DealsTotal() barato em MT5. Não é a ordem elementar (e gratuita)HistoryTotal() em MT4.

não escrever ;)

ou melhor, o mais provável é que o faça, e irá gastar recursos da EA para manter o algoritmo, penso que precisa de descobrir como funciona o SQLite, os testes de desempenho do MQ declararam, trabalhar com grandes tabelas e amostras é exactamente o objectivo da base de dados - o código EA será minimalista, todo o trabalho que a base de dados irá fazer, todo o trabalho se resume ao preenchimento de dados quando coloca uma encomenda e actualização quando o servidor responde (sincronização, claro, quando executa a EA, a base de dados em memória)

 
Igor Makanu:

mas não o fará ;)

ou melhor, muito provavelmente escreverá e gastará recursos da EA para manter o algoritmo, penso que precisa de descobrir como funciona o SQLite, os testes de desempenho do MQ indicados, trabalhar com grandes tabelas e amostras é exactamente o objectivo da base de dados - o código EA será minimalista, todo o trabalho que a base de dados lhe fará, todo o trabalho será reduzido ao preenchimento de dados quando colocar uma encomenda e actualização quando responder a partir do servidor (sincronização, claro, no arranque da EA, a base de dados em memória)

Foi originalmente escrito e afixado. É pouco provável que seja mais rápido.

 
fxsaber:

Foi originalmente escrito e afixado. É pouco provável que seja mais rápido.

Devo ter visto a tarefa de forma incorrecta.

Pensei que precisava de actualizar a lista de encomendas de dois pontosOnTradeTransaction() e OnTick() , por isso sugeri que o fizesse na base de dados

 
void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result)
  {
   if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
     {
      if(!HistoryDealSelect(trans.deal))
         return;
      bool time_to_sum_up=false;
      if(HistoryDealGetInteger(trans.deal,DEAL_ENTRY)==DEAL_ENTRY_OUT)
        {
         time_to_sum_up=true;
        }
      if(!time_to_sum_up)
         return;
      HistorySelect(0,TimeCurrent());
      int deals=HistoryDealsTotal();
      for(int i=deals-1; i>=0; i--)
        {
         if(HistoryDealGetTicket(i)==trans.deal)
           {
            Print("Found!");
            return;
           }
        }
      Print("Not Found!");
     }
   return;
  
Este código é um trecho simplificado da minha EA.
Assumir que, em alguns casos, o resultado da execução deste código é devolver "Não Encontrado".
Não percebo bem porquê.
Porque não se pode encontrar nos eventos que desencadeia?
O evento de transacção enviado pelo servidor para o terminal chegou, mas o servidor não consegue sincronizar simultaneamente a hora correcta para o terminal?
O meu entendimento é que um segundo aumento no valor do TimeCurrent() é mais do que suficiente.
Deve-me estar a faltar algoimportante, certo?
Ficar-lhe-ia muito grato se pudesse apontar quaisquer erros no meu entendimento.
Объем импорта г/г - экономический индекс Японии
Объем импорта г/г - экономический индекс Японии
  • www.mql5.com
Объем импорта г/г (Imports y/y) отражает изменение объема импорта товаров и услуг в отчетном месяце по сравнению с тем же месяцем прошлого года. Показатели импорта используются для оценки внешней торговой активности Японии и спроса на импортируемые товары внутри страны. Из-за последствий "финансового кризиса" США Япония также столкнулась с...
 
Pode criar um método para abrir o Mercado Profundo de algum símbolo em mql5, por favor? isto é importante quando se trabalha com múltiplos símbolos.
 
Dmitri Custurov:

Aqui está o meu código. Na inicialização, cria um registo na tabela. No corpo do OnTick deve devolver imediatamente um erro, porque tento adicionar um registo com a mesma CHAVE PRIMÁRIA, e depois disso a base fecha imediatamente. Mas ao mesmo tempo devia ver pelo menos o primeiro registo quando o abro, mas quando o corro no provador não está lá. E mesmo a mesa não é criada. Se eu apenas o abrir no terminal, tudo é normal. O primeiro registo está lá.

Com a localização da base de dados, não terá feito asneira, assim o espero?

 
Aleksey Mavrin:

Não está confuso sobre a localização da base, pois não?

Não, não estou. Tudo está em Ficheiros. Penso que em modo de teste, a base de dados é criada em memória e destruída após o teste.

 
Igor Makanu:

pensamentos em voz alta, sem reivindicação de relevância ou competência:

...

ou melhor, muito provavelmente escreverá e gastará recursos da EA para manter o algoritmo, penso que precisa de descobrir como funciona o SQLite, os testes de desempenho do MQ indicados, trabalhar com grandes tabelas e amostras é precisamente o objectivo da base de dados - o código EA será minimalista, todo o trabalho que a base de dados lhe fará, todo o trabalho é reduzido ao preenchimento de dados ao colocar uma encomenda e actualização ao responder a partir do servidor (sincronização, claro, ao executar a EA, a base de dados em memória)

E que base de dados irá fazer todo o seu trabalho? Pode dizer-me?

 

Num terminal apenas colocando ordens, no outro (com o mesmo corretor e conta) controlando a execução. comunicação quer através da base de dados quer através do PUB/SUB ZMQ. Claro que a base de dados não é SQLite. O mais adequado para estes fins é Redis, claro que a minha opinião pessoal.

Boa sorte