Preciso colocar um stop móvel baseado no Parabolic Sar

 

Boa Tarde pessoal,


preciso que o stop móvel seja o mesmo valor do indicador PARABOLIC SAR, estou mandando o código, depois que alguém me ajudar vou postar o código do robô para ajudar alguém que estaja com a mesma dúvida, obrigado. 



//+------------------------------------------------------------------+

//|                                                  Robo_MM_IFR.mq5 |

//|                                             rafaelfvcs@gmail.com |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "rafaelfvcs@gmail.com"

#property link      "https://www.mql5.com"

#property version   "1.00"

//---

enum ESTRATEGIA_ENTRADA

  {

   APENAS_MM,  // Apenas Médias Móveis

   APENAS_IFR, // Apenas IFR

   MM_E_IFR    // Médias mais IFR

  };

//---


// Variáveis Input

sinput string s0; //-----------Estratégia de Entrada-------------

input ESTRATEGIA_ENTRADA   estrategia      = APENAS_MM;     // Estratégia de Entrada Trader


sinput string s1; //-----------Médias Móveis-------------

input int mm_rapida_periodo                = 12;            // Periodo Média Rápida

input int mm_lenta_periodo                 = 32;            // Periodo Média Lenta

input ENUM_TIMEFRAMES mm_tempo_grafico     = PERIOD_CURRENT;// Tempo Gráfico

input ENUM_MA_METHOD  mm_metodo            = MODE_EMA;      // Método 

input ENUM_APPLIED_PRICE  mm_preco         = PRICE_CLOSE;   // Preço Aplicado


sinput string s2; //-----------IFR-------------

input int ifr_periodo                      = 5;             // Período IFR

input ENUM_TIMEFRAMES ifr_tempo_grafico    = PERIOD_CURRENT;// Tempo Gráfico  

input ENUM_APPLIED_PRICE ifr_preco         = PRICE_CLOSE;   // Preço Aplicado


input int ifr_sobrecompra                  = 70;            // Nível de Sobrecompra

input int ifr_sobrevenda                   = 30;            // Nível de Sobrevenda


sinput string s3; //---------------------------

input int num_lots                         = 100;           // Número de Lotes

input double TK                            = 60;            // Take Profit

input double SL                            = 30;            // Stop Loss


sinput string s4; //---------------------------

input string hora_limite_fecha_op          = "17:40";       // Horário Limite Fechar Posição 

//---

//+------------------------------------------------------------------+

//|  Variáveis para os indicadores                                   |

//+------------------------------------------------------------------+

//--- Médias Móveis

// RÁPIDA - menor período

int mm_rapida_Handle;      // Handle controlador da média móvel rápida

double mm_rapida_Buffer[]; // Buffer para armazenamento dos dados das médias


// LENTA - maior período

int mm_lenta_Handle;      // Handle controlador da média móvel lenta

double mm_lenta_Buffer[]; // Buffer para armazenamento dos dados das médias


//--- IFR

int ifr_Handle;           // Handle controlador para o IFR

double ifr_Buffer[];      // Buffer para armazenamento dos dados do IFR


//+------------------------------------------------------------------+

//| Variáveis para as funçoes                                        |

//+------------------------------------------------------------------+


int magic_number = 123456;   // Nº mágico do robô


MqlRates velas[];            // Variável para armazenar velas

MqlTick tick;                // variável para armazenar ticks 


//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

