Discussione sull’articolo "Applicazione Pratica dei Database per l'Analisi dei Mercati"

 

Il nuovo articolo Applicazione Pratica dei Database per l'Analisi dei Mercati è stato pubblicato:

Lavorare con i dati è diventato il compito principale del software moderno, sia per applicazioni standalone che di rete. Per risolvere questo problema è stato creato un software specializzato. Si tratta di Database Management Systems (DBMS), in grado di strutturare, sistematizzare e organizzare i dati per l'archiviazione e l'elaborazione del proprio computer. Per quanto riguarda il trading, la maggior parte degli analisti non utilizza database nel proprio lavoro. Ma ci sono compiti in cui una soluzione del genere dovrebbe essere utile. Questo articolo fornisce un esempio di indicatori, in grado di salvare e caricare dati da database sia con architetture client-server che file-server.

Molto semplice, secondo me. Nell'indicatore vengono chiamate solo due funzioni della classe: ProcessTick() e SaveData(). La funzione ProcessTick() viene utilizzata per i calcoli e la funzione SaveData() è necessaria per reimpostare il buffer con i tic, sebbene non salvi i dati.

Proviamo a compilare e "voilà": l'indicatore inizia a mostrare i valori:

 

 Figura 1. Indicatore BuySellVolume senza collegamento al database su GBPUSD M1

Eccellente! I tick stanno spuntando, l'indicatore sta calcolando. Il vantaggio di tale soluzione: abbiamo bisogno solo dell'indicatore stesso (ex5) per il suo lavoro e niente di più. Tuttavia, quando si modifica il timeframe, o lo strumento, o quando si chiude il terminale, i dati vengono irrimediabilmente persi. Per evitare ciò, vediamo come aggiungere il salvataggio e il caricamento dei dati nel nostro indicatore.

Autore: Alexander

 

L'articolo è molto utile e vi farò riferimento molte volte per creare i miei database.

È un po' presto per farlo, ma in generale si può già percepire la potenza della quinta versione.

 
Alessandro, per favore aiutami in questa situazione...

Ho bisogno, ad esempio, di salvare alcuni array in un database. Ho scritto uno script.

Si presenta così:

#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#include <Object.mqh>
#include <Arrays\List.mqh>

// collegare i componenti OleDb
#include <Ado\Providers\OleDb.mqh>
#include <Ado\Data.mqh>

double PriceBuffer[];
//+------------------------------------------------------------------+
//| Funzione di avvio del programma di 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;
     
// forma la tabella da passare a SaveDataToDb
   CAdoTable *table=new CAdoTable();
   table.Columns().AddColumn("Price",ADOTYPE_DOUBLE);
   ArrayResize(PriceBuffer,n1);
// riempire la tabella con i dati dei buffer
   for(int i=1; i<n1; i++)
     {
      CAdoRecord *row=table.CreateRecord();
      row.Values().GetValue(0).SetValue(PriceBuffer[i]);
      table.Records().Add(row);
     }
  }

Ma in fase di compilazione si verifica il seguente errore: "'Values' - cannot call protected member function".

L'errore è relativo alla riga:

row.Values().GetValue(0).SetValue(PriceBuffer[i]);

Sebbene nella funzione CBsvEngine::SaveData(void)

tali righe funzionavano normalmente:

// riempire la tabella con i dati dei buffer
      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);
        }
 
Esistono classi per lavorare con MySQL (tramite libmySQL.dll) e SQLite(tramite sqlite3.dll) senza ADO da MT5?
 
Ottimo articolo! Purtroppo ho lo stesso problema che Denkir ha commentato nella versione russa di questo articolo.

Non compila dando l'errore:
'Values' - cannot call protected member function.

Associato a queste righe in 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]);
E anche lo stesso errore associato a numerose chiamate a 'Values()' in CDbDataAdapter::Fill(CAdoTable *table) nel file DbDataAdapter.mqh

Mi piacerebbe davvero che funzionasse. Molto apprezzato!
 
Quando utilizzo adoSuite in strategy tester, il programma viene sempre interrotto.
 
zephyrrr:

Quando utilizzo adoSuite in strategy tester, il programma viene sempre terminato.
Purtroppo la build 586 presenta un errore nella chiamata delle funzioni delle DLL a 32 bit. Sarà risolto nella prossima build.
 
Automated-Trading:
Purtroppo la build 586 presenta un errore nella chiamata delle funzioni delle DLL a 32 bit. Verrà risolto nella prossima build.
Purtroppo non è stato risolto dopo l'ultimo aggiornamento. Ci sono soluzioni o raccomandazioni? Quanto tempo potrebbe volerci? Mi è stato detto di aspettare la prossima build e questa è arrivata senza risolvere il problema.
 
Alexander
  • 2010.04.20
  • www.mql5.com
交易者的个人资料