Saída por TP em preço exato.

 

Pessoal,

Estou tentando criar um EA para scalp em conta HEDGE, mas preciso fazer com que a saída ocorra no preço exato. Por exemplo, compro em 10,00 e quero sair em 10,02.

Só estou conseguindo fazer sair com ordem a mercado, aí com o spread, acaba saindo por 10,01 ou mesmo 10,00. Mas nunca pega o 10,02.

Alguma dica?


Valeu!

[Excluído]  
Thiago Lopes:

Pessoal,

Estou tentando criar um EA para scalp em conta HEDGE, mas preciso fazer com que a saída ocorra no preço exato. Por exemplo, compro em 10,00 e quero sair em 10,02.

Só estou conseguindo fazer sair com ordem a mercado, aí com o spread, acaba saindo por 10,01 ou mesmo 10,00. Mas nunca pega o 10,02.

Alguma dica?


Valeu!

Simplesmente compensar o spread ao preço de saída não seria suficiente?

Por exemplo, se o spread é de 0.02 e você deseja sair quando ao preço de 10.02, bastaria configurar a saída para 10.04 (ou 10.00), e a ordem seria executada ao preço de 10.02.

Tenha em mente que existem dois preços: o gráfico que você observa normalmente exibe o preço BID, enquanto as operações de compra e venda podem ser executadas a preços diferentes devido ao spread.
Ou seja, o preço de execução da entrada ou saída da operação nem sempre será exatamente o mesmo preço observado no candle

 
Thiago Lopes:

Pessoal,

Estou tentando criar um EA para scalp em conta HEDGE, mas preciso fazer com que a saída ocorra no preço exato. Por exemplo, compro em 10,00 e quero sair em 10,02.

Só estou conseguindo fazer sair com ordem a mercado, aí com o spread, acaba saindo por 10,01 ou mesmo 10,00. Mas nunca pega o 10,02.

Alguma dica?


Valeu!

ordem limitada stop ou ordem limitada. No exemplo esta comprado no 10 e quer vender no 10,02 coloca venda limitada no 10,02. Se quiser comprar mais digamos no 10,03, teria que colocar a ordem limite stop para quando bater 10,03 enviar a ordem limitada no preço desejado.

Depois quando a posição for criada, voce pode anular elas com o close by.

 
Thiago Lopes:

Pessoal,

Estou tentando criar um EA para scalp em conta HEDGE, mas preciso fazer com que a saída ocorra no preço exato. Por exemplo, compro em 10,00 e quero sair em 10,02.

Só estou conseguindo fazer sair com ordem a mercado, aí com o spread, acaba saindo por 10,01 ou mesmo 10,00. Mas nunca pega o 10,02.

Alguma dica?


Valeu!

void CloseOppositePositions(ulong ticket)
{
    for (int i = 0; i < PositionsTotal(); i++)
    {
        ulong oppositeTicket = PositionGetTicket(i);
        if (oppositeTicket != ticket && 
            PositionGetString(POSITION_SYMBOL) == _Symbol && 
            PositionGetInteger(POSITION_MAGIC) == MagicNumber)
        {
            if (PositionSelectByTicket(ticket) && PositionSelectByTicket(oppositeTicket))
            {
                ENUM_POSITION_TYPE currentType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
                ENUM_POSITION_TYPE oppositeType = (currentType == POSITION_TYPE_BUY) ? POSITION_TYPE_SELL : POSITION_TYPE_BUY;

                if ((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == oppositeType)
                {
                    if (trade.PositionCloseBy(ticket, oppositeTicket))
                    {
                        Print("Posição oposta fechada com Close By: ", ticket, " fechou ", oppositeTicket);
                        return; // Sai do loop se uma posição foi fechada com sucesso
                    }
                    else
                    {
                        Print("Erro ao fechar posição oposta com Close By: ", GetLastError());
                    }
                }
            }
        }
    }
}



void OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result)
{
    if (trans.type == TRADE_TRANSACTION_DEAL_ADD)
    {
        if (result.retcode == TRADE_RETCODE_DONE)
        {
            Print("Transação detectada - Type: ", trans.deal_type, ", Order Type: ", trans.order_type);
            
            // Verifica se a transação era uma ordem LIMIT executada para TP
            if ((trans.deal_type == DEAL_TYPE_BUY || trans.deal_type == DEAL_TYPE_SELL) && 
                (trans.order_type == ORDER_TYPE_BUY_LIMIT || trans.order_type == ORDER_TYPE_SELL_LIMIT))
            {
                Print("Tentando fechar posições opostas...");
                CloseOppositePositions(result.order);
            }
        }
    }
}

Estou tentando sair pelo CLOSE BY da conta hedge, a operação é feita, no take profit é feita uma operação oposta com ordem LIMIT, mas elas não estão fechando pelo close by.

Alguém teria uma abordagem para solucionar?

 
Thiago Lopes #:
if (PositionSelectByTicket(ticket) && PositionSelectByTicket(oppositeTicket))
Falaria pra tentar simplicar recuperando o tipo da posicao antes e depois indo percorrer procurando a oposta. Assim, tu nao sabe se realmente eh uma oposta ou não, já que supoem que eh o inverso da atual.
 
Acredito que se
trans.type == TRADE_TRANSACTION_DEAL_ADD
então o 
result.retcode == TRADE_RETCODE_DONE
não vai estar preenchido.
Veja na documentação o que é preenchido para cada caso:
https://www.mql5.com/pt/docs/constants/structures/mqltradetransaction
Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Estruturas de Dados / Estrutura de uma Transação de Negociação
Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Estruturas de Dados / Estrutura de uma Transação de Negociação
  • www.mql5.com
Ao realizar algumas ações específicas em uma conta de negociação, seu estado muda. Tais ações...