Tudo sobre Programação, com código fonte exemplo - página 2

 
Gostaria de saber se já existe algum código pronto para informar o número de ordens em aberto. Grato. Wilson
 
Rogerio Figurelli:
Olá Juscelino, para mim depende do que você chama exatamente de problema de sincronização, pois isso é muito genérico. Por exemplo, pelas opções que você apresenta pode estar perguntando sobre sincronização de sinais, sincronização de timeframes de indicadores, etc.. 
Seja como for, minha resposta genérica, válida para qualquer problema de sincronização,  é começar pelo diagnóstico da causa e formulação do problema, para aí sim projetar uma solução.
Sds.,
Rogério Figurelli

Ola @Rogerio Figurelli

Grato pelas observações, com elas alterei meu questionamento.

Na verdade, meu foco seria os problemas de sincronização dos dados de um ativo selecionado no terminal com os dados no servidor de negociação.

[ ]´s

 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Media movel 30s

leosteg, 2019.04.10 18:57

Boa tarde, estou fazendo um indicador de media móvel corrida, mas ao invés dela fazer as medias de todos os candles, queria saber se é possível ela pegar apenas os últimos 30 segundos


#property indicator_label1  "A"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrYellow
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         ABuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ABuffer,INDICATOR_DATA);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   for(int i=0; i<rates_total; i++)
   
      {
      
      ABuffer[i] = (high[i] + low[i]) / 2;
      }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

 
Joscelino Celso de Oliveira:

Ola @Rogerio Figurelli

Grato pelas observações, com elas alterei meu questionamento.

Na verdade, meu foco seria os problemas de sincronização dos dados de um ativo selecionado no terminal com os dados no servidor de negociação.

[ ]´s

Olá @Joscelino Celso de Oliveira,
Perfeitamente, agora ficou mais claro seu questionamento, que considero um ponto bastante relevante, principalmente para segurança de operações na B3.
Acredito que não existe uma forma determinística de garantir essa sincronização no MT5 apenas do lado do cliente, principalmente porque o robô depende de toda configuração e arquitetura cliente/servidor de cada corretora.
Dessa forma, nessa questão, sou bastante conservador, e utilizo uma abordagem de buscar trabalhar com o máximo de informações que a plataforma disponibiliza, como por exemplo validar a abertura e fazer o acompanhamento de posições, para comparar com a realidade de mercado e com a realidade apresentada nos dados do ativo em tempo real, de forma a poder agir imediatamente no caso de detecção de algum problema de sincronização.
Em outra palavras, infelizmente, me parece que a tecnologia para isso, do lado do cliente, está mais em trabalhar nos efeitos que nas causas dos problemas, uma vez que nem sempre esses problemas de sincronização são de simples detecção.
Evidentemente que essa abordagem está considerando apenas uma plataforma MT5 e corretora específica, pois sem dúvida é possível pensar em abordagens com arquiteturas bem mais complexas e de maior investimento, como tipicamente em sistemas organizacionais e com maior volume operacional, mas que no meu entender perdem o sentido em termos de custo/benefício para serem disseminadas para a maior parte dos usuários aqui nesse fórum.
Espero ter ajudado.
Sds.,
Rogério Figurelli

 
adv info:
Gostaria de saber se já existe algum código pronto para informar o número de ordens em aberto. Grato. Wilson

Olá @adv info certamente existem centenas de códigos assim nesse fórum, minha sugestão é você começar pesquisando pela função PositionSelect() no fórum ou codebase para encontrar alguns deles.
Fique à vontade para trazer algum deles para discussão nesse tópico no caso de qualquer dificuldade.
Sds.,
Rogério Figurelli

Documentação sobre MQL5: Funções de Negociação / PositionSelect
Documentação sobre MQL5: Funções de Negociação / PositionSelect
  • www.mql5.com
Escolhe uma posição aberta para posteriormente trabalhar com ele. Retorna true se a função for concluída com êxito. Retorna false em caso de falha. Para obter informações sobre o erro, chameGetLastError(). Ao usar a exibição independente de posições, (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) segundo cada símbolo, podem ao mesmo tempo existir várias...
 
Rogerio Figurelli:

