Como registro dado de um Buffers Para continuar fazendo a analise dele nas barras seguintes?

Para adicionar comentários, por favor Faça o login ou registrar
Lucas
135
Lucas  

Olá pessoal. Tudo bem?

Gostaria de pedir ajuda a vcs. Se puderem me ajudar.

Estou com o seguinte problema. Estou criando um robo que pega dados do indicador. ele tem dois buffers que quero usar para compra e venda. um é sinalcompra[] e o outro sinalvenda[]. usei a função ArraySetAsSeries para inverter a indexação. quando sinalcompra[1] for =1 eu compro ou quando sinalvenda[1]=1 eu vendo. Só que tem um porem. eu compro se a(s) próxima(s) barra(s) tiver um aumento em 50 pontos ou vendo se a(s) proxima(s) barra(s) tiver um decrescimo de 50 pontos. 
Ai Surge o problema: 1) Como faço para registrar o valor sinalcompra[1] =1 ou sinalvenda[1]=1, para que ele fique analisando se as proximas barras atingem uma diferença de 50 pontos? 
2) Se eu tiver um sinalcompra[1]=1 e nao subir 50 pontos para eu comprar, e depois de algumas barras der sinalvenda[1]=1, como faço para atualizar o valor que eu teria gravado que era de sinalcompra[1]? 

Se puder me ajudar ficarei muito grato. 
Att. Lucas Massotti


Joscelino
908
Joscelino  
massotti:

Olá pessoal. Tudo bem?

Gostaria de pedir ajuda a vcs. Se puderem me ajudar.

Estou com o seguinte problema. Estou criando um robo que pega dados do indicador. ele tem dois buffers que quero usar para compra e venda. um é sinalcompra[] e o outro sinalvenda[]. usei a função ArraySetAsSeries para inverter a indexação. quando sinalcompra[1] for =1 eu compro ou quando sinalvenda[1]=1 eu vendo. Só que tem um porem. eu compro se a(s) próxima(s) barra(s) tiver um aumento em 50 pontos ou vendo se a(s) proxima(s) barra(s) tiver um decrescimo de 50 pontos. 
Ai Surge o problema: 1) Como faço para registrar o valor sinalcompra[1] =1 ou sinalvenda[1]=1, para que ele fique analisando se as proximas barras atingem uma diferença de 50 pontos? 
2) Se eu tiver um sinalcompra[1]=1 e nao subir 50 pontos para eu comprar, e depois de algumas barras der sinalvenda[1]=1, como faço para atualizar o valor que eu teria gravado que era de sinalcompra[1]? 

Se puder me ajudar ficarei muito grato. 
Att. Lucas Massotti


Como eu vejo isso (se entendi bem):

1. Cria uma variável para ser o passo (no caso 50 pontos, mas depois voce pode mudar);

2. Cria uma variável para armazenar o valor da entrada;

3. Cria uma varável para armazenar o preço corrente;

4. Compara através de um "if" se o preço corrente eh >= (ou <= ) a valor de entrada +/- passo;

5. Envia ordem (compra/venda) para aumento do lote,  fazendo as devidas verificações de risco;

6. Variável de entrada recebe novo valor (5) e recomeça o ciclo.

Espero ter contribuído.

[ ]'s

Lucas
135
Lucas  
entendi. Por exemplo, se der sinalcompra[1]=1, como faço para ter uma variável que segura este valor sabendo que conforme entra uma nova barra o sinalcompra[1] ja nao é mais o mesmo =1?
Joscelino
908
Joscelino  
massotti:
entendi. Por exemplo, se der sinalcompra[1]=1, como faço para ter uma variável que segura este valor sabendo que conforme entra uma nova barra o sinalcompra[1] ja nao é mais o mesmo =1?

Pelo que entendi, depois da primeira compra o sinal passa a ser os 50 pontos . Correto?

Sendo assim, não precisa mais voltar no buffer, basta seguir a sequencia que te sugeri.

[ ]'s

Lucas
135
Lucas  

Quase la.

Após um sinal de compra (sinalcompra[1]=1) qualquer barra que vem na sequencia em que o valor do preço mais alto menos o valor do preço mais alto do candle do sinal de compra for maior que 50 eu compro.

Não sei se deu pra entender...

Se a proxima barra der 50 pontos blz. mas e se for a segunda barra? assim eu teria que registrar o valor do sinalcompra[1]=1 porque conforme surge novas barras o valor do sinalcompra[1] muda.

Joscelino
908
Joscelino  
massotti:

Quase la.

Após um sinal de compra (sinalcompra[1]=1) qualquer barra que vem na sequencia em que o valor do preço mais alto menos o valor do preço mais alto do candle do sinal de compra for maior que 50 eu compro.

Não sei se deu pra entender...

Se a proxima barra der 50 pontos blz. mas e se for a segunda barra? assim eu teria que registrar o valor do sinalcompra[1]=1 porque conforme surge novas barras o valor do sinalcompra[1] muda.

