Discusión sobre el artículo "Aplicación Práctica de Bases de Datos para Análisis de Mercados"
El artículo es muy útil y lo consultaré muchas veces para crear mis propias bases de datos.
Es un poco pronto para ello, pero en general ya se nota la potencia de la quinta versión.
Necesito, por ejemplo, guardar algún array en una base de datos. Escribí un script.
Tiene este aspecto:
#property copyright "Copyright 2010, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #include <Object.mqh> #include <Arrays\List.mqh> // conectar componentes OleDb #include <Ado\Providers\OleDb.mqh> #include <Ado\Data.mqh> double PriceBuffer[]; //+------------------------------------------------------------------+ //| Función de inicio del programa de script| //+------------------------------------------------------------------+ void OnStart() { long n1=100; MqlRates rates[]; ArraySetAsSeries(rates,true); double nClose[]; ArrayResize(nClose,n1); ArrayResize(t,n1); CSymbolInfo m_smbinf; m_smbinf.Name(Symbol()); int dg=m_smbinf.Digits(); int copied=CopyRates(Symbol(),0,0,n1,rates); for(int i=0;i<n1;i++) nClose[i]=rates[i].close; // formar la tabla que se pasará a SaveDataToDb CAdoTable *table=new CAdoTable(); table.Columns().AddColumn("Price",ADOTYPE_DOUBLE); ArrayResize(PriceBuffer,n1); // rellenar el dable con datos de los buffers for(int i=1; i<n1; i++) { CAdoRecord *row=table.CreateRecord(); row.Values().GetValue(0).SetValue(PriceBuffer[i]); table.Records().Add(row); } }
Pero al compilar se produce el siguiente error: "'Values' - cannot call protected member function".
El error está relacionado con la línea:
row.Values().GetValue(0).SetValue(PriceBuffer[i]);
Aunque en la función CBsvEngine::SaveData(void)
estas líneas funcionaban normalmente:
// rellenar el dable con datos de los buffers for(int i=1; i<TicksInBuffer; i++) { CAdoRecord *row=table.CreateRecord(); row.Values().GetValue(0).SetValue(TickBuffer[i].time); row.Values().GetValue(1).SetValue(TickBuffer[i].bid); row.Values().GetValue(2).SetValue(VolumeBuffer[i]); table.Records().Add(row); }
No compila dando error:
'Values' - cannot call protected member function.
Asociado con estas líneas en CBsvEngine::SaveData(void)
row.Values().GetValue(0).SetValue(TickBuffer[i].time); row.Values().GetValue(1).SetValue(TickBuffer[i].bid); row.Values().GetValue(2).SetValue(VolumeBuffer[i]);Y también el mismo error asociado con numerosas llamadas a 'Values()' en CDbDataAdapter::Fill(CAdoTable *table) en el archivo DbDataAdapter.mqh
Me encantaría que esto funcionara. Muchas gracias.
Desafortunadamente la build 586 tiene un error en la llamada a funciones de DLLs de 32 bits. Será corregido en la próxima versión.
Artículo publicado Aplicación Práctica de Bases de Datos para Análisis de Mercados:
Trabajar con datos se ha convertido en la principal tarea para el software moderno, tanto para aplicaciones independientes como para aplicaciones de red. Para resolver este problema se creó un software especializado. Se trata de los Sistemas de Gestión de Bases de Datos (Database Management Systems o DBMS), que pueden estructurar datos para su almacenamiento en el ordenador y su procesamiento. En lo que se refiere a trading, la mayoría de analistas no usan bases de datos en su trabajo. Pero hay tareas donde esta solución resultaría muy práctica. Este artículo facilita un ejemplo de indicadores que puede guardar y cargar datos de bases de datos tanto con arquitecturas de servidor de cliente como de servidor de archivos.
El indicador BuySellVolume enlazado a la base de datos SQLite 3.6 en EURUSD M5
Autor: Alexander