Pessoal,
Gostaria de realizar parcialmente uma operação e mover o stop ao mesmo tempo. Utilizei Ctrade, o stop movimenta, mas a realização não acontece... Alguém pode me ajudar?
...
Por favor ao postar código use o atalho Alt+S para que a postagem fique mais organizada.
Pessoal,
Gostaria de realizar parcialmente uma operação e mover o stop ao mesmo tempo. Utilizei Ctrade, o stop movimenta, mas a realização não acontece... Alguém pode me ajudar?
....
Conforme a documentação existem duas formas de chamar esse método.
Você está chamando com ticket, então seria a segunda opção. Pelo que da pra ver no seu código falta um parâmetro na chamada.
Sua chamada:
trade.PositionClosePartial(PositionGetTicket(0),contratos);
Olá Juliano,
você precisa testar o retorno ResultRetcode e em caso de erro imprimir o ResultRetcodeDescription e tratar o erro. Todas as funções de negociação devem ser testadas.
Você também pode ver no Log Diário o motivo pelo qual o fechamento parcial não foi feito.
Infelizmente a Metaquotes errou na documentação e na implementação dessa função.
Conforme a documentação existem duas formas de chamar esse método.
Você está chamando com ticket, então seria a segunda opção. Pelo que da pra ver no seu código falta um parâmetro na chamada.
Sua chamada:
Obrigado Jonathan, ainda estou aprendendo...
Fiz a alteração e coloquei desvio máximo de preço de 50 (pontos - WIN). Porém, ainda não vai.
Olá Juliano,
você precisa testar o retorno ResultRetcode e em caso de erro imprimir o ResultRetcodeDescription e tratar o erro. Todas as funções de negociação devem ser testadas.
Você também pode ver no Log Diário o motivo pelo qual o fechamento parcial não foi feito.
Infelizmente a Metaquotes errou na documentação e na implementação dessa função.
Olá Rogério,
Coloquei o ResultRetcode e obtive o erro 4753 - Posição não encontrada. Tentei usar o comando com a variante Symbol invés de Ticket. Mas retorna o mesmo erro.
Olá Rogério,
Coloquei o ResultRetcode e obtive o erro 4753 - Posição não encontrada. Tentei usar o comando com a variante Symbol invés de Ticket. Mas retorna o mesmo erro.
Juliano
Faltou testar o retorno de trade.PositionClosePartial(PositionGetTicket(0),contratos);
O problema não é só a falta do parm de derrapagem, o problema é a função que testa se está em modo headging, se for outro modo de negociação dá erro.
(*) Tinha comentado que a documentação estava errada, foi um equivoco meu, a documentação está correta, a função é usada somente para o modo cobertura (hedging)!
...
(*) Tinha comentado que a documentação estava errada, foi um equivoco meu, a documentação está correta, a função é usada somente para o modo cobertura (hedging)!
Seguindo o que o Rogério disse, vc deve fazer algo como:
//+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- ENUM_ACCOUNT_MARGIN_MODE mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(mode!=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) { if(liga_parcial == SIM && PositionSelect(_Symbol) && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && num_lots>1 && contratos<num_lots) { double preco_entrada = PositionGetDouble(POSITION_PRICE_OPEN); double preco_sl = PositionGetDouble(POSITION_SL); double preco_tp = PositionGetDouble(POSITION_TP); double preco_parcial = preco_entrada + pont_parcial; if(tick.last >= preco_parcial && !pa_ativado_c) { trade.Sell(contratos); trade.PositionModify(PositionGetTicket(0),preco_entrada - pont_parcial + ganho,preco_tp); pa_ativado_c = true; Print("Realização Parcial = ", preco_parcial); } } } if(mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) { if(liga_parcial == SIM && PositionSelect(_Symbol) && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && num_lots>1 && contratos<num_lots) { double preco_entrada = PositionGetDouble(POSITION_PRICE_OPEN); double preco_sl = PositionGetDouble(POSITION_SL); double preco_tp = PositionGetDouble(POSITION_TP); double preco_parcial = preco_entrada + pont_parcial; if(tick.last >= preco_parcial && !pa_ativado_c) { trade.PositionClosePartial(PositionGetTicket(0),contratos, 50); trade.PositionModify(PositionGetTicket(0),preco_entrada - pont_parcial + ganho,preco_tp); pa_ativado_c = true; Print("Realização Parcial = ", preco_parcial); } } } //+------------------------------------------------------------------+
Juliano
Faltou testar o retorno de trade.PositionClosePartial(PositionGetTicket(0),contratos);
O problema não é só a falta do parm de derrapagem, o problema é a função que testa se está em modo headging, se for outro modo de negociação dá erro.
(*) Tinha comentado que a documentação estava errada, foi um equivoco meu, a documentação está correta, a função é usada somente para o modo cobertura (hedging)!
O problema era esse. O modo que está trabahando é netting. Eu mudei a lógica e fiz uma operaçao inversa e resolvi o problema. Mais um dia foi salvo pelo super Rogério! Obrigado.
Seguindo o que o Rogério disse, vc deve fazer algo como:
Muito Obrigado Jonathan!!!
Seguindo o que o Rogério disse, vc deve fazer algo como:
Obrigado Jonathan!
Eu estava com um problema semelhante e com a sua adaptação de código do nosso colega, consegui identificar onde eu estava errando.
![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- 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
Pessoal,
Gostaria de realizar parcialmente uma operação e mover o stop ao mesmo tempo. Utilizei Ctrade, o stop movimenta, mas a realização não acontece... Alguém pode me ajudar?
Segue o código:
//+------------------------------------------------------------------+
//|Realização Parcial |
//+------------------------------------------------------------------+
// --- Parcial - COMPRA
if( liga_parcial == SIM && PositionSelect(_Symbol) && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY
&& num_lots>1 && contratos<num_lots)
{
double preco_entrada = PositionGetDouble(POSITION_PRICE_OPEN);
double preco_sl = PositionGetDouble(POSITION_SL);
double preco_tp = PositionGetDouble(POSITION_TP);
double preco_parcial = preco_entrada + pont_parcial;
if( tick.last >= preco_parcial && !pa_ativado_c )
{
trade.PositionClosePartial(PositionGetTicket(0),contratos);
trade.PositionModify(PositionGetTicket(0),preco_entrada - pont_parcial + ganho ,preco_tp);
pa_ativado_c = true;
Print("Realização Parcial = ", preco_parcial);
}