Sem ver seu codigo fica complicado.

Em seu lugar eu só utilizaria o buffer enquanto não houvesse posição aberta. Com posição aberta eu adotaria a forma sugerida.

Pelo que estou entendendo você terá stop móvel (trailing stop), correto?

Lucas
135
Lucas  
//+------------------------------------------------------------------+
//|                                                                    EA.mq5 |
//|                                                          Lucas Massotti |
//|                                            https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Lucas Massotti"
#property link      "https://www.mql5.com"
#property version   "1.00"

//+------------------------------------------------------------------+
//| INPUTS (PARAMETROS EXTERNOS)                              |                                                                
//+------------------------------------------------------------------+
input int takeprofit = 10;
input int stoploss=20;

MqlRates candle[]; //---acesso a dados de preço

int handlehaseganshuriken;
double principeny1[],principeny2[],principeny3[],sinalcompra[],sinalvenda[],principenycandle1[],principenycandle2[],principenycandle3[],principenycandle4[];
//+------------------------------------------------------------------+
//| Expert initialization function                                    |
//+------------------------------------------------------------------+
int OnInit()
  {
     
   EventSetMillisecondTimer(1);
   ArraySetAsSeries(candle,true); 
   
   
   handlehaseganshuriken = iCustom(_Symbol,_Period,"RasengaShurikenNY.ex5",30);
   ArraySetAsSeries(principeny1,true);
   ArraySetAsSeries(principeny2,true);
   ArraySetAsSeries(principeny3,true);
   ArraySetAsSeries(sinalcompra,true);
   ArraySetAsSeries(sinalvenda,true);
   ArraySetAsSeries(principenycandle1,true);
   ArraySetAsSeries(principenycandle2,true);
   ArraySetAsSeries(principenycandle3,true);
   ArraySetAsSeries(principenycandle4,true);
   MarketBookAdd(_Symbol); // abre o acesso aos dados do book, ou seja, estamos pedindo acesso ao dado do book.
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
   EventKillTimer();
   
  }

 
void OnTimer()
{
   CopyBuffer(handlehaseganshuriken,0,0,1000,principeny1);
   CopyBuffer(handlehaseganshuriken,1,0,1000,principeny2);
   CopyBuffer(handlehaseganshuriken,2,0,1000,principeny3);
   CopyBuffer(handlehaseganshuriken,3,0,1000,sinalcompra);
   CopyBuffer(handlehaseganshuriken,4,0,1000,sinalvenda);
   CopyBuffer(handlehaseganshuriken,5,0,1000,principenycandle1);
   CopyBuffer(handlehaseganshuriken,6,0,1000,principenycandle2);
   CopyBuffer(handlehaseganshuriken,7,0,1000,principenycandle3);
   CopyBuffer(handlehaseganshuriken,8,0,1000,principenycandle4);
  
   CopyRates(_Symbol,_Period,0,1000,candle);
  
//+------------------------------------------------------------------+
//|SETUP DE NEGOCIAÇÃO DE COMPRA E VENDA              |
//+------------------------------------------------------------------+
  
    
      if( sinalcompra[1]==1 && ((candle[1].high-candle[2].high)>=50) ) 
      {
         
        SetupCompra();      
      }
      if( sinalvenda[1]==1 && ((candle[0].low-candle[1].low)>=50) ) 
      {
      
      SetupVenda();
      }  
}







//+------------------------------------------------------------------+
//|                      setup de compra                                  |
//+------------------------------------------------------------------+
   void SetupCompra()
  {
       MqlTradeRequest requisicao;
       MqlTradeResult resposta;
       ZeroMemory(requisicao);   // limpa a memoria da struct
       ZeroMemory(resposta);     // limpa a memoria da struct
       //AGORA: DEFINIR TODAS AS CARACTERÍSTICA DA ORDEM
       requisicao.action=TRADE_ACTION_DEAL; //aqui falei que o negocio é a mercado...no type logo abaixo eu disse que é COMPRA  a MERCADO.
       requisicao.magic = 1234;
       //requisicao.order 
       requisicao.symbol=_Symbol;
       requisicao.volume= vol;
       requisicao.price=0; // a mercado
       //requisicao.stoplimit=
       requisicao.sl=tick2.ask-stoploss; //EU QUE COLOQUEI TRADE_ACTION_DEAL
       requisicao.tp=tick2.ask+takeprofit;  //EU QUE COLOQUEI TRADE_ACTION_DEAL
       requisicao.deviation=5;
       requisicao.type = ORDER_TYPE_BUY; //aqui disse que é COMPRA A MERCADO
       requisicao.type_filling=ORDER_FILLING_FOK;
       requisicao.type_time = ORDER_TIME_DAY;
       requisicao.expiration=0;
       requisicao.comment= "COMPRA A MERCADO";
       //---resetar erros antes de enviar a ordem
       ResetLastError();
       //AGORA USAR A FUNÇÃO PARA ENVIO DE ORDENS
       bool envio_de_compra = OrderSend(requisicao,resposta);
       //---tratamento do envio da ordem caso de errado
       if(envio_de_compra==false)
         {
          //Print( "erro ao enviar ordem. O erro é  ", GetLastError());
          //--Para tratar o erro posso fazer as seguintes coisas:
          //1)remover o robo  usando a funcao "ExpertRemove()"
          //2)retry no envio da ordem
          //3)enviar uma notificação/email
          //4)imprimir um alerta
          }
         else
           {
            //Print("A ordem foi corretamente enviada para a CORRETORA  ");
            //---
            if(resposta.retcode == 10008 || resposta.retcode == 10009)
              {
              //Print("Ordem corretamente colocada/executada ");
              }
            else
              {
                  //Print("Erro ao executar ordem. Erro é  ", GetLastError(), " / retorno = ", resposta.retcode);
                  //--Para tratar o erro posso fazer as seguintes coisas:
                  //1)remover o robo  usando a funcao "ExpertRemove()"
                  //2)retry no envio da ordem
                  //3)enviar uma notificação/email
                  //4)imprimir um alerta
              }
            }
     }
//+------------------------------------------------------------------+
//|                      setup de venda                              |
//+------------------------------------------------------------------+  
      void SetupVenda()
      {
       MqlTradeRequest requisicao;
       MqlTradeResult resposta;
       ZeroMemory(requisicao);   // limpa a memoria da struct
       ZeroMemory(resposta);     // limpa a memoria da struct
       //AGORA: DEFINIR TODAS AS CARACTERÍSTICA DA ORDEM
       requisicao.action=TRADE_ACTION_DEAL; //aqui falei que o negocio é a mercado...no type logo abaixo eu disse que é COMPRA  a MERCADO.
       requisicao.magic = 1234;
       //requisicao.order 
       requisicao.symbol=_Symbol;
       requisicao.volume= vol;
       requisicao.price=0; // a mercado
       //requisicao.stoplimit=
       requisicao.sl=tick2.bid+stoploss; //EU QUE COLOQUEI TRADE_ACTION_DEAL  TRADE_ACTION_DEAL+30
       requisicao.tp=tick2.bid-takeprofit;  //EU QUE COLOQUEI TRADE_ACTION_DEAL   TRADE_ACTION_DEAL-5
       requisicao.deviation=5;
       requisicao.type = ORDER_TYPE_SELL; //aqui disse que é COMPRA A MERCADO
       requisicao.type_filling=ORDER_FILLING_FOK;
       requisicao.type_time = ORDER_TIME_DAY;
       requisicao.expiration=0;
       requisicao.comment= "VENDA A MERCADO";
       //---resetar erros antes de enviar a ordem
       ResetLastError();
       //AGORA USAR A FUNÇÃO PARA ENVIO DE ORDENS
       bool envio_de_venda = OrderSend(requisicao,resposta);
       //---tratamento do envio da ordem caso de errado
       if(envio_de_venda==false)
         {
          //Print( "erro ao enviar ordem. O erro é  ", GetLastError());
          //--Para tratar o erro posso fazer as seguintes coisas:
          //1)remover o robo usando a funcao "ExpertRemove()"
          //2)retry no envio da ordem
          //3)enviar uma notificação/email
          //4)imprimir um alerta
          }
         else
           {
            //Print("A ordem foi corretamente enviada para a CORRETORA  ");
            //---
            if(resposta.retcode == 10008 || resposta.retcode == 10009)
              {
              // Print("Ordem corretamente colocada/executada ");
              }
            else
              {
                  //Print("Erro ao executar ordem. Erro é  ", GetLastError(), " / retorno = ", resposta.retcode);
                  //--Para tratar o erro posso fazer as seguintes coisas:
                  //1)remover o robo  usando a funcao "ExpertRemove()"
                  //2)retry no envio da ordem
                  //3)enviar uma notificação/email
                  //4)imprimir um alerta
              }
           }
  }


Lucas
135
Lucas  

esta ai o codigo. Usei a função "if" para estabelecer condições. Mas do jeito que fiz só pega a próxima barra e nao analisa as próxima. 


ve se consegue entender agora...

Joscelino
908
Joscelino  
massotti:

esta ai o codigo. Usei a função "if" para estabelecer condições. Mas do jeito que fiz só pega a próxima barra e nao analisa as próxima. 


ve se consegue entender agora...

Hoje não consigo mais analisar isto.

Ao ver seu código sugiro que você leia urgentemente a thread abaixo.

Assim que conseguir verificar seu código posto aqui minhas sugestões, se outros colegas não o fizerem antes.

[ ]'s

Um checklist dos riscos dos robôs antes de operar em conta real
Um checklist dos riscos dos robôs antes de operar em conta real
  • 2014.04.23
  • www.mql5.com
A maior parte dos traders que operam com robôs, tanto no mercado Forex, como no mercado BM&FBovespa, geralmente focam apenas no lado bom, que é o p...
Para adicionar comentários, por favor Faça o login ou registrar