Erros, bugs, perguntas - página 1724

 
MK, porque não acrescentar funções normais de pesquisa binária à biblioteca padrão? O ArrayBsearch só é aplicável em casos simples em que os tipos são simples e não é necessário um comparador personalizado. Os gabaritos estão lá, faça uma substituição sobre c++::std::lower/upper_bound. Até agora tive de ser eu a escrevê-lo, o que não é normal (quase completamente copiado de cppreference).
template<typename A, typename T, typename Compare>
uint lower_bound(const A &ar[], const T &value, Compare &comp){
   long count = ArraySize(ar);
   uint first = 0;
  
   while(count > 0){
      uint it = first;
      uint step = count / 2;
      it += step;
      if(comp.comp(ar[it], value)){
         first = ++it;
         count -= step + 1;
      }
      else
         count = step;
   }
   return first;
}

void OnStart(){
   struct M_point{
      double price;
      datetime time;
   };
   M_point ar[5];
   ar[0].time = 2; ar[1].time = 4; ar[2].time = 6;
   ar[3].time = 8; ar[4].time = 10;
   struct Comp{
      bool comp(const M_point &p, datetime value) {return p.time < value;}
   }cmp;
   datetime value = 6;
   lower_bound(ar, value, cmp);
   return;
}

No processo, surgiram algumas questões:
1. Porque é impossível escrever operador() em Comp (é proibido por alguma razão)?
bool operator()(const M_point &p, datetime value) {return p.time < value;}
2. Porque não podemos passar o prvalue para uma função que aceita referência constante?
lower_bound(ar, 6, cmp) ); // ошибка
ZS: e também muito irritante este aviso: "estrutura não tem membros, tamanho atribuído a 1 byte".
 
coderex:

Tudo está bem aí, a colocação de encomendas deve ser controlada através da OnTradeTransaction, a propósito, se se ligar directamente à bolsa através do Plaza2, a situação é a mesma - é necessário controlar a chegada de mensagens sobre a colocação de encomendas. Em MT4, esta função é síncrona, mas a mesma opção está disponível em MT5, só que neste caso, a lógica irá parar até a função não receber resposta.

Se precisar, posso enviar-lhe a classe de controlo, mas esta está escrita para colocação no mercado, mas em breve finalizá-la-ei para os limitadores.

Para controlar o pedido, é preciso lembrar o facto da sua colocação. A turma ser-lhe-á enviada.
 
fxsaber:
Peço-vos muito que ponham algo na kodobase! Para fins educacionais.

Não pode, pela razão que você mesmo apontou https://www.mql5.com/ru/forum/1111/page1743#comment_2877482. Recentemente não consegui localizar o erro, gastei muito tempo para formar o código fonte em servicedesk - no final nada saiu por causa de muitas referências cruzadas (uma puxa a outra em progressão geométrica) - enviei .ex5

Para fins educacionais posso sugerir a tarefa: sem introduzir variáveis adicionais simplifique h() para que f() seja chamado em qualquer caso uma vez

bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
#ifndef  MACRO
        if ( f() )
#endif
        {
                if ( f() )
                        g1();
                g2();
        }
}
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум трейдеров MQL5.community
 
A100:

Erro de compilação

(*) Em geral, em padrão (1) tanto A->(2) como const A->(3) podem ser substituídos em vez de T.

Porquê? Um padrão com const não pode aceitar não const - viola o contrato.

 
A100:

Para fins educacionais, posso sugerir a seguinte tarefa: sem introduzir variáveis adicionais, simplificar h() para que f() seja chamado uma vez em qualquer caso

bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
#ifndef  MACRO
        if ( f() )
        {
                g1();
                g2();
        }
#else
        if ( f() )
                g1();
        g2();
#endif
}
 
Stanislav Korotky:

Porquê? Um modelo com const não pode aceitar não const - viola o contrato.

O modelo não é por si só (ao contrário da função) - a sua tarefa é realizar a substituição (por analogia com #define). Se não houver contradições no final da substituição (e não há nenhuma), o modelo cumpriu a sua tarefa. Pelo menos tentei compilá-lo em C++ e o compilador não deu erros ou avisos
 
fxsaber:
Isto não é realmente uma simplificação. No MACRO+2*f+g1+g2=5 original - tem: MACRO+2*f+2*g1+2*g2=7.
 
Sergey Diubakin:

Alguém experimentou um problema semelhante? É um "bug" no terminal ou na mina?

O que é que a GetLastError() devolve ?
 
fxsaber:

O MT5-OrderSend NÃO está totalmente sincronizado - não há sincronização com o ambiente comercial. Isto significa que as leituras da história não correspondem à situação real.

Não há timeout fora de questão. Não existe uma solução fiável para o problema, porque os problemas de sincronização têm de ser resolvidos ao nível do terminal, não ao nível do servidor.

De facto, os utilizadores do MT5 estão a enfrentar o que os criadores de pontes MT4 estão a enfrentar.

Se um OrderSend é enviado, tem de LEMBRAR (é aqui que se encontra a potencial vulnerabilidade) que é feito. Depois ignorar o histórico actual (ambiente de negociação) até que a mensagem correspondente chegue à OnTrade. Uma vez chegado, LEMBRE-SE de ESQUECER.

Quando não há LEMBRE-SE, pode confiar na história como no MT4.

O MT4-OrderSend é totalmente sincronizado.
Pergunto-me - por que razão é que isto é feito ...
Compreendo que se se meter com a OrderSendAsync de forma assíncrona, pode lidar tanto com a OnTrade como com a OnTradeTransaction. Com OrderSend quero ter um comportamento simples, como no MT4. Uma vez chamado, obtemos na produção posições abertas e história já modificadas.
Há um ponto subtil. Se o estado actual for armazenado numa variável global e a expectativa de mudanças de estado levar um tempo relativamente longo, e o comerciante conseguir alterar os parâmetros EA, as variáveis globais serão reiniciadas e o estado será descartado.
 
bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
        if ( f() )

        {
                g1();
#ifdef  MACRO
        }
#endif
                 g2();
#ifndef  MACRO
        }
#endif
}