Olá @Joscelino Celso de Oliveira,
Perfeitamente, agora ficou mais claro seu questionamento, que considero um ponto bastante relevante, principalmente para segurança de operações na B3.
Acredito que não existe uma forma determinística de garantir essa sincronização no MT5 apenas do lado do cliente, principalmente porque o robô depende de toda configuração e arquitetura cliente/servidor de cada corretora.
Dessa forma, nessa questão, sou bastante conservador, e utilizo uma abordagem de buscar trabalhar com o máximo de informações que a plataforma disponibiliza, como por exemplo validar a abertura e fazer o acompanhamento de posições, para comparar com a realidade de mercado e com a realidade apresentada nos dados do ativo em tempo real, de forma a poder agir imediatamente no caso de detecção de algum problema de sincronização.
Em outra palavras, infelizmente, me parece que a tecnologia para isso, do lado do cliente, está mais em trabalhar nos efeitos que nas causas dos problemas, uma vez que nem sempre esses problemas de sincronização são de simples detecção.
Evidentemente que essa abordagem está considerando apenas uma plataforma MT5 e corretora específica, pois sem dúvida é possível pensar em abordagens com arquiteturas bem mais complexas e de maior investimento, como tipicamente em sistemas organizacionais e com maior volume operacional, mas que no meu entender perdem o sentido em termos de custo/benefício para serem disseminadas para a maior parte dos usuários aqui nesse fórum.
Espero ter ajudado.
Sds.,
Rogério Figurelli

Ola @Rogerio Figurelli,

Obrigado por compartilhar sua experiencia. Vejo que meu pensamento esta alinhado.

Meus EAs testam o problema e então aciono um Sleep().

[ ]'s

 
Joscelino Celso de Oliveira:

Ola @Rogerio Figurelli,

Obrigado por compartilhar sua experiencia. Vejo que meu pensamento esta alinhado.

Meus EAs testam o problema e então aciono um Sleep().

[ ]'s

Olá @Joscelino Celso de Oliveira,
Sem dúvida existe alinhamento em relação a testar o problema, mas quanto ao Sleep(), para ser franco é uma função que evito utilizar, mas apenas por questão de padrão de projeto, pois ela, em tese, remove uma boa parte do controle, deixando o robô mais dependente da plataforma.
A abordagem que prefiro é o controle pela arquitetura, como por exemplo utilizando máquina de estados e pooling, tentando manter ao máximo o controle nos algoritmos do robô, de forma a ser mais responsivo.
Em tese, você pode fazer o mesmo, fatiando o Sleep() dentro de um loop, mas isso não me parece muito elegante em termos de projeto, digamos assim.
Abs.,
Rogério Figurelli

 

Olá, boa tarde!

Sou novo no fórum e também comecei a programar na plataforma faz poucos dias. Por favor, alguém poderia me ajudar na programação de um trailing stop numa ordem em execução, mas que seja ativado somente após o implemento de eventual lucro definido para a operação ?

Agradeço muito a ajuda!

Estou à disposição para colaborar com o que puder...


 
bool_el:

Olá, boa tarde!

Sou novo no fórum e também comecei a programar na plataforma faz poucos dias. Por favor, alguém poderia me ajudar na programação de um trailing stop numa ordem em execução, mas que seja ativado somente após o implemento de eventual lucro definido para a operação ?

Agradeço muito a ajuda!

Estou à disposição para colaborar com o que puder...


 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Rôbo não encerrando posições no Stop Loss e no Take profit definidos

Vlehmann, 2019.04.14 16:01

Bom dia pessoal,


Sou iniciante no desenvolvimento de robôs e provavelmente minha dúvida seja iniciante.

Estou programando este robô mas ele não sai das operações. Ele consegue entrar mas não consegue stopar nem no GAIN nem no LOSS.


Poderiam me ajudar?

bool Buy()
{
   MqlTradeRequest request;
   MqlTradeResult result;
   MqlTradeCheckResult checkResult;
   
   ZeroMemory(request);
   ZeroMemory(result);
   ZeroMemory(checkResult);
   
   request.action=TRADE_ACTION_DEAL;
   request.type=ORDER_TYPE_BUY;
   request.symbol=_Symbol;
   request.volume=lote;
   request.magic=EA_Magic;
   request.deviation=2.0;
   request.type_filling=ORDER_FILLING_RETURN;
   request.price=NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_ASK), 2);
   request.sl=NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_ASK) - 2.0, 2);
   request.tp=NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_ASK) + TP, 2);
   
   
   if(!OrderCheck(request, checkResult))
   {
      Print("Erro na checagem da ordem: ", GetLastError());
      Print("Código de erro: ", checkResult.retcode);
      return false;
   }
   
   
   Print("Saldo: ", ACCOUNT_BALANCE);
   Print("Saldo após operação: ", checkResult.balance);
   
   if(!OrderSend(request, result))
   {
      Print("Erro no envio da ordem: ", GetLastError());
      Print("Código de retorno do erro: ", result.retcode);
      return false;
   }
   
   return true;  
   
   
}

Razão: