Discussão do artigo "Como colocar um produto no mercado" - página 48

 

Meu EA ao cadastrar novo produto retorna erro :

test on EURUSD,H1 (netting) 2020.04.15 15:47:05 failed modify #44 sell 0.2 EURUSD sl: 1.08929, tp: 1.08599 -> sl: 1.08919, tp: 1.08599 [Modification failed due to order or position being close to market]

Porém meu EA é para rodar no WIN$ não em forex. Porque o testador não deixa informar qual ativo deve ser executado ?

Agora como corrigir algo que não tem erro, pois o EA está rodando perfeitamente, só não consigo cadastrar o produto para venda.

 
Adriano De Mello Moura #:

Meu EA ao cadastrar novo produto retorna erro :

test on EURUSD,H1 (netting) 2020.04.15 15:47:05 failed modify #44 sell 0.2 EURUSD sl: 1.08929, tp: 1.08599 -> sl: 1.08919, tp: 1.08599 [Modification failed due to order or position being close to market]

Porém meu EA é para rodar no WIN$ não em forex. Porque o testador não deixa informar qual ativo deve ser executado ?

Agora como corrigir algo que não tem erro, pois o EA está rodando perfeitamente, só não consigo cadastrar o produto para venda.

O robô deve estar preparado para funcionar em qualquer ativo . . .


Para corrigir o erro apontado acima, você deve fazer a verificação abaixo antes de modificar a posição:

//+--------------------------------------------------------------------------------------------------------------------+
//| Verifica se distância entre o TakeProfit/StopLoss e o preço de fechamento é maior do que SYMBOL_TRADE_STOPS_LEVEL  |
//+--------------------------------------------------------------------------------------------------------------------+
bool Check_SL_TP(ENUM_ORDER_TYPE type, double SL, double TP)
  {
//--- Local variables
   bool SL_check = false, TP_check = false;

//--- Determines last price for current symbol
   double BID = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   double ASK = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

//--- get the SYMBOL_TRADE_STOPS_LEVEL level
   int stops_level = (int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
   if(stops_level != 0)
     {
      PrintFormat("SYMBOL_TRADE_STOPS_LEVEL=%d: StopLoss and TakeProfit must not be nearer than %d points from the closing price", stops_level, stops_level);
     }

//--- check only two order types
   switch(type)
     {
      //--- Buy operation
      case  ORDER_TYPE_BUY:
        {
         //--- check the StopLoss
         SL_check = (BID - SL > stops_level * _Point);
         if(!SL_check)
           {
            ERRMSG = StringFormat("For order %s StopLoss=%.5f must be less than %.5f (Bid=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, BID - stops_level * _Point, BID, stops_level);
           }
         //--- check the TakeProfit
         TP_check = (TP - BID > stops_level * _Point);
         if(!TP_check)
           {
            ERRMSG = StringFormat("For order %s TakeProfit=%.5f must be greater than %.5f (Bid=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, BID + stops_level * _Point, BID, stops_level);
           }
         //--- return the result of checking
         return(SL_check && TP_check);
        }
      //--- Sell operation
      case  ORDER_TYPE_SELL:
        {
         //--- check the StopLoss
         SL_check = (SL - ASK > stops_level * _Point);
         if(!SL_check)
           {
            ERRMSG = StringFormat("For order %s StopLoss=%.5f must be greater than %.5f (Ask=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, ASK + stops_level * _Point, ASK, stops_level);
           }
         //--- check the TakeProfit
         TP_check = (ASK - TP > stops_level * _Point);
         if(!TP_check)
           {
            ERRMSG = StringFormat("For order %s TakeProfit=%.5f must be less than %.5f (Ask=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, ASK - stops_level * _Point, ASK, stops_level);
           }
         //--- return the result of checking
         return(TP_check && SL_check);
        }
      break;
     }

//--- Verification succeeded
   return(false);
  }



Veja outras verificações que devem ser feitas pelo robô no artigo abaixo:

Que testes deve passar o robô de negociação antes da publicação no Mercado - Artigos MQL5

 

Olá, não consigo editar a descrição do produto em um dos meus produtos antigos.

Segui as instruções em vários fóruns, inclusive escrevendo a descrição novamente, ocultando-a do mercado e assim por diante, mas a descrição ainda é revertida para a versão original.

Agora não posso mais restaurar o produto no mercado nem editá-lo. Solicitei assistência nos fóruns relacionados a esse problema, mas não obtive ajuda até o momento.

Como faço para resolver esse problema de "Não conseguir editar a descrição do produto"? Por favor, me ajude

 

Ao carregar o Expert Advisor e testá-lo, ele escreve um erro, mas não está claro como corrigi-lo.

Teste em EURUSD,H1 (compensação)

2020.04.14 00:24:42 falha na compra instantânea de 0,01 EURUSD a 1,09044 [volume inválido]

2020.04.14 00:24:45 falha na compra instantânea de 0,01 EURUSD a 1,09044 [volume inválido]

2020.04.14 00:24:48 falha na compra instantânea de 0.01 EURUSD a 1.09037 [Volume inválido]

2020.04.21 00:01:34 falha na compra instantânea de 0.01 EURUSD a 1.08626 [volume inválido]

2020.04.21 00:01:37 falha na compra instantânea de 0.01 EURUSD a 1.08626 [volume inválido]

2020.04.21 00:01:40 falha na compra instantânea de 0.01 EURUSD a 1.08626 [Volume inválido]

2020.04.27 16:08:24 falha na venda instantânea de 0.01 EURUSD a 1.08546 [volume inválido]

2020.04.27 16:08:27 falha na venda instantânea de 0.01 EURUSD a 1.08548 [volume inválido]

2020.04.27 16:08:30 falha na venda instantânea de 0.01 EURUSD a 1.08547 [Volume inválido]

2020.04.29 20:15:52 falha na venda instantânea de 0,01 EURUSD a 1,08565 [volume inválido]

2020.04.29 20:15:55 falha na venda instantânea de 0.01 EURUSD a 1.08566 [volume inválido]

2020.04.29 20:15:58 falha na venda instantânea de 0.01 EURUSD a 1.08566 [Volume inválido]

2020.05.18 00:12:09 falha na compra instantânea de 0.01 EURUSD a 1.08134 [Volume inválido]

2020.05.18 00:12:12 falha na compra instantânea de 0.01 EURUSD a 1.08134 [Volume inválido]

2020.05.18 00:12:15 falha na compra instantânea de 0.01 EURUSD a 1.08143 [Volume inválido]

2020.05.21 15:50:25 falha na venda instantânea de 0.01 EURUSD a 1.10031 [volume inválido]

2020.05.21 15:50:28 falha na venda instantânea de 0.01 EURUSD a 1.10034 [volume inválido]

2020.05.21 15:50:31 falha na venda instantânea de 0.01 EURUSD a 1.10036 [volume inválido]

2020.05.25 19:00:05 falha na compra instantânea de 0,01 EURUSD a 1,08950 [Volume inválido]

2020.05.25 19:00:08 falha na compra instantânea de 0.01 EURUSD a 1.08951 [Volume inválido]

2020.05.25 19:00:11 falha na compra instantânea de 0,01 EURUSD a 1,08952 [Volume inválido]

não há operações de negociação

 
Kirill Voytseshchuk #:

Ao carregar o Expert Advisor e testá-lo, ele grava um erro, mas não está claro como corrigi-lo.

Teste em EURUSD, H1 (compensação)

2020.04.14 00:24:42 falha na compra instantânea de 0,01 EURUSD a 1,09044 [volume inválido]

***

Leia a mensagem de erro completa - haverá um link para o artigo "Quais verificações devem ser aprovadas...".
 

Leia e coloque no código

Volumes incorretos nas operações de negociação

Antes de enviar ordens de negociação, também é necessário verificar se os volumes especificados na ordem estão corretos. O número de lotes que o Expert Advisor vai especificar na ordem deve ser verificado antes de chamar a função OrderSend(). Para instrumentos financeiros, aEspecificação especifica os volumes mínimo e máximo permitidos para negociação, bem como a gradação do volume. Você pode obter esses valores em MQL5a partir da enumeração ENUM_SYMBOL_INFO_DOUBLE usando a funçãoSymbolInfoDouble().

//+------------------------------------------------------------------+
//| Verifica se o volume do pedido está correto.
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- volume mínimo permissível para operações de negociação
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("Volume menor do que o mínimo permitido SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- volume máximo permitido para operações de negociação
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("Volume maior que o máximo permitido SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- obter a gradação mínima de volume
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("O volume não é um múltiplo da graduação mínima SYMBOL_VOLUME_STEP=%.2f, o volume correto mais próximo é %.2f",
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="Valor correto do volume";
   return(true);
  }

Não ajudou, posso corrigir algum outro código?

Você pode me dizer como refinar o script?

Обзор рынка - Торговые операции - Справка по MetaTrader 5
Обзор рынка - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Окно "Обзор рынка" позволяет просматривать ценовые данные по торговым инструментам: котировки, ценовую статистику и график тиков. Здесь...
 
Kirill Voytseshchuk #:

Leia-o, coloque-o no código

Volumes incorretos em operações comerciais

Antes de enviar ordens de negociação, também é necessário verificar se os volumes especificados na ordem estão corretos. O número de lotes que o Expert Advisor vai especificar na ordem deve ser verificado antes de chamar a função OrderSend(). Para instrumentos financeiros, aEspecificação especifica os volumes mínimo e máximo permitidos para negociação, bem como a gradação do volume. Esses valores podem ser obtidos em MQL5a partir da enumeração ENUM_SYMBOL_INFO_DOUBLE usando a funçãoSymbolInfoDouble()

Não ajudou, posso corrigir algum outro código?

Você pode me dizer como refinar o script?

Leia o artigo na íntegra, 'CheckVolumeValue' é uma verificação da exatidão dos parâmetros de entrada.

E há também uma verificação do arredondamento correto do lote...

 

Levando em conta o volume da posição aberta e o volume das ordens pendentes, a verificação final será semelhante a esta:

//+------------------------------------------------------------------+
//| Retorna o volume máximo permitido para a ordem por símbolo.
//+------------------------------------------------------------------+
double NewOrderAllowedVolume(string symbol)
  {
   double allowed_volume=0;
//--- obter o limite máximo de volume no pedido
   double symbol_max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//--- obter o limite de caracteres no volume
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);

//--- obter o volume da posição aberta por símbolo
   double opened_volume=PositionVolume(symbol);
   if(opened_volume>=0)
     {
      //--- se já tivermos esgotado o volume
      if(max_volume-opened_volume<=0)
         return(0);

      //--- o volume da posição aberta não excede max_volume
      double orders_volume_on_symbol=PendingsVolume(symbol);
      allowed_volume=max_volume-opened_volume-orders_volume_on_symbol;
      if(allowed_volume>symbol_max_volume) allowed_volume=symbol_max_volume;
     }
   return(allowed_volume);
  }

add?

checkvolumevalue.mq5 como está escrito aqui


//+------------------------------------------------------------------+
//| Função de início do programa de script|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP)/2.0;
   double volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN)-step;
   double finish=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX)+step;

//--- descubra quantas casas decimais estão contidas na gradação de volume
   int digits=(int)MathLog10(SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP));
   if(digits<0) digits=-digits;
   else digits=0;

//--- verificar vários valores de volume diferentes no loop
   while(volume<finish+4*step)
     {
      string descr;
      if(!CheckVolumeValue(volume,descr))
        {
         Print("Resultado da inspeção",volume,": ",descr);
        }
        else PrintFormat("O volume %G está correto.",volume);
      volume+=3*step;
      volume=NormalizeDouble(volume,digits+1);
     }
//---
  }
//+------------------------------------------------------------------+
//| Verifica se o volume do pedido está correto.
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- volume mínimo permissível para operações de negociação
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("Volume menor do que o mínimo permitido SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- volume máximo permitido para operações de negociação
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("Volume maior que o máximo permitido SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- obter a gradação mínima de volume
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("O volume não é um múltiplo da graduação mínima SYMBOL_VOLUME_STEP=%.2f, o volume correto mais próximo é %.2f",
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="Valor correto do volume";
   return(true);
  }
//+------------------------------------------------------------------+
 
Kirill Voytseshchuk ordens pendentes, a verificação final será semelhante a esta:

adicionar?

checkvolumevalue.mq5 como está escrito aqui


Todas as verificações necessárias estão no artigo Quase um construtor para criar um EA

Почти конструктор для создания советника
Почти конструктор для создания советника
  • www.mql5.com
Предлагаю свой набор торговых функций в виде готового советника. Представленный способ позволяет получать множество торговых стратегий простым добавлением индикаторов и изменением входных параметров.
 

O código perguntado anteriormente é adequado?

Você poderia escrever as linhas necessárias do artigo.