Não seria por que o preço do ativo está fora da faixa entre 77345 e 77605 ?
Se o preço do ativo estiver abaixo de 77345 ou acima de 77605 no momento em que a ordem for enviada, vai retornar esse erro "Invalid Stops".
Se não for isso, acrescente a instrução request.sl = sl , pois o campo "sl" está indo com zero, visto que vc executou um ZeroMemory(request) antes (não sei se isso dá problema, eu sempre preencho sl e tp com os valores vigentes quando não quero modifica-los, não sei o que acontece se mandar valor zero em um deles).
Exemplo de mensagem de erro (Ctrade):
2018.08.08 19:58:07.883 2018.01.02 10:20:21 failed modify #2 sell 1.00 WIN$N sl: 77605, tp: 77345 -> sl: 77605, tp: 77345 [Invalid stops]
2018.08.08 19:58:07.883 2018.01.02 10:20:21 CTrade::OrderSend: modify WIN$N (sl: 77605, tp: 77345) [invalid stops]
Exemplo de mensagem de erro (MqlTradeRequest):
Olá,
no log que você postou nenhum dos preços foi alterado, isso dá erro sim!
Não seria por que o preço do ativo está fora da faixa entre 77345 e 77605 ?
Se o preço do ativo estiver abaixo de 77345 ou acima de 77605 no momento em que a ordem for enviada, vai retornar esse erro "Invalid Stops".
Se não for isso, acrescente a instrução request.sl = sl , pois o campo "sl" está indo com zero, visto que vc executou um ZeroMemory(request) antes (não sei se isso dá problema, eu sempre preencho sl e tp com os valores vigentes quando não quero modifica-los, não sei o que acontece se mandar valor zero em um deles).
Olá amigo, o sl está recebendo o valor do stop loss da operação double sl=PositionGetDouble(POSITION_SL); // Stop Loss da posição
O preço está dentro, pois ele entra no metodo logo apos executar a operação, se vario 1 tick é muito e ambos (TP e SL) estão bem longes do valor.
Olá,
no log que você postou nenhum dos preços foi alterado, isso dá erro sim!
Eu tinha essa duvida, procurei na documentação e não achei nada sobre isso.
Devia ter testado. #ProgramadorCansado rs
obrigado
Bom dia pessoal, novamente eu aqui ressuscitando posts, mas como o assunto é bem similar, acho que é melhor que abrir novos posts e acabar por dificultar as pesquisas dos próximos colegas.
A questão é a seguinte, não consigo entender o motivo de estar dando erro de invalid stops nesse caso. Eu estava definindo o stop na própria operação de abertura, mas como ficou dando esse erro eu resolvi abrir e depois modificar o TP, mas ocorre o mesmo erro.
No caso o que eu estou tentando é aumentar o volume, comprando mais na mesma direção, mas aí eu levanto o TP proporcional ao preço médio e como pode ser visto no log, é uma venda e o TP está abaixo do preço como deveria, então eu não sei o que pode estar ocasionando esse erro, alguém sabe se há alguma regra especial quando se aumenta o volume ou alguma outra ideia de o por que pode estar dando esse erro?
Eu acompanhei todo o processo no debug e ele passa por todo o processo de verificação da biblioteca Ctrade e só dá erro no OrderSend.
2020.01.02 10:59:00 order performed sell 8 at 117540 [#12 sell 8 WIN@N at 117540] 2020.01.02 10:59:00 CTrade::OrderSend: exchange sell 8.00 WIN@N [done] 2020.01.02 10:59:00 failed modify #8 sell 16 WIN@N sl: 0, tp: 0 -> sl: 0, tp: 117373 [Invalid stops]
sds,
Bom dia pessoal, novamente eu aqui ressuscitando posts, mas como o assunto é bem similar, acho que é melhor que abrir novos posts e acabar por dificultar as pesquisas dos próximos colegas.
A questão é a seguinte, não consigo entender o motivo de estar dando erro de invalid stops nesse caso. Eu estava definindo o stop na própria operação de abertura, mas como ficou dando esse erro eu resolvi abrir e depois modificar o TP, mas ocorre o mesmo erro.
No caso o que eu estou tentando é aumentar o volume, comprando mais na mesma direção, mas aí eu levanto o TP proporcional ao preço médio e como pode ser visto no log, é uma venda e o TP está abaixo do preço como deveria, então eu não sei o que pode estar ocasionando esse erro, alguém sabe se há alguma regra especial quando se aumenta o volume ou alguma outra ideia de o por que pode estar dando esse erro?
Eu acompanhei todo o processo no debug e ele passa por todo o processo de verificação da biblioteca Ctrade e só dá erro no OrderSend.
sds,
#include <Trade\SymbolInfo.mqh> CSymbolInfo cSymbol; newSL = cSymbol.NormalizePrioe(entryPrice - (p_sl *_Point)); newTP = cSymbol.NormalizePrioe(entryPrice + (p_tp *_Point);
Tive esse problema anteriormente e estou repassando a função de normalização da posição.
Att
Tive esse problema anteriormente e estou repassando a função de normalização da posição.
Att
Obrigado pela sua resposta, mas eu já estava normalizando o TP antes de enviar para o PositionOpen, mesmo assim eu tentei da sua forma e continua dando o mesmo erro. o que é mais estranho é que não é sempre o erro, as vezes passa sem erro, as vezes dá erro uma vez e na segunda passa e as vezes dá erro direto em sequencia...
Esse expert era para testar de uma estratégia que criei mentalmente que eu queria ver o resultado na prática, a princípio não seria um robô completo, a menos que a estratégia vingasse, o que não posso saber com esses erros estranhos.
De qualquer forma, muito obrigado pelo seu tempo.
Tive esse problema anteriormente e estou repassando a função de normalização da posição.
Att
Opa, consegui resolver. Sua solução é perfeita, só que como eu não costumo usar o CSymbolInfo, não sabia que precisava chamar o método Refrash, mas olhando códigos antigos que eu fiz eu percebi que eu estava esquecendo do step do ativo e aí fui ver esse método do CSymbolInfo que fazia a conta completa, mas se não chamar no OnInit o Refrash, ele não define os valores necessários. Dessa forma, inclusive não é necessário o *_Point que você usa, pois o .NormalizePrice do CSymbolInfo já faz isso.
Para alguém com o mesmo problema, segue a solução completa:
#include <Trade\SymbolInfo.mqh> CSymbolInfo cSymbol;
int OnInit()
{
(...)
if(!cSymbol.Refresh())
return(INIT_FAILED);
(...)
}
(...)
newSL = cSymbol.NormalizePrioe(entryPrice - p_sl);
newTP = cSymbol.NormalizePrioe(entryPrice + p_tp);
(....)
Novamente agradeço a resposta.
Opa, consegui resolver. Sua solução é perfeita, só que como eu não costumo usar o CSymbolInfo, não sabia que precisava chamar o método Refrash, mas olhando códigos antigos que eu fiz eu percebi que eu estava esquecendo do step do ativo e aí fui ver esse método do CSymbolInfo que fazia a conta completa, mas se não chamar no OnInit o Refrash, ele não define os valores necessários. Dessa forma, inclusive não é necessário o *_Point que você usa, pois o .NormalizePrice do CSymbolInfo já faz isso.
Para alguém com o mesmo problema, segue a solução completa:
Novamente agradeço a resposta.
Maravilha, tambem estava precisando fazer esse trecho do refresh pra funcionar!! Valeu!!
Boa noite, estou apanhando para implementar uma alteração de posição apenas do take profit, o stop loss é o mesmo.
Recebo o erro [Invalid stops], já tentei usar a biblioteca CTrade ou o MqlTradeRequest.
void VerificarTP(double NovoValor)
{
MqlTradeRequest request;
MqlTradeResult result;
int total=PositionsTotal(); // número de posições abertas
for(int i=0; i<total; i++)
{
ulong position_ticket=PositionGetTicket(i);// bilhete da posição
string position_symbol=PositionGetString(POSITION_SYMBOL); // símbolo
ulong magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber da posição
double volume=PositionGetDouble(POSITION_VOLUME); // volume da posição
double sl=PositionGetDouble(POSITION_SL); // Stop Loss da posição
double tp=PositionGetDouble(POSITION_TP); // Take-Profit da posição
int type=PositionGetInteger(POSITION_TYPE); // tipo da posição
if (magic==EXPERT_MAGIC)
{
ZeroMemory(request);
ZeroMemory(result);
//--- definição dos parâmetros de operação
request.action =TRADE_ACTION_SLTP; // tipo de operação de negociação
request.position=position_ticket; // bilhete da posição
request.symbol=position_symbol; // símbolo
request.tp = NovoValor; // Take Profit da posição
request.magic=EXPERT_MAGIC; // MagicNumber da posição
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // se não for possível enviar o pedido, exibir o código de erro
//--- informações sobre a operação
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
}
}
}
Exemplo de mensagem de erro (Ctrade):
2018.08.08 19:58:07.883 2018.01.02 10:20:21 failed modify #2 sell 1.00 WIN$N sl: 77605, tp: 77345 -> sl: 77605, tp: 77345 [Invalid stops]
2018.08.08 19:58:07.883 2018.01.02 10:20:21 CTrade::OrderSend: modify WIN$N (sl: 77605, tp: 77345) [invalid stops]
Exemplo de mensagem de erro (MqlTradeRequest):
Você tentou contar o total de posições sem selecionar antes.
bool PositionSelect( string symbol // Nome Simbolo );
Selecionar e vê...
Sucesso por aí.

- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Boa noite, estou apanhando para implementar uma alteração de posição apenas do take profit, o stop loss é o mesmo.
Recebo o erro [Invalid stops], já tentei usar a biblioteca CTrade ou o MqlTradeRequest.
void VerificarTP(double NovoValor)
{
MqlTradeRequest request;
MqlTradeResult result;
int total=PositionsTotal(); // número de posições abertas
for(int i=0; i<total; i++)
{
ulong position_ticket=PositionGetTicket(i);// bilhete da posição
string position_symbol=PositionGetString(POSITION_SYMBOL); // símbolo
ulong magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber da posição
double volume=PositionGetDouble(POSITION_VOLUME); // volume da posição
double sl=PositionGetDouble(POSITION_SL); // Stop Loss da posição
double tp=PositionGetDouble(POSITION_TP); // Take-Profit da posição
int type=PositionGetInteger(POSITION_TYPE); // tipo da posição
if (magic==EXPERT_MAGIC)
{
ZeroMemory(request);
ZeroMemory(result);
//--- definição dos parâmetros de operação
request.action =TRADE_ACTION_SLTP; // tipo de operação de negociação
request.position=position_ticket; // bilhete da posição
request.symbol=position_symbol; // símbolo
request.tp = NovoValor; // Take Profit da posição
request.magic=EXPERT_MAGIC; // MagicNumber da posição
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // se não for possível enviar o pedido, exibir o código de erro
//--- informações sobre a operação
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
}
}
}
Exemplo de mensagem de erro (Ctrade):
2018.08.08 19:58:07.883 2018.01.02 10:20:21 failed modify #2 sell 1.00 WIN$N sl: 77605, tp: 77345 -> sl: 77605, tp: 77345 [Invalid stops]
2018.08.08 19:58:07.883 2018.01.02 10:20:21 CTrade::OrderSend: modify WIN$N (sl: 77605, tp: 77345) [invalid stops]
Exemplo de mensagem de erro (MqlTradeRequest):