Caros amigos, boa noite.
Preciso de uma ajuda.
Estou desenvolvendo um robô e gostaria de colocar nele uma meta diária em pontos ou em valor financeiro
Quando o robô atingir uma quantidade de pontos ou um valor financeiro no dia ele automaticamente parasse de operar.
Alguém poderia me ajudar? É um robô para operar índice e dólar
Obrigado
Leandro Vieira
Bom dia!
Criei uma função que retorna se a meta/perda foi alcançada no dia, veja se pode utilizar, faça testes dela! Depois por gentileza de seu feedback principalmente se houver algum erro nela!
bool funcao_verifica_meta_ou_perda_atingida(string tmpOrigem, double tmpValorMaximoPerda, double tmpValor_Maximo_Ganho, bool tmp_placar) { //tmpOrigem = comentario de qual local EA foi chamado a função //tmpValorMaximoPerda = valor máximo desejado como perda máxima //tmpValor_Maximo_Ganho = valor estipulado de meta do dia //tmp_placar = true exibe no comment o resultado das negociações do dia Print("Pesquisa funcao_verifica_meta_ou_perda_atingida (" + tmpOrigem + ")"); string tmp_x; double tmp_resultado_financeiro_dia; int tmp_contador; MqlDateTime tmp_data_b; TimeCurrent(tmp_data_b); tmp_resultado_financeiro_dia = 0; tmp_x = string(tmp_data_b.year) + "." + string(tmp_data_b.mon) + "." + string(tmp_data_b.day) + " 00:00:01"; HistorySelect(StringToTime(tmp_x),TimeCurrent()); int tmp_total=HistoryDealsTotal(); ulong tmp_ticket=0; double tmp_price; double tmp_profit; datetime tmp_time; string tmp_symboll; long tmp_typee; long tmp_entry; //--- para todos os negócios for(tmp_contador=0;tmp_contador<tmp_total;tmp_contador++) { //--- tentar obter ticket negócios if((tmp_ticket=HistoryDealGetTicket(tmp_contador))>0) { //--- obter as propriedades negócios tmp_price =HistoryDealGetDouble(tmp_ticket,DEAL_PRICE); tmp_time =(datetime)HistoryDealGetInteger(tmp_ticket,DEAL_TIME); tmp_symboll=HistoryDealGetString(tmp_ticket,DEAL_SYMBOL); tmp_typee =HistoryDealGetInteger(tmp_ticket,DEAL_TYPE); tmp_entry =HistoryDealGetInteger(tmp_ticket,DEAL_ENTRY); tmp_profit=HistoryDealGetDouble(tmp_ticket,DEAL_PROFIT); //--- apenas para o símbolo atual if(tmp_symboll==Symbol()) tmp_resultado_financeiro_dia = tmp_resultado_financeiro_dia + tmp_profit; } } if (tmp_resultado_financeiro_dia == 0) { if (tmp_placar = true) Comment("Placar 0x0"); return(false); //sem ordens no dia } else { if ((tmp_resultado_financeiro_dia > 0) && (tmp_resultado_financeiro_dia != 0)) { if (tmp_placar = true) Comment("Lucro R$" + DoubleToString(NormalizeDouble(tmp_resultado_financeiro_dia, 2),2) ); } else { if (tmp_placar = true) Comment("Prejuizo R$" + DoubleToString(NormalizeDouble(tmp_resultado_financeiro_dia, 2),2)); } if (tmp_resultado_financeiro_dia < tmpValorMaximoPerda) { Print("Perda máxima alcançada."); return(true); } else { if (tmp_resultado_financeiro_dia > tmpValor_Maximo_Ganho) { Print("Meta Batida."); return(true); } } } return(false); } ;
Atenciosamente,
DAniel
Bom dia!
Criei uma função que retorna se a meta/perda foi alcançada no dia, veja se pode utilizar, faça testes dela! Depois por gentileza de seu feedback principalmente se houver algum erro nela!
Atenciosamente,
DAniel
Vou chegar em casa e testar, estava procurando exatamente isso. Valeu Daniel.
Se funcionar dou retorno a noite. abraços.
Deu certo amigo, muito bom.
Ainda não verifiquei todos os detalhes de funcionamento, mas funciona legal.
Tornou o robô mais lento na otimização, depois vou tentar simplificar.
Para corrigir tive que acrescentar alguns iguais antes do true e false e tirar as variáveis dos parenteses da função.
Aí só acrescentei a função no ontick para zerar uma variável que autorizava a operação e funcionou bem.
input string tmpOrigem = "EA_Keltner_WIN$D_M5_Meta_Diaria";//tmpOrigem = comentario de qual local EA foi chamado a função input double tmpValorMaximoPerda = 0; //tmpValorMaximoPerda = valor máximo desejado como perda máxima input double tmpValor_Maximo_Ganho = 0; //tmpValor_Maximo_Ganho = valor estipulado de meta do dia input bool tmp_placar = true; //tmp_placar = true exibe no comment o resultado das negociações do dia ontick { tradenow=1; if(funcao_verifica_meta_ou_perda_atingida()){tradenow=0;} "Funções de operação do robô" } //+------------------------------------------------------------------+ //| Função para meta diária de Profit | //+------------------------------------------------------------------+ bool funcao_verifica_meta_ou_perda_atingida() { //tmpOrigem = comentario de qual local EA foi chamado a função //tmpValorMaximoPerda = valor máximo desejado como perda máxima //tmpValor_Maximo_Ganho = valor estipulado de meta do dia //tmp_placar = true exibe no comment o resultado das negociações do dia Print("Pesquisa funcao_verifica_meta_ou_perda_atingida (" + tmpOrigem + ")"); string tmp_x; double tmp_resultado_financeiro_dia; int tmp_contador; MqlDateTime tmp_data_b; TimeCurrent(tmp_data_b); tmp_resultado_financeiro_dia = 0; tmp_x = string(tmp_data_b.year) + "." + string(tmp_data_b.mon) + "." + string(tmp_data_b.day) + " 00:00:01"; HistorySelect(StringToTime(tmp_x),TimeCurrent()); int tmp_total=HistoryDealsTotal(); ulong tmp_ticket=0; double tmp_price; double tmp_profit; datetime tmp_time; string tmp_symboll; long tmp_typee; long tmp_entry; //--- para todos os negócios for(tmp_contador=0;tmp_contador<tmp_total;tmp_contador++) { //--- tentar obter ticket negócios if((tmp_ticket=HistoryDealGetTicket(tmp_contador))>0) { //--- obter as propriedades negócios tmp_price =HistoryDealGetDouble(tmp_ticket,DEAL_PRICE); tmp_time =(datetime)HistoryDealGetInteger(tmp_ticket,DEAL_TIME); tmp_symboll=HistoryDealGetString(tmp_ticket,DEAL_SYMBOL); tmp_typee =HistoryDealGetInteger(tmp_ticket,DEAL_TYPE); tmp_entry =HistoryDealGetInteger(tmp_ticket,DEAL_ENTRY); tmp_profit=HistoryDealGetDouble(tmp_ticket,DEAL_PROFIT); //--- apenas para o símbolo atual if(tmp_symboll==Symbol()) tmp_resultado_financeiro_dia = tmp_resultado_financeiro_dia + tmp_profit; } } if (tmp_resultado_financeiro_dia == 0) { if (tmp_placar == true) Comment("Placar 0x0"); return(false); //sem ordens no dia } else { if ((tmp_resultado_financeiro_dia > 0) && (tmp_resultado_financeiro_dia != 0)) { if (tmp_placar == true) Comment("Lucro R$" + DoubleToString(NormalizeDouble(tmp_resultado_financeiro_dia, 2),2) ); } else { if (tmp_placar == true) Comment("Prejuizo R$" + DoubleToString(NormalizeDouble(tmp_resultado_financeiro_dia, 2),2)); } if (tmp_resultado_financeiro_dia < tmpValorMaximoPerda) { Print("Perda máxima alcançada."); return(true); } else { if (tmp_resultado_financeiro_dia > tmpValor_Maximo_Ganho) { Print("Meta Batida."); return(true); } } } return(false); }
as vezes se coloca todos os indicadores e funções trabalhando no tick, mas nem todas as rotinas precisam ficar desta forma
se seu EA trabalha com barra fechada, ou se a função de "checagem de perda" pode ser calculada sempre a cada barra nova
você vai ganhar muito na otimização se fizer desta forma.
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- we work only at the time of the birth of new bar
static datetime PrevBars=0;
datetime time_0=iTime(0);
if(time_0==PrevBars)
return;
PrevBars=time_0;
if(!RefreshRates())
{
PrevBars=iTime(1);
return;
}
//---
tradenow=1;
if(funcao_verifica_meta_ou_perda_atingida()){tradenow=0;}
"Funções de operação do robô"
}
Daniel, parabéns pela iniciativa , é difícil achar coisas interessante na parte em português, você vai ver muito gente só postando coisa com outros finalidades ($$$)
as vezes se coloca todos os indicadores e funções trabalhando no tick, mas nem todas as rotinas precisam ficar desta forma
se seu EA trabalha com barra fechada, ou se a função de "checagem de perda" pode ser calculada sempre a cada barra nova
você vai ganhar muito na otimização se fizer desta forma.
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- we work only at the time of the birth of new bar
static datetime PrevBars=0;
datetime time_0=iTime(0);
if(time_0==PrevBars)
return;
PrevBars=time_0;
if(!RefreshRates())
{
PrevBars=iTime(1);
return;
}
//---
tradenow=1;
if(funcao_verifica_meta_ou_perda_atingida()){tradenow=0;}
"Funções de operação do robô"
}
Boa ideia, eu uso a classe is_newbar pra isso, tornou mais rápido meus robôs do que usar funções internas, vou acresentar um if () antes da função de de meta diária, assim ele verifica apenas uma vez a cada vela.
A iniciativa do Daniel foi muito boa mesmo, me ajudou muito.
Eu também, sempre que posso ajudar, posto as linhas de programação pois fica mais fácil pra quem está aprendendo, inclusive procuro postar os inputs e inicializações pra ficar mais fácil a compreensão.
Bom dia!
Criei uma função que retorna se a meta/perda foi alcançada no dia, veja se pode utilizar, faça testes dela! Depois por gentileza de seu feedback principalmente se houver algum erro nela!
Atenciosamente,
DAniel
Olá Boa Tarde Daniel, estava tentando utilizar essa sua função para realizar metas e perdas semanais, eu tentei adicionar na (string tmp_x) a (string(tmp_data_b.day).day_of_week + " 1") mas não deu certo ele não zera na sexta ele está zerando diariamente, teria alguma sugestão?
att. Alex Buziquia
Deu certo amigo, muito bom.
Ainda não verifiquei todos os detalhes de funcionamento, mas funciona legal.
Tornou o robô mais lento na otimização, depois vou tentar simplificar.
Para corrigir tive que acrescentar alguns iguais antes do true e false e tirar as variáveis dos parenteses da função.
Aí só acrescentei a função no ontick para zerar uma variável que autorizava a operação e funcionou bem.
Olá Boa Tarde João, estava tentando utilizar essa sua função para realizar metas e perdas semanais, eu tentei adicionar na (string tmp_x) a (string(tmp_data_b.day).day_of_week + " 1") mas não deu certo ele não zera na sexta ele está zerando diariamente, teria alguma sugestão?
att. Alex Buziquia

- 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
Caros amigos, boa noite.
Preciso de uma ajuda.
Estou desenvolvendo um robô e gostaria de colocar nele uma meta diária em pontos ou em valor financeiro
Quando o robô atingir uma quantidade de pontos ou um valor financeiro no dia ele automaticamente parasse de operar.
Alguém poderia me ajudar? É um robô para operar índice e dólar
Obrigado
Leandro Vieira