Pages:
Author

Topic: Javascript: Funciones de conversión de bitcoins (Read 2763 times)

member
Activity: 91
Merit: 10
Se quedo bien al final eh... jejeje

Bueno, todo es mejorable. Pero creo que cumple con creces mis objetivos iniciales. Espero que te sirva a ti también.  Wink
newbie
Activity: 28
Merit: 0
Se quedo bien al final eh... jejeje

Lo intentare agregar a un blog para ver como queda  Wink

member
Activity: 91
Merit: 10
¡¡Habemus conversor!!  Cheesy

http://jsfiddle.net/izzukay/CTjhj/


Bien, paso a explicar un poco...

Lo primero comentar que la API de Mt.Gox apenas está funcionando hoy (he leído que han sufrido un ataque o nosequé). Para casos como éste, o para convertir a partir de cotizaciones históricas, o de otros exchanges, he añadido los campos price, que permiten introducir la cotización manualmente.

Para aclarar ideas: los campos price siempre deben indicar cuántas unidades de la divisa/subdivisa de turno hay en un BTC.

Para EUR y USD, el valor (auto) de estos campos implica trabajar con la cotización de Mt.Gox que se muestra abajo, siempre que se muestre, claro. Si no se muestra (aparece el texto Waiting for Mt.Gox data) habrá que introducir la cotización manualmente.

Obviamente, para BTC y sus subdivisas, el price debe dejarse en (auto), ya que son valores fijos al estar el conversor basado en el BTC.

También he añadido la casilla High precission que sirve para añadir 2 decimales extra (4 en total) cuando convertimos a dólares o euros.

Para trabajar con otras divisas (que no sean EUR ni USD) se puede seleccionar generic. En tal caso habrá que introducir la cotización manualmente, y devolverá el resultado en generic currency units.

member
Activity: 91
Merit: 10
Pues lo mismo en la línea de abajo.

¡¡Madre mía!! Y yo aquí haciendo reglas de tres en una libreta.  Cheesy

Como se nota que soy de letras. ¡¡Mil gracias!!
member
Activity: 70
Merit: 10
Estás multiplicando el precio por el kind y no hace falta :

Cierto Ogig. Me he dado cuenta hace unos minutos (después de devanarme los sesos  Grin ). Gracias.  Wink

Ahora estoy devanándomelos otra vez. El problema ahora es que, con una cotización BTC/EUR de 84.96739 (la he puesto fija, sin llamar a Mt.Gox, para no volverme loco) me ocurre esto:

15 BTC -> 1274.51 € (correcto)

15 BTC -> 12745108.50 c€ (error)


Claramente estoy multiplicando por 100 en alguna parte. Estoy intentando encontrar donde.

http://jsfiddle.net/izzukay/CTjhj/18/

Pues lo mismo en la línea de abajo.

Code:
var outputCurrency = BtcConv.dlZ( (btcs * BtcConv.currencies[conversion.to].price * BtcConv.kinds[ BtcConv.currencies[conversion.to].kind ]).toFixed(BtcConv.currencies[conversion.to].decimals) );
member
Activity: 91
Merit: 10
Estás multiplicando el precio por el kind y no hace falta :

Cierto Ogig. Me he dado cuenta hace unos minutos (después de devanarme los sesos  Grin ). Gracias.  Wink

Ahora estoy devanándomelos otra vez. El problema ahora es que, con una cotización BTC/EUR de 84.96739 (la he puesto fija, sin llamar a Mt.Gox, para no volverme loco) me ocurre esto:

15 BTC -> 1274.51 € (correcto)

15 BTC -> 12745108.50 c€ (error)


Claramente estoy multiplicando por 100 en alguna parte. Estoy intentando encontrar donde.

http://jsfiddle.net/izzukay/CTjhj/18/
member
Activity: 70
Merit: 10
Ogig, me he permitido hacer un fiddle a partir del tuyo para experimentar y liarla parda.  Cheesy

http://jsfiddle.net/izzukay/CTjhj/15/


El reto era tratar de implementar la conversión con céntimos de divisa, y en ello sigo. El caso es que algo anda mal: si convierto 15 euros a BTCs me da 0.18, pero si convierto 1500 c€ a BTCs me da 18 (y pico), es decir, me los trata como si fueran 1500€.

Me da la impresión de que es alguna tontada que se me ha pasado por alto, pero aún no he dado con ella. Voy a seguir a ver si lo soluciono.

Estás multiplicando el precio por el kind y no hace falta :

Code:
var btcs = conversion.amount / (BtcConv.currencies[conversion.from].price * BtcConv.kinds[BtcConv.currencies[conversion.from].kind ]);
member
Activity: 91
Merit: 10
Me autorrespondo: 'Set as base version'  Cool
member
Activity: 91
Merit: 10
Por cierto, ¿cómo hago en jsFiddle para que al publicar aquí este enlace:

http://jsfiddle.net/izzukay/CTjhj/


...se muestre la última actualización que he hecho? En el momento de escribir este post la última actualización sería ésta:

http://jsfiddle.net/izzukay/CTjhj/16/
member
Activity: 91
Merit: 10
Ogig, me he permitido hacer un fiddle a partir del tuyo para experimentar y liarla parda.  Cheesy

http://jsfiddle.net/izzukay/CTjhj/15/


El reto era tratar de implementar la conversión con céntimos de divisa, y en ello sigo. El caso es que algo anda mal: si convierto 15 euros a BTCs me da 0.18, pero si convierto 1500 c€ a BTCs me da 18 (y pico), es decir, me los trata como si fueran 1500€.

Me da la impresión de que es alguna tontada que se me ha pasado por alto, pero aún no he dado con ella. Voy a seguir a ver si lo soluciono.
member
Activity: 91
Merit: 10
Cuando esta terminado avisar  Grin ... que al final se quedara perfecto.

Lo venderemos a un módico precio.  Grin

Voy a ponerme yo también con los churros, que ya está el aceite caliente.
newbie
Activity: 28
Merit: 0
Cuando esta terminado avisar  Grin ... que al final se quedara perfecto.

member
Activity: 91
Merit: 10
 Shocked Shocked Shocked ¡¡Madre mía!! En tiempo real. Así sí mola. Eso es lo que necesito para coger la cotización.
member
Activity: 70
Merit: 10
Mirad, al final me he metido un poco con la api de websockets de mtgox. Ahora pilla el valor del USD y del EUR en tiempo real Smiley

http://jsfiddle.net/guillermosan/Z8kAx/

member
Activity: 91
Merit: 10
¡Ajá! Bien, pues entonces tenemos que el formulario del conversor tendrá que permitir, no sólo escoger una divisa, sino también permitir usar una genérica (no listada) cuyo valor especifique el propio usuario.

El usuario también debe poder modificar el valor de cualquier divisa (por ejemplo, para hacer una conversión respecto a una cotización histórica).

¡Buff! Tengo las neuronas en estado de rebelión ya.  Grin Por el momento voy a tratar de pensar en otra cosa (como preparar la plantilla web que usaré). En cuanto vuelva a estar listo retomaré esto con energías renovadas y a ver qué sale.
member
Activity: 70
Merit: 10

Eso sí, el problema que veo ahora es que un usuario final no podría usar una divisa que no esté listada en BtcConv.currencies. Antes eso no importaba, siempre que el usuario introdujese la cotización del BTC respecto a esa divisa.


Un usuario siempre puede hacer

Code:
BtcConv.currencies.patacon = {price: 20, decimals: 5};

para añadir una divisa.

Igualmente puedes usar

Code:
BtcConv.currencies.USD.price = 79;

