{"id":3,"date":"2008-02-10T21:35:11","date_gmt":"2008-02-11T04:35:11","guid":{"rendered":"http:\/\/www.arturo.hoffstadt.cl\/wp\/?p=3"},"modified":"2015-01-05T18:18:11","modified_gmt":"2015-01-06T01:18:11","slug":"introduccion-a-fix-y-quickfix-financial-information-exchange","status":"publish","type":"post","link":"https:\/\/www.arturo.hoffstadt.cl\/wp\/2008\/02\/10\/introduccion-a-fix-y-quickfix-financial-information-exchange\/","title":{"rendered":"Introducci\u00f3n a FIX y QuickFIX: Financial Information eXchange"},"content":{"rendered":"<p>Durante mis a\u00f1os trabajando como sysadmin, desarrollador, e investigador en <a href=\"http:\/\/www.ifitec.cl\" title=\"Ifitec S.A - Desarrollo de SW Financiero, Trading y cient\u00edfico.\">Ifitec<\/a>, tuve que (obviamente), hacer muchos proyectos, pero solo dos me dieron dolores de cabeza por la poca documentaci\u00f3n que hab\u00eda para introducirse.<\/p>\n<p>El primero, fuero Oracle, en espec\u00edfico, su motor de Bases de Datos. Es monol\u00edtico, lo cual hace que la instalaci\u00f3n, sea igual de ingente. Y el segundo, fue el motor de mensajer\u00ed\u00ada para transacciones financieras, QuickFIX, por su escasa documentaci\u00f3n inicial, y pr\u00e1cticamente su carencia de &#8220;Hello Worlds!&#8221;.<\/p>\n<p>Pero obviamente, si todo fuese tan f\u00e1cil, no existr\u00edan los desaf\u00edos, asique puse manos a la obra, y aqu\u00ed les dejo mis &#8220;traspies&#8221; con QuickFIX para que no les pase lo mismo que a mi \ud83d\ude00<\/p>\n<h1>Introducci\u00f3n a FIX y QuickFIX<\/h1>\n<p><a href=\"https:\/\/i0.wp.com\/www.arturo.hoffstadt.cl\/wp\/wp-content\/uploads\/2008\/02\/a1.gif?ssl=1\" title=\"FIX Protocol\" rel=\"lightbox[3]\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.arturo.hoffstadt.cl\/wp\/wp-content\/uploads\/2008\/02\/a1.gif?w=780&#038;ssl=1\" alt=\"FIX Protocol\" align=\"right\" \/><\/a><a href=\"http:\/\/www.fixprotocol.org\" title=\"Pagina oficial de FIX\">FIX<\/a>, es la especificaci\u00f3n del Protocolo para transacciones financieras &#8220;Financial Information eXchange&#8221;, o FIX. Participan en su elaboraci\u00f3n un gran n\u00famero de stakeholders, interesados en hacerla cada d\u00ed\u00ada mas completa, y abierta. Fue concebida en el 1992, y su misi\u00f3n es <em>&#8220;To improve the global trading process by defining, managing and promoting an open protocol for real-time, electronic communication between industry participants, while complementing industry standards.&#8221; <\/em>(Mas informaci\u00f3n sobre FIX <a href=\"http:\/\/www.fixprotocol.org\/what-is-fix.shtml\" title=\"Creaci\u00f3n, misi\u00f3n y progreso de FIX\">aqu\u00ed\u00ad<\/a>, <strong>NOTA<\/strong>: si quieres obtener acceso al sitio completo, debe registrarte)<\/p>\n<p>A pesar de que la especificaci\u00f3n del protocola es abiertas, sus implementaciones no tienen la obligaci\u00f3n de serlo (ya se libre &#8211; como libre en cerveza-, o codigo abierto), y la mayor\u00ed\u00ada son especificaciones comerciales. Aqu\u00ed\u00ad es donde entra en el cuadro QuickFIX.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.arturo.hoffstadt.cl\/wp\/wp-content\/uploads\/2008\/02\/logo.gif?ssl=1\" title=\"QuickFIX\" rel=\"lightbox[3]\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.arturo.hoffstadt.cl\/wp\/wp-content\/uploads\/2008\/02\/logo.gif?w=780&#038;ssl=1\" alt=\"QuickFIX\" align=\"right\" \/><\/a>QuickFIX, es una implementaci\u00f3n de c\u00f3digo abierto de FIX. Actualmente soporta hasta la versi\u00f3n 4.4 de la especificaci\u00f3n FIX, y es bastante robusto. Tiene implementaciones para Java, C++, Ruby y Python.<\/p>\n<p><!--more--><\/p>\n<h1>Usando QuickFIX<\/h1>\n<p>La <a href=\"http:\/\/www.quickfixengine.org\/quickfix\/doc\/html\/license.html\" title=\"Licencia de QuickFIX\">licencia<\/a> de QuickFIX no es una de las tradicionales open-source, pero sigue su esp\u00ed\u00adritu, permitiendo la modificaci\u00f3n y redistribuci\u00f3n del c\u00f3digo, siempre y cuando se conserve su autor\u00ed\u00ada original, se reconozca a sus autores en los softwares derivados, y el nombre QuickFIX, no puede ser usado sin consultar antes a sus due\u00f1os.<\/p>\n<p>Del <a href=\"http:\/\/www.quickfixengine.org\/quickfix\/doc\/html\/FAQ.html\" title=\"Frequently Asked Questions de QuickFIX\">FAQ<\/a> de QuickFIX, es bastante importante tener en consideraci\u00f3n los siguientes puntos:<\/p>\n<ul>\n<li>\u00c2 Las horas de todos los computadores envueltos en transacciones FIX deben estar sincronizadas, de preferencia, usando un servidor NTP com\u00fan.<\/li>\n<li>Quickfix esta programado en C++ y hace uso de excepciones. Compilar tus proyectos con la opci\u00f3n &#8220;-fexceptions&#8221;.<\/li>\n<\/ul>\n<p align=\"center\">&nbsp;<\/p>\n<h1>Arquitectura de FIX<\/h1>\n<p>QuickFIX, m\u00e1s all\u00e1 de ser una implementaci\u00f3n de un protocolo, es tambi\u00e9n un motor de mensajer\u00ed\u00ada. Esto delega gran parte del control sobre la transmisi\u00f3n, a QuickFIX. Es por esto, que hay que conocer la arquitectura antes de poder usarlo.<\/p>\n<p>FIX en si, divide todos sus mensajes en dos tipos, Session y Application. Asimismo, el motor QuickFIX divide su funcionamiento entre estas dos capas.<\/p>\n<ul>\n<li><strong>Sesi\u00f3n<\/strong>: esta capa esta encargada de manejar cosas como login, logout, recuperaci\u00f3n de mensajes, heartbeats, peticiones de test, peticiones de reenvio, rechazos, reseteos de secuencia (gap fills), entre otros. La mayor\u00ed\u00ada de estos mensajes se usan de forma autom\u00e1tica, pero siempre pueden ser modificados, o enviados bajo petici\u00f3n del programador.<\/li>\n<li><strong>Aplicaci\u00f3n<\/strong>: Dado que FIX maneja informaci\u00f3n de trade para stock market y futures market, los mensajes de la capa de aplicaci\u00f3n estar\u00e1n en la linea de enviar una orden, obtener una confirmaci\u00f3n (fill), cambiar una orden, entre otros. Estos mensajes nunca son generador de forma autom\u00e1tica por el motor QuickFIX, el programador debe controlar el flujo de mensajes en esta aplicaci\u00f3n de forma <strong>total<\/strong>.<\/li>\n<\/ul>\n<p>Si desea un buen resumen de la estructura y funcionamiento de FIX y Quickfix, referirse a este <a href=\"http:\/\/www.devchix.com\/2007\/04\/20\/fix-protocol\/\">link<\/a>. (una breve y muy intuitiva introducci\u00f3n a FIX, por DevChix).<\/p>\n<h1>Conceptos de FIX<\/h1>\n<ul>\n<li><strong>Contra parte<\/strong>: El otro lado de la conexi\u00f3n. Si se esta trabajando en el cliente, la contraparte ser\u00e1 el servidor, y vice-versa.<\/li>\n<li><strong>Mensaje<\/strong>: Mensaje que se env\u00ed\u00ada una contra parte a otra. Existen dos tipos:\n<ul>\n<li><strong>Aplicaci\u00f3n<\/strong>: Mensaje generados por la aplicaci\u00f3n (que en si, es lo que realmente se programa, es decir, la informaci\u00f3n financiera)<\/li>\n<li><strong>Administrativos<\/strong>: Mensajes generados por el Engine Quickfix para control de la conexi\u00f3n, la mayor\u00ed\u00ada son mensajes de Sesi\u00f3n.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li><strong>Sesiones:<\/strong> Las sesiones existen mientras exista la aplicaci\u00f3n, y pueden ser definidas como un canal de comunicaci\u00f3n entre dos contrapartes. Estas existen incluso si no hay contra parte que escuche o este conectada. Al momento de ser creada una sesi\u00f3n, puedes enviar mensajes. Si no hay contraparte activa, los mensajes ser\u00e1n enviados al momento en que una conexi\u00f3n sea establecida por la contra parte (un cliente conectado).\n<ul>\n<li><strong>Iniciador<\/strong>: En cada sesi\u00f3n, existe, un iniciador, una de las contraparte debe iniciar la sesi\u00f3n. Esto se debe a que QuickFIX esta implementado sobre TCP\/IP, por ende, una de las contrapartes debe intentar contactar a otro &#8220;servidor&#8221;<\/li>\n<li><strong>Aceptador<\/strong>: El aceptador act\u00faa como listener en TCP\/IP, normalmente tambi\u00e9n es el servidor central de transacciones financieras. Esta contraparte escucha la red en un socket, esperando conexiones entrantes de sus contrapartes &#8220;iniciadoras&#8221;.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.arturo.hoffstadt.cl\/wp\/wp-content\/uploads\/2008\/02\/fix.png\" title=\"FIX, de forma gr\u00e1fica\" rel=\"lightbox[3]\"><\/a><\/p>\n<p style=\"text-align: center\"><a href=\"https:\/\/i0.wp.com\/www.arturo.hoffstadt.cl\/wp\/wp-content\/uploads\/2008\/02\/fix.png?ssl=1\" title=\"FIX, de forma gr\u00e1fica\" rel=\"lightbox[3]\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.arturo.hoffstadt.cl\/wp\/wp-content\/uploads\/2008\/02\/fix.png?w=780&#038;ssl=1\" alt=\"FIX, de forma gr\u00e1fica\" \/><\/a><\/p>\n<h1><\/h1>\n<h1>Mensajes FIX al descubierto<\/h1>\n<p>Este es un ejemplo de un mensaje FIX<\/p>\n<blockquote><\/blockquote>\n<pre>Send(12\/06\/2006-10:23:43.175)|8=FIX.4.2|9=00060|35=0|49=Alex|56=orders|34=99|52=20041206-10:23:43.175|10=080|<\/pre>\n<blockquote><\/blockquote>\n<p>Un mensaje esta compuesto de varios tags ( Ej: <strong>8=FIX.4.2|<\/strong> ). Este tag, esta compuesto de:<\/p>\n<ul>\n<li><strong>ID del Tag<\/strong>: Un n\u00famero que identifica a que corresponde el tag. (ej: 8). Es muy importante entender estos n\u00fameros. Por ejemplo, el n\u00famero 43, indica que es un valor de secuencia de mensajes.<\/li>\n<li><strong>=:<\/strong> Signo igual (ej: =)<\/li>\n<li><strong>valor<\/strong>: Dependiendo del id de tag, el valor puede cambiar (ej: FIX.4.2)<\/li>\n<li><strong>delimitador<\/strong>: Indica el fin del tag. (ej: |)<\/li>\n<\/ul>\n<p>Dado que ya sabemos como esta compuesto un mensaje, podemos analizarlos.\u00c2  La especificaci\u00f3n 4.4 de FIX posee cerca de 900 tags, y cada mensaje tiene especificado cuales de estos tags son obligatorios, opcionales, o prohibidos para ese mensaje. Pero todo deben tener los siguientes dos tags, que son universales.<\/p>\n<ul>\n<li>34: N\u00famero de secuencia (permite la sincronizaci\u00f3n entre contrapartes)<\/li>\n<li>35: Tipo de mensaje (permite identificar el mensaje, y darle un sentido a los datos que trae).<\/li>\n<\/ul>\n<p>El tipo de mensaje permite saber que comunica ese mensaje, algunos casos son:<\/p>\n<ul>\n<li>0: Heartbeat(usado para mantener vivas &#8211;keepalive&#8211; las comunicaciones)<\/li>\n<li>A: Logon (es usado para iniciar las sesiones, permite identificar y autenticar)<\/li>\n<li>5: Logout<\/li>\n<li>B: News (Noticia)<\/li>\n<li>S: Quote (Para registrar en tiempo real los bid &amp; ask)<\/li>\n<li>y otros&#8230;<\/li>\n<\/ul>\n<p><a href=\"http:\/\/www.fixprotocol.org\/specifications\/fix4.4fiximate\/index.html\" title=\"FIXimate 4.4\">FIXimate 4.4<\/a>, es una presentaci\u00f3n mas amigable de la especificaci\u00f3n de FIX 4.4 (que es XML), ordenada por mensajes o tags. Cuando programes, ten siempre un navegador abierto con esta p\u00e1gina.<\/p>\n<h1>Instalaci\u00f3n y Compilaci\u00f3n de las fuentes<\/h1>\n<p>En Fedora (cuando comence, era Fedora 7), es necesario tener instalados lo siguientes paquetes:<\/p>\n<ul>\n<li>mysql-devel<\/li>\n<li>libxml2<\/li>\n<li>libxml2-devel<\/li>\n<li>gcc<\/li>\n<li>gcc-c++<\/li>\n<li>glibc-devel<\/li>\n<li>make<\/li>\n<li>python<\/li>\n<li>python-devel<\/li>\n<li>ruby<\/li>\n<li>ruby-devel<\/li>\n<\/ul>\n<p>Utiliza el siguiente comando de yum para instalarlos:<\/p>\n<pre>yum install  mysql-devel libxml2 gcc gcc-c++ glibc-devel make python python-devel ruby ruby-devel<\/pre>\n<p>Luego, debes descargar la ultima versi\u00f3n desde esta <a href=\"http:\/\/www.quickfixengine.org\/download.html\">direcci\u00f3n<\/a> y descomprimirla:<\/p>\n<pre>cd \/tmp<\/pre>\n<pre>wget http:\/\/ufpr.dl.sourceforge.net\/sourceforge\/quickfix\/quickfix-1.12.4.tar.gz<\/pre>\n<pre>tar xvfz quickfix-1.12.4.tar.gz<\/pre>\n<p>Luego, ingresa al directorio <strong>quickfix<\/strong> y crea los scripts makefile con la siguiente configuraci\u00f3n:<\/p>\n<pre>.\/configure --with-python=\/usr\/include\/python2.4\/ --with-ruby --with-mysql=\/usr<\/pre>\n<p><strong>Nota<\/strong>: La opci\u00f3n de mysql esta incorrecta aprop\u00f3sito. Si no se especifica as\u00ed\u00ad, el Makefile construido no es capaz de encontrar las cabeceras de desarrollo de MySQL.Luego, compilamos QuickFIX. Es normal cuando se compila el soporte para Python, el computador deje de responder (esto sucede cuando el computador tiene poca RAM)&#8230; (y si&#8230; el computador completo deja de responder \ud83d\ude41 ).<\/p>\n<pre>make<\/pre>\n<p>Una vez que termina de compilar, instalamos las bibliotecas quickfix en nuestro sistema. Esto debe ejecutarse como usuario <strong>root<\/strong>.<\/p>\n<pre>su -<\/pre>\n<pre>cd \/tmp\/quickfix<\/pre>\n<pre>make install<\/pre>\n<p>\u00c2\u00a1Y listo!, ya tienes QuickFIX en tu sistema.<\/p>\n<p><strong>NOTA: <\/strong>Los siguientes pasos de la instalaci\u00f3n solo deben realizarse si se utilizar\u00e1 el soporte de MySQL.<\/p>\n<p>Ahora se deben crear la BD y tablas de QuickFIX en MySQL. Para eso, QuickFIX proporciona un script, el cual se modificara ligeramente.<\/p>\n<pre>cd \/tmp\/quickfix\/src\/sql\/mysql<\/pre>\n<p>Edita el archivo &#8221;&#8217;<strong>create.sh<\/strong>&#8221;&#8217;. Este archivo tiene una solo linea, que ahora deber\u00e1 ser:<\/p>\n<pre>mysql -u root -p --execute=\"source mysql.sql\";<\/pre>\n<p>Esto permite autenticar con password de forma interactiva. Ejecuta ahora el script, e ingresa la password del usuario &#8221;&#8217;<strong>root<\/strong>&#8221;&#8217; de mysql.<\/p>\n<pre>.\/create.sh<\/pre>\n<h1>Explicaci\u00f3n sobre el funcionamiento de QuickFIX<\/h1>\n<p>QuickFIX en si posee una arquitectura cliente(s)\/servidor(es). Y su implementaci\u00f3n se basa en TCP\/IP.\u00c2  La biblioteca de QuickFIX se encarga de crear las conexiones, y de auto-configurarse (a partir de un archivo). Como programador, solo es necesario preocuparse de crear un archivo de configuraci\u00f3n y los mensajes a enviar.<\/p>\n<p>Toda aplicaci\u00f3n de QuickFIX, debe tener un archivo de configuraci\u00f3n, el cual define el tipo de conexi\u00f3n, el puerto, si el puerto sera reutilizado, cuando inician y finalizan las sesiones, entre otros par\u00e1metros.<\/p>\n<pre>[DEFAULT]<\/pre>\n<pre>ConnectionType=acceptor<\/pre>\n<pre>SocketAcceptPort=5001<\/pre>\n<pre>SocketReuseAddress=Y<\/pre>\n<pre>StartTime=00:00:00<\/pre>\n<pre>EndTime=00:00:00<\/pre>\n<pre>\r\n[SESSION]<\/pre>\n<pre>BeginString=FIX.4.4<\/pre>\n<pre>SenderCompID=EXECUTOR<\/pre>\n<pre>TargetCompID=CLIENT1<\/pre>\n<pre>FileStorePath=store<\/pre>\n<pre>DataDictionary=spec\/FIX44.xml<\/pre>\n<p>Cada secci\u00f3n <strong>SESSION<\/strong> del archivo de configuraci\u00f3n, puede especificar el <strong>DataDictionary<\/strong> a usar, el cual, es el DTD del protocolo FIX (la especificaci\u00f3n formal del lenguaje). Se usa para validar los mensajes entrantes y salientes. Estos, debe estar en la ruta especificada. Los archivos spec se pueden encontrar junto con las fuentes de QuickFIX.<\/p>\n<p>Las aplicaciones QuickFIX deben tener un conjunto de clases instanciadas, para poder funcionar como motor de mensajes, entre ellas podemos encontrar los Logger, Initiators, Acceptors. Todos estos act\u00faan por separado.<\/p>\n<p>Para poder enviar y recibir mensajes, se debe implementar la interfaz <a href=\"http:\/\/www.quickfixengine.org\/quickfix\/doc\/html\/class_f_i_x_1_1_application.html\">Application<\/a>. Los m\u00e9todos de esta interfaz ser\u00e1n llamados cuando ocurran los eventos a los cuales hacen referencia.<\/p>\n<p><code>namespace FIX{<br \/>\n  class Application{<br \/>\n    public:<br \/>\n    virtual ~Application() {};<br \/>\n    virtual void onCreate( const SessionID&amp; ) = 0;<br \/>\n    virtual void onLogon( const SessionID&amp; ) = 0;<br \/>\n    virtual void onLogout( const SessionID&amp; ) = 0;<br \/>\n    virtual void toAdmin( Message&amp;, const SessionID&amp; ) = 0;<br \/>\n    virtual void toApp( Message&amp;, const SessionID&amp; )<br \/>\n      throw( DoNotSend ) = 0;<br \/>\n    virtual void fromAdmin( const Message&amp;, const SessionID&amp; )<br \/>\n      throw( FieldNotFound, IncorrectDataFormat, IncorrectTagValue, RejectLogon ) = 0;<br \/>\n    virtual void fromApp( const Message&amp;, const SessionID&amp; )<br \/>\n      throw( FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType ) = 0;<br \/>\n  };<br \/>\n}<\/code><\/p>\n<table>\n<tr>\n<th>M\u00e9todo<\/th>\n<th>Observaciones<\/th>\n<\/tr>\n<tr>\n<td>~Application<\/td>\n<td>Destructor que se encarga de limpiar el objeto<\/td>\n<\/tr>\n<tr>\n<td>onCreate<\/td>\n<td>Esta funci\u00f3n es llamada cuando se establece una sesi\u00f3n<\/td>\n<\/tr>\n<tr>\n<td>onLogon<\/td>\n<td>Esta funci\u00f3n es llamada cuando una contraparte env\u00ed\u00ada un mensaje de tipo Logon (A). Por defecto, acepta toda conexi\u00f3n entrante. Es posible utilizar esta funci\u00f3n para crear autenticaci\u00f3n simple, o basada en sistemas de autententicaci\u00f3n centralizadas.<\/td>\n<\/tr>\n<tr>\n<td>onLogout<\/td>\n<td>Notifica cuando una sesi\u00f3n FIX ya no esta en linea, o cuando se recibe un mensaje de Logout (5). Posibles causes de ser llamada esta funci\u00f3n son: un logout v\u00e1lido, problemas en la conexi\u00f3n, o terminaci\u00f3n forzada de la conexi\u00f3n<\/td>\n<\/tr>\n<tr>\n<td>toAdmin<\/td>\n<td>Notifica cuando el Engine QuickFIX enviar\u00e1 un mensaje administrativo a la contra parte. Algo interesante, es\u00c2  que la referencia que es pasada del mensaje no es constante. Es decir, se puede modificar el mensaje.<\/td>\n<\/tr>\n<tr>\n<td>toApp<\/td>\n<td>Funci\u00f3n de callback que se llama cuando se env\u00ed\u00ada un mensaje de aplicaci\u00f3n. La referencia al mensaje no es constante. Arrojar una excepci\u00f3n &#8221;DoNotSend&#8221;, hace que el engine QuickFIX no envie este mensaje.<\/td>\n<\/tr>\n<tr>\n<td>fromAdmin<\/td>\n<td>Notifica cuando llega al engine QuickFIX un mensaje administrativo de su contra parte<\/td>\n<\/tr>\n<tr>\n<td>fromApp<\/td>\n<td>Es pr\u00e1cticamente el n\u00facleo de una aplicaci\u00f3n quickfix. Por ejemplo, en el caso de un sistema <font color=\"#000000\">OMS (Order Management System)<\/font>, el lado del servidor recibe a trav\u00e9s de esta funci\u00f3n, las peticiones de nuevas ordenes. En cambio, por el lado del cliente,  esta funci\u00f3n dar\u00e1 permitir\u00e1 recibir las confirmaciones de una orden emitida (o rechazo). La excepci\u00f3n &#8221;FieldNotFound&#8221; permite decir a la contraparte que faltaron campos en el mensaje, esta excepci\u00f3n es tirada autom\u00e1ticamente por la clase Message. La excepci\u00f3n &#8221;UnsupportedMessageType&#8221; permite indicar a la contra parte que no se posible procesar ese tipo de mensaje. La excepci\u00f3n &#8221;IncorrectTagValue&#8221; permite indicar que un campo tiene un valor o rango no soportado.<\/td>\n<\/tr>\n<\/table>\n<h1>Compilaci\u00f3n de Programas en C++<\/h1>\n<p>Para compilar con QuickFIX:<\/p>\n<pre>g++ -fexceptions -finline-functions -lquickfix -lpthread -lxml2 -lz -L\/usr\/local\/lib Application.cpp\u00c2  main.cpp<\/pre>\n<ul>\n<li> &#8211;<strong>fexceptions<\/strong> -\u00c2  Para el soporte de exceptions<\/li>\n<li><strong>-finline-functions<\/strong> &#8211; Que las funciones sean compiladas inline.<\/li>\n<li><strong>-lquickfix<\/strong> &#8211; Que incluya la libreria de quickfix al compilar.<\/li>\n<li><strong>-lpthread<\/strong> &#8211; Que incluya la libreria de threads.<\/li>\n<li><strong>-lxml2<\/strong> &#8211; Que incluya al compilar, la libreria &#8221;&#8217;xml2&#8221;&#8217;, para parsing de xml.<\/li>\n<li><strong>-lz<\/strong> &#8211; Que incluya al compilar, la libreria &#8221;&#8217;z&#8221;&#8217;, para compresi\u00f3n.<\/li>\n<li><strong>-L\/usr\/local\/lib<\/strong> &#8211; Que incluya en la ruta de librerias, este directorio<\/li>\n<\/ul>\n<p>Para facilitar la compilaci\u00f3n, usaremos &#8221;&#8217;Makefile&#8221;&#8217;. Un archivo makefile como el siguiente, permite compilar una aplicaci\u00f3n en quickfix:<\/p>\n<pre>CC = g++<\/pre>\n<pre>CXXFLAGS = -fexceptions -finline-functions -lquickfix -lpthread -lxml2 -lz -L\/usr\/local\/lib<\/pre>\n<pre>all: executor<\/pre>\n<pre>executor: Application.o<\/pre>\n<pre>clean:<\/pre>\n<pre>        rm -rf *.o executor<\/pre>\n<h1>Conclusiones<\/h1>\n<p>A pesar de que no se toco el tema de dise\u00f1o y arquitectura, existe un trabajo en las referencias (<a href=\"http:\/\/traxel.com\/fix\/fix-architecture.pdf\">Exploring FM Software Architecture<\/a>), el cual trata sobre este tema, y posee an\u00e1lisis sobre caracter\u00ed\u00adsticas deseadas, consideraciones y recomendaciones para el dise\u00f1o y arquitectura de software para Mercados Financieros.<\/p>\n<p>Espero haber cumplido como introducci\u00f3n a QuickFIX. Pronto pondr\u00e9 un Hello World! de QuickFIX. Porfavor, dejen comentarios, para saber si interesa el tema. Saludos!!<\/p>\n<h1>Referencias<\/h1>\n<ul>\n<li><a href=\"http:\/\/fixprotocol.org\" title=\"Sitio del Protocolo FIX\">Sitio del Protocolo FIX<\/a><\/li>\n<li><a href=\"http:\/\/www.quickfixengine.org\">Sitio de Quickfix<\/a><\/li>\n<li><a href=\"http:\/\/www.quickfixengine.org\/download.html\">Sitio de descargas de Quickfix<\/a><\/li>\n<li><a href=\"http:\/\/www.quickfixengine.org\/documentation.html\">Documentaci\u00f3n de Quickfix<\/a><\/li>\n<li><a href=\"http:\/\/www.quickfixengine.org\/mailinglist.html\">Listas de Correo de Quickfix<\/a><\/li>\n<li><a href=\"http:\/\/www.quickfixengine.org\/quickfix\/doc\/html\/license.html\">Licencia de Quickfix<\/a><\/li>\n<li><a href=\"http:\/\/www.quickfixengine.org\/quickfix\/doc\/html\/FAQ.html\">FAQ de Quickfix<\/a><\/li>\n<li><a href=\"http:\/\/www.devchix.com\/2007\/04\/20\/fix-protocol\/\">FIX Protocol &#8211; DevChix<\/a><\/li>\n<li><a href=\"http:\/\/traxel.com\/fix\/fix-architecture.pdf\">Exploring FM Software Architecture<\/a><\/li>\n<li><a href=\"http:\/\/www.fixprotocol.org\/specifications\/fix4.4fiximate\/index.html\">FIXimate 4.4<\/a><\/li>\n<\/ul>\n<h1>Agradecimientos<\/h1>\n<ul>\n<li>A Renato (<a href=\"http:\/\/rnt.bla.cl\">RNT<\/a>), por recordarme que debo corregir las faltas de ortograf\u00ed\u00ada \ud83d\ude1b<\/li>\n<li>A mis colegas de <a href=\"http:\/\/www.ifitec.cl\">Ifitec<\/a>, que ellos son ahora m\u00e1s expertos en FIX que yo \ud83d\ude00<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Durante mis a\u00f1os trabajando como sysadmin, desarrollador, e investigador en Ifitec, tuve que (obviamente), hacer muchos proyectos, pero solo dos&hellip; <a class=\"read-more\" href=\"https:\/\/www.arturo.hoffstadt.cl\/wp\/2008\/02\/10\/introduccion-a-fix-y-quickfix-financial-information-exchange\/\">Read more <span class=\"screen-reader-text\">Introducci\u00f3n a FIX y QuickFIX: Financial Information eXchange<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[4,101],"tags":[29,32,27,28,31,30],"class_list":["post-3","post","type-post","status-publish","format-standard","hentry","category-desarrollo-de-software","category-opensource","tag-financial","tag-finanzas","tag-fix","tag-quickfix","tag-quotes","tag-trading"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.arturo.hoffstadt.cl\/wp\/wp-json\/wp\/v2\/posts\/3","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.arturo.hoffstadt.cl\/wp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.arturo.hoffstadt.cl\/wp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.arturo.hoffstadt.cl\/wp\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.arturo.hoffstadt.cl\/wp\/wp-json\/wp\/v2\/comments?post=3"}],"version-history":[{"count":2,"href":"https:\/\/www.arturo.hoffstadt.cl\/wp\/wp-json\/wp\/v2\/posts\/3\/revisions"}],"predecessor-version":[{"id":23227,"href":"https:\/\/www.arturo.hoffstadt.cl\/wp\/wp-json\/wp\/v2\/posts\/3\/revisions\/23227"}],"wp:attachment":[{"href":"https:\/\/www.arturo.hoffstadt.cl\/wp\/wp-json\/wp\/v2\/media?parent=3"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.arturo.hoffstadt.cl\/wp\/wp-json\/wp\/v2\/categories?post=3"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.arturo.hoffstadt.cl\/wp\/wp-json\/wp\/v2\/tags?post=3"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}