Mas não ficou muito claro a sua pergunta.
Você se refere a como fazer isso através da programação?
E contar os candles... como assim? Tente detalhar mais sua dúvida.
att,
Opa, consigo sim.
Mas não ficou muito claro a sua pergunta.
Você se refere a como fazer isso através da programação?
E contar os candles... como assim? Tente detalhar mais sua dúvida.
att,
Olá Pablo. Estou fazendo um EA que tem como takeprofit dois candles com lucro, não necessariamente consecutivos mas tem que estar entre os cinco após a entrada. O código ainda está com takeprofit fixo no preço pois não faço ideia de como fazer
// Condições de entrada MmPsarMacd void MmPsarMacd() // Testa condições para Marubozu/Marubozu_long/Long {CANDLE_STRUCTURE cand; RecognizeCandle(_Symbol,_Period,velas[1].time,10,cand); if(cand.type==CAND_MARIBOZU||cand.type==CAND_MARIBOZU_LONG||cand.type==CAND_LONG) {if(wma_220_Buffer[1]<wma_62_Buffer[1]&&wma_14_Buffer[1]<wma_8_Buffer[1]) {if(velas[1].open<wma_8_Buffer[1]&&velas[1].close>wma_8_Buffer[1]) {if(psar_Buffer[1]<velas[1].open&&macd_Buffer[1]>0) {if(OrdersTotal()==0&&PositionsTotal()==0&&pode_operar) {ObjectCreate(0,"x"+velas[1].time,OBJ_ARROW_CHECK,0,velas[1].time,velas[1].low); CompraAMercado(num_lots,tick.ask);}}}} else if(wma_220_Buffer[1]>wma_62_Buffer[1]&&wma_14_Buffer[1]>wma_8_Buffer[1]) {if(velas[1].open>wma_8_Buffer[1]&&velas[1].close<wma_8_Buffer[1]) {if(psar_Buffer[1]>velas[1].open&&macd_Buffer[1]<0) {if(OrdersTotal()==0&&PositionsTotal()==0&&pode_operar) {ObjectCreate(0,"x"+velas[1].time,OBJ_ARROW_CHECK,0,velas[1].time,velas[1].high); VendaAMercado(num_lots,tick.bid);}}}}}} void CompraAMercado(double num_lots_,double ask) // Função contendo o objeto trade {houve_reversao=false;take_profit_alt=false; if(velas[1].low<velas[2].low&&velas[1].low<velas[3].low) // Calcula o Stop Loss {stop=velas[1].low;} else if(velas[2].low<velas[3].low) {stop=velas[2].low;} else {stop=velas[3].low;} take=(velas[1].high-velas[1].low)+(((velas[1].high-velas[1].low)*80)/100); // Takeprofit trade.Buy(num_lots_,_Symbol,ask,stop,ask+take); // Entrada desenhaLinhaVertical("Compra",velas[1].time,clrBlue); if(trade.ResultRetcode()==10008||trade.ResultRetcode()==10009) // Testa se houve erro {Print(" ====== Ordem de Compra executada com sucesso! ====== ");} else {Print("Erro ao enviar Ordem de Compra. Erro = ", GetLastError()); ResetLastError();}} // Venda a mercado void VendaAMercado(double num_lots_,double bid) // Função contendo o objeto trade {houve_reversao=false;take_profit_alt=false; if(velas[1].high>velas[2].high&&velas[1].high>velas[3].low) // Calcula o Stop Loss {stop=velas[1].high;} else if(velas[2].high>velas[3].high) {stop=velas[2].high;} else {stop=velas[3].high;} take=(velas[1].high-velas[1].low)+(((velas[1].high-velas[1].low)*80)/100); // Calcula o Take Profit trade.Sell(num_lots_,_Symbol,bid,stop,bid-take); // Entrada desenhaLinhaVertical("Venda",velas[1].time,clrRed); if(trade.ResultRetcode()==10008||trade.ResultRetcode()==10009) // Testa se houve erro {Print(" ====== Ordem de Venda executada com sucesso! ====== ");} else {Print("Erro ao enviar Ordem de Venda. Erro = ", GetLastError()); ResetLastError();}}
Tentei fazer desta forma mas não tá dando muito certo, o contador não zera quando dá stop e está contando todas as velas, não só as com lucro
// Takeprofit por número de candles void TakeALt() {if(PositionSelect(_Symbol)&&PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) {sOpen=iOpen(NULL,PERIOD_CURRENT,1); sClose=iClose(NULL,PERIOD_CURRENT,1); if((sClose-sOpen)>0) {cont=cont+1;Print("cont takealt = ",cont); if(cont==4) {//cont=0; FechaPosicao(); Print(" ========== TakeAlt ========== "); ObjectCreate(0,"x"+velas[1].time,OBJ_ARROW_CHECK,0,velas[1].time,velas[1].high); take_profit_alt=true;}}} if(PositionSelect(_Symbol)&&PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL) {sOpen=iOpen(NULL,PERIOD_CURRENT,1); sClose=iClose(NULL,PERIOD_CURRENT,1); if((sClose-sOpen)<0) {cont=cont+1;Print("cont takealt = ",cont); if(cont==4) {cont=0; FechaPosicao(); Print(" ========== TakeAlt ========== "); ObjectCreate(0,"x"+velas[1].time,OBJ_ARROW_CHECK,0,velas[1].time,velas[1].high); take_profit_alt=true;}}}}Já procurei material sobre o assunto mas não encontro
Olá Pablo. Estou fazendo um EA que tem como takeprofit dois candles com lucro, não necessariamente consecutivos mas tem que estar entre os cinco após a entrada. O código ainda está com takeprofit fixo no preço pois não faço ideia de como fazer
Tentei fazer desta forma mas não tá dando muito certo, o contador não zera quando dá stop e está contando todas as velas, não só as com lucro
Já procurei material sobre o assunto mas não encontroAlexandre
Veja se a rotina abaixo pode ser util no seu codigo.. Apenas um exemplo partindo do pressuposto que já exista uma ordem de compra não importando se as velas de altas são seguidas ou maiores que as anteriores.
Fiz os testes aqui e aparentemente funciona, só fazer suas adaptações;
//==============================================================================
// Inicialização de variaveis
int barra_entrada,barras_positivas=0;
long bilhete;
double fech, abert,prc_compra;
if(PositionSelect(_Symbol)){ // Testamos a condição
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY){ // Pegamos o tipo de posição aberta
prc_compra=PositionGetDouble(POSITION_PRICE_OPEN); // Pegamos o preço de compra
bilhete=PositionGetInteger(POSITION_TICKET); // Pegamos o ticket da posição aberta
barra_entrada=iBarShift(_Symbol,PERIOD_CURRENT,PositionGetInteger(POSITION_TIME),false); // Pegamos a qtd de barra correntes desde a barra de entrada no trade
}
}
if(barra_entrada>=2){ // Verificamos se a qtd de barra desde a entrada é igual ou superior a 2 pois faz sentido que a contagem seja apenas a partir da segunda barra que precede a barra de entrada
for(int b=1;b<=barra_entrada;b++){ // Fazemos um loop pra tras até o valor da barra de entrada
fech=iClose(_Symbol,PERIOD_CURRENT,b); // Pegamos o fechamento imediatamente anterior até o fechamento da barra de entrada
abert=iOpen(_Symbol,PERIOD_CURRENT,b); // Pegamos a abertura imediatamente anterior ate a abertura da barra de entrada
if(fech > abert && fech > prc_compra){ // Testamos se os fechamentos são maiores que a aberturas ao mesmo tempo se os fechamentos são maiores que o preço de entrada
barras_positivas=barras_positivas+1; // Caso a condição acima seja satisfeita, incrementamos o contador de barras positivas
if(barras_positivas==2){ // Testamos se as qtd de barras positivas são iguais a 2
if(trade.PositionClose(bilhete,-1)){ // Fechamos o trade
barras_positivas=0; // zeramos o contador de barras positivas
}
}
}
}
}
}
Tentei fazer desta forma mas não tá dando muito certo, o contador não zera quando dá stop e está contando todas as velas, não só as com lucro
Então @Alexandre Becker, tudo bem?
Vou me ater a essa parte do contador apenas para tentar lhe ajudar.
Percebo que seu robô esta contando tudo, pois quando você faz o uso do
PositionSelect(_Symbol)
e continua a perguntar se é do tipo compra ou venda
PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
ele, de acordo com o código esta incrementando mais 1 ao contador
if((sClose-sOpen)>0) {cont=cont+1;Print("cont takealt = ",cont);
A questão é que você deve perguntar a ele se no histórico das posições, depois de selecioná-las é claro
bool HistorySelect( datetime from_date, // a partir da data datetime to_date // até à data );
Se no seu histórico deal, desde que você abriu sua posição, garanta o horário da operação
int HistoryDealsTotal();
houve alguma com o reason
DEAL_REASON_SL | Transação realizada como resultado da ativação de uma ordem Stop Loss |
Então você conta.
Sugiro que separe seu código, faça uma função para contar, uma função para selecionar seu histórico etc.
Como na matemática que, ao termos um problema, dividimos ele.
Da maneira que está aí você não conseguirá de fato contar àquelas operações que foram concluídas com o stop loss como deseja.
Observe também que, apesar de você desejar saber se houve stop você atribui um valor true a uma variável que possui nome de take profit
take_profit_alt=true;}}}
Neste caso você deve buscar a
DEAL_REASON_TP | Transação realizada como resultado da ativação de uma ordem Take Profit |
pois para o robô serão coisas diferentes
Enfim, evitei criar um código pois a lógica de cada um é muito pessoal, uma assinatura, então acredito que mostrar a questão do contador somente é suficiente para você adequar com sua assinatura ao seu código.
Sucesso por aí.
Estou com dificuldade para contar os candles para sair de uma operação.
Alguém consegue me dar uma mãozinha?
- 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
Estou com dificuldade para contar os candles para sair de uma operação.
Alguém consegue me dar uma mãozinha?