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.
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 variablesbool SL_check = false, TP_check = false;
//--- Determines last price for current symboldouble BID = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double ASK = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
//--- get the SYMBOL_TRADE_STOPS_LEVEL levelint 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 typesswitch(type)
{
//--- Buy operationcaseORDER_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 checkingreturn(SL_check && TP_check);
}
//--- Sell operationcaseORDER_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 checkingreturn(TP_check && SL_check);
}
break;
}
//--- Verification succeededreturn(false);
}
Veja outras verificações que devem ser feitas pelo robô no artigo abaixo:
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
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çãodouble 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çãodouble 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 volumedouble 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);
}
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 pedidodouble symbol_max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//--- obter o limite de caracteres no volumedouble max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);
//--- obter o volume da posição aberta por símbolodouble opened_volume=PositionVolume(symbol);
if(opened_volume>=0)
{
//--- se já tivermos esgotado o volumeif(max_volume-opened_volume<=0)
return(0);
//--- o volume da posição aberta não excede max_volumedouble 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);
}
//+------------------------------------------------------------------+//| Função de início do programa de script|//+------------------------------------------------------------------+voidOnStart()
{
//---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 volumeint digits=(int)MathLog10(SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP));
if(digits<0) digits=-digits;
else digits=0;
//--- verificar vários valores de volume diferentes no loopwhile(volume<finish+4*step)
{
string descr;
if(!CheckVolumeValue(volume,descr))
{
Print("Resultado da inspeção",volume,": ",descr);
}
elsePrintFormat("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çãodouble 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çãodouble 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 volumedouble 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);
}
//+------------------------------------------------------------------+
Предлагаю свой набор торговых функций в виде готового советника. Представленный способ позволяет получать множество торговых стратегий простым добавлением индикаторов и изменением входных параметров.
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
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.
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:
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
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 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().
Não ajudou, posso corrigir algum outro código?
Você pode me dizer como refinar o script?
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:
add?
checkvolumevalue.mq5 como está escrito aqui
adicionar?
checkvolumevalue.mq5 como está escrito aqui
Todas as verificações necessárias estão no artigo Quase um construtor para criar um EA
O código perguntado anteriormente é adequado?
Você poderia escrever as linhas necessárias do artigo.