Por favor ter em conta a secção adequada quando criar tópicos — https://www.mql5.com/pt/forum/421109/page6#comment_49385139
Boa Tarde Pessoal,
estou com um cliente que quer, que os Stops das negociações sejam feitas com ordens limit e stop
para isso criei a seguinte função:
na função eu recebo o valor do contrato, o preço da ordem aberta, o valor do take e o valor do stop, esse typ é so pra colocar se é compra ou venda
a cliente fala q a ordem vai, porém os stops não estão indo, no testador funciona, mas na real não funciona
não há mensagens de erro na aba expert
Se for forex verifica no ativo o atributo stop level, voce possivelmente esta dentro desse intervalo. Outra possibilidade, mas dai nao acreditaria seria alguma proteção anti-flood.
Boa tarde, Gustavo!!
1. Nas funções Trade.BuyLimit() e Trade.BuyStop() você utiliza ORDER_TIME_GTC, e nas funções Trade.SellLimit() e Trade.SellStop() você utiliza ORDER_TIME_SPECIFIED_DAY... Eu não entendi por quê...
2. Na função Trade.SellStop() faltou o parâmetro correspondente ao Take Profit...
3. Os preços priceStop e priceTake não estão sendo normalizados... A função abaixo está disponível também na classe SymbolInfo:
//+--------------------------------------------------------------------------------------------------------------------+ //| This function normalizes and adjusts the price to the TICK SIZE | //+--------------------------------------------------------------------------------------------------------------------+ double NormalizePrice(double price) { //--- Get the minimal price change double tick_size = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE); //--- Return the price normalized if(tick_size == 0.0) { return(NormalizeDouble(price, _Digits)); } //--- Return the price normalized and adjusted to the TICK SIZE return(NormalizeDouble(MathRound(price / tick_size) * tick_size, _Digits)); }
4. Exemplo básico de verificação do retorno das ordens para salvar possíveis mensagens na guia Experts (verificar o retorno de cada ordem):
if(Trade.BuyLimit(_lote,priceTake,_Symbol)) { Print("Envio de Ordens Pendentes com sucesso."); return(true); } else { Print(Trade.ResultRetcode(), " ", Trade.ResultRetcodeDescription()); return(false); } //--- if(Trade.BuyStop(_lote,priceStop,_Symbol)) { Print("Envio de Ordens Pendentes com sucesso."); return(true); } else { Print(Trade.ResultRetcode(), " ", Trade.ResultRetcodeDescription()); return(false); }
Se for mercado nacional, o stop level possivelmente é zero (mas eu teria verificado, principalmente se for em corretora não-B3 como activtrades, roboforex, etc). Seu sistema abre e fecha ordens com qual frequencia? Seria possivel colocar isso antes do envio das ordens? A ideia seria entender como estava a melhor venda e compra em relacao aos seus precos de colocacao de ordem.
Print(SymbolInfoDouble(NULL,SYMBOL_BID), " ", SymbolInfoDouble(NULL,SYMBOL_ASK), " ", priceTake, " ", priceStop);Outra coisa que eu descarto, o erro de arredondamento proposto pelo Vinicius que isso seria bem aparente no log (diario) quando ele da invalid stop / invalid price.
Boa tarde, Gustavo!!
1. Nas funções Trade.BuyLimit() e Trade.BuyStop() você utiliza ORDER_TIME_GTC, e nas funções Trade.SellLimit() e Trade.SellStop() você utiliza ORDER_TIME_SPECIFIED_DAY... Eu não entendi por quê...
2. Na função Trade.SellStop() faltou o parâmetro correspondente ao Take Profit...
3. Os preços priceStop e priceTake não estão sendo normalizados... A função abaixo está disponível também na classe SymbolInfo:
4. Exemplo básico de verificação do retorno das ordens para salvar possíveis mensagens na guia Experts (verificar o retorno de cada ordem):
pergunta 1 :
Nesse eu estava testando se era isso que estava fazendo com que não executasse
Ponto 2:
Corrigido!
Ponto 3:
Coloquei a função que você me passou;
Ponto 4
Inseri a verificação em todas
bool StopsPend(double _lote,double _price,double _TK,double _SL, int typ) { //0 venda //1 compra if(PositionSelect(_Symbol) && CountPendingOrders() < 2) { if(typ == 0) { double priceStop = Robo.NormalizePrice(_price)+(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE)); double priceTake = Robo.NormalizePrice(_price); Trade.BuyLimit(_lote,priceTake,_Symbol,NULL,NULL,ORDER_TIME_DAY); if(Trade.ResultRetcode() == 10008 || Trade.ResultRetcode() == 10009) { Print("Envio de Ordens Pendentes com sucesso (BUY LIMIT)."); return true; } else { Print("Erro ao enviar Ordens Pendentes."); } Trade.BuyStop(_lote,priceStop,_Symbol,NULL,NULL,ORDER_TIME_DAY); if(Trade.ResultRetcode() == 10008 || Trade.ResultRetcode() == 10009) { Print("Envio de Ordens Pendentes com sucesso (BUY STOP)."); return true; } else { Print("Erro ao enviar Ordens Pendentes."); } } if(typ == 1) { double priceStop = Robo.NormalizePrice(_price)-(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE)); double priceTake = Robo.NormalizePrice(_price); Trade.SellLimit(_lote,priceTake,_Symbol,NULL,NULL,ORDER_TIME_DAY); if(Trade.ResultRetcode() == 10008 || Trade.ResultRetcode() == 10009) { Print("Envio de Ordens Pendentes com sucesso(SELL LIMIT)."); return true; } else { Print("Erro ao enviar Ordens Pendentes."); } Trade.SellStop(_lote,priceStop,_Symbol,NULL,NULL,ORDER_TIME_DAY); if(Trade.ResultRetcode() == 10008 || Trade.ResultRetcode() == 10009) { Print("Envio de Ordens Pendentes com sucesso(SELL STOP)."); return true; } else { Print("Erro ao enviar Ordens Pendentes."); } } } return false; }
Se for mercado nacional, o stop level possivelmente é zero (mas eu teria verificado, principalmente se for em corretora não-B3 como activtrades, roboforex, etc). Seu sistema abre e fecha ordens com qual frequencia? Seria possivel colocar isso antes do envio das ordens? A ideia seria entender como estava a melhor venda e compra em relacao aos seus precos de colocacao de ordem.
então, o EA abre ordem seguindo um indicador, acredito que seja poucas entradas no intraday, então o que estranho é não tem erro no log. por isso fiquei sem saber o que fazer, o robo só funciona em conta nacional NETTING
então, o EA abre ordem seguindo um indicador, acredito que seja poucas entradas no intraday, então o que estranho é não tem erro no log. por isso fiquei sem saber o que fazer, o robo só funciona em conta nacional NETTING
Isso não diz muito sobre a implementação, tem gente que esbarra em problema porque segue o indicador meio que arrisca ele entrou na zona de acao. Vai lá e cria a ordem, ele saiu (na mesma vela 1s depois), deleta a ordem e fica nesse zigzag... não sendo assim, acho que tu não teria problema com flood também.
Isso não diz muito sobre a implementação, tem gente que esbarra em problema porque segue o indicador meio que arrisca ele entrou na zona de acao. Vai lá e cria a ordem, ele saiu (na mesma vela 1s depois), deleta a ordem e fica nesse zigzag... não sendo assim, acho que tu não teria problema com flood também.
a referente a esse zigzag eu criei um estado que é so resetado na criação de uma barra nova, a questão da frequencia ta tranquilo neste projeto
- 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 Tarde Pessoal,
estou com um cliente que quer, que os Stops das negociações sejam feitas com ordens limit e stop
para isso criei a seguinte função:
na função eu recebo o valor do contrato, o preço da ordem aberta, o valor do take e o valor do stop, esse typ é so pra colocar se é compra ou venda
a cliente fala q a ordem vai, porém os stops não estão indo, no testador funciona, mas na real não funciona
não há mensagens de erro na aba expert