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
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á
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)
![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
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);
}