F2011B / ami2py

Python Package for reading an amibroker database
MIT License
20 stars 6 forks source link

Amibroker 6.3 can see the changes added from code #8

Open pymen opened 1 year ago

pymen commented 1 year ago

Step 0. Initial Setup

  1. Win 10, Amibroker 6.3 64bit
  2. New blank local database with 5min tf
  3. Added manually one symbol and some quotes using Amibroker UI - Quote Editor
  4. Saved db by existing from Amibroker

Step 1. Python Code with read mode

  1. Connected from code to db
  2. Read state
db = AmiDataBase('/media/ant/HDD/STUDY/AmibrokerDB/5MIN_TEST/')
data = db.get_symbol_data('RRR2')

print(db.get_symbol_data('RRR2'))
print(db.get_dict_for_symbol('RRR2'))
SymbolData(Header=b'BROKDAt5RRR2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00', Entries=[SymbolEntry(Month=7, Year=2023, Close=2.0, Open=1.0, Low=1.0, High=2.0, Volume=0.0, Future=0, Reserved=0, Micro_second=0, Milli_sec=0, Second=0, Minute=0, Hour=0, Day=8, Aux_1=0, Aux_2=0, Terminator=0)])
{'Day': [8], 'Month': [7], 'Year': [2023], 'Open': [1.0], 'High': [2.0], 'Low': [1.0], 'Close': [2.0], 'Volume': [0.0]}

Step 2. Python Code with write mode

added one entry by code as copy of existing with minute = minute + 5min

entry = data.Entries[-1]
entry_dt = datetime.datetime(entry.Year, entry.Month, entry.Day, entry.Hour, entry.Minute)

next_dt = entry_dt + timedelta(minutes=5)  # also tried with timedelta == day=1
next_entry = dataclasses.replace(entry)
next_entry.Year = next_dt.year
next_entry.Month = next_dt.month
next_entry.Day = next_dt.day
next_entry.Hour = next_dt.hour
next_entry.Minute = next_dt.minute
db.append_symbole_entry("RRR2", next_entry)

db.write_database()

print(db.get_symbol_data('RRR2'))
print(db.get_dict_for_symbol('RRR2'))
Entries=[SymbolEntry(Month=7, Year=2023, Close=2.0, Open=1.0, Low=1.0, High=2.0, Volume=0.0, Future=0, Reserved=0, Micro_second=0, Milli_sec=0, Second=0, Minute=0, Hour=0, Day=8, Aux_1=0, Aux_2=0, Terminator=0), SymbolEntry(Month=7, Year=2023, Close=2.0, Open=1.0, Low=1.0, High=2.0, Volume=0.0, Future=0, Reserved=0, Micro_second=0, Milli_sec=0, Second=0, Minute=5, Hour=0, Day=8, Aux_1=0, Aux_2=0, Terminator=0)])
{'Day': [8, 8], 'Month': [7, 7], 'Year': [2023, 2023], 'Open': [1.0, 1.0], 'High': [2.0, 2.0], 'Low': [1.0, 1.0], 'Close': [2.0, 2.0], 'Volume': [0.0, 0.0]}

Step 3. Amibroker

open Amibroker (real open after closing) open database Amibroker still can see only original first quote added from hist UI Ie Amibroker can not see new Quotes added by python code

Ami2Py can see new quotes

# after 2 added quotes from code
{'Day': [8, 8, 8], 'Month': [7, 7, 7], 'Year': [2023, 2023, 2023], 'Open': [1.0, 1.0, 1.0], 'High': [2.0, 2.0, 2.0], 'Low': [1.0, 1.0, 1.0], 'Close': [2.0, 2.0, 2.0], 'Volume': [0.0, 0.0, 0.0]}
pymen commented 8 months ago

i was able to write intraday data, to do it you need to take ami2py from main branch here (not from pypy) and update date_to_bin function inside ami_symbol_facade.py

to

def date_to_bin(day, month, year, hour=0, minute=0, second=0, mic_sec=0, milli_sec=0):
    values = (
        (year << 52) |
        (month << 48) |
        (day << 43) |
        (hour << 38) |
        (minute << 32) |
        (second << 26) |
        (milli_sec << 16) |
        (mic_sec << 6) |
        (0) |
        (0)
    )

    byte_values = values.to_bytes(8, 'little')
    return bytearray(byte_values)

the code below show the example which copies quotes from one symbol to new another, including intraday


def add_symbol(symbol):
    db = AmiDataBase(db_path)
    if db.get_fast_symbol_data(symbol).length == 0:
        db.add_new_symbol(symbol)
        print('add new symbol')

    destination = db.get_fast_symbol_data(symbol)
    source = db.get_fast_symbol_data('POLY')

    dest_len = destination.length
    start, end = dest_len, dest_len + 10

    slice_range = slice(start, end)
    values = [i for i in source[slice_range]]

    db.append_to_symbol(symbol, values)
    db.write_database()