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

 
Alexey Viktorov:

Não é porque eu a recompilei, é porque os testes começaram a partir de uma data diferente. E notei este erro, se você colocar algo que já estava lá, então o teste não acontece, mas dá imediatamente o resultado do teste anterior. Portanto, não se deixe enganar por tais muletas. Tente torná-lo normal. Se algo estiver faltando ou se os parâmetros forem inválidos, informe através de Imprimir e tudo estará correto.

Se fosse apenas devido a uma data diferente, então meus cheques o revelariam (barras em falta, etc.), mas não é a data que é o problema. Se eu não puder reconstruir o erro que a validação automática encontra, então é mais fácil para mim deslizar o mesmo e esperar que a vingança com os compradores encontre a área problemática (se houver). Esta implementação de validações não me dá total compreensão de onde procurar o erro. E a impressão já está empurrada por todo o lado para mim.

Alexey Viktorov:

E eu notei tal foda, se eu colar isso já foi, então o teste não ocorre e dá imediatamente o resultado do teste anterior.

E para não obter um resultado de teste anterior, devo mudar algo, até mesmo adicionar um fio vazio (eu quis dizer "recompilar").

 
Roman Gergert:

Eu finalmente descobri, talvez alguém possa ajudar, em geral, o soviético só verificou o lote mínimo quando o MM foi habilitado, e então o lote do conjunto hardcore = 0,01, bem, no depósito do validador acaba sendo $ 1 (encontrei esta informação em um dos tópicos), respectivamente, ele usa o lote 0,001 (ou mais) para negociar e porque eu sempre tive um lote de 0,01 em um lugar, ele não tinha os fundos e o robô não negocia)

Exatamente, Roman, o validador está testando com um depósito de $1.

Há muita função de normalização na EA. Se ele retornar 0, o comércio nem sequer tenta abrir:

      if((Auto() && (b==0 || (b>0 && BuyPriceMin-Ask>(b==1?iPointOrderStep_1:iPointOrderStep_2)*Point()))) || buy) {
         BuyLot=buy && LotFromPanel()>0 ? LotFromPanel() : BuyLot;
         double norm_lot=NormalizeLots(_Symbol,BuyLot);
         if(norm_lot>0.0) {  
            int ticket=OrderSend(Symbol(),OP_BUY,norm_lot,NormalizeDouble(Ask,_Digits),30,0,0,
                        "NZT-48",iMagicNumber,0,clrGreen);
            if(ticket>0) {
                ObjectSetInteger(0,"V_5_buy",OBJPROP_STATE,false);
                buy=false;
            }
            else  
               Print("Order Send error #",GetLastError());
         } else Print("Not enough money for the minimum lot");   
      }

Mas não está claro então como esta função de normalização de lotes da EA envia um lote 0,2 para abrir:

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, 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;
   return(_lot);
}

Afinal, se o lote 0,2 chegar para verificação e a margem a julgar pelos troncos for 645, então esta parte da expressão deve dar verdade

if(is_margin && _lot*margin>free)  _lot=0.0;     //0.2*645>0.95

E a função enviará 0,0, mas não 0,2. Ele só pode enviar 0,2 se

MarketInfo(symbol,MODE_MARGINREQUIRED);

devolvido 0 ou um valor insignificante. Não entendo de todo como este validador funciona.

Caros desenvolvedores MQL, por favor, enviem-nos logs de testes em vez de relatórios de erros de validação a seco em três linhas. Será muito mais fácil para nós, humildes programadores, entender os erros do código e corrigi-los. Você pode enviá-lo como um arquivo para e-mail, você provavelmente pensará em uma forma))))

P.S. Situação engraçada. Pelo 5º dia estou tentando colocar no mercado um Expert Advisor que funciona perfeitamente no testador e no mercado real.
 
Andrey Kaunov:

Exatamente, Roman, o validador testa com um depósito de $1.

Há muita função de normalização na EA. Se ele retornar 0, o comércio nem sequer tenta abrir:

Mas não está claro então como esta função de normalização de lotes da EA envia um lote 0,2 para abrir:

Afinal, se o lote 0,2 chegar para verificação e a margem a julgar pelos troncos for 645, então esta parte da expressão deve dar verdade

E a função enviará 0,0, mas não 0,2. Ele só pode enviar 0,2 se

devolvido 0 ou um valor insignificante. Não entendo de todo como este validador funciona.

Caros desenvolvedores MQL, por favor, enviem-nos logs de testes em vez de relatórios de erros de validação a seco em três linhas. Será muito mais fácil para nós, humildes programadores, entender os erros do código e corrigi-los. Você pode enviá-los como um arquivo para e-mail, você pode pensar em uma maneira :)))

P.S. Situação engraçada. Pelo quinto dia estou tentando colocar no mercado um Expert Advisor que funciona perfeitamente no testador e na vida real.

parece que você tem uma alavancagem diferente da do mercado, talvez 1:500

tente levar o cálculo do lote para 1k100 mudando apenas uma linha no código:

margem = AccountLeverage()*MarketInfo(symbol,MODE_MARGINREQUIRED)/100.0;

e o lote mínimo para o mercado é 0,1 Eu acho....
 

Você vive em algum tipo de mundo limitado por si mesmo. Em um mundo normal, o lote mínimo pode ser muito diferente de 0,01

Receita: ler e ler novamente o artigo "Que cheques devem passar...".

Antes de enviar uma ordem de comércio, é preciso verificar se ela passará, se há margem suficiente ...


Em geral, o validador cumpriu até agora sua tarefa principal: extrair o código incompleto do Mercado.

 
Renat Akhtyamov:

parece que você tem uma alavancagem diferente da do mercado, talvez 1:500

tentar levar o cálculo do lote para 1k100 alavancagem, alterando apenas uma linha no código:

margem = AccountLeverage()*MarketInfo(symbol,MODE_MARGINREQUIRED)/100.0;

Renat, obrigado pelo conselho, vou tentar.

Vladimir Karputov:

Você vive em algum mundo limitado por si mesmo. Em um mundo normal, o lote mínimo pode ser muito diferente de 0,01

RECIPEÇÃO: ler e ler novamente o artigo "Que cheques devem passar...".

Antes de enviar uma ordem de comércio, é preciso verificar se ela passará, se há margem suficiente ...


Em geral, o validador tem lidado até agora com sua tarefa principal: extrair do mercado o código incompleto.

Vladimir, você pode entender a pergunta de forma construtiva?! Eu não verifico o lote para margem e outras coisas?O artigo "Que cheques devem ser passados ..." já é como uma bíblia para mim. Eu postei trechos de código acima. Mudei o código de acordo com suas recomendações do 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 o 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 a EA é iniciada.

Vladimir Karputov:

...

Até o momento, o validador tem lidado com sua tarefa principal: retirar do mercado o código incompleto.

Então, o que o validador trata? Não consigo vê-lo fazendo nada além de estourar os cérebros dos programadores!

Note que não estou pedindo que você mude 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, podemos 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.

 
Andrey Kaunov:

...Não é como se estivéssemos trabalhando um contra o outro! Eu entendo, estamos tentando ganhar algo juntos.

Andrew, encontrei uma vez um servidor congelado durante o fim de semana.

o que significa que simplesmente não comeria MarketInfo(...)

Eu mal conseguia colocá-lo para trabalhar.

Portanto, se você entende que não pode engolir Mercado, resta pensar como fazer um validador não jura

Por exemplo, eu pergunto - que alavanca?

Diz 0.

Eu acrescento no código - se for 0, então ele diz 100

Se a lógica for clara, ela funcionará e boa sorte!

 

Estou vendo, Renat, obrigado.

Eu já fiz muitas muletas, mas em alguns lugares estou num beco sem saída. E eu quero que o código adequado seja adequadamente testado. Além disso, não é impossível encontrar um problema na ausência de registros de teste, mas é muito trabalhoso.

Talvez o validador também seria bom para obter uma atualização. Eu não sou o único que encontra tais problemas.

 
Andrey Kaunov:

Estou vendo, Renat, obrigado.

Eu já fiz muitas muletas, mas em alguns lugares estou num beco sem saída. E eu quero que o código adequado seja adequadamente testado. Além disso, não é impossível encontrar um problema na ausência de registros de teste, mas é muito trabalhoso.

Talvez o validador também seria bom para obter uma atualização. Eu não sou o único que encontra tais problemas.

Sim, você não é o único que enfrentou este problema, no próximo tópico há outro que enfrentou este problema - vocês já são dois.

Além disso, veja quantos EAs são colocados no mercado todos os dias sem problemas, é chamado de "o nível de profissionalismo".

 

Vitaly, se você e outros "profissionais" conseguirem passar a validação pela primeira vez, só posso aplaudir. Mas há muito mais de dois fios em um problema semelhante. Além disso, nem todos escrevem, algumas pessoas apenas lêem. A propósito, o Expert Advisor não é meu. Eu o preparo no Mercado para o cliente. Mas isso não nega os problemas descritos acima. Se você ler meu post cuidadosamente, talvez como "profissional" você possa sugerir uma solução para o problema. Colocar um posto na linha de "Você é burro e eu sou inteligente" não requer muito conhecimento.

Aqui está outro problema para você. Por que ter adicionado no início da OnTick() abertura em série incondicional de 5 transações em 5 minutos com lote mínimo, o validador também me dá uma mensagem de"sem operações comerciais".

void OnTick() { 
   static int test_ticket[2]={0,0};
   if(test_ticket[1]<5 && test_ticket[0]==0) {
      test_ticket[0]=OrderSend(_Symbol,OP_BUY,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),NormalizeDouble(Ask,_Digits),30,0.0,0.0,"NZT-48_test",33333,0,clrNONE);
      if(test_ticket[0]>0) test_ticket[1]++;
   }   
   if(OrderSelect(test_ticket[0],SELECT_BY_TICKET))
      if(OrderCloseTime()==0 && OrderOpenTime()+300<TimeCurrent())
         if(OrderClose(test_ticket[0],NormalizeDouble(OrderLots(),2),NormalizeDouble(Bid,_Digits),30,clrNONE)) {
            printf("Test order closed, ticket #%d",test_ticket[0]);
            test_ticket[0]=0;
         }   
...
}
 
Andrey Kaunov:

Vitaly, se você e outros "profissionais" conseguirem passar a validação pela primeira vez, só posso aplaudir. Mas há muito mais de dois fios em um problema semelhante. Além disso, nem todos escrevem, algumas pessoas apenas lêem. A propósito, o Expert Advisor não é meu. Eu o preparo no Mercado para o cliente. Mas isso não nega os problemas descritos acima. Se você ler meu post cuidadosamente, talvez como "profissional" você possa sugerir uma solução para o problema. Colocar um posto na linha de "Você é burro e eu sou inteligente" não requer muito conhecimento.

Aqui está outro problema para você. Por que ter adicionado no início do OnTick() abertura incondicional sequencial de 5 transações em 5 minutos com lote mínimo, o validador me dá"nenhuma operação comercial" da mesma forma?

E você deve primeiro postar aqui a resposta completa do validador

E o que o faz pensar que o validador define os bilhetes pelo princípio que você inventou?

para abrir 5 negócios, você precisa contar o número de negócios abertos, não a bilheteria