Особенности формирования неполной свечи,
Неполная свеча появляется когда в sql запрос попадает хотя бы одна сделка
а неполном периоде:
timestamp x = 1521933300
Расчет свечей из кэша :
data1 = [{'date': 1521929700, 'open': 8640.0, 'high': 8717.0, 'low': 8610.81133606, 'close': 8694.24124667}, {'date': 1521930600, 'open': 8694.24124712, 'high': 8719.44583815, 'low': 8650.76841592, 'close': 8667.85584522}, {'date': 1521931500, 'open': 8667.83364934, 'high': 8683.19046025, 'low': 8613.02673386, 'close': 8630.0}, {'date': 1521932400, 'open': 8630.0, 'high': 8653.33548722, 'low': 8610.81133606, 'close': 8653.33548722}]
cand2_st = 1521933300
cand2_end = 1521933300
data2= []
Удаляем последнюю свечу
data1 = [{'date': 1521929700, 'open': 8640.0, 'high': 8717.0, 'low': 8610.81133606, 'close': 8694.24124667}, {'date': 1521930600, 'open': 8694.24124712, 'high': 8719.44583815, 'low': 8650.76841592, 'close': 8667.85584522}, {'date': 1521931500, 'open': 8667.83364934, 'high': 8683.19046025, 'low': 8613.02673386, 'close': 8630.0}, {'date': 1521932400, 'open': 8630.0, 'high': 8653.33548722, 'low': 8610.81133606, 'close': 8653.33548722}]
Добавим последню свечу
Если data2 не пустой
Список в работу целиком :
data1 = [{'date': 1521929700, 'open': 8640.0, 'high': 8717.0, 'low': 8610.81133606, 'close': 8694.24124667}, {'date': 1521930600, 'open': 8694.24124712, 'high': 8719.44583815, 'low': 8650.76841592, 'close': 8667.85584522}, {'date': 1521931500, 'open': 8667.83364934, 'high': 8683.19046025, 'low': 8613.02673386, 'close': 8630.0}, {'date': 1521932400, 'open': 8630.0, 'high': 8653.33548722, 'low': 8610.81133606, 'close': 8653.33548722}]
—---------------------------------------------------------------------------------------------------------------------------------—
timestamp x = 1521933310
Расчет свечей из кэша :
data1 = [{'date': 1521930600, 'open': 8694.24124712, 'high': 8719.44583815, 'low': 8650.76841592, 'close': 8667.85584522}, {'date': 1521931500, 'open': 8667.83364934, 'high': 8683.19046025, 'low': 8613.02673386, 'close': 8630.0}, {'date': 1521932400, 'open': 8630.0, 'high': 8653.33548722, 'low': 8610.81133606, 'close': 8653.33548722}, {'date': 1521933300, 'open': 8653.13572438, 'high': 8653.13572438, 'low': 8653.13572438, 'close': 8653.13572438}]
cand2_st = 1521933300
cand2_end = 1521933310
data2= [{'date': 1521933300, 'open': 8653.13572438, 'high': 8653.13572438, 'low': 8653.13572438, 'close': 8653.13572438}]
Удаляем последнюю свечу
data1 = [{'date': 1521930600, 'open': 8694.24124712, 'high': 8719.44583815, 'low': 8650.76841592, 'close': 8667.85584522}, {'date': 1521931500, 'open': 8667.83364934, 'high': 8683.19046025, 'low': 8613.02673386, 'close': 8630.0}, {'date': 1521932400, 'open': 8630.0, 'high': 8653.33548722, 'low': 8610.81133606, 'close': 8653.33548722}, {'date': 1521933300, 'open': 8653.13572438, 'high': 8653.13572438, 'low': 8653.13572438, 'close': 8653.13572438}]
Добавим последню свечу
Если data2 не пустой
Список в работу целиком :
data1 = [{'date': 1521930600, 'open': 8694.24124712, 'high': 8719.44583815, 'low': 8650.76841592, 'close': 8667.85584522}, {'date': 1521931500, 'open': 8667.83364934, 'high': 8683.19046025, 'low': 8613.02673386, 'close': 8630.0}, {'date': 1521932400, 'open': 8630.0, 'high': 8653.33548722, 'low': 8610.81133606, 'close': 8653.33548722}, {'date': 1521933300, 'open': 8653.13572438, 'high': 8653.13572438, 'low': 8653.13572438, 'close': 8653.13572438}]
# candel_polo_5x.py
import time
import json
import requests
import urllib, http.client
import hmac, hashlib
import mysql.connector
import sys
import os, errno
import calendar
import numpy
import talib
from datetime import datetime
#Начало и конец свечей PERIOD1 # get_ticks (cand1_st, cand1_end, PERIOD1)
#MACD=26
MACD=2
PERIOD = 15 # минут
cand1_st = calendar.timegm((2018, 3, 24, 22, 0, 0, 0, 0, 0)) # время UTC
cand1_end = calendar.timegm((2018, 3, 25, 2, 0, 0, 0, 0, 0)) # время UTC
#1518628155 Начало базы 2018-02-14 20:09:15
#print('Начало базы', datetime.fromtimestamp(1518628155))
#Установим дату и время начала тестирования
#time_start = (2018, 1, 1, 0, 0, 0, 0, 0, 0) #Время UTC
time_start = (2018, 3, 24, 23, 0, 0, 0, 0, 0) #Время UTC
#timestampstart = time.mktime(time_start) #Локальное время
timestampstart = calendar.timegm(time_start) # время UTC
x=timestampstart
#x=1509494400
#x=1509494399
#x=1521932451
#x=1521932400
#x=1521932401
#x=1521933300
#x=1521933299
x=1521933300
print('Начало тестирования utc ', datetime.utcfromtimestamp(timestampstart))
#Установим дату и время завершения тестирования
#time_end = (2018, 3, 20, 0, 0, 0, 0, 0, 0) #Время UTC
time_end = (2018, 3, 25, 1, 0, 0, 0, 0, 0) #Время UTC
#time_end = (2018, 3, 13, 15, 0, 0, 0, 0, 0) #Время UTC
#time_end = (2018, 3, 20, 5, 0, 0, 0, 0, 0) #Время UTC
#timestampend = time.mktime(time_end) #Локальное время
timestampend = calendar.timegm(time_end) # время UTC
print('Заввершение тестирования utc ', datetime.utcfromtimestamp(timestampend))
y=timestampend
USE_LOG = True
DEBUG = False # True - выводить отладочную информацию, False - писать как можно меньше
numpy.seterr(all='ignore')
# Свой класс исключений
class ScriptError(Exception):
pass
class ScriptQuitCondition(Exception):
pass
def is_nan(x):
return (x is numpy.nan or x != x)
# Получаем данные, необходимые для построения индикаторов
#def get_ticks(pair):
def get_sql(st, end, PER):
#global y
#global x
#_SQL = """select * from trade"""
#x=int(time.time())
#print('y = ',y)
#print(datetime.fromtimestamp(y))
pr = PER * 60
#x= y - pr*50 #Для построения MACD требуется примерно 50 периодов свечей
#_SQL = """select * from trade where date between 1519318790 and 1519318800; """
_SQL = """SELECT
FLOOR(MIN(`date`)/%s)*%s AS date,
SUBSTRING_INDEX(MIN(CONCAT(`date`, '_', id, '_', rate)), '_', -1) AS `open`,
MAX(rate) AS high,
MIN(rate) AS low,
SUBSTRING_INDEX(MAX(CONCAT(`date`, '_', id, '_', rate)), '_', -1) AS `close`
FROM trade
WHERE date >= %s and date <= %s
GROUP BY FLOOR(`date`/%s)
ORDER BY date"""
db = mysql.connector.connect(host="localhost", user="u", passwd="secret", db="polo")
#db = mysql.connector.connect(host="10.8.1.1", user="u", passwd="secret", db="exmo")
cur = db.cursor()
try:
cur.execute(_SQL,(pr,pr,st,end,pr))
sdata=[]
for item in cur.fetchall():
sdata.append({'date':int(item[0]),'open':float(item[1]),'high':float(item[2]),'low':float(item[3]),'close':float(item[4])})
except Exception as e:
log(e)
cur.close()
db.close()
#print(sdata)
return sdata
# Выводит всякую информацию на экран, самое важное скидывает в Файл log.txt
def log(*args):
if USE_LOG:
l = open("./candel_polo.txt", 'a', encoding='utf-8')
print(datetime.now(), *args, file=l)
#print(datetime.fromtimestamp(y+3*60*60), *args, file=l) #Локальное время
#print(datetime.utcfromtimestamp(y), *args, file=l) #UTC
l.close()
print(datetime.now(),' ', *args)
#print(datetime.fromtimestamp(y+3*60*60),' ', *args) #Локальное время
#print(datetime.utcfromtimestamp(y),' ', *args) #UTC
def get_ticks (d, data, flg):
global PERIOD
global MACD
# d текщее время на которое расчитывается свеча
# data список предварительно рассчитанные свечи
DEBUG = True
if flg: #flg = True для ускорения используем кэш предрасчитанные свечи в списке data
data1=[] #перегрузим сюда свечи до времени d с учетом запаса для расчета MACD
for offset, elem in enumerate(data):
#if True:
if (data[offset]['date'] <=d) and (data[offset]['date'] >= (d - PERIOD*MACD*2*60)):
data1.append(data[offset]) #не пропускаем последнюю свечу!
cand2_st = data1[-1]['date'] # из последней свечи возьмем возьмем начала периода для расчета неполной свечи
cand2_end = d # время UTC
data2=get_sql(cand2_st, cand2_end, PERIOD) #расчет неполной свечи на момент d
data1.pop() #удалим последнюю, полную закрытую свечу
if len(data2)>0: # при расчете свечи на момент d может вернуться пустой список (если сделок не было)
data1.append(data2[-1])
if DEBUG: #отладка
print()
print('Расчет свечей из кэша :')
print('data1 =', data1)
print('cand2_st = ', cand2_st)
print('cand2_end = ', cand2_end)
print()
print('data2=',data2)
print()
print("Удаляем последнюю свечу")
print('data1 =', data1)
print()
print('Добавим последню свечу')
print('Если data2 не пустой')
print('Список в работу целиком :')
print('data1 =', data1)
return data1
else: #flg = False свечи рассчитываются напрямую запросом sql
cand2_st = d - PERIOD*MACD*2*60 # время UTC
cand2_end = d # время UTC
data2=get_sql(cand2_st, cand2_end, PERIOD)
if DEBUG:# отладка
print()
print('Тоже напрямую через SQL :')
print('cand2_st = ', cand2_st)
print('cand2_end = ', cand2_end)
print()
print('data2 =', data2)
return data2
log('свечи PERIOD = ',PERIOD, ' мин')
#log('начало запроса', datetime.utcfromtimestamp(x))
#log('окончание запроса', datetime.utcfromtimestamp(y))
#print('Начало запроса',datetime.now()) #UTC
data=get_sql(cand1_st, cand1_end, PERIOD)
#print(data)
#print('Конец запроса', datetime.now()) #UTC
#print(data)
print('текущее время x',datetime.utcfromtimestamp(x)) #UTC
print('timestamp x = ',x)
#while True:
data1=get_ticks(x, data, True)
#data1=get_ticks(x, data, False)
x=1521933310
data1=get_ticks(x, data, True)
#print(data1[-1])
#print(data1)
#x = x +3600
#x=x+1
#data2=get_sql(x-100, x, PERIOD)
#print(data2)