Discussão do artigo "Que testes deve passar o robô de negociação antes da publicação no Mercado" - página 5

 
Oleksii Chepurnyi:
Mas, nesse caso, há a chance de perder um negócio.....
É sobre o mercado. Portanto, não deve haver erros. Ou deveria haver seu processamento adequado.
 
Artyom Trishkin:
É sobre o mercado. Portanto, não deve haver erros. Ou deve haver seu processamento adequado.

Se não fosse pelo mercado, eu não teria me incomodado muito :)

Entendo que a margem é para slippage?

 
Oleksii Chepurnyi:

Se não fosse pelo mercado, eu não teria me incomodado muito :)

Entendo que a margem é para slippage?

Sim, de fato, para reduzir um pouco mais a probabilidade de cometer um erro no caso de movimentos bruscos de preços.

 
Oleksii Chepurnyi:

Se não fosse pelo mercado, eu não teria me incomodado muito :)

Entendo que a margem é para slippage?

Slippage - na execução, e aqui - correção da solicitação de negociação no momento do estado do ambiente de mercado.

Calculada - verificada a correção, corrigida se necessário e enviada a solicitação. Em seguida, verificamos o resultado da solicitação. Isso é feito no lado do EA.

E a execução está no lado do servidor, e o valor da derrapagem já é exigido pela parte do servidor para aceitar ou rejeitar a solicitação quando o preço muda.

 

À tarde.

Da documentação:

SYMBOL_VOLUME_LIMIT.

O máximo permitido para esse símbolo é o volume total de uma posição aberta e de ordens pendentes em uma direção (Compra ou Venda). Por exemplo, se o limite for 5 lotes, você poderá ter uma posição de compra aberta com o volume de 5 lotes e colocar uma ordem pendente Sell Limit com o volume de 5 lotes. No entanto, não é possível colocar uma ordem pendente Buy Limit (porque o volume total em uma direção excederá o limite) ou colocar uma ordem Sell Limit de mais de 5 lotes.


Pelo que entendi, o cálculo deve levar em conta o volume de todas as posições e ordens somente na direção em que vamos abrir uma negociação ou colocar uma ordem.

Mas aqui a Limitação do número de lotes para um símbolo na direção não é levada em conta de forma alguma....

Ou eu entendi algo errado?

 
Vladislav Andruschenko:

Talvez o lote deva ser normalizado nessa função para que não haja nenhuma deficiência.

e então a função escreve que não há dinheiro, mas não envia uma solicitação ao servidor para abrir posições, o que satisfaz as regras do mercado.

Comecei a usar essa instrução recentemente, há cerca de 2 anos:

Na verdade, tudo funciona.

Ao abrir uma negociação, o Expert Advisor simplesmente retorna astring Print("Not Enought Money Margin Required "+( string)margin) ;

O Expert Advisor foi testado no mercado e todos estão satisfeitos com ele

Obrigado, Vladislav!

Sua variante ainda está funcionando, ao contrário da minha, que funcionava bem anteriormente, e desta, para a qual o validador nos direciona:

bool CheckMoneyForTrade(string symb, double lots,int type)
  {
   double free_margin=AccountFreeMarginCheck(symb,lots,type);
   //-- se não houver dinheiro suficiente
   if(free_margin<0)
     {
      string oper=(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError());
      return(false);
     }
   //-- o teste foi bem-sucedido
   return(true);
  }
 
Ramiz Mavludov:
Obrigado, Vladislav!

Sua variante ainda está funcionando, ao contrário da minha, que funcionava bem antes, e desta, para a qual o validador nos direciona:

Onde esse código é exibido?

PS: Eu o encontrei nas versões em português e japonês do artigo e o corrigi. Há também o gd
 
Oleksii Chepurnyi:

À tarde.

Da documentação:

SYMBOL_VOLUME_LIMIT.

O máximo permitido para esse símbolo é o volume total de uma posição aberta e de ordens pendentes em uma direção (Compra ou Venda). Por exemplo, se o limite for 5 lotes, você poderá ter uma posição de compra aberta com o volume de 5 lotes e colocar uma ordem pendente Sell Limit com o volume de 5 lotes. No entanto, não é possível colocar uma ordem pendente Buy Limit (porque o volume total em uma direção excederá o limite) ou colocar uma ordem Sell Limit de mais de 5 lotes.


