Errori, bug, domande - pagina 1380

 
Sergey Zhukov:
L'applicazione è stata creata, ma nessuno l'ha guardata per più di tre giorni.
Qual è il numero della domanda?
 
Alexander:
Qual è il numero dell'applicazione?
#1302121 | 2015.09.14 18:17
Segnali: problema con le statistiche
 

Il tema perenne dei dub =)

Chiedo agli sviluppatori di aggiungere due caratteristiche standard.

Suggerisco la seguente specifica:

====

Rp

La funzione restituisce il valore da allineare al passo di prezzo dello strumento.

doppio Rp(

stringasymbol_name, // nome del simbolo
doublevalue// prezzo da allineare
);

Parametri

nome_simbolo

[Simbolo.

valore

[Numero positivo.

Valore restituito

Numero più vicino arrotondato alla fase di prezzo dello strumento di trading.

...

Esempio:

Valori di ingresso:

symbol_name = ES-...

valore = 2000.55

uscita = 2000.50

(passo di prezzo per strumento ES = 0,25)


Valori di ingresso:

nome_simbolo = SPX

valore = 2000.55

uscita = 2000.63

(su SPX il passo di prezzo è anche 0,25, come su ES, ma c'è un offset di base e la quotazione può avere solo le seguenti parti frazionarie -- 13,38,63,88)


Valori di ingresso:

nome_simbolo = RTS

valore = 82055,55

uscita = 82060

(passo di prezzo dallo strumento RTS = 10)

...e così via.


La seconda funzione, che mi interessa ancora di più:

====

Rv

La funzione restituisce un valore che sarà allineato con il passo di volume dello strumento e sarà nell'intervallo da SYMBOL_VOLUME_MIN a SYMBOL_VOLUME_MAX.

doppio Rv(

stringasymbol_name, // nome del simbolo
doppiovalore// lotto da allineare
);

Parametri

nome_simbolo

[Simbolo.

valore

[Numero positivo.

Valore restituito

Numero più vicino arrotondato al gradino del volume dellostrumento di trading. Il numero non sarà più grande di SYMBOL_VOLUME_MAX o più piccolo di SYMBOL_VOLUME_MIN.

...

======


La principale proprietà che mi aspetto da queste funzioni è che siano valide per TUTTI GLI STRUMENTI DI TRADING NEL MONDO e PER QUALSIASI INTRODUZIONE.

Se qualcuno ha una soluzione pronta per l'uso, per favore condividetela, a patto che lo facciano gli sviluppatori.

Strano che non ci sia ancora =/

 

Risolvendo il problema dal tuo commento ho fatto una funzione più stupida e goffa, ma anche questa fallisce per molti valori di input.

Codice di funzione:

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

Il punto è che ho stupidamente spostato tutto il fastidio di determinare la parte significativa del numero frazionario al metodo che il compilatore inserisce al posto dell'operatore =(stringa).

Ma si scopre che in questo modo il codice formatta la stringa quasi come il tipo g di printf(), cioè per le frazioni lunghe la stringa viene stampata in un formato scientifico.

Come posso ottenere l'output in una stringa per qualsiasi n senza formato esponenziale e senza cifre extra a destra, e senza problemi =)?

E un'altra domanda: è sempre una frazione decimale separata da un punto o per default dalle impostazioni di sistema può essere una virgola o qualcos'altro?

 
Fry:

Risolvendo il problema dal tuo commento ho fatto una funzione più stupida e goffa, ma anche questa fallisce per molti valori di input.

Codice di funzione:

Il punto è che ho stupidamente spostato tutto il fastidio di determinare la parte significativa del numero frazionario al metodo che il compilatore inserisce al posto dell'operatore =(stringa).

Ma si scopre che in questo modo il codice formatta la stringa quasi come il tipo g di printf(), cioè per le frazioni lunghe la stringa viene stampata in un formato scientifico.

Come posso ottenere l'output in una stringa per qualsiasi n senza formato esponenziale e senza cifre extra a destra, e senza problemi =)?

E un'altra domanda: è sempre una frazione decimale separata da un punto o per default dalle impostazioni di sistema può essere una virgola o qualcos'altro?

Perché non ti piace Point(), Digits?
 
Vladimir Pastushak:
E cosa non ti piace di Point(), Digits?

Almeno avere DigitsLot(), che restituirà la precisione del passo di volume.

Forse non ho capito il tuo suggerimento. C'è un modo sensato per ottenere ciò che state cercando tramite Point() o Digits()?


Ancora, ha davvero bisogno di quelle due funzioni che ho descritto sopra (equalizzatori validi per il prezzo e per il lotto).

Capisco che nelle cucine forex il volume è accettato il più delle volte in incrementi di 0,01, e a nessuno importa cosa succederà domani, ma il terminale si sta sviluppando.

Ci sono sempre più strumenti. Tutti i dispositivi fatti in casa che non permettono gli incrementi dell'intero lotto non funzionano più. Chi dice che non ci sarà il lotto minimo, diciamo un quarto? Non ci sono molte varianti.

Questa soluzione deve essere assoluta (per tutti i valori) o non è affidabile.


E riguardo alla citazione. Quando si invia una richiesta, il server accetta i prezzi che non sono pari, anche solo per normalizzarli (tagliarli in caratteri), ma ci sono altri compiti.

Sei d'accordo che dovremmo essere in grado di ottenere una quotazione reale possibile per qualsiasi simbolo, ma non una quotazione tagliata.

 
Fry:

Risolvendo il problema dal tuo commento ho fatto una funzione più stupida e goffa, ma anche questa fallisce per molti valori di input.

Codice di funzione:

...
Mi correggo. Questo sembra funzionare:
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
Возвращает кол-во значимых цифр после запятой для чисел с точностью до 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);
}

Non pensare che io sia così sciocco, così ostinato a fare una stringa con un numero per un problema puramente matematico.

All'inizio ho provato a farlo attraverso il logaritmo, ma si è rivelato glitchato al punto di non ritorno =(

 
Fry:
Mi correggo. Questo sembra funzionare:

Non pensare che io sia troppo stupido per fare una stringa da un numero per un problema puramente matematico.

All'inizio ho provato onestamente a farlo tramite il logaritmo, ma si è rivelato glitchato come l'inferno =(

Nel caso, perché non ti piace NormalizeDouble()_Point _Digits ?????????

Perché fai una bicicletta?

 
Vladimir Pastushak:

Nel caso, cosa c'è di sbagliato in NormalizeDouble() _Point _Digits ?????????

Perché stai creando una bicicletta?

Risponderò un'altra volta, per sicurezza. Per favore, spiegatemi come scoprire la precisione di SYMBOL_VOLUME_STEP usando "NormalizeDouble() _Point _Digits"?

O come ottenere un valore multiplo di SYMBOL_VOLUME_STEP da qualsiasi numero positivo?

Come ottenere il seguente risultato:

2000.55 (simbolo ES) -----> 2000.50

2000.55 (simbolo SPX) -----> 2000.63

1055.5555 (simbolo RTS) ------> 1060

per qualsiasi simbolo nel mondo che è disponibile nel terminale MT5 oggi (e preferibilmente domani)

"????????"

Gli sviluppatori possono aggiungere solo 2 funzioni e modificarle man mano che il terminale si sviluppa, e io non conosco tutte le peculiarità dei diversi strumenti di trading. Dove posso scoprire quali citazioni esistono? E ho bisogno di una citazione, non del risultato di NormalizeDouble().

Se questa moto è già là fuori - puntare su un'implementazione specifica, lo apprezzerei. Quello che mi sono trovato già non funziona su alcuni simboli in questo momento.

 
Fry:

...

2000.55 (simbolo ES) -----> 2000.50

2000.55 (simbolo SPX) -----> 2000.63

1055.5555 (simbolo RTS) ------> 1060

...

Si prega di mostrareSYMBOL_VOLUME_STEP per questi tre caratteri.