Características da linguagem mql5, subtilezas e técnicas - página 186

 
HistóriaSelect.

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

MT5 e Velocidade em Acção

fxsaber, 2020.09.02 00:32

Se alguém tentar utilizar bibliotecas partilhadas onde o parâmetro de entrada não corresponda, o processo será lento.


O outro HistorySelect.

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

MT5 e Velocidade em Acção

fxsaber, 2020.09.02 00:52

HistoryDealSelect e HistoryOrderSelect devem necessariamente ser escritos desta forma.

  static bool HistorySelectOrder( const ulong Ticket )
  {
    return((::HistoryOrderGetInteger(Ticket, ORDER_TICKET) == Ticket) || ::HistoryOrderSelect(Ticket));
  }

  static bool HistorySelectDeal( const ulong &Ticket )
  {
    return((::HistoryDealGetInteger(Ticket, DEAL_TICKET) == Ticket) || ::HistoryDealSelect(Ticket));
  }

Caso contrário, é garantido que encontrará lentos.

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

MT5 e Velocidade em Acção

Renat Fatkhullin, 2020.09.02 00:40

Quando se trabalha com grandes volumes (e mostrou milhares e dezenas de milhares de negócios na história por uma razão), que requerem acesso atómico/snapshot, é preciso compreender o seu custo.

 
Se a EA tiver MessageBox no OnInit, há uma série de coisas a fazer para contornar o potencial problema de realinhamento.
 
É sensato minimizar o número de chamadas para funções internas para reduzir a probabilidade de encontrar os seus não infrequentes desfasamentos.
 

Não pode ganhar

2020.04.01 11:49:34 venda instantânea falhada 0,32 EURUSD a 1,09539 [Volume inválido]

Tenho uma verificação sobre o limite de volume total no mercado.

Não sei porque é que recebi um tal erro

No validador do mercado
 
Vladimir Pastushak:

Não pode ganhar

2020.04.01 11:49:34 venda instantânea falhada 0,32 EURUSD a 1,09539 [Volume inválido]

Tenho uma verificação sobre o limite de volume total no mercado.

Não compreendo porque é que recebi um erro tão grande.

No validador do mercado

Não conseguiu atingir o limite da encomenda? Penso que foi assim.

 
Edgar Akhmadeev:

Poderia ter-se deparado com um limite de mandados? Penso que sim.

Diz-se volume errado, verifica-se a disponibilidade de fundos, verifica-se também a ultrapassagem do limite do lote. Continua a cavar...

 
Vladimir Pastushak:

Não diz o volume certo.

Edgar Akhmadeev:

Parece que estou farto.

...que um pequeno volume não abriu com um grande depósito. Não me lembro dos detalhes, mas um dos corretores do cêntimo tinha um limite de encomendas muito pequeno no instrumento.

 

Há o seguinte problema no MT5. Preciso de testar o funcionamento do painel de negociação no testador de estratégia em modo visual. O painel de negociação tem campos de entrada (OBJ_EDIT). Quando se altera o texto no campo de entrada e se prime ENTER, o novo texto não aparece, em vez disso, aparece o texto original que foi definido quando o campo de entrada foi criado. Ou seja, não é possível alterar o texto no campo de entrada durante o teste visual do painel.

Como é que isto pode ser resolvido?

Exemplo de código:

void OnTick()
  {
   string name="EDIT";
   if(ObjectFind(0,name)==-1)
     {
      ObjectCreate(0,name,OBJ_EDIT,0,0,0);
      ObjectSetString(0,name,OBJPROP_TEXT,"EURUSD");
      ObjectSetInteger(0,name,OBJPROP_XDISTANCE,50);
      ObjectSetInteger(0,name,OBJPROP_YDISTANCE,50);
      ObjectSetInteger(0,name,OBJPROP_XSIZE,50);
      ObjectSetInteger(0,name,OBJPROP_YSIZE,20);
      ObjectSetInteger(0,name,OBJPROP_READONLY,false);
      ObjectSetInteger(0,name,OBJPROP_COLOR,clrBlack);
      ObjectSetInteger(0,name,OBJPROP_BGCOLOR,clrWhite);
     }
  }
 

Criei este guião de auto-hotkey para esconder as barras de título enquanto codificava. Funciona para todas as janelas no Windows. Não tenho a certeza acerca de outras plataformas.



; 
Hide borders, title bar 









#IfWinNotActive ahk_class Progman 









#IfWinNotActive ahk_class Shell_TrayWnd 









^] :: 









WinGet Style, Style, A 









if (Style & 0xC40000) { 









WinSet, Style, -0xC40000, A 









WinMaximize, A 













} 









else { 









WinSet, Style, + 0xC40000, A 









WinRestore, A 









} 









return 

O resultado, é um ecrã de secretária perfeitamente preenchido.

Basta guardar o ficheiro como file_name.ahk. Guarde-o no seu directório preffered, depois descarregue e instale https://www.autohotkey.com .

Criar um atalho do guião e cortá-lo. Ganha a imprensa + r

Tipo shell: arranque e colar o atalho na janela pop.

Dessa forma, o guião começará com janelas após reiniciar. Para lançar o guião agora, faça duplo clique, depois pode esconder barras de título da janela com ctrl +].

Certifique-se de que a janela não é maximizada durante a utilização do atalho. Não vale a pena maximizar uma janela maximizada, e eu não tratei desse caso.

Desfrute

editar:

O formador de códigos está a comportar-se de forma estranha. Continua a expandir o código para um enorme espaçamento de linhas. Lol!

AutoHotkey
  • www.autohotkey.com
AutoHotkey provides a simple, flexible syntax allowing you to focus more on the task at hand rather than every single little technicality. It supports not only the popular imperative-procedural paradigm, but also...
Arquivos anexados:
 

Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

Bibliotecas: Benchmark

fxsaber, 2020.10.01 23:49

// Возвращает true в некоторых ситуациях, когда чарт не виден.
bool IsInvisible( long chartID = 0 )
{
  bool Res = ::ChartGetInteger(chartID, CHART_IS_MINIMIZED);
  
  if (!Res && !::ChartGetInteger(chartID, CHART_IS_MAXIMIZED) && ::ChartGetInteger(chartID, CHART_IS_DOCKED))
  {
    if (!chartID)
      chartID = ::ChartID();

    for (long Chart = ::ChartFirst(); (Chart != -1) && !Res; Chart = ::ChartNext(Chart))
      Res = (Chart != chartID) && ::ChartGetInteger(Chart, CHART_IS_MAXIMIZED);
  }
  
  return(Res);
}

Os painéis de negociação e outras informações nos gráficos não são actualizados se as devoluções forem verdadeiras.

Razão: