Preocupado com o erro, não há operações comerciais - página 14

 
Maxim Kuznetsov:

pense sobre o que acontecerá em Stop Out. (você já tem Margin Call, Steppe está mais perto do que nunca)

sua profissão será fechada à força, mas você ignora tal opção, e estará procurando por ela a cada tique (na história, é longo) e enviando ordens incorretas.

Apenas para adicionar para qualquer pessoa que tenha "mais de 10 anos de programação MQL".

Se algo pode acontecer, com certeza acontecerá.

Stop Out e Margin Call não são tão normais, mas é natural, e um EA deve estar pronto para eles.

As condições comerciais podem mudar, elas não são constantes. StopLevel salta e até mesmo alavanca mudanças às vezes.

O usuário pode facilmente definir/alterar uma posição, mesmo não intencionalmente - o Conselheiro Especialista deve reagir a isso

Um usuário pode abrir/fechar um pedido com Magic (ou acidentalmente definir Magic=0 e negociar à mão) - o que o robô vai fazer?

O saldo é depositado/retirado sem reiniciar o EA - é extremamente importante que o robô seja capaz de fazer isso (houve um tópico recentemente - um homem acabou de perder dinheiro)

O terminal pode reiniciar e levar muito tempo para ser atualizado, ou a conexão pode ser perdida por um tempo significativo - tudo isso e tudo o que aconteceu offline deve ser levado em conta

O validador só verifica 1-2% do "mínimo de candidatos" e as pessoas ainda reclamam...

 
Renat Akhtyamov:

parece ter sido escrito sequencialmente, pergunta - resposta

todas as páginas da linha estão acessíveis.

Renat, eu entendo que você está contando mandados. Eu não entendo por quê?


Maxim Kuznetsov:

Apenas para acrescentar para todos que têm "mais de 10 anos de programação MQL".

Se algo pode acontecer, com certeza acontecerá.

Stop Out e Margin Call não são tão normais, mas é natural, e um EA tem que estar pronto para eles

As condições comerciais podem mudar, elas não são constantes. StopLevel salta e até mesmo alavanca mudanças às vezes.

O usuário pode facilmente definir/alterar uma posição, mesmo não intencionalmente - o Conselheiro Especialista deve reagir a isso

Um usuário pode abrir/fechar um pedido com Magic (ou acidentalmente definir Magic=0 e negociar à mão) - o que o robô vai fazer?

O saldo é depositado/retirado sem reiniciar o EA - é extremamente importante que o robô seja capaz de fazer isso (houve um tópico recentemente - um homem acabou de perder dinheiro)

O terminal pode reiniciar e levar muito tempo para ser atualizado, ou a conexão pode ser perdida por um tempo significativo - tudo isso e tudo o que aconteceu offline deve ser levado em conta

O validador é verificado por apenas 1-2% do "mínimo de candidatos" e as pessoas ainda reclamam...

Maxim, do que você está falando?! O que eu pedi conselhos sobre o que fazer quando eu conseguir uma parada para sair. Leia o fórum da página 6, na minha opinião eu expus minha pergunta em grande detalhe.

 
Andrey Kaunov:

Renat, eu entendo que você está contando mandados. Eu não entendo por quê?


Maxim, do que você está falando?! Eu pedi conselhos sobre o que fazer com uma parada para sair? Leia o fórum na página 6, acho que expus minha pergunta em grande detalhe.

Porque os bilhetes no real não são 0,,,,N

 
Oh, você se refere ao meu pequeno código. Portanto, não importa que tipo de bilhetes existem. Renat existe uma matriz bidimensional. Na cela [0] ele escreve um bilhete, e na cela [1] ele conta as ordens. Poderíamos fazê-lo com diferentes variáveis, mas decidi fazê-lo dessa forma.
 
Andrey Kaunov:

Renat, eu entendo que você está contando mandados. Eu não entendo por quê?


Maxim, do que você está falando?! Eu pedi conselhos sobre o que fazer com uma parada para sair? Leia o fórum da página 6, na minha opinião, eu coloquei minha pergunta com muito detalhe.

com seus 10 anos de experiência, o que posso aconselhar...nada em princípio :-)

Você está ignorando meus conselhos e insistindo em consertar o Validor para sua EA.

---

você tem uma parada no NZDUSD, um pedido foi fechado, a lógica de sua EA não importa, você ainda seleciona-o e envia OrderClose, você fica falso. Esta incrível operação se repete a cada tique, a coisa toda desacelera e o cheque é cancelado. E este é o caso mais simples.

Sobre as verificações das condições comerciais - ver 14 páginas anteriores

 
Andrey Kaunov:

Preste atenção a este seu posto:

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

Cansado do erro, não há operações comerciais

Andrey Kaunov, 2020.07.25 11:42

Vou tentar, Renat, obrigado pela dica.

Vladimir, você pode entender a pergunta de forma construtiva? Eu não verifico o lote para margem e assim por diante?O artigo "Que cheques devem passar..." já é como uma bíblia para mim. Eu postei trechos de código acima. Mudei o código de acordo com suas recomendações no artigo para conformidade total:

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, bool is_margin=true) {
   if(lot<=0) return(0.0);
   RefreshRates();
   double min=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double max=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); 
   //double free = AccountFreeMargin()*0.95;
   //double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot=MathRound(_lot/step)*step;
   //if(is_margin && _lot*margin>free)  _lot=0.0;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=0.0;
   return(_lot);
}

Mas eu ainda recebo "sem negócios":

Bem, se a função sempre envia lote 0,0 e não permite a abertura de comércios, eu a mudo para enviar lote mínimo:

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, bool is_margin=true) {
   if(lot<=0) return(0.0);
   RefreshRates();
   double min=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double max=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); 
   //double free = AccountFreeMargin()*0.95;
   //double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot=MathRound(_lot/step)*step;
   //if(is_margin && _lot*margin>free)  _lot=0.0;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=min;
   return(_lot);
}

E eu recebo o histórico de que as negociações ocorrem (ver capturas de tela abaixo). Mas o lote mínimo, é claro, vem muito estranho, mas que venha. Mas os negócios estão lá!

Nesta situação, algo muito estranho é o validador, fazendo um lote mínimo de 0,2 para um depósito de 1 dólar.


Naturalmente, não haverá nenhum acordo! E isto com um código perfeitamente adequado. A propósito, removi todas as condições sobre indicadores, etc. para testes. As negociações começam a ser abertas assim que o Expert Advisor é lançado.

Então, o que o validador faz? Acho que, até agora, a única coisa que faz é estourar a cabeça dos programadores!

Note que não estou pedindo para mudar nada no validador. Podemos simplesmente ver os logs de testes. Entenderemos então com que parâmetros os testes estão sendo executados e em que depósitos. No final do dia, você pode ao menos usar impressões para verificar onde o erro está no código e corrigi-lo o mais rápido possível. Não vamos apontar nossos dedos no céu durante uma semana inteira, tentando apenas localizar um erro. Não estamos trabalhando um contra o outro, estamos? Eu entendo, estamos tentando ganhar algo juntos.

Sua primeira captura de tela. Você se apegou à mensagem de que não há negócios no NZDUSD. E há 14 páginas que você vem lutando com este moinho.

Mas o erro principal na primeira captura de tela não é esse. É o que o informa sobre testes muito longos em GBPUSD. Como o teste durou muito tempo, o tempo de validação foi muito longo.

Execute o profiler de código em GBPUSD, M30 e deixe-o operar por três horas. Em seguida, observe os gargalos e conserte-os.

 
Maxim Kuznetsov:


---

Você tem uma parada no NZDUSD, você fechou um pedido, a lógica de seu Expert Advisor não se importa, você ainda a seleciona e envia OrderClose, você fica falso. Esta incrível operação se repete a cada tique, a coisa toda desacelera e o cheque é cancelado. E este é o caso mais simples.

Sobre a verificação das condições comerciais - veja as 14 páginas anteriores.

Maxim, você está lendo o código de forma muito desatenta.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
   gl_lots=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   gl_ask=NormalizeDouble(Ask,_Digits);
   gl_bid=NormalizeDouble(Bid,_Digits);
   gl_comm="test";
//---
   if(AccountFreeMarginCheck(_Symbol,OP_BUY,gl_lots)<=0 || GetLastError()==134) {
      printf("Not enough money for the minimum lot: %.4f",gl_lots); 
      return;
   }
   if(test_ticket[1]<8 && test_ticket[0]==0) {
      test_ticket[0]=OrderSend((StringCompare(_Symbol,"NZDUSD")==0?"NZDUSD":_Symbol),OP_BUY,gl_lots,gl_ask,30,0.0,0.0,gl_comm,33333,0,clrNONE);
      if(test_ticket[0]>0) test_ticket[1]++;
      else if(Fun_Error(GetLastError())==1) return; 
   }   
   if(test_ticket[0]>0)
      if(OrderSelect(test_ticket[0],SELECT_BY_TICKET)) {
         if(OrderCloseTime()==0 && OrderOpenTime()+300<TimeCurrent())
            if(OrderClose(test_ticket[0],OrderLots(),gl_bid,30,clrNONE)) {
               printf("Test order closed, ticket #%d",test_ticket[0]);
               test_ticket[0]=0;
            } else if(Fun_Error(GetLastError())==1) return;
      } else if(Fun_Error(GetLastError())==1) return;
}

A condição mencionada no marcador não deixará a função OrderClose() fugir se a ordem for fechada, esta é a primeira coisa a ser feita. E em segundo lugar, se pelo menos um pedido estiver aberto no NZDUSD, o validador não devolveria "nenhuma troca".

Artyom Trishkin:

...

Execute o profiler de código em GBPUSD, M30 e deixe-o operar por três horas. Em seguida, observe os gargalos e conserte-os.

Ok, Artyom. Vou tentar.

 
Andrey Kaunov:

Maxim, você leu o código de forma muito desatenta.

A condição especificada pelo marcador não deixará escapar a função OrderClose(), esta é a primeira coisa a ser feita. E segundo, se pelo menos um pedido fosse aberto no NZDUSD, o validador não devolveria "nenhuma troca".


Francamente falando, estou cansado de agir como um depurador de um código torto e tentar combater a autoconfiança do autor. Os erros especificados estão lá, procure por si mesmo

Se você não souber o que fazer com ele, terá que fazer algo para seu próprio lucro. O validador não tem nada a ver com isso

 
Não estou lhe pedindo pessoalmente, Maxim, para depurar nada. O código é torto, tudo bem, mas passa na validação. A questão é bem diferente.
 
Artyom Trishkin:

...

Execute o profiler de código em GBPUSD, M30 e deixe-o negociar por três horas. Em seguida, veja os gargalos e conserte-os.

Artyom, o profiler do código não mostrou nenhum gargalo. Todo o código funciona sem problemas, sem nenhum processo patologicamente longo.

A linha de fundo de toda esta história é esta. Por gancho ou por vigarista, eu finalmente passei a validação. Não depende em nada do código (se estiver correto, sem nenhum erro óbvio, como mencionado neste artigo). Como funciona o validador é obviamente conhecido apenas por seu criador. O código é verificado após 2 vezes e, em seguida, na terceira vez. Às vezes passa várias vezes seguidas e às vezes não passa de jeito nenhum. Além disso, eu só altero os parâmetros de entrada (que não são cruciais) ou mudo as linhas que não mudam nada ao rearranjá-las, ou mesmo removo ou acrescento comentários (que não devem afetar de forma alguma o arquivo de trabalho).

Em geral, a validação de aprovação ou falha, depende apenas do validador de "humor" (tensão na rede, algum tipo de fluxo de energia ou o que quer que seja). Assim, o código no testador habitual em parâmetros normais nunca foi pendurado e não deu nenhuma falha, em nenhum par e TF.

Razão: