#!/home/hoogca/virtualenv/bri/3.7/bin/python
###!/home/debian/miniconda3/bin/python3
#print("Incl test")
import sys, os, math
import xml.etree.ElementTree as ET
from pathlib import Path
from websocket import create_connection # pip install websocket-client
### source /home/hoogca/virtualenv/bri/3.7/bin/activate && pip install websocket-client
import json
import random
import string
import re
import csv
from datetime import datetime
import time
now=time.time()
import numpy as np
import pandas as pd
from numpy import inf
import matplotlib.pyplot as plt
pd.options.mode.chained_assignment = None
import struct
import sqlite3
from datetime import datetime as dt, timedelta as tdelta
global interval, quoteInternal, Records, quote, interval2, dir
global nRecords,idx,rows,HighestHigh,LowestLow,nRow,LastClose,LastDT
def include(filename):
#hprint(filename)
if os.path.exists(filename):
#hprint("2")
exec(compile(source=open(filename).read(), filename=filename, mode='exec'))
def hprint(text):
print(f"{text}
\n")
def filter_raw_message(text):
try:
found1 = re.search('"m":"(.+?)",', text).group(1)
found2 = re.search('"p":(.+?"}"])}', text).group(1)
print(found1)
print(found2)
return found1, found2
except AttributeError:
print("error")
def generateSession():
stringLength = 12
letters = string.ascii_lowercase
random_string = ''.join(random.choice(letters) for i in range(stringLength))
return "qs_" + random_string
def generateChartSession():
stringLength = 12
letters = string.ascii_lowercase
random_string = ''.join(random.choice(letters) for i in range(stringLength))
return "cs_" + random_string
def prependHeader(st):
return "~m~" + str(len(st)) + "~m~" + st
def constructMessage(func, paramList):
# json_mylist = json.dumps(mylist, separators=(',', ':'))
return json.dumps({
"m": func,
"p": paramList
}, separators=(',', ':'))
def createMessage(func, paramList):
return prependHeader(constructMessage(func, paramList))
def sendRawMessage(ws, message):
ws.send(prependHeader(message))
def sendMessage(ws, func, args):
#ws.send(createMessage(func, args))
j=json.dumps({
"m": func,
"p": args
}, separators=(',', ':'))
j="~m~" + str(len(j)) + "~m~" + j
ws.send(j)
def extractData(a):
out = re.search('"s":\[(.+?)\}\]', a).group(1)
x = out.split(',{\"')
with open('data_file.csv', mode='w', newline='') as data_file:
writer = csv.writer(data_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
writer.writerow(['index', 'date', 'open', 'high', 'low', 'close', 'volume'])
for xi in x:
xi = re.split('\[|:|,|\]', xi)
print(xi)
ind = int(xi[1])
ts = datetime.fromtimestamp(float(xi[4])).strftime("%Y/%m/%d, %H:%M:%S")
writer.writerow([ind, ts, float(xi[5]), float(xi[6]), float(xi[7]), float(xi[8]), float(xi[9])])
headers = json.dumps({
'Connection': 'upgrade',
'Host': 'data.tradingview.com',
'Origin': 'https://data.tradingview.com',
'Cache-Control': 'no-cache',
'Upgrade': 'websocket',
'Sec-WebSocket-Extensions': 'permessage-deflate; client_max_window_bits',
# 'Sec-WebSocket-Key': '2C08Ri6FwFQw2p4198F/TA==',
# 'Sec-WebSocket-Version': '13',
'User-Agent': 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 Edg/83.0.478.56',
'Pragma': 'no-cache',
'Upgrade': 'websocket'
})
ws = create_connection('wss://data.tradingview.com/socket.io/websocket', headers=headers)
session = generateSession()
#print("session generated {}".format(session))
chart_session = generateChartSession()
#print("chart_session generated {}".format(chart_session))
sendMessage(ws, "set_auth_token", ["unauthorized_user_token"])
sendMessage(ws, "chart_create_session", [chart_session, ""])
sendMessage(ws, "quote_create_session", [session])
sendMessage(ws, "resolve_symbol", [chart_session, "symbol_1","={\"symbol\":\"%s\",\"adjustment\":\"splits\",\"session\":\"extended\"}"%quoteInternal])
sendMessage(ws, "create_series", [chart_session, "s1", "s1", "symbol_1", "%s"%interval, 1000])
series_loading=""
timescale_update=""
while True:
try:
result = ws.recv()
if (result.find("series_loading") > 0): series_loading=result
if(result.find("timescale_update")>0):
timescale_update=result
#print(result)
#extractData(result)
break;
except Exception as e:
print(e)
break
def excel_date(datetime, offset=0):
"""convert date&time with offset in hours to excel format for scid"""
delta = datetime - dt(1899, 12, 30) + tdelta(hours=offset)
return delta.days + delta.seconds / 86400
def python_date(exceldt, offset=0):
"""convert date&time with offset in hours to python format"""
excel_as_delta = tdelta(days=exceldt//1) + tdelta(seconds=exceldt%1*86400)
return dt(1899, 12, 30) + excel_as_delta + tdelta(hours=offset)
FILES_OUT = "C:\\SierraChart\\SierraChartTransActMA\\Data\\"
MaxIndex=int((24*60)/int(interval2))
SumVolumeByTime = [0] * MaxIndex
nSumVolumeByTime = [0] * MaxIndex
try:
data = re.search('"s":\[(.+?)\}\]', timescale_update).group(1)
except:
hprint(f"{quote} Not found.")
sys.exit()
lines = data.split(',{\"')
LastLine=lines[-1]
fields = re.split('\[|:|,|\]', LastLine)
LastUnixDate=int(float(fields[4]))
LastExcelDate=excel_date(datetime.fromtimestamp(LastUnixDate), 4)
#print(LastLine)
# Exponential moving average ...
def EMA(PriceToday,EMAyesterday,nPeriod):
return PriceToday*(2/(nPeriod+1))+EMAyesterday*(1-(2/(nPeriod+1)))
nRecords=0
prevAvgVolumePerTime=0
prevVolume = 0
rows=[]
HighestHigh=-10000000
LowestLow=10000000
nRow=0
LastClose=0
LastDT=""
prevClose=0
prevLow=0
prevHigh=0
global GlobalSpreadAvg, GlobalGainAvg
GlobalSpreadAvg=0
SpreadTot=0
nSpreadTot=0
GlobalGainAvg=0
GainTot=0
nGainTot=0
for line in lines:
line = line.strip()
if line: # not empty
#hprint(line)
fields = re.split('\[|:|,|\]', line)
unixDate=int(float(fields[4]))
day=datetime.fromtimestamp(unixDate).day
month=datetime.fromtimestamp(unixDate).month
year=datetime.fromtimestamp(unixDate).year
hour=datetime.fromtimestamp(unixDate).hour
minute = datetime.fromtimestamp(unixDate).minute
idx=int(((hour*60)+minute)/int(interval2))
excelDate=excel_date(datetime.fromtimestamp(unixDate), 4)
openX=float(fields[5])
high=float(fields[6])
low=float(fields[7])
close=float(fields[8])
if(nRow>1):
if(prevClose > high):
high=prevClose
openX=prevClose
elif(prevClose < low):
low=prevClose
openX=prevClose
if(openX > prevHigh):
openX=prevHigh
elif(openX < prevLow):
openX=prevLow
#if(low<=0): low[nRow]=low[nRow]
if(low<=0): low=prevLow
sprd=high-low
if sprd!=0:
SpreadTot=SpreadTot+sprd
nSpreadTot=nSpreadTot+1
gn=close-openX
if gn!=0:
GainTot=GainTot+abs(gn)
nGainTot=nGainTot+1
days_difference = (LastUnixDate - unixDate)/(60*60*24)
#print(days_difference)
volume=int(float(fields[9]))
if high>HighestHigh: HighestHigh=high
if low0 and days_difference{VolumePerTick} | {VolumePerTickMA} | {EffortResult} | {EffortResultAbsMA}")
#hprint(f"{day}-{month}-{year} | {hour}:{minute} | {close} | {pCloseMA5} | {pEMA1} | {pEMA2} | {pZZMA}")
rows.append([year,month,day,hour,minute,idx,openX,high,low,close,volume])
LastClose=close
nRecords=nRecords+1
LastDT=f"{hour}:{minute}"
nRow=nRow+1
#print(f"{hour} | {minute} | {index} | {unixDate} | {excelDate}")
#wt = struct.pack('d4f4I', excel_date(datetime.fromtimestamp(unixDate),4), float(fields[5]), float(fields[6]), float(fields[7]), float(fields[8]), 0, int(float(fields[9])), 0, 0)
#scidfile.write(wt)
prevClose=close
prevLow=low
prevHigh=high
Records = pd.DataFrame(rows, columns=['year','month','day','hour','minute','idx','openX','high','low','close','volume'])
if nSpreadTot>0:
GlobalSpreadAvg=SpreadTot/nSpreadTot
if nGainTot>0:
GlobalGainAvg=GainTot/nGainTot
global iHigh,iLow,iClose,iOpen,iVolume,iYear,iMonth,iDay,iHour,iMinute
iHigh=Records['high']
iLow=Records['low']
iClose=Records['close']
iOpen=Records['openX']
iVolume=Records['volume']
iYear=Records['year']
iMonth=Records['month']
iDay=Records['day']
iHour=Records['hour']
iMinute=Records['minute']
idx=Records['idx']
global iZZMA5,iZZMA15,iVolMA,iVolumePerTick,iVolumePerTickMA,iSpread,iSpreadMA,iPrevClose,iGain,iGainMA
global vMAperiod
vMAperiod=20
Records['prevClose']=Records['close'].shift(1)
iPrevClose=Records['prevClose']
Records['Ema1'] = iClose.ewm(span=5, min_periods=1).mean()
Records['Ema2'] = Records['Ema1'].ewm(span=5, min_periods=1).mean()
Records['pZZMA5'] = Records['Ema1']+(Records['Ema1']-Records['Ema2'])
#Records['pZZMA5slope'] = 1/(Records['pZZMA5']-Records['pZZMA5'].shift(1))
Records['pcChange_pZZMA5'] = ((Records['pZZMA5']-Records['pZZMA5'].shift(1))*100.0)/(HighestHigh-LowestLow)
#Records['highMA'] = iHigh.ewm(span=10, min_periods=1).mean()
#Records['pcChange_highMA'] = ((Records['highMA']-Records['highMA'].shift(1))*100.0)/(HighestHigh-LowestLow)
#Records['lowMA'] = iLow.ewm(span=10, min_periods=1).mean()
#Records['pcChange_lowMA'] = ((Records['lowMA']-Records['lowMA'].shift(1))*100.0)/(HighestHigh-LowestLow)
#Records['closeMA'] = iClose.ewm(span=5, min_periods=1).mean()
#Records['pcChange_closeMA'] = ((Records['closeMA']-Records['closeMA'].shift(1))*100.0)/(HighestHigh-LowestLow)
Records['Ema1']=0; Records['Ema1'] = iHigh.ewm(span=5, min_periods=1).mean()
Records['Ema2']=0; Records['Ema2'] = Records['Ema1'].ewm(span=10, min_periods=1).mean()
Records['hZZMA5'] = Records['Ema1']+(Records['Ema1']-Records['Ema2'])
#Records['hZZMA5'] = Records['hZZMA5'].ewm(span=2, min_periods=1).mean()
Records['slope_hZZMA5'] = ((Records['hZZMA5']-Records['hZZMA5'].shift(1))*100.0)/(HighestHigh-LowestLow)
Records['Ema1']=0; Records['Ema1'] = iLow.ewm(span=5, min_periods=1).mean()
Records['Ema2']=0; Records['Ema2'] = Records['Ema1'].ewm(span=10, min_periods=1).mean()
Records['lZZMA5'] = Records['Ema1']+(Records['Ema1']-Records['Ema2'])
#Records['lZZMA5'] = Records['lZZMA5'].ewm(span=2, min_periods=1).mean()
Records['slope_lZZMA5'] = ((Records['lZZMA5']-Records['lZZMA5'].shift(1))*100.0)/(HighestHigh-LowestLow)
Records['avgZZMA5']=(Records['hZZMA5']+Records['lZZMA5'])/2.0
Records['avgZZMA5slope']= ((Records['avgZZMA5']-Records['avgZZMA5'].shift(1))*100.0)/(HighestHigh-LowestLow)
#Records['Ema1']=0; Records['pEma1'] = iClose.ewm(span=25, min_periods=1).mean()
#Records['Ema2']=0; Records['pEma2'] = Records['pEma1'].ewm(span=25, min_periods=1).mean()
#Records['pZZMA15'] = Records['pEma1']+(Records['pEma1']-Records['pEma2'])
#Records['pcChange_pZZMA15'] = ((Records['pZZMA15']-Records['pZZMA15'].shift(1))*100.0)/(HighestHigh-LowestLow)
Records['PeakHigh']=0
Records['PeakLow']=0
def ClosestPeaksHL(p,m):
nPeakHigh=p
nPeakLow=p
for z in reversed(range(p-m,p)):
if z>m:
if Records['high'][z]>Records['high'][nPeakHigh] and Records['high'][z+1]<=Records['high'][z]: nPeakHigh=z
if Records['low'][z] =Records['low'][z]: nPeakLow=z
if Records['PeakHigh'][nPeakHigh]>0 and Records['high'][Records['PeakHigh'][nPeakHigh]]>Records['high'][nPeakHigh]: nPeakHigh=Records['PeakHigh'][nPeakHigh]
if Records['PeakLow'][nPeakLow]>0 and Records['low'][Records['PeakLow'][nPeakLow]]HighestHigh:
HighestHigh=Records['high'][z]
nHighestHigh=z
return nHighestHigh
def LowestLowWave(b,barsBack):
nLowestLow=b
LowestLow=Records['low'][b]
for z in (range(b-barsBack,b)):#reversed
if Records['low'][z]2 and eslope and (Records['direction'][e-1]=="dn" or Records['direction'][e-1]=="neutral"):
# Peak down move --> up move ...
Records['direction'][e]="up"
nLastLowPeak=LowestLowWave(e,e-nLastPeak)
peaks+=f"L{nLastLowPeak},"
peaksdata.append(["up",nLastLowPeak])
#Peaks['Direction'][nPeaks]="up"
#Peaks['Start'][nPeaks]=nLastLowPeak
#Peaks['End'][nPeaks]=e
#nPeaks=nPeaks+1
for z in range(nLastLowPeak,e+1):
Records['direction'][z]="up"
nLastPeak=e
elif Records['avgZZMA5slope'][e]<-slope and (Records['direction'][e-1]=="up" or Records['direction'][e-1]=="neutral"):
# Peak up move --> down move ...
Records['direction'][e]="dn"
nLastHighPeak=HighestHighWave(e,e-nLastPeak)
peaks+=f"H{nLastHighPeak},"
peaksdata.append(["dn",nLastHighPeak])
#Peaks['Direction'][nPeaks]="dn"
#Peaks['Start'][nPeaks]=nLastHighPeak
#Peaks['End'][nPeaks]=e
#nPeaks=nPeaks+1
for z in range(nLastHighPeak,e+1):
Records['direction'][z]="dn"
nLastPeak=e
else:
Records['direction'][e]=Records['direction'][e-1]
if e==nRecords-2: Records['direction'][e+1]=Records['direction'][e]
Peaks = pd.DataFrame(peaksdata,columns=['Direction','Start'])
#Peaks['End']=Peaks['Start'].shift(1).astype(int,errors='ignore')
#Peaks.replace([np.inf, -np.inf], 0, inplace=True)
#Peaks.replace([np.nan, -np.nan], 0, inplace=True)
Peaks['End']=0
Peaks['wavelength']=0
AvgWaveLength=0
nAvgWaveLength=0
for p in range(0,len(Peaks)):
start=Peaks['Start'][p]
if p0:
AvgWaveLength=AvgWaveLength/nAvgWaveLength
else: AvgWaveLength=0
global avgMomentumWave, avgVolumeWave, HighestMomentumWave, HighestVolumeWave
HighestMomentumWave=0
HighestVolumeWave=0
Peaks['PCwave']=0
Peaks['TakenOut']=0
Peaks['WaveTookOut']=""
for p in range(0,len(Peaks)):
Peaks['PCwave'][p]=round((Peaks['wavelength'][p]*100)/(AvgWaveLength*2))
FoundLow=0
FoundHigh=0
for z in (range(p+1,len(Peaks))): #reversed
#if p==50: hprint(z)
if Peaks['Direction'][p]=="dn" and FoundLow==0: # and Peaks['TakenOut'][z]==0 and Peaks['Direction'][z]=="dn"
CurrentLow=Records['low'][ Peaks['End'][p] ]
FutureHigh=Records['high'][ Peaks['Start'][z] ]
FutureLow=Records['low'][ Peaks['End'][z] ]
#hprint(f"{p} | {z} | {CurrentLow} | {FutureHigh} | {FutureLow}")
if CurrentLow>=FutureLow and CurrentLow<=FutureHigh:
Peaks['TakenOut'][z]=1
FoundN=z
for zn in (range(Peaks['Start'][z],Peaks['End'][z]+1)): #reversed
znHigh=Records['high'][zn]
znLow=Records['low'][zn]
if CurrentLow>=znLow and CurrentLow<=znHigh:
FoundN=zn
break
if FoundN!=z:
Peaks['WaveTookOut'][p]+=f"{z}|{FoundN},"
FoundLow=1
if Peaks['Direction'][p]=="up" and FoundHigh==0: # and Peaks['TakenOut'][z]==0 and Peaks['Direction'][z]=="dn"
CurrentHigh=Records['high'][ Peaks['End'][p] ]
FutureHigh=Records['high'][ Peaks['End'][z] ]
FutureLow=Records['low'][ Peaks['Start'][z] ]
#hprint(f"{p} | {z} | {CurrentLow} | {FutureHigh} | {FutureLow}")
if CurrentHigh>=FutureLow and CurrentHigh<=FutureHigh:
Peaks['TakenOut'][z]=1
FoundN=z
for zn in (range(Peaks['Start'][z],Peaks['End'][z]+1)): #reversed
znHigh=Records['high'][zn]
znLow=Records['low'][zn]
if CurrentHigh>=znLow and CurrentHigh<=znHigh:
FoundN=zn
break
if FoundN!=z:
Peaks['WaveTookOut'][p]+=f"{z}|{FoundN},"
FoundHigh=1
if FoundLow==1 and FoundHigh==1: break
#hprint(f"{Peaks['Start'][p]}..{Peaks['End'][p]} | {Peaks['Direction'][p]} | {Peaks['wavelength'][p]} | {Peaks['PCwave'][p]} | {Peaks['WaveTookOut'][p]}")
#for e in (range(1,nRecords)):
# if e>2:
# if Records['direction'][e]==Records['direction'][e-1]:
# if Records['direction'][e]=="up":
# Records['MomentumWave'][e]=Records['MomentumWave'][e-1]+Records['slope_hZZMA5'][e]
# Records['VolumeWave'][e]=Records['VolumeWave'][e-1]+Records['volume'][e]
# elif Records['direction'][e]=="dn":
# Records['MomentumWave'][e]=Records['MomentumWave'][e-1]-Records['slope_lZZMA5'][e]
# Records['VolumeWave'][e]=Records['VolumeWave'][e-1]-Records['volume'][e]
#hprint(f"{Records['direction'][e-1]}|{Records['direction'][e]} {Records['VolumeWave'][e-1]}")
#SumMomentum=SumMomentum+abs(Records['MomentumWave'][e])
#nSumMomentum=nSumMomentum+1
#SumVolume=SumVolume+abs(Records['VolumeWave'][e])
#nSumVolume=nSumVolume+1
# if Records['direction'][e]!=Records['direction'][e-1]:
# if Records['direction'][e]=="up":
# Records['MomentumWave'][e]=Records['slope_hZZMA5'][e]
# Records['VolumeWave'][e]=Records['volume'][e]
# if Records['direction'][e]=="dn":
# Records['MomentumWave'][e]=Records['slope_lZZMA5'][e]
# Records['VolumeWave'][e]=Records['volume'][e]
#hprint(f"{Records['direction'][e-1]}|{Records['direction'][e]} {Records['VolumeWave'][e-1]}")
# SumMomentum=abs(Records['MomentumWave'][e-1])
# nSumMomentum=nSumMomentum+1
# SumVolume=abs(Records['VolumeWave'][e-1])
# nSumVolume=nSumVolume+1
# if abs(Records['MomentumWave'][e])>HighestMomentumWave: HighestMomentumWave=abs(Records['MomentumWave'][e])
# if abs(Records['VolumeWave'][e])>HighestVolumeWave: HighestVolumeWave=abs(Records['VolumeWave'][e])
avgMomentumWave=0
if nSumMomentum>0:
avgMomentumWave=SumMomentum/nSumMomentum
avgVolumeWave=0
if nSumVolume>0:
avgVolumeWave=SumVolume/nSumVolume
hprint(f"{avgMomentumWave} | {avgVolumeWave}")
#ax = Records['high'].plot(figsize=(150, 7))
#Records['hZZMA5'].plot(ax=ax)
#Records['low'].plot(ax=ax)
#Records['lZZMA5'].plot(ax=ax)
#Records['avglhZZMA5'].plot(ax=ax)
#plt.savefig(f'{dir}/pZZMA5plot.png')
#print(f"
")
Records['spread']=(iHigh-iLow)
Records['spreadMA'] = Records['spread'].ewm(span=10, min_periods=1).mean()
Records['gain']=(iClose-iPrevClose)
Records['gainMA'] = Records['gain'].abs().ewm(span=10, min_periods=1).mean()
global StrongPriceBars
StrongPriceBars= pd.DataFrame(columns=['Direction','Start'])
StrongPriceBars['TakenOut']=0
#for e in (range(1,nRecords)):
include(f"{dir}/py/incl-directionMap2.py")
sys.exit()
Records['volMAFWD'] = iVolume.ewm(span=vMAperiod, min_periods=1).mean()
#Records['VolumeWave'] = Records['volume']
#hprint(Records['pZZMA15'])
ReverseRecords = pd.DataFrame()
ReverseRecords['volume'] = iVolume[::-1]
ReverseRecords['volMAREV'] = ReverseRecords['volume'].ewm(span=vMAperiod, min_periods=1).mean()
RevRevRecords = pd.DataFrame()
RevRevRecords['volMAREV'] = ReverseRecords['volMAREV'][::-1]
Records['volMAREV'] = RevRevRecords['volMAREV']
Records['volMA']=(Records['volMAFWD']+Records['volMAREV'])/2
Records['VolumePerTick']=iVolume/(iHigh-iLow)
Records['VolumePerTickMA'] = Records['VolumePerTick'].ewm(span=5, min_periods=1).mean()
iZZMA5=Records['pZZMA5']
iZZMA15=Records['pZZMA15']
iVolMA=Records['volMA']
iVolumePerTick=Records['VolumePerTick']
iVolumePerTickMA=Records['VolumePerTickMA']
iSpread=Records['spread']
iSpreadMA=Records['spreadMA']
iGain=Records['gain']
iGainMA=Records['gainMA']
global iEffortPricePerTick,iEffortVolPerTick,iEffortPrice,iEffortVol
Records['EffortPricePerTick'] =((iVolumePerTick/iVolumePerTickMA)*iSpreadMA) #if ((iVolumePerTick/iVolumePerTickMA)*iSpreadMA)<(iSpread*2) else (iSpread*2)
Records['EffortVolPerTick'] =((iSpread/iSpreadMA)*iVolumePerTickMA)
Records['EffortPrice']=((iVolume/iVolMA)*iSpreadMA) #if ((iVolume/iVolMA)*iSpreadMA)<(iSpread*2) else (iSpread*2)
Records['EffortVol']=((iSpread/iSpreadMA)*iVolMA)
iEffortPricePerTick=Records['EffortPricePerTick']
iEffortVolPerTick=Records['EffortVolPerTick']
iEffortPrice=Records['EffortPrice']
iEffortVol=Records['EffortVol']
global iVolSpreadHigh,iVolSpreadLow,iVolColor
Records['VolSpreadHigh']=0
Records['VolSpreadLow']=0
Records['VolSpreadHighPerTick']=0
Records['VolSpreadLowPerTick']=0
Records['volColor']="255|255|255"
Records['VolSpreadLowTO']=0
Records['VolSpreadHighTO']=0
iVolSpreadLow=Records['VolSpreadLow']
iVolSpreadHigh=Records['VolSpreadHigh']
iVolSpreadLowPerTick=Records['VolSpreadLowPerTick']
iVolSpreadHighPerTick=Records['VolSpreadHighPerTick']
def CheckInfNAN(x,ret):
if x == float('inf') or x == float('-inf'):
return ret
return float(x)
Records.replace([np.inf, -np.inf], 0, inplace=True)
Records.replace([np.nan, -np.nan], 0, inplace=True)
#hprint(iSpreadMA[nRecords-10])
#nRecords-500
global dataOut
dataOut="["
VolumeWave=0
direction="up"
def VolumeColor(v,d):
if d=="up":
if v>=200: return "0,255,0"
elif v>=150: return "0,225,0"
elif v>=100: return "0,215,0"
elif v>=95: return "0,200,0"
elif v>=90: return "0,190,0"
elif v>=85: return "0,180,0"
elif v>=80: return "0,170,0"
elif v>=75: return "0,160,0"
elif v>=70: return "0,150,0"
elif v>=65: return "0,140,0"
elif v>=60: return "0,130,0"
elif v>=55: return "0,120,0"
elif v>=50: return "0,100,0"
elif v>=45: return "50,100,255"
elif v>=40: return "75,140,255"
elif v>=35: return "100,160,255"
elif v>=30: return "125,180,255"
elif v>=25: return "150,200,255"
elif v>=20: return "175,220,255"
elif v>=15: return "200,240,255"
elif v>=10: return "225,250,255"
else: return "255,255,255"
elif d=="dn":
if v>=200: return "255,0,0"
elif v>=150: return "225,0,0"
elif v>=100: return "215,0,0"
elif v>=95: return "200,0,0"
elif v>=90: return "190,0,0"
elif v>=85: return "180,0,0"
elif v>=80: return "170,0,0"
elif v>=75: return "160,0,0"
elif v>=70: return "150,0,0"
elif v>=65: return "140,0,0"
elif v>=60: return "130,0,0"
elif v>=55: return "120,0,0"
elif v>=50: return "100,0,0"
elif v>=45: return "255,100,100"
elif v>=40: return "255,120,120"
elif v>=35: return "255,140,140"
elif v>=30: return "255,160,160"
elif v>=25: return "255,180,180"
elif v>=20: return "255,200,200"
elif v>=15: return "255,225,225"
elif v>=10: return "255,240,255"
else: return "255,255,255"
else: return "255,255,255"
global n, vsa
vsa = pd.DataFrame(index=np.arange(nRecords))
global UpBar,DnBar,NewHi,NewLo,NewHi10,NewLo10,RecentHigh,RecentLow
UpBar = [0 for i in range(nRecords)] #pd.DataFrame(index=np.arange(nRecords))
DnBar = [0 for i in range(nRecords)] #pd.DataFrame(index=np.arange(nRecords))
NewHi = [0 for i in range(nRecords)] #pd.DataFrame(index=np.arange(nRecords))
NewLo = [0 for i in range(nRecords)] #pd.DataFrame(index=np.arange(nRecords))
NewHi10 = [0 for i in range(nRecords)] #pd.DataFrame(index=np.arange(nRecords))
NewLo10 = [0 for i in range(nRecords)] #pd.DataFrame(index=np.arange(nRecords))
RecentHigh = [0 for i in range(nRecords)] #pd.DataFrame(index=np.arange(nRecords))
RecentLow = [0 for i in range(nRecords)] #pd.DataFrame(index=np.arange(nRecords))
global UltraHighBar, VeryHighBar, HighBar, LowBar, VeryLowBar
UltraHighBar = pd.DataFrame(index=np.arange(nRecords))
VeryHighBar = pd.DataFrame(index=np.arange(nRecords))
HighBar = pd.DataFrame(index=np.arange(nRecords))
LowBar = pd.DataFrame(index=np.arange(nRecords))
VeryLowBar = pd.DataFrame(index=np.arange(nRecords))
global vPerTick, vVolume, pSpread, pGain
for n in range(1,nRecords):
#print(Records['pZZMA5slope'][n])
xEffortPrice=CheckInfNAN(iEffortPrice[n],0)
if xEffortPrice>iSpread[nRecords-10]*2: xEffortPrice=iSpread[nRecords-10]*2
if(iZZMA5[n]>=iZZMA5[n-1]):
iVolSpreadLow[n]=iHigh[n]
iVolSpreadHigh[n]=iLow[n]+xEffortPrice
iVolSpreadLowPerTick[n]=iHigh[n]
iVolSpreadHighPerTick[n]=iLow[n]+CheckInfNAN(iEffortPricePerTick[n],0)
else:
iVolSpreadHigh[n]=iLow[n]
iVolSpreadLow[n]=iHigh[n]-xEffortPrice
iVolSpreadHighPerTick[n]=iLow[n]
#hprint(f"[{n}] | [{iHigh[n]}] | [{iEffortPricePerTick[n]}]")
iVolSpreadLowPerTick[n]=iHigh[n]-CheckInfNAN(iEffortPricePerTick[n],0)
VolSpreadLowTO=0
VolSpreadHighTO=0
if n>nRecords-500:
if(iVolSpreadLow[n]iHigh[n]):
if(abs(CheckInfNAN(iEffortPrice[n],0))>iSpreadMA[nRecords-10]):
zbreak=0
LL="-"
HH="-"
for z in range(n+1,nRecords): #(int z=n+1; z=iLow[z] and iVolSpreadLow[n]<=iHigh[z]) or iLow[z]<=iVolSpreadLow[n]):
LL="X"
VolSpreadLowTO=z
zbreak=zbreak+1
if VolSpreadHighTO==0:
if( (iVolSpreadHigh[n]>=iLow[z] and iVolSpreadHigh[n]<=iHigh[z]) or iHigh[z]>=iVolSpreadHigh[n]):
HH="X"
VolSpreadHighTO=z
zbreak=zbreak+1
#if(z==nRecords and VolSpreadLowTO==n): VolSpreadLowTO=nRecords
#if(z==nRecords and VolSpreadHighTO==n): VolSpreadHighTO=nRecords
#if n>nRecords-50:
# hprint(f"{n}>{z} [{LL}] [{VolSpreadLowTO}] {iVolSpreadLow[n]} [{iLow[z]}..{iHigh[z]}] {iVolSpreadHigh[n]} [{VolSpreadHighTO}] [{HH}]")
if z==nRecords-1:
#hprint("====================================")
#hprint(f"{n} | {VolSpreadLowTO} | {VolSpreadHighTO}")
if VolSpreadLowTO==0: VolSpreadLowTO=nRecords+2
if VolSpreadHighTO==0: VolSpreadHighTO=nRecords+2
#hprint(f"{n} | {VolSpreadLowTO} | {VolSpreadHighTO}")
if zbreak==2:
#hprint("+++++++++++++++++++++++++++++++++++++")
if VolSpreadLowTO-n>1 or VolSpreadHighTO-n>1:
if not VolSpreadLowTO-n>1: VolSpreadLowTO=n
if not VolSpreadHighTO-n>1: VolSpreadHighTO=n
#hprint(f"{n}>{z} [{VolSpreadLowTO-n}] [{VolSpreadLowTO}] {iVolSpreadLow[n]} [{iLow[z]}..{iHigh[z]}] {iVolSpreadHigh[n]} [{TOH}] [{TOH-n}]")
break
if VolSpreadLowTO==0: VolSpreadLowTO=n
if VolSpreadHighTO==0: VolSpreadHighTO=n
Records['VolSpreadLowTO'][n]=VolSpreadLowTO
Records['VolSpreadHighTO'][n]=VolSpreadHighTO
#if(out==ArraySize): DrawDOMRectangles(sc,DrawingTool,nXline++,n,pLow[n],TO,VolSpreadLow,RGB(0,green,0),50,0,RGB(0,green,0),0);
#else: DrawDOMRectangles(sc,DrawingTool,nXline++,n,pLow[n],TO,VolSpreadLow,RGB(red,0,0),50,0,RGB(red,0,0),0);
#DrawDOMLine(sc,DrawingTool,nXline++,n,VolSpreadLow,n,VolSpreadHigh,Transparency(0,200,0,60),LINESTYLE_SOLID,bz,Above,0);//10 sc.ChartBarSpacing
#DrawDOMMarker(sc,DrawingTool,nXline++,n,VolSpreadLow,Transparency(0,200,0,30),MARKER_POINT,3,3,false,0);
#//DrawDOMRectangles(sc,DrawingTool,nXline++,n,VolSpreadLow,n+1,VolSpreadHigh,RGB(150,150,150),80,0,RGB(150,150,150),0);
#if(VolSpreadHigh-pHigh[n]>sc.TickSize){
#if(out==sc.ArraySize-1) DrawDOMRectangles(sc,DrawingTool,nXline++,n,pHigh[n],TO,VolSpreadHigh,RGB(red,0,0),50,0,RGB(red,0,0),0);
#else DrawDOMRectangles(sc,DrawingTool,nXline++,n,pHigh[n],TO,VolSpreadHigh,RGB(0,green,0),50,0,RGB(0,green,0),0);
#DrawDOMLine(sc,DrawingTool,nXline++,n,VolSpreadLow,n,VolSpreadHigh,Transparency(200,0,0,60),LINESTYLE_SOLID,bz,Above,0);//10 sc.ChartBarSpacing
#DrawDOMMarker(sc,DrawingTool,nXline++,n,VolSpreadHigh,Transparency(200,0,0,30),MARKER_POINT,3,3,false,0);
#//DrawDOMRectangles(sc,DrawingTool,nXline++,n,VolSpreadLow,n+1,VolSpreadHigh,RGB(150,150,150),80,0,RGB(150,150,150),0);
if n=iZZMA15[n]:
VolumeWave=VolumeWave+iVolume[n]
elif direction=="dn" and iZZMA15[n+1]>iZZMA15[n]:
VolumeWave=iVolume[n]
direction="up"
elif direction=="dn" and iZZMA15[n+1]<=iZZMA15[n]:
VolumeWave=VolumeWave-iVolume[n]
elif direction=="up" and iZZMA15[n+1]