int OnInit()

  {

//---

   mm_rapida_Handle = iMA(_Symbol,mm_tempo_grafico,mm_rapida_periodo,0,mm_metodo,mm_preco);

   mm_lenta_Handle  = iMA(_Symbol,mm_tempo_grafico,mm_lenta_periodo,0,mm_metodo,mm_preco);

   

   ifr_Handle = iRSI(_Symbol,ifr_tempo_grafico,ifr_periodo,ifr_preco);

   

   if(mm_rapida_Handle<0 || mm_lenta_Handle<0 || ifr_Handle<0)

     {

      Alert("Erro ao tentar criar Handles para o indicador - erro: ",GetLastError(),"!");

      return(-1);

     }

   

   CopyRates(_Symbol,_Period,0,4,velas);

   ArraySetAsSeries(velas,true);

   

   // Para adicionar no gráfico o indicador:

   ChartIndicatorAdd(0,0,mm_rapida_Handle); 

   ChartIndicatorAdd(0,0,mm_lenta_Handle);

   ChartIndicatorAdd(0,1,ifr_Handle);

   //---

//---

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

//---

   IndicatorRelease(mm_rapida_Handle);

   IndicatorRelease(mm_lenta_Handle);

   IndicatorRelease(ifr_Handle);

  }

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

  {

//---

   //desenhaLinhaVertical("L1",tick.time,clrRed);

   // Copiar um vetor de dados tamanho três para o vetor mm_Buffer

    CopyBuffer(mm_rapida_Handle,0,0,4,mm_rapida_Buffer);

    CopyBuffer(mm_lenta_Handle,0,0,4,mm_lenta_Buffer);

    

    CopyBuffer(ifr_Handle,0,0,4,ifr_Buffer);

    

    //--- Alimentar Buffers das Velas com dados:

    CopyRates(_Symbol,_Period,0,4,velas);

    ArraySetAsSeries(velas,true);

    

    // Ordenar o vetor de dados:

    ArraySetAsSeries(mm_rapida_Buffer,true);

    ArraySetAsSeries(mm_lenta_Buffer,true);

    ArraySetAsSeries(ifr_Buffer,true);

    //---

    

    // Alimentar com dados variável de tick

    SymbolInfoTick(_Symbol,tick);

   

    // LOGICA PARA ATIVAR COMPRA 

    bool compra_mm_cros = mm_rapida_Buffer[0] > mm_lenta_Buffer[0] &&

                          mm_rapida_Buffer[2] < mm_lenta_Buffer[2] ;

                                             

    bool compra_ifr = ifr_Buffer[0] <= ifr_sobrevenda;

    

    // LÓGICA PARA ATIVAR VENDA

    bool venda_mm_cros = mm_lenta_Buffer[0] > mm_rapida_Buffer[0] &&

                         mm_lenta_Buffer[2] < mm_rapida_Buffer[2];

    

    bool venda_ifr = ifr_Buffer[0] >= ifr_sobrecompra;

   

   //---

    bool Comprar = false; // Pode comprar?

    bool Vender  = false; // Pode vender?

    

    if(estrategia == APENAS_MM)

      {

       Comprar = compra_mm_cros;

       Vender  = venda_mm_cros;

       

      }

    else if(estrategia == APENAS_IFR)

     {

        Comprar = compra_ifr;

        Vender  = venda_ifr;

     }

    else

      {

         Comprar = compra_mm_cros && compra_ifr;

         Vender  = venda_mm_cros && venda_ifr;

      } 

   

   //---

   // retorna true se tivermos uma nova vela

    bool temosNovaVela = TemosNovaVela(); 

    

    // Toda vez que existir uma nova vela entrar nesse 'if'

    if(temosNovaVela)

      {

       

       // Condição de Compra:

       if(Comprar && PositionSelect(_Symbol)==false)

         {

          desenhaLinhaVertical("Compra",velas[1].time,clrBlue);

          CompraAMercado();

         }

       

       // Condição de Venda:

       if(Vender && PositionSelect(_Symbol)==false)

         {

          desenhaLinhaVertical("Venda",velas[1].time,clrRed);

          VendaAMercado();

         } 

         

      }

    

    //---

     if(TimeToString(TimeCurrent(),TIME_MINUTES) == hora_limite_fecha_op && PositionSelect(_Symbol)==true)

        {

            Print("-----> Fim do Tempo Operacional: encerrar posições abertas!");

             

            if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)

               {

                  FechaCompra();

               }

            else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)

               {

                  FechaVenda();

               }

        }  

   

  }

//+------------------------------------------------------------------+


//+------------------------------------------------------------------+

//| FUNÇÕES PARA AUXILIAR NA VISUALIZAÇÃO DA ESTRATÉGIA              |

//+------------------------------------------------------------------+


void desenhaLinhaVertical(string nome, datetime dt, color cor = clrBlueViolet)

   {

      ObjectDelete(0,nome);

      ObjectCreate(0,nome,OBJ_VLINE,0,dt,0);

      ObjectSetInteger(0,nome,OBJPROP_COLOR,cor);

   } 

//---


//+------------------------------------------------------------------+

//| FUNÇÕES PARA ENVIO DE ORDENS                                     |

//+------------------------------------------------------------------+


// COMPRA A MERCADO

void CompraAMercado() // bser na documentação ordem das variaveis!!!

  {

   MqlTradeRequest   requisicao;    // requisição

   MqlTradeResult    resposta;      // resposta

   

   ZeroMemory(requisicao);

   ZeroMemory(resposta);

   

   //--- Cacacterísticas da ordem de Compra

   requisicao.action       = TRADE_ACTION_DEAL;                            // Executa ordem a mercado

   requisicao.magic        = magic_number;                                 // Nº mágico da ordem

   requisicao.symbol       = _Symbol;                                      // Simbolo do ativo

   requisicao.volume       = num_lots;                                     // Nº de Lotes

   requisicao.price        = NormalizeDouble(tick.ask,_Digits);            // Preço para a compra

   requisicao.sl           = NormalizeDouble(tick.ask - SL*_Point,_Digits);// Preço Stop Loss

   requisicao.tp           = NormalizeDouble(tick.ask + TK*_Point,_Digits);// Alvo de Ganho - Take Profit

   requisicao.deviation    = 0;                                            // Desvio Permitido do preço

   requisicao.type         = ORDER_TYPE_BUY;                               // Tipo da Ordem

   requisicao.type_filling = ORDER_FILLING_FOK;                            // Tipo deo Preenchimento da ordem

   

   //---

   OrderSend(requisicao,resposta);

   //---

   if(resposta.retcode == 10008 || resposta.retcode == 10009)

     {

      Print("Ordem de Compra executada com sucesso!");

     }

   else

     {

       Print("Erro ao enviar Ordem Compra. Erro = ", GetLastError());

       ResetLastError();

     }

  }


// VENDA A MERCADO

void VendaAMercado()

  {

   MqlTradeRequest   requisicao;    // requisição

   MqlTradeResult    resposta;      // resposta

   

   ZeroMemory(requisicao);

   ZeroMemory(resposta);

   

   //--- Cacacterísticas da ordem de Venda

   requisicao.action       = TRADE_ACTION_DEAL;                            // Executa ordem a mercado

   requisicao.magic        = magic_number;                                 // Nº mágico da ordem

   requisicao.symbol       = _Symbol;                                      // Simbolo do ativo

   requisicao.volume       = num_lots;                                     // Nº de Lotes

   requisicao.price        = NormalizeDouble(tick.bid,_Digits);            // Preço para Venda

   requisicao.sl           = NormalizeDouble(tick.bid + SL*_Point,_Digits);// Preço Stop Loss

   requisicao.tp           = NormalizeDouble(tick.bid - TK*_Point,_Digits);// Alvo de Ganho - Take Profit

   requisicao.deviation    = 0;                                            // Desvio Permitido do preço

   requisicao.type         = ORDER_TYPE_SELL;                              // Tipo da Ordem

   requisicao.type_filling = ORDER_FILLING_FOK;                            // Tipo deo Preenchimento da ordem

   //---

   OrderSend(requisicao,resposta);

   //---

     if(resposta.retcode == 10008 || resposta.retcode == 10009)

       {

        Print("Ordem de Venda executada com sucesso!");

       }

     else

       {

        Print("Erro ao enviar Ordem Venda. Erro = ", GetLastError());

        ResetLastError();

       } 

 }

//---

//---

void FechaCompra()

   {

      MqlTradeRequest   requisicao;    // requisição

      MqlTradeResult    resposta;      // resposta

      

      ZeroMemory(requisicao);

      ZeroMemory(resposta);

      

      //--- Cacacterísticas da ordem de Venda

      requisicao.action       = TRADE_ACTION_DEAL;

      requisicao.magic        = magic_number;

      requisicao.symbol       = _Symbol;

      requisicao.volume       = num_lots; 

      requisicao.price        = 0; 

      requisicao.type         = ORDER_TYPE_SELL;

      requisicao.type_filling = ORDER_FILLING_RETURN;

      

      //---

      OrderSend(requisicao,resposta);

      //---

        if(resposta.retcode == 10008 || resposta.retcode == 10009)

          {

           Print("Ordem de Venda executada com sucesso!");

          }

        else

          {

           Print("Erro ao enviar Ordem Venda. Erro = ", GetLastError());

           ResetLastError();

          }

   }


void FechaVenda()

   {   

      MqlTradeRequest   requisicao;    // requisição

      MqlTradeResult    resposta;      // resposta

      

      ZeroMemory(requisicao);

      ZeroMemory(resposta);

      

      //--- Cacacterísticas da ordem de Compra

      requisicao.action       = TRADE_ACTION_DEAL;

      requisicao.magic        = magic_number;

      requisicao.symbol       = _Symbol;

      requisicao.volume       = num_lots; 

      requisicao.price        = 0; 

      requisicao.type         = ORDER_TYPE_BUY;

      requisicao.type_filling = ORDER_FILLING_RETURN;

      

      //---

      OrderSend(requisicao,resposta);

   

      //---

        if(resposta.retcode == 10008 || resposta.retcode == 10009)

          {

           Print("Ordem de Compra executada com sucesso!");

          }

        else

          {

           Print("Erro ao enviar Ordem Compra. Erro = ", GetLastError());

           ResetLastError();

          }

   }

//---

//+------------------------------------------------------------------+

//| FUNÇÕES ÚTEIS                                                    |

//+------------------------------------------------------------------+

//--- Para Mudança de Candle

bool TemosNovaVela()

  {

//--- memoriza o tempo de abertura da ultima barra (vela) numa variável

   static datetime last_time=0;

//--- tempo atual

   datetime lastbar_time= (datetime) SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);


//--- se for a primeira chamada da função:

   if(last_time==0)

     {

      //--- atribuir valor temporal e sair

      last_time=lastbar_time;

      return(false);

     }


//--- se o tempo estiver diferente:

   if(last_time!=lastbar_time)

     {

      //--- memorizar esse tempo e retornar true

      last_time=lastbar_time;

      return(true);

     }

//--- se passarmos desta linha, então a barra não é nova; retornar false

   return(false);

  }   

    

Descubra novos recursos para o MetaTrader 5 com a comunidade e os serviços MQL5
Descubra novos recursos para o MetaTrader 5 com a comunidade e os serviços MQL5
  • www.mql5.com
Tire dúvidas sobre análise técnica, fale com outros traders sobre sistemas de negociação e melhore suas habilidades de programação de estratégias em linguagem MQL5. Participe do fórum, compartilhe ideias com traders de todo o mundo e ajude com feedback os novatos — nossa comunidade está crescendo junto com você. Bloquear um indicador Boa...
Razão: