 ami2py
==========================

[![Build Status](https://travis-ci.org/F2011B/ami2py.svg?branch=master)](https://travis-ci.org/F2011B/ami2py)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![PyPi version](https://pypip.in/v/ami2py/badge.png)](https://crate.io/packages/ami2py/)
[![PyPi downloads](https://pypip.in/d/ami2py/badge.png)](https://crate.io/packages/ami2py/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![ami2py](https://snyk.io/advisor/python/ami2py/badge.svg)](https://snyk.io/advisor/python/ami2py)

Python Package for reading and writing from and to an amibroker database.<br/>
This package is using construct for defining the binary structures used to access the amibroker database, 
see [Construct documentation](https://construct.readthedocs.io/en/latest/). <br/>
The specification of the binary structure was taken from the official amibroker C++ sdk api documentation.

However, this is not an official amibroker database api. <br/> 
Therefore, no warranty is given and handle with care. <br/>
Improvement requests are always welcome.<br/>
This module can be used to create a database and write symbol data to that. <br/> 
However, it seems to be a good idea to use the official quote downloader program for productive usage.<br/>

Examples
---------

Creating a Database from scratch and adding symbol data to the database. 
**WARNING Database from scratch created database cannot be used by amibroker at current state.**
To use the underlying constructs in compiled form, use_compiled can be set to True within the  
AmiDataBase constructor. This is a more or less experimental feature.

    >>> from ami2py import AmiDataBase, SymbolEntry
    >>> db = AmiDataBase(db_folder)
    >>> db.add_symbol("AAPL")    
    >>> db.append_data_to_symbol(
            "AAPL",
            SymbolEntry(
                Close=200.0,
                High=230.0,
                Low=190.0,
                Open=210.0,
                Volume=200003122.0,
                Month=12,
                Year=2020,
                Day=17,
            ),
        )
    >>> db.write_database()

Reading a list of symbols contained in the database.

    >>> symbols = db.get_symbols()
    >>> symbols
    ["AAPL"]

Getting values for a symbol in a pandas compatible dicitonary format.

    >>> db.get_dict_for_symbol("SPCE")
    {
        "Open": [20.0,....],
        "Close": [200.0,....],
        "High": [230.0,.....],
        "Low": [190.0,.....],
        "Open": [210.0,.......],
        "Volume": [200003122.0,.....],
        "Month": [12,.......],
        "Year": [2020,.......],
        "Day": [17,........],
    }

Using a list container facade for fast reading of symbol data. 
The previous mentioned methods to read symbol data from the database use construct to 
convert the binary array into a hierarchical object structure. 
Creating those objects during the load process, causes high delay during loading. 
Therefore a symbol facade called AmiSymbolDataFacade was created to read data only in case 
it is necessary.

     >>> data = db.get_fast_symbol_data("SPCE")
     >>> data[0]
     {'Year': 2017, 
      'Month': 9, 
      'Day': 29, 
      'Hour': 10, 
      'Minute': 63, 
      'Second': 63, 
      'MilliSec': 258, 
      'MicroSec': 255, 
      'Reserved': 1,  
      'Isfut': 1,  
      'Close': 10.100000381469727, 
      'Open': 10.5, 
      'High': 10.5, 
      'Low': 10.0, 
      'Volume': 212769.0, 
      'AUX1': 0.0, 
      'AUX2': 0.0,  
      'TERMINATOR': 0.0
     }
     >>> newslice=data[0:10] 
     >>> newslice[0]
     {'Year': 2017,
      'Month': 9,
      ......
     }
     >>> newslice[1]
     {'Year': 2017,
      'Month': 10,
       ......
     }

Todos
--------------------
* Created database should be readable by amibroker
* Write tests for intraday data, currently data structures is able to handle intraday data. 
  But no tests had been written, until now. 
  This is considered mandatory to reach version 1.0.0  
* Add docstrings to the source code. This seems to be a minor task.
* Currently no real life performance measures have been done. 






