Detecção de 5 dígitos - página 6

 
cameofx 2010.07.29 10:52

I use below functions now, and it's usable across different brokers & instruments.

double vPoint; 
if(Digits == 2 || Digits == 4) vPoint = Point; else
if(Digits == 3 || Digits == 5) vPoint = Point*10; // I use this for my indies; call once on init() & use where Point supposed to be used in start() 

double Poin() 
{ 
   int d = Digits;
   switch(d){
   case 2 : {return(Point); break;}
   case 4 : {return(Point); break; }
   case 3 : {return(Point*10); break;}
   case 5 : {return(Point*10); break:}
   default : return;
} // I just come up with this. Untested but should be ok/robust. To be used to replace Point for trade parameters calculations. 

cheers, ~ cameo

Aqui está uma solução alternativa para o problema que eu uso...

int init()
  {
   double SymPoint;
   if (Point == 0.00001) SymPoint = 0.0001; //5 digits
   else if (Point == 0.001) SymPoint = 0.01; //3 digits
   else SymPoint = Point; //Normal
   
   return(0);
  }

Depois basta usar a variável SymPoint no lugar da variável Point. Muito similar a Cameo

 

Só para confundir um pouco mais as coisas, a BrocoTrader tem títulos com 0 a 5 dígitos para seus vários títulos...

 
kennyhubbard:

Olá 7bit,

Eu acho que você está certo em tentar criar código à prova de balas.......mas sempre haverá limites.

Você só tem que olhar o feed de demonstração do The Collective FX, onde eles estão testando um feed independente combinado de diferentes provedores de liquidez (em oposição a um único feed agregado de múltiplas fontes), cada um com seu próprio sufixo de par de moedas (encontramos finalmente um uso para o sufixo?), para perceber o escopo do problema. Isto significa que dentro de 1 plataforma você poderá escolher entre EURUSD_fx ou EURUSDm ou EURUSD_dbfx como quiser. Isto, por si só, vai abrir um enorme buraco em sua estratégia, pois alguns destes são preços de 4 dígitos e outros 5 dígitos...

O "se (Dígitos == 3 || Dígitos == 5)" é tão abrangente quanto você vai encontrar, pois funciona com a simples premissa de que você só tem 2 tipos de corretores, ou seja, aqueles que têm pip feeds inteiros e aqueles que têm 1/10º pips feeds. Este caso cobre os 2/3/4/5 pares de moedas e corretores.

Para minha própria informação, você já viu algum caso que seria uma exceção? No caso do Gold, sempre foi uma cotação de 2 dígitos e os novos corretores de 1/10º pip a cotam como 3 dígitos, portanto, mesmo este caso está bem coberto.

Eu sugeriria simplesmente tratar quaisquer exceções que você encontre como tal e talvez código duro que problema particular, em vez de tentar encontrar uma solução de retenção.


Uma coisa que tenho notado quando esta conversa surge é que as pessoas falam de um sufixo, mas nunca de um prefixo. É possível ter também um prefixo. Eu encontrei um corretor que tem um prefixo.

Minhas idéias sobre isto estão de acordo com o poster original aqui, quero produtos tão sólidos quanto possível para meus clientes, não me importo de arriscar mais codificação para consertar mais tarde. Todo o meu código poderia ser enrolado em torno dessa única mudança e pode me custar várias horas de desenvolvimento para passar por milhares de linhas de código para modificá-lo. Portanto, acertar na primeira vez reduz o risco e a despesa de ter que voltar e consertá-lo. Também concordo que isto é um bug, mas não um bug em nosso código, mas sim uma fraqueza no MQL.

Entretanto, também tenho contemplado uma solução. Uma de minhas soluções foi percorrer a lista de símbolos e encontrar o EURUSD usando o substrato para chegar até ele. Depois, obter o valor da oferta. Uma vez que eu tivesse o valor de oferta, eu poderia fazer um doubletostr, então descobrir uma maneira de contar os caracteres na cadeia, como strlen ou algo parecido. Dor na parte de trás, mas isso poderia me dar a determinação de 4 ou 5 dígitos, o que seria bastante sólido. A partir disso, eu poderia estabelecer minha base para odds como o Ouro.

Esta é apenas uma teoria, eu ainda não a tentei. Demasiado ocupado apenas tentando resolver os projetos atuais.

 

no meu EA eu uso este código para cálculo de Pip - este Pip eu uso em todos os lugares que eu lido com bool externo digitado em pips como SL, TP, TS ou eu quero ver lucro em pips ... testado em 3 diff brokers - sem prob em diff pairs, DAX 1/2 decimais ... ya eu sei que parece similar aos posts anteriores, mas seu funcionamento ao vivo ...


Pip = Point;
if(Digits==2 || Digits==4 || Digits==6) Pip = 100*Point;
else if( Digits==1 || Digits==3 || Digits==5) Pip = 10*Point; 

em minha outra indis eu também tento procurar pelo símbolo JPY ... :-)

Tmp_int = StringFind(Symbol(), "JPY", 0);
if(Tmp_int<0) Pip = 10000;
else Pip = 100;
 
seic:

no meu EA eu uso este código para cálculo de Pip - este Pip eu uso em todos os lugares que eu lido com bool externo digitado em pips como SL, TP, TS ou eu quero ver lucro em pips ... testado em 3 dif brokers - sem prob em dif pares, DAX 1/2 decimais ... ya eu sei que parece similar aos posts anteriores, mas seu funcionamento ao vivo ...


em minha outra indis eu também tento procurar pelo símbolo JPY ... :-)

Ao invés de procurar JPY gostaria de encontrar o "Ponto" para cada moeda. Isto é o que eu tentei:

  ObjectSetText("pi_Pair01",MarketInfo(Pair01,MODE_POINT));

Então a expectativa seria dar o respectivo valor para o par armazenado no Pair01. No entanto, este só retorna 0. Por que isso? Pari01 no meu exemplo é "AUDCAD" e o indicador está anexado a um gráfico EURUSD.

Experimentando mais, vejo agora que ele funciona para algumas moedas, mas não para outras. Isto é bastante confuso. MODE_DIGITS parece funcionar melhor. Como isso pode ser?

pi

 
seic:

no meu EA eu uso este código para cálculo de Pip - este Pip eu uso em todos os lugares que eu lido com bool externo digitado em pips como SL, TP, TS ou eu quero ver lucro em pips ... testado em 3 dif brokers - sem prob em dif pares, DAX 1/2 decimais ... ya eu sei que parece similar aos posts anteriores, mas seu funcionamento ao vivo ...

if(Digits==2 || Digits==4 || Digits==6) Pip = 100*Point;

Somente porque você está em um corretor de 5 dígitos. Em um corretor de 4 dígitos PIP e Point são o mesmo.
O que é um TICK?-Fórum de programação MQL4 e MetaTrader 4 -MQL4

 

E a InstaForex tem 4 dígitos para USDSEK e USDNOK, enquanto que 5 dígitos para EURUSD.


Portanto, eu acho que você precisa ter um array com um ajuste para cada moeda de cotação para obter a quantidade de pips e não de ticks.

Razão: