IMPLEMENTAR MARTINGALE NO EA

 

Boa noite, pessoal! 
Continuo na saga para finalizar meu EA, e agora faltam basicamente 3 questões: delimitar o horário de funcionamento, estipular o limite de perda e ganho diários e implementar o martingale.

Nesse momento voltei a  sofrer com o martingale.. já li e vários artigos e postagens aqui no fórum, mas sem sucesso.
Eu preciso definir o fator de multiplicação e a quantidade de martingales apenas.

Se alguém conseguir me ajudar com essa questão, na verdade, se puder me ajudar com qualquer uma das questões acima já ficarei muito agradecido.
Vou deixar aqui a baixo a lógica do EA.

A estratégia é simples: é usado um canal de keltner, um candle fecha dentro do canal e o proximo candle rompendo o canal pra cima, é gerada uma ordem de compra, se romper pra baixo é venda.
Junto com as ordens de abertura da posição estão configurados os stop loss e take profit, bem como o breakeven e o trailling stop.

Vou deixar o EA em anexo.. Se alguém puder olhar e me dar essa força eu agradeço.
Arquivos anexados:
EA_REV_3.mq5  39 kb
 
savio95:

.

" Continuo na saga para finalizar meu EA, e agora faltam basicamente 3 questões: delimitar o horário de funcionamento, estipular o limite de perda e ganho diários e implementar o martingale. "

 

Tem alguma alma ingênua nesse fórum para fazer este EA para este rapaz?

 
payoff negativo e martingale é quebrar a conta com certeza... as pessoas não sabem o poder da matemática...
 
Rogerio Giannetti Torres:

 

Tem alguma alma ingênua nesse fórum para fazer este EA para este rapaz?

Bom dia! Não entendi a ironia, amigo..
Pra você pode parecer algo ridiculamente fácil, mas pra mim não é!
Eu não pedi pra ninguém fazer nada do zero pra mim, o EA está quase finalizado.. só que estou tendo dificuldade nesses pontos e estou pedindo auxílio.

Aqui é um fórum, onde as pessoas se ajudam.. gostaria que alguém me indicasse onde encontro material para sanar minhas dúvidas.

 
savio95:

Boa noite, pessoal! 
Continuo na saga para finalizar meu EA, e agora faltam basicamente 3 questões: delimitar o horário de funcionamento, estipular o limite de perda e ganho diários e implementar o martingale.

Nesse momento voltei a  sofrer com o martingale.. já li e vários artigos e postagens aqui no fórum, mas sem sucesso.
Eu preciso definir o fator de multiplicação e a quantidade de martingales apenas.

Se alguém conseguir me ajudar com essa questão, na verdade, se puder me ajudar com qualquer uma das questões acima já ficarei muito agradecido.
Vou deixar aqui a baixo a lógica do EA.

A estratégia é simples: é usado um canal de keltner, um candle fecha dentro do canal e o proximo candle rompendo o canal pra cima, é gerada uma ordem de compra, se romper pra baixo é venda.
Junto com as ordens de abertura da posição estão configurados os stop loss e take profit, bem como o breakeven e o trailling stop.

Vou deixar o EA em anexo.. Se alguém puder olhar e me dar essa força eu agradeço.

Bom dia!


Para controle de horário tem essa biblioteca que vem com exemplo de como implementar:

Download livre da biblioteca 'Classe para controlar horários de negociação' por '14134597' para MetaTrader 5 no CodeBase MQL5, 2020.07.03

Veja também esse tópico:

https://www.mql5.com/pt/forum/367647/page4#comment_22976960




 
input uchar hora_inicio                   = 09;                          // Hora para Iniciar Operação
input uchar minuto_inicio                 = 00;                          // Minuto para Iniciar Operação
input uchar hora_fim                      = 18;                          // Hora para Finalizar Operação
input uchar minuto_fim                    = 25;                          // Minuto para Finalizar Operação

void OnTick()
{if (HoraPodeOperar())

    // ->> aqui vc coloca a rotina que abre ordens do seu EA

}

bool HoraPodeOperar()
    {datetime time_current = TimeCurrent();
     datetime zero_hora = StringToTime(TimeToString(time_current,TIME_DATE));

     datetime horarioInicial = zero_hora + (hora_inicio * 60 * 60) + (minuto_inicio * 60);
     datetime horarioFinal   = zero_hora + (hora_fim * 60 * 60)    + (minuto_fim * 60);
     if ((horarioInicial < horarioFinal) && (time_current >= horarioInicial && time_current < horarioFinal))   // intraday time interval
         {return true;}
     if ((horarioInicial > horarioFinal) && (time_current >= horarioInicial || time_current < horarioFinal))   // time interval with the transition in a day
         {return true;}

     return(false);}

segue uma rotina para vc implementar o horário de funcionamento em seu EA

 
savio95:

Boa noite, pessoal! 
Continuo na saga para finalizar meu EA, e agora faltam basicamente 3 questões: delimitar o horário de funcionamento, estipular o limite de perda e ganho diários e implementar o martingale.

Nesse momento voltei a  sofrer com o martingale.. já li e vários artigos e postagens aqui no fórum, mas sem sucesso.
Eu preciso definir o fator de multiplicação e a quantidade de martingales apenas.

Se alguém conseguir me ajudar com essa questão, na verdade, se puder me ajudar com qualquer uma das questões acima já ficarei muito agradecido.
Vou deixar aqui a baixo a lógica do EA.

A estratégia é simples: é usado um canal de keltner, um candle fecha dentro do canal e o proximo candle rompendo o canal pra cima, é gerada uma ordem de compra, se romper pra baixo é venda.
Junto com as ordens de abertura da posição estão configurados os stop loss e take profit, bem como o breakeven e o trailling stop.

Vou deixar o EA em anexo.. Se alguém puder olhar e me dar essa força eu agradeço.



Para resultado diário tem essa função:

//+------------------------------------------------------------------+ 
//| Calcula o lucro / prejuízo do dia atual por símbolo              |
//+------------------------------------------------------------------+ 
double CurrentDayProfit()
  {
//   datetime time_start = (datetime) (86400*(((ulong)TimeCurrent())/86400));
   datetime time_start = iTime(_Symbol, PERIOD_D1, 0);
   double   result = 0.0;
   ulong    ticket;
   int      cnt;

   if(HistorySelect(time_start, TimeCurrent()))
     {
      for(cnt = HistoryDealsTotal() - 1; cnt >= 0; cnt--)
        {
         ticket = HistoryDealGetTicket(cnt);

         if(HistoryDealGetString(ticket, DEAL_SYMBOL) == _Symbol && HistoryDealGetInteger(ticket, DEAL_MAGIC) == EA_MAGIC)
           {
            result += HistoryDealGetDouble(ticket, DEAL_PROFIT);
           }
        }
     }
   else
     {
      Print(_Symbol, " - Erro ao recuperar o histórico de operações...");
     }

   return(result);
  }


Se quiser o resultado geral, independente do símbolo, retire a condição HistoryDealGetString(ticket, DEAL_SYMBOL) == _Symbol.

 
Vinicius de Oliveira:



Para resultado diário tem essa função:


Se quiser o resultado geral, independente do símbolo, retire a condição HistoryDealGetString(ticket, DEAL_SYMBOL) == _Symbol.

Então, Vinicius.. consegui implementar perfeitamente o horário operacional tanto com o método que você indicou, quanto com o método que o ArmandoJunior passou acima.
Mas essa parte do Lucro/Prejuízo do dia não tá indo de jeito algum..  estou o dia inteiro e não consigo fazer funcionar. Compila sem erros, mas não está funcional.
Tentei de algumas formas comparar o valor retornado pela função em "OnTick", usando um IF, para só abri a posição se o saldo diário estivesse abaixo do lucro máximo e acima da perda máxima, utilizando os iputs e tal, mas não consegui.
Tem alguma sugestão? ou algum conteúdo onde eu possa estudar sobre.. rodei o forum em outros idiomas tbm, mas sem sucesso.

 
ArmandoJunior70:

segue uma rotina para vc implementar o horário de funcionamento em seu EA


Obrigado, meu amigo! Deu super certo dessa forma também.. super simples, eu que estava tentando de uma forma bem mais complicada que essa..

 

Olá Savio,

a rotina do Vinícius está correta só precisa ver se vc está sabendo colocá-la corretamento no seu EA. Tente assim:

input double perda_max  = 500;
input double ganho_max  = 900;

void OnTick()
{if (HoraPodeOperar() && CurrentDayProfit() > perda_max*-1 && CurrentDayProfit() < ganho_max)

    {// ->> aqui vc coloca a rotina que abre ordens do seu EA}

 else
 
    {// ->> fecha ordens e posições 

    if (HoraPodeOperar() == false)
       {Print("Fora de Período Operacional!");} 
    if (CurrentDayProfit() <= perda_max*-1)
       {Print("Perda Máxima Atingida!");}       
    if (CurrentDayProfit() >= ganho_max)
       {Print("Ganho Máximo Atingido!");}}       
 
ArmandoJunior70:

Olá Savio,

a rotina do Vinícius está correta só precisa ver se vc está sabendo colocá-la corretamento no seu EA. Tente assim:

Então, é exatamente essa a lógica que eu estava usando, com exceção desse "*-1". Mas tentei dessa forma que você colocou acima e também não funcionou.
Quando insiro essa funcionalidade o EA não abre ordens.

 
Não sei se os valores retornados estão em outro formato, e ao comparar com os valores inputados está dando alguma irregularidade.. 
Ou se eu estou inserindo a rotina no local errado.. Eu coloquei a rotina no final do EA, abaixo das funções (void) de traillingstop e breakeven.

Razão: