wemersonrv

MQL4 - Verificação de Spread e compatibilidade com TDS

May 13th, 2017
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.01 KB | None | 0 0
  1. // -----------------------------------------------------------------------------------------------------
  2. // 1º Exemplo para função de retorno de SPREAD em PIPs e/ou PIPETs
  3. //      Usando a função nativa da linguagem MQL4 MarketInfo
  4. // -----------------------------------------------------------------------------------------------------
  5.  
  6. enum ENUM_MARKET_INFO_TYPE{
  7.    ENUM_PIPs,   // 0
  8.    ENUM_PIPETs  // 1
  9. };
  10.  
  11. double GetSpread(ENUM_MARKET_INFO_TYPE type=ENUM_PIPs){
  12.    
  13.    // Retorna o Spread em PIPEts
  14.    // EURUSD 5 digitos: 0,00012 = 12 PIPETs
  15.    // USDJPY 3 digitos: 0,012 = 12 PIPETs
  16.    // USDRUB 4 digitos: 0,0012 = 12 PIPETs
  17.    // XAUUSD 2 digitos: 0,12 = 12 PIPETs
  18.    double spread = MarketInfo(_Symbol, MODE_SPREAD);
  19.    
  20.    // Caso precise do resultado em PIPs´
  21.    // Filtre os ativos com 3 e 5 dígitos e divida por 10
  22.    // 3 e 5 dígitos, precisa de conversão
  23.    // EURUSD 5 digitos: 0,00012 = 12 PIPETs / 10 = 1,2 PIPs
  24.    // USDJPY 3 digitos: 0,012 = 12 PIPETs / 10 = 1,2 PIPs
  25.    
  26.    // 2 e 4 dígitos, NÃO precisa de conversão
  27.    // USDRUB 4 digitos: 0,0012 = 12 PIPETs = 12 PIPs
  28.    // XAUUSD 2 digitos: 0,12 = 12 PIPETs = 12 PIPs
  29.    if( type==ENUM_PIPs && ( _Digits==3 || _Digits==5 ) ) {
  30.       if( spread > 0 ){ spread /=10; }
  31.    }
  32.    
  33.    return spread;
  34. }
  35.  
  36. // Exemplos de chamada da função com spread de 1.2 PIPs no EURUSD
  37. double spread_pipets = GetSpread(ENUM_PIPETs);          // 12 PIPETs
  38. double spread_pips = GetSpread(ENUM_PIPs);              // 1.2 PIPs  
  39. double spread_pips2 = GetSpread();                      // GetSpread() sem parâmetro, força retorno em PIPs
  40.  
  41. // -----------------------------------------------------------------------------------------------------
  42. // 2º Exemplo para função de retorno de SPREAD. Agora em Ponto Flutuante, PIPs e/ou PIPETs
  43. //      Também foi mudada a forma de recuperação do SPREAD para usar a diferença entre o Ask e o Bid
  44. //      Para garantir compatibilidade com o TDS ( Tick Data Suite )
  45. // -----------------------------------------------------------------------------------------------------
  46. enum ENUM_MARKET_INFO_TYPE{  ENUM_PIPs, ENUM_PIPETs, ENUM_FLOATs };
  47. enum ENUM_MARKET_INFO_TYPE{
  48.    ENUM_PIPs,   // 0
  49.    ENUM_PIPETs, // 1
  50.    ENUM_FLOATs  // 2
  51. };
  52.  
  53. double GetSpread(ENUM_MARKET_INFO_TYPE type=ENUM_PIPs){
  54.    
  55.    // 1 - Calculamos o Spread pela diferença entre as cotações Ask-Bid. A função MathAbs() Garante valor positivo
  56.    double spread_float = MathAbs(Ask-Bid);
  57.    
  58.    // 2 - Normalizamos o valor garantindo o que tenha o mesmo número de dígitos do ativo
  59.    spread_float = NormalizeDouble(spread_float, _Digits);
  60.    
  61.    // 3 - Se queremos apenas o restulado em ponto flutuante, paramos por aqui
  62.    if( type==ENUM_FLOATs)
  63.       return spread_float;
  64.    
  65.    // 3 - Desafio: Converter o spread de ponto flutuante para PIPEts
  66.    //    Facilitando a compreensão, para isso, basta dividir o valor em ponto flutuante
  67.    //    pelo PONTO FLUTUANTE DO ATIVO... Point!
  68.    double spread = spread_float / _Point; // ou Point(), tanto faz
  69.    
  70.    // Exemplo: EURUSD 5 Digitos        Ask: 1.09317     Bid: 1.09305
  71.    // spread_float: MathAbs(Ask - Bid)
  72.    // spread_float: MathAbs(1.09317 - 1.09305) = 0.00012
  73.    // EURUSD Point: 0.00001
  74.    // spread = spread_float / point       spread = 0.00012 / 0,00001 = 12 PIPETs
  75.    // Aqui a mesma coisa... Já temos o resultado em PIPETs da mesma forma que no método anterior
  76.    // Agora, Fazemos apenas o ajuste final para ativos de 3 e 5 dígitos. 2 e 4 dígitos já está pronto
  77.    if( type==ENUM_PIPs && ( _Digits==3 || _Digits==5 ) ) {
  78.       if( spread > 0 ){ spread /=10; }
  79.    }
  80.    
  81.    return spread;
  82. }
  83.  
  84. // Exemplos de chamada da função com spread de 1.2 PIPs no EURUSD
  85. double spread_ponto_flutuante = GetSpread(ENUM_FLOATs); // 0.00012
  86. double spread_pipets = GetSpread(ENUM_PIPETs);          // 12 PIPETs
  87. double spread_pips = GetSpread(ENUM_PIPs);              // 1.2 PIPs  
  88. double spread_pips2 = GetSpread();                      // GetSpread() sem parâmetro, força retorno em PIPs
Advertisement
Add Comment
Please, Sign In to add comment