Erro de validação ao liberar o robô comercial para o mercado. - página 5

 
Obrigado pela dica, mas provavelmente não é o meu caso. Meu validador não vê as funções de negociação, não há como chegar ao número máximo de ordens ))))
 

Oh, shaitan... Validação aprovada e agora

sem operações comerciais

não mais um erro.

P.S. Foi um tiro aleatório. O próximo teste é novamente a mesma coisa


 
Andrey Kaunov:

Não há nenhum erro aqui, não entendo o que está acontecendo. Eu coloquei uma muleta (divisão por zero) antes da função comercial:

Funciona:

Eu o retiro, ele me dá o mesmo

Nenhuma operação comercial.

Não entendo o que impede o validador de OrderSend(). Afinal, se chegar até ele, deve haver erros de faturamento (embora eu os tenha corrigido todos) 130, 131, 134, ..., mas não"nenhuma operação comercial". Eu só tenho que colocar no OnInit() uma ordem pendente em algum lugar distante dele, para não saber como combatê-la.

E qual é o sentido de uma muleta assim se a condição sob a qual uma posição deve ser executada não entra no código?

 
Por que não está entrando?! Olhe com atenção, Alexey. Pouco antes da OrderSend, há uma muleta.
 
Andrey Kaunov:
Por que não há entrada?! Veja com atenção Alexey. Há uma muleta um pouco antes da OrderSend.

Certo. Se a OrderSend não for executada, isso significa que a execução do código não chega a ela por algum motivo. E não importa o que você coloque diante dele no bloco de condições, não há entrada e não há execução, nem mesmo divisão por zero.

 

Espere, eu não entendo. Se o operador 1 (divisão por zero) for executado, então o próximo é o se operador. E isso significa verificar seu estado. Para verificar a condição, a função OrderSend deve ser executada, o que significa que ela é a próxima na linha após a divisão por zero.

Mas não importa. Eu mudei o código por causa da pureza da experiência:


O resultado é o mesmo. O resultado com a muleta é um erro de divisão por zero. Sem a muleta, o resultado é mostrado acima: nenhuma operação comercial.

 
Andrey Kaunov:

Espere, eu não entendo. Se o operador 1 (divisão por zero) for executado, então o próximo é o se operador. E isso significa verificar seu estado. Para verificar a condição, a função OrderSend deve ser executada, o que significa que ela é a próxima na linha após a divisão por zero.

Mas não importa. Eu mudei o código por causa da pureza da experiência:


O resultado é o mesmo. O resultado com a muleta é um erro de divisão por zero. O resultado é mostrado acima sem ele: nenhuma operação comercial.

Você não deveria ter usado uma imagem para colar o código. É impossível lê-lo de forma alguma. E o problema não está neste fragmento de código. O problema é que algumas condições não são cumpridas em alguns parâmetros de entrada e não há notificação.

 
Andrey Kaunov:
Por que ele não entra?!

Por que você está tentando escrever pior para o mercado do que para você mesmo?

É simples - antes de enviar um pedido, veja "é mesmo executável?

verificar os limites (você disse isso), verificar os fundos e a margem (você não tem isso), ver se existe um vínculo e se o comércio é permitido.

(opção) se houvesse cálculos pesados, não é pecado refrescar antes de ler Bid Ask

Para seu próprio bem, você fará todas essas verificações. Por que não agora?

 

Você acha que eu não verifico. O tamanho do lote é verificado em uma função separada

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
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();
   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; //MathFloor(free/margin/step)*step;
   return(_lot);
}

Não são necessários limites aqui, porque Stop Loss e Take Profit são iguais a zero na abertura comercial.RefreshRates() atualiza os dados no cálculo do lote. É claro que não há verificação de conexão, etc. antes de cada entrada, mas não é essa a questão. Se a OrderSend enviasse um pedido, haveria um erro específico: 130, 131, etc. Mas o que eu tenho é.

Não tentar enviar uma ordem de abertura de forma alguma. Mesmo no último teste, quando defino uma posição de verificação na função OnInit().

int OnInit() {
  
   int stops_level=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
   iTrailStart=inpTrailStart;
   iTrailStart2=inpTrailStart2;
   iTrailStartL=inpTrailStartL;
   //---
   if(stops_level>0) {
      if(inpTrailStart<stops_level+3) iTrailStart=stops_level+3;
      if(inpTrailStart2<stops_level+3) iTrailStart2=stops_level+3;
      if(inpTrailStartL<stops_level+3) iTrailStartL=stops_level+3;
   }
   
   Comment("");
   EventSetMillisecondTimer(300);
   ButtonCreate("V_5",5,25,50,20,"FLAT",9,clrBlack,C'236,233,235', clrNONE,false);
   ButtonCreate("V_7",60,25,50,20,"TREND",9,clrBlack,C'236,233,235', clrNONE,false);
   ButtonCreate("Auto",115,25,50,20,"Auto",9,clrBlack,C'236,233,235',clrNONE,false);
   ObjectCreate(0,"Lot",OBJ_EDIT,0,0,0);
   ObjectSetInteger(0,"Lot",OBJPROP_CORNER,CORNER_LEFT_LOWER);
   ObjectSetInteger(0,"Lot",OBJPROP_XDISTANCE,115);
   ObjectSetInteger(0,"Lot",OBJPROP_YDISTANCE,50);
   ObjectSetString(0,"Lot",OBJPROP_TEXT,"");
   ObjectSetInteger(0,"Lot",OBJPROP_ALIGN,ALIGN_RIGHT);
   ObjectSetInteger(0,"Lot",OBJPROP_FONTSIZE,9);
   ObjectSetInteger(0,"Lot",OBJPROP_COLOR,clrBlack);
   ObjectSetInteger(0,"Lot",OBJPROP_YSIZE,20);
   ButtonCreate("V_5_buy",5,50,50,20,"BUY",9,clrBlack,C'236,233,235', clrNONE,false);
   ButtonCreate("V_5_sell",60,50,50,20,"SELL",9,clrBlack,C'236,233,235', clrNONE,false); 
     
   test_ticket=OrderSend(_Symbol,OP_BUYLIMIT,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),_Point,30,0.0,0.0,"NZT-48_test",iMagicNumber,0,clrNONE);
   
   return(INIT_SUCCEEDED);
}//-------------------------------------- End OnInit ---------------------------------------- 

Alexey Viktorov:

Você não deveria ter colado o código em uma imagem. É impossível lê-lo. O problema não está neste fragmento de código. O problema é que algumas condições não são cumpridas em alguns parâmetros de entrada e não há notificação deste fato.

Pode ser. Mas eu já verifiquei tudo duas vezes. Eu não sei onde cavar em seguida.

 
Andrey Kaunov:

Você acha que eu não verifico. O tamanho do lote é verificado em uma função separada

Não são necessários limites aqui, porque Stop Loss e Take Profit são iguais a zero na abertura comercial.RefreshRates() atualiza os dados no cálculo do lote. É claro que não há verificação de conexão, etc. antes de cada entrada, mas não é essa a questão. Se a OrderSend enviasse um pedido, haveria um erro específico: 130, 131, etc. Mas o que eu tenho é.

Não tentar enviar uma ordem de abertura de forma alguma. Mesmo no último teste, quando defino uma posição de verificação na função OnInit().


Isso é possível. Mas eu já verifiquei tudo duas vezes. Não sei para onde ir em seguida.

Veja como outras ordens foram implementadas na EA. Acho que o Expert Advisor não abre apenas

no bilhete de abertura<0 foi definido - olhe para a outra lógica, como ela reage a isso na realidade