StopLoss e TakeProfit

 

Preciso de uma ajuda pessoal, estou desenvolvendo um EA e esbarrei numa questão, preciso que o stoploss seja o preço minimo da vela anterior a entrada, ou seja SL=preço-minimovelaanterior

E o TP seja o preço de entrada + SL.

Grato desde já

Consegui desenvolver a logica para um sl e tp fixo escolhidos, porém não é isso que eu quero.

void Compra()

  {

      double price = simbolo.Ask();

      double stoploss = simbolo.NormalizePrice(price - SL);

      double takeprofit = simbolo.NormalizePrice(price + TP);

      negocio.Buy(Volume, NULL, price, stoploss, takeprofit);

    

  }

   void Venda()

  {

      double price = simbolo.Ask();

      double stoploss = simbolo.NormalizePrice(price + SL);

      double takeprofit = simbolo.NormalizePrice(price - TP);

      negocio.Sell(Volume, NULL, price, stoploss, takeprofit);

  }

 
lbevilaqua:

Preciso de uma ajuda pessoal, estou desenvolvendo um EA e esbarrei numa questão, preciso que o stoploss seja o preço minimo da vela anterior a entrada, ou seja SL=preço-minimovelaanterior

E o TP seja o preço de entrada + SL.

Grato desde já

Consegui desenvolver a logica para um sl e tp fixo escolhidos, porém não é isso que eu quero.

void Compra()

  {

      double price = simbolo.Ask();

      double stoploss = simbolo.NormalizePrice(price - SL);

      double takeprofit = simbolo.NormalizePrice(price + TP);

      negocio.Buy(Volume, NULL, price, stoploss, takeprofit);

    

  }

   void Venda()

  {

      double price = simbolo.Ask();

      double stoploss = simbolo.NormalizePrice(price + SL);

      double takeprofit = simbolo.NormalizePrice(price - TP);

      negocio.Sell(Volume, NULL, price, stoploss, takeprofit);

  }

Primeiramente você esta com muitos problemas de logica. Sugiro que estude este tema antes de continuar.

Para pegar o minimo do candle anterior leia esta documentação. Use a função ArraySetAsSerries.

O que você desenvolveu contem erros e expõe a riscos, a saber:

1. Você considera compras e vendas tudo na ponta Ask. Tem certeza disso? Você pode estar distorcendo sua estrategia ao não considerar as pontas Bid/Ask;

2. Você não trata eventuais erros no envio de ordens;

3. Falta verificar se o ativo não esta em leilão no envio de ordens.

Quando for colar trechos do código aqui no Fórum utilize Alt+S.


Sugiro que leia as threads abaixo:

https://www.mql5.com/pt/forum/309881

https://www.mql5.com/pt/forum/312033

https://www.mql5.com/pt/forum/312453


Boa sorte!

[ ]'s

 
Joscelino Celso de Oliveira:

Primeiramente você esta com muitos problemas de logica. Sugiro que estude este tema antes de continuar.

Para pegar o minimo do candle anterior leia esta documentação. Use a função ArraySetAsSerries.

O que você desenvolveu contem erros e expõe a riscos, a saber:

1. Você considera compras e vendas tudo na ponta Ask. Tem certeza disso? Você pode estar distorcendo sua estrategia ao não considerar as pontas Bid/Ask;

2. Você não trata eventuais erros no envio de ordens;

3. Falta verificar se o ativo não esta em leilão no envio de ordens.

Quando for colar trechos do código aqui no Fórum utilize Alt+S.


Sugiro que leia as threads abaixo:

https://www.mql5.com/pt/forum/309881

https://www.mql5.com/pt/forum/312033

https://www.mql5.com/pt/forum/312453


Boa sorte!

[ ]'s

  void Compra()
{
   double price;
   if(TipoAction==TRADE_ACTION_DEAL) // Determinação do preço da ordem a mercado
      price = simbolo.Ask(); 
   else
      price = simbolo.Bid() - Distancia;
   double stoploss = simbolo.NormalizePrice(price - SL); // Cálculo normalizado do stoploss
   double takeprofit = simbolo.NormalizePrice(price + TP); // Cálculo normalizado do takeprofit
   //negocio.Buy(Volume, NULL, price, stoploss, takeprofit, "Compra CruzamentoMediaEA"); // Envio da ordem de compra pela classe responsável
   
   // Limpar informações das estruturas
   ZeroMemory(request);
   ZeroMemory(result);
   ZeroMemory(check_result);
   
   //--- Preenchimento da requisição
   request.action       =TipoAction;
   request.magic        =magic;
   request.symbol       =_Symbol;
   request.volume       =Volume;
   request.price        =price; 
   request.sl           =stoploss;
   request.tp           =takeprofit;
   if(TipoAction==TRADE_ACTION_DEAL)
      request.type      =ORDER_TYPE_BUY;
   else
      request.type      =ORDER_TYPE_BUY_LIMIT;
   request.type_filling =ORDER_FILLING_RETURN; 
   request.type_time    =ORDER_TIME_DAY;
   request.comment      ="Compra CruzamentoMediaEA";
   
   //--- Checagem e envio de ordens
   ResetLastError();
   if(!OrderCheck(request, check_result))
   {
      PrintFormat("Erro em OrderCheck: %d", GetLastError());
      PrintFormat("Código de Retorno: %d", check_result.retcode);
      return;
   }
   
   if(!OrderSend(request, result))
   {
      PrintFormat("Erro em OrderSend: %d", GetLastError());
      PrintFormat("Código de Retorno: %d", result.retcode);
      return;
   }
   
   ObjectCreate(0, "BE", OBJ_HLINE, 0, 0, price + BE);
}
//+------------------------------------------------------------------+
//| Realizar venda com parâmetros especificados por input            |
//+------------------------------------------------------------------+
void Venda()
{
   double price;
   if(TipoAction==TRADE_ACTION_DEAL) // Determinação do preço da ordem a mercado
      price = simbolo.Bid(); 
   else
      price = simbolo.Ask() + Distancia;
   double stoploss = simbolo.NormalizePrice(price + SL); // Cálculo normalizado do stoploss
   double takeprofit = simbolo.NormalizePrice(price - TP); // Cálculo normalizado do takeprofit
   //negocio.Sell(Volume, NULL, price, stoploss, takeprofit, "Venda CruzamentoMediaEA"); // Envio da ordem de compra pela classe responsável
   
   // Limpar informações das estruturas
   ZeroMemory(request);
   ZeroMemory(result);
   ZeroMemory(check_result);
   
   //--- Preenchimento da requisição
   request.action       =TipoAction;
   request.magic        =magic;
   request.symbol       =_Symbol;
   request.volume       =Volume;
   request.price        =price; 
   request.sl           =stoploss;
   request.tp           =takeprofit;
   if(TipoAction==TRADE_ACTION_DEAL)
      request.type      =ORDER_TYPE_SELL;
   else
      request.type      =ORDER_TYPE_SELL_LIMIT;
   request.type_filling =ORDER_FILLING_RETURN; 
   request.type_time    =ORDER_TIME_DAY;
   request.comment      ="Venda CruzamentoMediaEA";
   
   //--- Checagem e envio de ordens
   ResetLastError();
   if(!OrderCheck(request, check_result))
   {
      PrintFormat("Erro em OrderCheck: %d", GetLastError());
      PrintFormat("Código de Retorno: %d", check_result.retcode);
      return;
   }

1. Você considera compras e vendas tudo na ponta Ask. Tem certeza disso? Você pode estar distorcendo sua estrategia ao não considerar as pontas Bid/Ask;

Sim, não irá mudar em nada minha estratégia

2. Você não trata eventuais erros no envio de ordens;

Melhorei a questão da checagem de erros no envio das ordens.

3. Falta verificar se o ativo não esta em leilão no envio de ordens.

Isso não vai influenciar, pois eu irei acompanhar o EA rodando.


A dúvida é realmente como fazer o stoploss ser a minima do candle anterior em caso de compra e em caso de venda a máxima do candle anterior.

Aceito sugestões é claro.

Agradecido desde já

 
lbevilaqua:

1. Você considera compras e vendas tudo na ponta Ask. Tem certeza disso? Você pode estar distorcendo sua estrategia ao não considerar as pontas Bid/Ask;

Sim, não irá mudar em nada minha estratégia

2. Você não trata eventuais erros no envio de ordens;

Melhorei a questão da checagem de erros no envio das ordens.

3. Falta verificar se o ativo não esta em leilão no envio de ordens.

Isso não vai influenciar, pois eu irei acompanhar o EA rodando.


A dúvida é realmente como fazer o stoploss ser a minima do candle anterior em caso de compra e em caso de venda a máxima do candle anterior.

Aceito sugestões é claro.

Agradecido desde já

Para pegar o minimo do candle anterior leia esta documentação. Use a função ArraySetAsSerries, alem da função CopyRates.

(Basta clicar nos links)

Razão: