Erros, bugs, perguntas - página 1380

 
Sergey Zhukov:
O pedido foi criado, mas ninguém olhou para ele em mais de três dias.
Qual é o número de candidatura?
 
Alexander:
Qual é o número de candidatura?
#1302121 | 2015.09.14 18:17
Sinais: Problema com as estatísticas
 

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:

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Возвращает кол-во значимых цифр после запятой
 вернёт 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?

 
Fry:

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?

Porque não gosta de Point(), Digits??
 
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.

 
Fry:

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 =(

 
Fry:
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?

 
Vladimir Pastushak:

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.

 
Fry:

...

2000.55 (Símbolo do ES) -----> 2000.50

2000.55 (símbolo SPX) -----> 2000.63

1055.5555 (símbolo RTS) ------> 1060

...

Por favor mostrarSYMBOL_VOLUME_STEP para estes três caracteres.