Peço aos criadores que acrescentem duas características padrão.
Sugiro a seguinte especificação:
====
Rp
A função retorna o valor a ser alinhado com a etapa de preço do instrumento.
duplo Rp(
nome_símbolo decadeia, // nome do símbolo duplovalor// preço a alinhar );
Parâmetros
símbolo_nome
[em] Símbolo.
valor
[em] Número positivo.
Valor devolvido
Onúmero mais próximo arredondado ao preço do instrumento comercial.
...
Exemplo:
Valores de entrada:
símbolo_nome = ES-...
valor = 2000.55
produção = 2000.50
(preço por instrumento ES = 0,25)
Valores de entrada:
símbolo_nome = SPX
valor = 2000.55
produção = 2000.63
(no SPX a etapa de preço é também 0,25, como no ES, mas há um offset de base e a cotação pode ter apenas as seguintes partes fracionárias -- 13,38,63,88)
Valores de entrada:
símbolo_nome = RTS
valor = 82055,55
saída = 82060
(preço por instrumento RTS = 10)
...e assim por diante.
A segunda função, que me interessa ainda mais:
====
Rv
A função retorna um valor que será alinhado com o passo de volume do instrumento e estará na gama de SYMBOL_VOLUME_MIN a SYMBOL_VOLUME_MAX.
duplo Rv(
nome_símbolo decadeia, // nome do símbolo duplovalor// lote a alinhar );
Parâmetros
símbolo_nome
[em] Símbolo.
valor
[em] Número positivo.
Valor devolvido
Número mais próximo arredondado para o passo de volume doinstrumento comercial. O número não será maior que SYMBOL_VOLUME_MAX ou menor que SYMBOL_VOLUME_MIN.
...
======
A principal propriedade que espero destas funções é que elas sejam válidas para TODOS OS INSTRUMENTOS DE TRADUÇÃO NO MUNDO e PARA QUALQUER INTRODUÇÃO.
Se alguém tiver uma solução pronta, por favor partilhe, desde que os criadores a tenham.
Resolvendo o problema a partir do vosso comentário, fiz uma função mais estúpida e desajeitada, mas mesmo assim falha para muitos valores de entrada.
Código de função:
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Возвращает кол-во значимых цифр после запятой
вернёт 0 если число без значимой десятичной дробной части
вернёт -1 в случае ошибки во время разбора строки на массив
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/int GetDigits(double n)
{
ushort array[];
string st=(string)n; // явным образом формируем строку из числаint len=StringLen(st);
if(len<3) return(0); // число не может быть дробным если строка получилась меньше трёх символовif(StringToShortArray(st,array)!=len+1) return(-1); // разбираем строку на массив символовfor(int i=0;i<len;i++) if(array[i]=='.') return(len-i-1); // ищем в строке точку и если она есть, возвращаем кол-во символов от точки до конца строкиreturn(0);
}
A questão é que mudei estupidamente todo o incómodo de determinar a parte significativa do número fracionário para o método que o compilador insere em vez de operador =(string).
Mas acontece que, desta forma, o código formata a corda quase como o tipo g da printf(), ou seja, para fracções longas, a corda imprime num formato científico.
Como posso obter a saída para um fio para qualquer n sem formato exponencial e sem dígitos extra à direita, e sem aborrecimentos =)?
E outra questão: é sempre uma fracção decimal separada por um ponto ou por defeito das definições do sistema pode ser uma vírgula ou outra coisa qualquer?
Resolvendo o problema a partir do vosso comentário, fiz uma função mais estúpida e desajeitada, mas mesmo assim falha para muitos valores de entrada.
Código de função:
A questão é que mudei estupidamente todo o incómodo de determinar a parte significativa do número fracionário para o método que o compilador insere em vez de operador =(string).
Mas acontece que, desta forma, o código formata a corda quase como o tipo g da printf(), ou seja, para fracções longas, a corda imprime num formato científico.
Como posso obter a saída para um fio para qualquer n sem formato exponencial e sem dígitos extra à direita, e sem aborrecimentos =)?
E outra questão: é sempre uma fracção decimal separada por um ponto ou por defeito das definições do sistema pode ser uma vírgula ou outra coisa qualquer?
Vladimir Pastushak: E o que é que não gosta em Point(), Digits?
Pelo menos tem DigitsLot(), que devolverá a precisão do passo do volume.
Talvez eu não tenha percebido a sua dica. Existe alguma forma sensata de obter o que se procura através de Point() ou Digits()?
Ainda assim, precisam realmente dessas duas funções que descrevi acima (equalizadores válidos para o preço e para o lote).
Compreendo que em cozinhas forex o volume é mais frequentemente aceite em incrementos de 0,01, e ninguém quer saber o que vai acontecer amanhã, mas o terminal está a desenvolver-se.
Há cada vez mais ferramentas. Todos os dispositivos caseiros que não permitem o aumento do lote inteiro já não funcionam. Quem diz que não haverá o lote mínimo, digamos, um quarto? Não há muitas variantes.
Esta solução deve ser absoluta (para todos os valores) ou não pode ser confiável.
E sobre a citação. Quando se envia um pedido, o servidor aceita preços que nem sequer são, nem sequer para os normalizar (cortá-los em caracteres), mas existem outras tarefas.
Concorda que devemos ser capazes de obter uma citação real possível para qualquer símbolo, mas não para um símbolo aparado.
Resolvendo o problema a partir do vosso comentário, fiz uma função mais estúpida e desajeitada, mas mesmo assim falha para muitos valores de entrada.
Código de função:
...
A corrigir-me a mim próprio. Este parece estar a funcionar:
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Возвращает кол-во значимых цифр после запятой для чисел с точностью до 8 знаков
Вернёт 0 если число целое (в пределах 8 знаков после запятой)
Вернёт -1 в случае ошибки во время разбора строки на массив
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/int GetDigits(double n)
{
ushort array[];
if(StringToShortArray(StringFormat("%.8f",n),array)<10) return(-1); // число в строку и разбираем строку на массив символовint r=ArraySize(array)-2; // размер массива минус ноль-терминатор и минус нулевая база указателя for(;r>0 && array[r]=='0';r--); // ищем справа не нольfor(int l=0;l<=r;l++) if(array[l]=='.') return(r-l); // ищем слева точку и если она есть, возвращаем кол-во символов от точки до не нуля справаreturn(0);
}
Não pensem que sou tão tolo, tão teimosamente a fazer um fio de um número por causa de um problema puramente matemático.
No início tentei fazê-lo através do logaritmo, mas acabou por se revelar uma falha ao ponto de não haver retorno =(
Só por precaução, o que há de errado com NormalizeDouble() _Ponto _Dígitos ?????????
Porque é que está a criar uma bicicleta?
Responderei a isto mais uma vez, só por precaução. Por favor explique-me como descobrir a precisão de SYMBOL_VOLUME_STEP usando "NormalizeDouble() _Point _Digits"?
Ou como obter um múltiplo de valor de SYMBOL_VOLUME_STEP a partir de qualquer número positivo?
Como obter o seguinte resultado:
2000.55 (Símbolo do ES) -----> 2000.50
2000.55 (símbolo SPX) -----> 2000.63
1055.5555 (Símbolo RTS) ------> 1060
para qualquer símbolo no mundo que esteja disponível no terminal MT5 hoje (e de preferência amanhã)
"????????"
Os criadores podem acrescentar apenas 2 funções e modificá-las à medida que o terminal se desenvolve, e eu não conheço todas as peculiaridades dos diferentes instrumentos comerciais. Onde posso descobrir que citações existem mesmo? E eu preciso de uma citação, não do resultado de NormalizeDouble().
Se esta bicicleta já anda por aí - picar uma implementação específica, agradecia que o fizesse. O que já me encontrei não funciona em alguns símbolos neste momento.
O pedido foi criado, mas ninguém olhou para ele em mais de três dias.
Qual é o número de candidatura?
O tema perene dos dubs =)
Peço aos criadores que acrescentem duas características padrão.
Sugiro a seguinte especificação:
====
Rp
A função retorna o valor a ser alinhado com a etapa de preço do instrumento.
duplo Rp(
nome_símbolo decadeia, // nome do símbolo
duplovalor// preço a alinhar
);
Parâmetros
símbolo_nome
[em] Símbolo.
valor
[em] Número positivo.
Valor devolvido
Onúmero mais próximo arredondado ao preço do instrumento comercial.
...
Exemplo:
Valores de entrada:
símbolo_nome = ES-...
valor = 2000.55
produção = 2000.50
(preço por instrumento ES = 0,25)Valores de entrada:
símbolo_nome = SPX
valor = 2000.55
produção = 2000.63
(no SPX a etapa de preço é também 0,25, como no ES, mas há um offset de base e a cotação pode ter apenas as seguintes partes fracionárias -- 13,38,63,88)
Valores de entrada:
símbolo_nome = RTS
valor = 82055,55
saída = 82060
(preço por instrumento RTS = 10)
...e assim por diante.
A segunda função, que me interessa ainda mais:
====
Rv
A função retorna um valor que será alinhado com o passo de volume do instrumento e estará na gama de SYMBOL_VOLUME_MIN a SYMBOL_VOLUME_MAX.
duplo Rv(
nome_símbolo decadeia, // nome do símbolo
duplovalor// lote a alinhar
);
Parâmetros
símbolo_nome
[em] Símbolo.
valor
[em] Número positivo.
Valor devolvido
Número mais próximo arredondado para o passo de volume doinstrumento comercial. O número não será maior que SYMBOL_VOLUME_MAX ou menor que SYMBOL_VOLUME_MIN.
...
======
A principal propriedade que espero destas funções é que elas sejam válidas para TODOS OS INSTRUMENTOS DE TRADUÇÃO NO MUNDO e PARA QUALQUER INTRODUÇÃO.
Se alguém tiver uma solução pronta, por favor partilhe, desde que os criadores a tenham.
Estranho que ainda não exista =/
Resolvendo o problema a partir do vosso comentário, fiz uma função mais estúpida e desajeitada, mas mesmo assim falha para muitos valores de entrada.
Código de função:
A questão é que mudei estupidamente todo o incómodo de determinar a parte significativa do número fracionário para o método que o compilador insere em vez de operador =(string).
Mas acontece que, desta forma, o código formata a corda quase como o tipo g da printf(), ou seja, para fracções longas, a corda imprime num formato científico.
Como posso obter a saída para um fio para qualquer n sem formato exponencial e sem dígitos extra à direita, e sem aborrecimentos =)?
E outra questão: é sempre uma fracção decimal separada por um ponto ou por defeito das definições do sistema pode ser uma vírgula ou outra coisa qualquer?
Resolvendo o problema a partir do vosso comentário, fiz uma função mais estúpida e desajeitada, mas mesmo assim falha para muitos valores de entrada.
Código de função:
A questão é que mudei estupidamente todo o incómodo de determinar a parte significativa do número fracionário para o método que o compilador insere em vez de operador =(string).
Mas acontece que, desta forma, o código formata a corda quase como o tipo g da printf(), ou seja, para fracções longas, a corda imprime num formato científico.
Como posso obter a saída para um fio para qualquer n sem formato exponencial e sem dígitos extra à direita, e sem aborrecimentos =)?
E outra questão: é sempre uma fracção decimal separada por um ponto ou por defeito das definições do sistema pode ser uma vírgula ou outra coisa qualquer?
E o que é que não gosta em Point(), Digits?
Pelo menos tem DigitsLot(), que devolverá a precisão do passo do volume.
Talvez eu não tenha percebido a sua dica. Existe alguma forma sensata de obter o que se procura através de Point() ou Digits()?
Ainda assim, precisam realmente dessas duas funções que descrevi acima (equalizadores válidos para o preço e para o lote).
Compreendo que em cozinhas forex o volume é mais frequentemente aceite em incrementos de 0,01, e ninguém quer saber o que vai acontecer amanhã, mas o terminal está a desenvolver-se.
Há cada vez mais ferramentas. Todos os dispositivos caseiros que não permitem o aumento do lote inteiro já não funcionam. Quem diz que não haverá o lote mínimo, digamos, um quarto? Não há muitas variantes.
Esta solução deve ser absoluta (para todos os valores) ou não pode ser confiável.
E sobre a citação. Quando se envia um pedido, o servidor aceita preços que nem sequer são, nem sequer para os normalizar (cortá-los em caracteres), mas existem outras tarefas.
Concorda que devemos ser capazes de obter uma citação real possível para qualquer símbolo, mas não para um símbolo aparado.
Resolvendo o problema a partir do vosso comentário, fiz uma função mais estúpida e desajeitada, mas mesmo assim falha para muitos valores de entrada.
Código de função:
...Não pensem que sou tão tolo, tão teimosamente a fazer um fio de um número por causa de um problema puramente matemático.
No início tentei fazê-lo através do logaritmo, mas acabou por se revelar uma falha ao ponto de não haver retorno =(
A corrigir-me a mim próprio. Este parece funcionar:
Não pense que sou demasiado estúpido para fazer um fio de um número por um problema puramente matemático.
No início tentei honestamente fazê-lo através do logaritmo, mas acabou por se revelar uma falha como o inferno =(
Só por precaução, porque não gosta de NormalizeDouble()_Ponto _Dígitos ?????????
Porque é que se faz uma bicicleta?
Só por precaução, o que há de errado com NormalizeDouble() _Ponto _Dígitos ?????????
Porque é que está a criar uma bicicleta?
Responderei a isto mais uma vez, só por precaução. Por favor explique-me como descobrir a precisão de SYMBOL_VOLUME_STEP usando "NormalizeDouble() _Point _Digits"?
Ou como obter um múltiplo de valor de SYMBOL_VOLUME_STEP a partir de qualquer número positivo?
Como obter o seguinte resultado:
2000.55 (Símbolo do ES) -----> 2000.50
2000.55 (símbolo SPX) -----> 2000.63
1055.5555 (Símbolo RTS) ------> 1060
para qualquer símbolo no mundo que esteja disponível no terminal MT5 hoje (e de preferência amanhã)
"????????"
Os criadores podem acrescentar apenas 2 funções e modificá-las à medida que o terminal se desenvolve, e eu não conheço todas as peculiaridades dos diferentes instrumentos comerciais. Onde posso descobrir que citações existem mesmo? E eu preciso de uma citação, não do resultado de NormalizeDouble().
Se esta bicicleta já anda por aí - picar uma implementação específica, agradecia que o fizesse. O que já me encontrei não funciona em alguns símbolos neste momento.
...
2000.55 (Símbolo do ES) -----> 2000.50
2000.55 (símbolo SPX) -----> 2000.63
1055.5555 (símbolo RTS) ------> 1060
...