y actualizar un valor con los datos json del server por ejemplo.
member
Activity: 70
Merit: 10
Sí, eso he leído. En el post #12 dejé una referencia a un hilo en el que hablan sobre ello, y facilitan un script PHP que se encarga de hacer esas llamadas periódicas y almacenarlas en una base de datos o archivo.

El problema que se me plantea con esas llamadas cada cierto tiempo es el siguiente: Si voy a hacer un conversor entiendo que el usuario busca exactitud en los datos que le voy a facilitar. Y si el resultado se basa en datos que fueron leídos 50 minutos antes, pues no es muy exacto ¿no? (pueden haber cambiado mucho las cosas en 50 minutos). Para mostrar información sobre la cotización en una página entiendo que se haga así. Pero para un conversor del que el usuario espera la máxima exactitud posible la verdad es que me choca un poco hacerlo así. Buff, no sé. Estoy más liado que la pata de un romano.  Huh

Tú haces que el server actualice los datos cada minuto por ejemplo. Ahora es misión del código JS que escribas en el cliente que se ejecute, cada minuto también, una llamada ajax actualizando los valores de los precios con los datos del server. Así tendrías un lag de 2 minutos máximo, pero es cuestión de cambiar los intervalos de consulta si lo necesitas más preciso.
member
Activity: 91
Merit: 10
Hola Ogig.

Pero he de decir que no me gusta nada esa colección enorme de funciones y todas hacen casi lo mismo. Hay que buscar el mínimo denominador común.

Sí, de eso me di cuenta desde el principio, pero me movía en el dilema de hacerlo todo superconciso, o permitir que personas con conocimientos no muy avanzados de Javascript (como yo) pudiesen identificar y aislar sin demasiada dificultad funciones específicas que necesitasen. De hecho al principio me lo plantee de forma que cada función fuese independiente y autosuficiente respecto a las demás (salvando las necesarias funciones 'requested', claro).

Pero bueno, como ya tenemos versiones para todos los gustos, y creo que inteligibles para cualquier nivel de conocimientos JS, creo que no hay problema en avanzar, y a mí me vendrá bien para ir aprendiendo más.

Voy a estudiar tu fiddle (por cierto, chapó por ese conversor), y a ver qué me sale.  Cheesy

Eso sí, el problema que veo ahora es que un usuario final no podría usar una divisa que no esté listada en BtcConv.currencies. Antes eso no importaba, siempre que el usuario introdujese la cotización del BTC respecto a esa divisa.

Sobre el tema que habláis de usar la api de mtgox o blockchain, es perfectamente posible, pero no desde el código del cliente. En principio los navegadores usan la "Same Origin Policy" y no te dejan cargar datos vía JS que no sean del servidor que sirvió el script. (hay excepciones y truquitos como websockets y webrtc, pero bueno). Lo mejor es hacer en el server un llamada cada X tiempo a blockchain.info y servir esos datos al cliente desde nuestro propio server.

Sí, eso he leído. En el post #12 dejé una referencia a un hilo en el que hablan sobre ello, y facilitan un script PHP que se encarga de hacer esas llamadas periódicas y almacenarlas en una base de datos o archivo.

El problema que se me plantea con esas llamadas cada cierto tiempo es el siguiente: Si voy a hacer un conversor entiendo que el usuario busca exactitud en los datos que le voy a facilitar. Y si el resultado se basa en datos que fueron leídos 50 minutos antes, pues no es muy exacto ¿no? (pueden haber cambiado mucho las cosas en 50 minutos). Para mostrar información sobre la cotización en una página entiendo que se haga así. Pero para un conversor del que el usuario espera la máxima exactitud posible la verdad es que me choca un poco hacerlo así. Buff, no sé. Estoy más liado que la pata de un romano.  Huh

Por otro lado está el tema de si leer los datos de Mt.Gox (es lo que pide mucha gente) o leer los de Blockchain (como sugirió an0therlr3) que se supone que son valores ponderados de entre distintos exchanges (aunque no sé de qué exchages se trata exactamente). Quizás la mejor opción sería que el propio usuario seleccionase qué datos usar para la conversión.

Suelo estar en #bitcoin-es en freenode así que pásate/pasaros por ahí para hablar en profundidad cualquier tema.

Perfecto, lo tengo en cuenta. Muchas zenkius.  Smiley
member
Activity: 70
Merit: 10
Buenas!

izzukay, me alegra ser de ayuda.

He visto tu nueva versión y ya veo que has usado un solo objeto para todas tus variables, bien hecho. De ese modo podrás copiar y pegar tus funciones en otras partes sin miedo a colisiones.

Pero he de decir que no me gusta nada esa colección enorme de funciones y todas hacen casi lo mismo. Hay que buscar el mínimo denominador común.

http://jsfiddle.net/guillermosan/Z8kAx/

He creado este fiddle donde puedes ver como me aproximaría yo a este problema. Una función lo resuelve todo, y además añadir una nueva moneda es sencillo. Usando el btc como base puedes incluso pasar de USD a EUR.

Sobre el tema que habláis de usar la api de mtgox o blockchain, es perfectamente posible, pero no desde el código del cliente. En principio los navegadores usan la "Same Origin Policy" y no te dejan cargar datos vía JS que no sean del servidor que sirvió el script. (hay excepciones y truquitos como websockets y webrtc, pero bueno). Lo mejor es hacer en el server un llamada cada X tiempo a blockchain.info y servir esos datos al cliente desde nuestro propio server.

EDIT:

Estaba releyendo el hilo y me quedan un montón de cosas que contestar! :p

Suelo estar en #bitcoin-es en freenode así que pásate/pasaros por ahí para hablar en profundidad cualquier tema.

Saludos
member
Activity: 91
Merit: 10
Joder hay que ver como os lo currais eh? Una cosa, dais permiso para utilizar el código libremente en nuestros proyectos personales?  Grin

Bueno, como no está bajo ninguna licencia (aún  Grin ) creo que el código puede considerarse de dominio público, y por lo tanto puede usarse libremente. Eso sí, si lo vas a modificar y/o redistribuir sería todo un detalle conservar el reconocimiento al autor original.  Smiley


De todas formas izzukay, se me ocurre que ya que https://blockchain.info/ticker te muestra en texto plano todos esos datos no sería mas sencillo hacer un código que lea esas lineas  tal cual y "extraiga" la cotización deseada?
Es que hace algún tiempo ya intenté programar algo parecido (y yo que soy muy malo en esto...) pero me perdí un poco con eso del JSON y la documentación oficial de la API de mtgox  Undecided

Entiendo que te refieres a "scrapear" ese texto plano que devuelve Blockchain y coger lo necesario. En principio no veo problema en optar por esa alternativa si no consigues que te funcione de otro modo.

Ahora bien, como buen novatillo en Javascript yo también tuve problemas hace poco para leer datos JSON, y la solución a la que he recurrido hasta ahora ha sido usar el método 'ajax' de jQuery.

En mi caso, lo que hice fue llamar a un script PHP en mi servidor local que llama al servidor remoto, recibe los datos y los entrega a Javascript:

Code:
$.ajax({
        type: "GET",
        dataType: "json",       
url:'http://www.mi_servidor_local.com/recibeDatos.php',
        success:function(data){
                //Hago lo que sea con 'data'.
        }
});

Eso es lo que he hecho yo hasta ahora, pero creo que hay formas más adecuadas de obtener datos JSON.

En fin, te dejo unos artículos sobre cómo trabajar con JSON en Javascript por si alguno te arroja algo de luz:

http://www.cristalab.com/tutoriales/leer-json-con-javascript-y-php-c104372l/
http://blog.openalfa.com/como-leer-ficheros-json-en-javascript/
http://web.ontuts.com/tutoriales/jsonp-llamadas-ajax-entre-dominios/

¡¡Saludos!!
Pages:
Jump to: