Errores, fallos, preguntas - página 1380

 
Sergey Zhukov:
La aplicación se ha creado, pero nadie la ha mirado en más de tres días.
¿Cuál es el número de solicitud?
 
Alexander:
¿Cuál es el número de solicitud?
#1302121 | 2015.09.14 18:17
Señales: Problema con las estadísticas
 

El eterno tema de los doblajes =)

Pido a los desarrolladores que añadan dos características estándar.

Sugiero la siguiente especificación:

====

Rp

La función devuelve el valor que debe alinearse con el paso de precio del instrumento.

doble Rp(

stringsymbol_name, // nombre del símbolo
doblevalor// precio a alinear
);

Parámetros

nombre_símbolo

[en] Símbolo.

valor

[en] Número positivo.

Valor devuelto

Número más cercano redondeado al paso de precio del instrumento de negociación.

...

Ejemplo:

Valores de entrada:

nombre_símbolo = ES-...

valor = 2000.55

producción = 2000,50

(paso de precio por instrumento ES = 0,25)


Valores de entrada:

nombre_símbolo = SPX

valor = 2000.55

producción = 2000,63

(en el SPX el paso de precio también es 0,25, como en el ES, pero hay un desplazamiento de base y la cotización sólo puede tener las siguientes partes fraccionarias -- 13,38,63,88)


Valores de entrada:

nombre_símbolo = RTS

valor = 82055,55

salida = 82060

(paso de precio por instrumento RTS = 10)

...y así sucesivamente.


La segunda función, que me interesa aún más:

====

Rv

La función devuelve un valor que estará alineado con el paso de volumen del instrumento y estará en el rango de SYMBOL_VOLUME_MIN a SYMBOL_VOLUME_MAX.

doble Rv(

stringsymbol_name, // nombre del símbolo
doblevalor// lote a alinear
);

Parámetros

nombre_símbolo

[en] Símbolo.

valor

[en] Número positivo.

Valor devuelto

Número más cercano redondeado al paso de volumen delinstrumento de negociación. El número no será mayor que SYMBOL_VOLUME_MAXni menor que SYMBOL_VOLUME_MIN.

...

======


La principal propiedad que espero de estas funciones es que sean válidas para TODOS LOS INSTRUMENTOS DE COMERCIO DEL MUNDO y PARA CUALQUIER INTRODUCCIÓN.

Si alguien tiene una solución lista, por favor, compártala mientras los desarrolladores lo hagan.

Es extraño que todavía no haya tal =/

 

Resolviendo el problema a partir de tu comentario hice una función más tonta y torpe, pero incluso falla para muchos valores de entrada.

Código de función:

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

La cuestión es que, estúpidamente, he trasladado toda la molestia de determinar la parte significativa del número fraccionario al método que inserta el compilador en lugar del operador =(cadena).

Pero resulta que de esta manera el código formatea la cadena casi como el tipo g de printf(), es decir, para fracciones largas la cadena se imprime en un formato científico.

¿Cómo puedo obtener la salida a una cadena para cualquier n sin formato exponencial y sin dígitos extra a la derecha, y sin molestias =)?

Y otra pregunta: ¿es siempre una fracción decimal separada por un punto o por defecto desde la configuración del sistema puede ser una coma u otra cosa?

 
Fry:

Resolviendo el problema a partir de tu comentario hice una función más tonta y torpe, pero incluso falla para muchos valores de entrada.

Código de función:

La cuestión es que, estúpidamente, he trasladado toda la molestia de determinar la parte significativa del número fraccionario al método que inserta el compilador en lugar del operador =(cadena).

Pero resulta que de esta manera el código formatea la cadena casi como el tipo g de printf(), es decir, para fracciones largas la cadena se imprime en un formato científico.

¿Cómo puedo obtener la salida a una cadena para cualquier n sin formato exponencial y sin dígitos extra a la derecha, y sin molestias =)?

Y otra pregunta: ¿es siempre una fracción decimal separada por un punto o por defecto desde la configuración del sistema puede ser una coma u otra cosa?

¿Por qué no te gusta Point(), Dígitos?
 
Vladimir Pastushak:
¿Y qué es lo que no te gusta de Point(), Digits?

Al menos tiene DigitsLot(), que devolverá la precisión del paso de volumen.

Tal vez no entendí tu indirecta. ¿Hay alguna forma sensata de obtener lo que se busca mediante Point() o Digits()?


Aún así, realmente se necesitan esas dos funciones que describí anteriormente (ecualizadores válidos para el precio y para el lote).

Entiendo que en las cocinas de forex el volumen se acepta la mayoría de las veces en incrementos de 0,01, y a nadie le importa lo que vaya a pasar mañana, pero el terminal se está desarrollando.

Cada vez hay más herramientas. Todos los dispositivos caseros que no permiten el incremento del lote completo ya no funcionan. ¿Quién dice que no habrá el lote mínimo, digamos, un cuarto? No hay muchas variantes.

Esta solución debe ser absoluta (para todos los valores) o no se puede confiar en ella.


Y sobre la cita. Cuando envías una solicitud, el servidor acepta precios que no son pares, aunque sólo sea para normalizarlos (cortarlos en caracteres), pero hay otras tareas.

Está de acuerdo en que deberíamos poder obtener una cotización real posible para cualquier símbolo, pero no una recortada.

 
Fry:

Resolviendo el problema a partir de tu comentario hice una función más tonta y torpe, pero incluso falla para muchos valores de entrada.

Código de función:

...
Me corrijo. Este parece 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);
}

No creas que soy tan tonto, que me obstino en hacer una cadena de un número por un problema puramente matemático.

Al principio traté de hacerlo a través del logaritmo, pero resultó glitchy al punto de no retorno =(

 
Fry:
Me corrijo. Este parece funcionar:

No creas que soy tan estúpido como para hacer una cadena con un número para un problema puramente matemático.

Al principio, honestamente, traté de hacerlo a través de logaritmo, pero resultó glitchy como el infierno =(

Por si acaso, ¿por qué no te gusta NormalizarDoble()_Punto _Dígitos ?????????

¿Por qué haces una bicicleta?

 
Vladimir Pastushak:

Por si acaso, ¿qué pasa con NormalizeDouble() _Point _Digits ?????????

¿Por qué creas una bicicleta?

Responderé a esto una vez más por si acaso. Por favor, explíqueme cómo averiguar la precisión de SYMBOL_VOLUME_STEP utilizando "NormalizeDouble() _Point _Digits".

¿O cómo obtener un valor múltiplo de SYMBOL_VOLUME_STEP a partir de cualquier número positivo?

Cómo obtener el siguiente resultado:

2000,55 (símbolo ES) -----> 2000,50

2000,55 (símbolo SPX) -----> 2000,63

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

para cualquier símbolo del mundo que esté disponible en el terminal MT5 hoy (y preferiblemente mañana)

"????????"

Los desarrolladores sólo pueden añadir 2 funciones y modificarlas a medida que se desarrolla el terminal, y no conozco todas las peculiaridades de los diferentes instrumentos de negociación. ¿Dónde puedo encontrar las cotizaciones que existen? Y necesito una cita, no el resultado de NormalizeDouble().

Si esta moto ya está por ahí - picar en una aplicación específica, lo agradecería. Lo que me encontré ya no funciona en algunos símbolos en este momento.

 
Fry:

...

2000,55 (símbolo ES) -----> 2000,50

2000,55 (símbolo SPX) -----> 2000,63

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

...

Por favor, muestreSYMBOL_VOLUME_STEP para estos tres personajes.