Pelo que entendi, o cálculo deve levar em conta o volume de todas as posições e ordens somente na direção em que vamos abrir uma negociação ou colocar uma ordem.

Mas aqui a Limitação do número de lotes para um símbolo na direção não é levada em conta de forma alguma....

Ou eu entendi algo errado?

Você está certo, nesse exemplo a direção não é levada em conta. Você pode tentar fazer isso levando em conta o sinal: as ordens de compra são consideradas positivamente e as de venda, negativamente. O valor e o sinal na saída nos darão o volume e a direção.

Precisamos corrigir

 
Rashid Umarov:

Onde esse código é exibido?

PS: Encontrei-o nas versões em português e japonês do artigo e o corrigi. Há também o gd

Não posso mostrá-lo agora, pois quando o enviei para validação, no relatório, ao clicar no erro 148, cheguei ao

bool CheckMoneyForTrade(string symb, double lots,int type)
  {
   double free_margin=AccountFreeMarginCheck(symb,lots,type);
   //-- se não houver dinheiro suficiente
   if(free_margin<0)
     {
      string oper=(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError());
      return(false);
     }
   //-- o teste foi bem-sucedido
   return(true);
  }
A versão do site ainda estava em russo.
 
Rashid Umarov:

Você está certo, nesse exemplo a direção não é levada em conta. Podemos tentar fazer isso levando em conta o sinal: as ordens de compra são consideradas positivamente e as de venda, negativamente. O valor e o sinal na saída nos darão o volume e a direção.

Precisa ser corrigido

Não estou entendendo o sinal...

Eu escrevi isso

//--- volume máximo para todos os itens
   double max_volume = SymbolInfoDouble(CheckSymb,SYMBOL_VOLUME_LIMIT);
   if(ED(max_volume,0)) return(true);
//---
   double sum_volume = 0;
   int    oper = 0;
   if(CheckOperation==ORDER_TYPE_BUY  || CheckOperation==ORDER_TYPE_BUY_LIMIT  || CheckOperation==ORDER_TYPE_BUY_STOP  || CheckOperation==ORDER_TYPE_BUY_STOP_LIMIT)  oper = 1;
   if(CheckOperation==ORDER_TYPE_SELL || CheckOperation==ORDER_TYPE_SELL_LIMIT || CheckOperation==ORDER_TYPE_SELL_STOP || CheckOperation==ORDER_TYPE_SELL_STOP_LIMIT) oper = 2;
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(!pst.SelectByIndex(i)) ShowError;
      if(pst.Symbol()==CheckSymb)
        {
         if(oper==1 && pst.PositionType()==POSITION_TYPE_BUY)  sum_volume += pst.Volume();
         if(oper==2 && pst.PositionType()==POSITION_TYPE_SELL) sum_volume += pst.Volume();
        }
     }
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(!ord.SelectByIndex(i)) ShowError;
      if(ord.Symbol()==CheckSymb)
        {
         if(oper==1 && (ord.OrderType()==ORDER_TYPE_BUY  || ord.OrderType()==ORDER_TYPE_BUY_LIMIT  || ord.OrderType()==ORDER_TYPE_BUY_STOP  || ord.OrderType()==ORDER_TYPE_BUY_STOP_LIMIT))  sum_volume += ord.VolumeCurrent();
         if(oper==2 && (ord.OrderType()==ORDER_TYPE_SELL || ord.OrderType()==ORDER_TYPE_SELL_LIMIT || ord.OrderType()==ORDER_TYPE_SELL_STOP || ord.OrderType()==ORDER_TYPE_SELL_STOP_LIMIT)) sum_volume += ord.VolumeCurrent();
        }
     }
   if(sum_volume+CheckVolume > max_volume)
     {
      Alert(OrdersText(0010),DoubleToString(max_volume,VolumeDigits(CheckSymb)));
      return(false);
     }
//---
   return(true);