Aquí otra variante, algo de OOPish, por la diversión. Implementa una lista enlazada, puede ser más rápido que la anterior. Código insertado/SCRIPT #property strict #define PERIOD 20 void OnStart () {Adrtop10 (); } void Adrtop10 () {class Map {public: int key; doble val; Mapa * nxt; Mapa () {clave = 0; val = 0; nxt = NULL; } Mapa (int k, doble v, Mapa * n) {clave = k; val = v; nxt = n; } void print (int n, Map * m) {if (m.nxt! = NULL n lt; = 10) print (n 1, m.nxt); if (m.val! = 0) printf (% 2i.% s =% .1f, n, SymbolName (m.key, true), m.val); }}; int numsymbols = SymbolsTotal (true); Mapa * symbolsmap = nuevo Mapa ();/todos los rangos para (int k = 0; k lt; numsymbols; k ) {double rng = 0; nombre de cadena = SymbolName (k, true); para (int i = 1; i lt; = PERIOD; i ) rng = iHigh (nombre, PERIOD_D1, i) - iLow (nombre, PERIOD_D1, i); doble f = 1; if (SymbolInfoInteger (nombre, SYMBOL_DIGITS) == 5 || SymbolInfoInteger (nombre, SYMBOL_DIGITS) == 3) f * = 10; rng = rngPERIODSymbolInfoDouble (name, SYMBOL_POINT)f;/ordenar Mapa * mn = symbolsmap, * trail = symbolsmap; while (rng lt; mn.val) {trail = mn; mn = mn.nxt; } Mapa * nmn = nuevo Mapa (k, rng, mn); if (mn == symbolsmap) symbolsmap = nmn; else trail.nxt = nmn; }/imprimir top 10 symbolsmap.print (1, symbolsmap);/limpia mientras while (symbolsmap.nxt! = NULL) {Map * mn = symbolsmap.nxt; borrar mapa de símbolos; symbolsmap = mn;} borrar symbolsmap; }