Skip to content

Commit

Permalink
Merge pull request #14 from kohestanimahdi/master
Browse files Browse the repository at this point in the history
Add P/E group, Value Of Market and fixed bus in pe
  • Loading branch information
miladj committed Jun 4, 2021
2 parents a48d62e + b161349 commit 0453002
Show file tree
Hide file tree
Showing 5 changed files with 112 additions and 92 deletions.
142 changes: 80 additions & 62 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,38 +1,38 @@
دریافت اطلاعات سایت
http://www.tsetmc.com


بروز رسانی اطلاعات نماد

```python
pytse.read_symbols()
```

بروز رسانی اطلاعات حقیقی حقوقی

```python
pytse.read_client_type()
```
پر شدن مقادیر میانگین حجم ماه و سهام شناور

پر شدن مقادیر میانگین حجم ماه و سهام شناور

بر روی آبجکت نماد باید فراخوانی شود مانند مثال پایین

```python
fill_data()
```


دریافت تاریخچه اطلاعات معاملاتی نماد(اطلاعات در خروجی متد قابل دریافت است)

```python
get_symbol_history()
```



```
pip install pytse
```

This is a http://www.tsetmc.com data crawler.


```python
from pytse.pytse import PyTse,SymbolData

Expand All @@ -42,7 +42,7 @@ if(__name__=="__main__"):
pytse=PyTse()#read_symbol_data=True,read_client_type=False
pytse.read_client_type() # در صورت نیاز به اطلاعات حقیقی
symbols=pytse.symbols_data
symbol=symbols["IRO1MKBT0001"]
symbol=symbols["IRO1MKBT0001"]
symbol.fill_data() #درصورت نیاز به اطلاعات "میانگین حجم ماه "و "سهام شناور" فرخوانی شود
symbol_history_data=symbol.get_symbol_history()
print(symbol_history_data["20210106"])
Expand All @@ -52,65 +52,83 @@ if(__name__=="__main__"):
print(symbol["ct"]["Buy_CountI"]) #fill_data()

```

You can refresh data by calling read_symbols

```python
pytse.read_symbols()
```
Read Client Type

Read Client Type

```python
pytse.read_client_type()
```
||||
|--- |--- |--- |
|فیلد|توضیح||
|l18|نماد||
|l30|نام||
|tno|تعداد معاملات||
|tvol|حجم معاملات||
|tval|ارزش معاملات||
|py|قیمت دیروز||
|pf|اولین قیمت||
|pmin|کمترین قیمت||
|pmax|بیشترین قیمت||
|pl|آخرین قیمت||
|plc|تغییر آخرین قیمت||
|plp|درصد تغییر آخرین قیمت||
|pc|قیمت پایانی||
|pcc|تغییر قیمت پایانی||
|pcp|درصد تغییر قیمت پایانی||
|eps|eps||
|pe|p/e||
|tmin|آستانه مجاز پایین||
|tmax|آستانه مجاز بالا||
|z|تعداد سهام||
|mv|ارزش بازار||
|pd1|قیمت خرید - سطر اول||
|zd1|تعداد خریدار - سطر اول||
|qd1|حجم خرید- سطر اول||
|po1|قیمت فروش - سطر اول||
|zo1|تعداد فروشنده - سطر اول||
|qo1|حجم فروش- سطر اول||
|pd2|قیمت خرید - سطر دوم||
|zd2|تعداد خریدار - سطر دوم||
|qd2|حجم خرید- سطر دوم||
|po2|قیمت فروش - سطر دوم||
|zo2|تعداد فروشنده - سطر دوم||
|qo2|حجم فروش- سطر دوم||
|pd3|قیمت خرید - سطر سوم||
|zd3|تعداد خریدار - سطر سوم||
|qd3|حجم خرید- سطر سوم||
|po3|قیمت فروش - سطر سوم||
|zo3|تعداد فروشنده - سطر سوم||
|qo3|حجم فروش- سطر سوم||
|bvol|حجم مبنا||
|cs|گروه صنعت||
|ct.Buy_CountI|تعداد خریدار حقیقی|با فراخوانی متد read_client_type|
|ct.Buy_CountN|تعداد خریدار حقوقی|با فراخوانی متد read_client_type|
|ct.Buy_I_Volume|حجم خرید حقیقی|با فراخوانی متد read_client_type|
|ct.Buy_N_Volume|حجم خرید حقوقی|با فراخوانی متد read_client_type|
|ct.Sell_CountI|تعداد فروشنده حقیقی|با فراخوانی متد read_client_type|
|ct.Sell_CountN|تعداد فروشنده حقوقی|با فراخوانی متد read_client_type|
|ct.Sell_I_Volume|حجم فروش حقیقی|با فراخوانی متد read_client_type|
|ct.Sell_N_Volume|حجم فروش حقوقی|با فراخوانی متد read_client_type|
|QTotTran5JAvg|میانگین حجم ماه|با فراخوانی متد fill_data|
|KAjCapValCpsIdx|سهام شناور|با فراخوانی متد fill_data|

| | | |
| ---------------- | ------------------------- | -------------------------------- |
| فیلد | توضیح | |
| l18 | نماد | |
| l30 | نام | |
| tno | تعداد معاملات | |
| tvol | حجم معاملات | |
| tval | ارزش معاملات | |
| py | قیمت دیروز | |
| pf | اولین قیمت | |
| pmin | کمترین قیمت | |
| pmax | بیشترین قیمت | |
| pl | آخرین قیمت | |
| plc | تغییر آخرین قیمت | |
| plp | درصد تغییر آخرین قیمت | |
| pc | قیمت پایانی | |
| pcc | تغییر قیمت پایانی | |
| pcp | درصد تغییر قیمت پایانی | |
| eps | eps | |
| pe | p/e | |
| tmin | آستانه مجاز پایین | |
| tmax | آستانه مجاز بالا | |
| z | تعداد سهام | |
| mv | ارزش بازار | |
| pd1 | قیمت خرید - سطر اول | |
| zd1 | تعداد خریدار - سطر اول | |
| qd1 | حجم خرید- سطر اول | |
| po1 | قیمت فروش - سطر اول | |
| zo1 | تعداد فروشنده - سطر اول | |
| qo1 | حجم فروش- سطر اول | |
| pd2 | قیمت خرید - سطر دوم | |
| zd2 | تعداد خریدار - سطر دوم | |
| qd2 | حجم خرید- سطر دوم | |
| po2 | قیمت فروش - سطر دوم | |
| zo2 | تعداد فروشنده - سطر دوم | |
| qo2 | حجم فروش- سطر دوم | |
| pd3 | قیمت خرید - سطر سوم | |
| zd3 | تعداد خریدار - سطر سوم | |
| qd3 | حجم خرید- سطر سوم | |
| po3 | قیمت فروش - سطر سوم | |
| zo3 | تعداد فروشنده - سطر سوم | |
| qo3 | حجم فروش- سطر سوم | |
| pd4 | قیمت خرید - سطر چهارم | |
| zd4 | تعداد خریدار - سطر چهارم | |
| qd4 | حجم خرید- سطر چهارم | |
| po4 | قیمت فروش - سطر چهارم | |
| zo4 | تعداد فروشنده - سطر چهارم | |
| qo4 | حجم فروش- سطر چهارم | |
| pd5 | قیمت خرید - سطر پنجم | |
| zd5 | تعداد خریدار - سطر پنجم | |
| qd5 | حجم خرید- سطر پنجم | |
| po5 | قیمت فروش - سطر پنجم | |
| zo5 | تعداد فروشنده - سطر پنجم | |
| qo5 | حجم فروش- سطر پنجم | |
| bvol | حجم مبنا | |
| cs | گروه صنعت | |
| ct.Buy_CountI | تعداد خریدار حقیقی | با فراخوانی متد read_client_type |
| ct.Buy_CountN | تعداد خریدار حقوقی | با فراخوانی متد read_client_type |
| ct.Buy_I_Volume | حجم خرید حقیقی | با فراخوانی متد read_client_type |
| ct.Buy_N_Volume | حجم خرید حقوقی | با فراخوانی متد read_client_type |
| ct.Sell_CountI | تعداد فروشنده حقیقی | با فراخوانی متد read_client_type |
| ct.Sell_CountN | تعداد فروشنده حقوقی | با فراخوانی متد read_client_type |
| ct.Sell_I_Volume | حجم فروش حقیقی | با فراخوانی متد read_client_type |
| ct.Sell_N_Volume | حجم فروش حقوقی | با فراخوانی متد read_client_type |
| QTotTran5JAvg | میانگین حجم ماه | با فراخوانی متد fill_data |
| KAjCapValCpsIdx | سهام شناور | با فراخوانی متد fill_data |
| SectorPE | P/E گروه | با فراخوانی متد fill_data |
29 changes: 15 additions & 14 deletions pytse/pytse.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

class SymbolData:
__regex = re.compile(
r"(QTotTran5JAvg\=\'(?P<QTotTran5JAvg>\d+)\')|(KAjCapValCpsIdx\=\'(?P<KAjCapValCpsIdx>\d+)\')")
r"(QTotTran5JAvg\=\'(?P<QTotTran5JAvg>\d+)\')|(KAjCapValCpsIdx\=\'(?P<KAjCapValCpsIdx>\d+)\')|(SectorPE\=\'(?P<SectorPE>\d+.\d+)\')")

def __init__(self):
super().__init__()
Expand All @@ -32,11 +32,12 @@ def get_symbol_history(self, use_cache=True):
return self["symbol_history"]
symbol_history_raw = rq.get(
SYMBOL_HISTORY_URL.format(inscode=self.inscode), timeout=PyTse.request_timeout).text
data = filter(lambda x: len(x) > 11, map(lambda row: row.split(","), symbol_history_raw.split("\r\n")[1:]))
data = filter(lambda x: len(x) > 11, map(
lambda row: row.split(","), symbol_history_raw.split("\r\n")[1:]))
parsed_data = dict(
map(lambda x: (x[1],{"Date": x[1], "FIRST": float(x[2]), "HIGH": float(x[3]), "LOW": float(x[4]), "CLOSE": float(x[5]), "VALUE": float(x[6]),
map(lambda x: (x[1], {"Date": x[1], "FIRST": float(x[2]), "HIGH": float(x[3]), "LOW": float(x[4]), "CLOSE": float(x[5]), "VALUE": float(x[6]),
"VOL": float(x[7]),
"OPENINT": float(x[8]), "PER": x[9], "OPEN": float(x[10]), "LAST": float(x[11])}),
"OPENINT": float(x[8]), "PER": x[9], "OPEN": float(x[10]), "LAST": float(x[11])}),
data))
self["symbol_history"] = parsed_data
return parsed_data
Expand Down Expand Up @@ -114,8 +115,8 @@ def __parse_symbol_data(self, symbol_raw_data):
symbol.plc = 0 if symbol.tno == 0 else int(symbol.pl) - symbol.py
symbol.plp = 0 if symbol.tno == 0 else round(
100 * symbol.plc / symbol.py, 2)
symbol.pe = "" if not symbol.eps else round(
100 * symbol.pc / symbol.eps, 2)
symbol.pe = "" if not symbol.eps else round(symbol.pc / symbol.eps, 2)
symbol.mv = int(symbol.z) * symbol.pc
return symbol

def __merge_symbol_data(self, symbol_data, best_limit):
Expand Down Expand Up @@ -160,21 +161,21 @@ def read_client_type(self):
if cols[0] in self.__symbols_data_by_id:
self.__symbols_data_by_id[cols[0]].ct = SymbolData()
self.__symbols_data_by_id[cols[0]
].ct["Buy_CountI"] = int(cols[1])
].ct["Buy_CountI"] = int(cols[1])
self.__symbols_data_by_id[cols[0]
].ct["Buy_CountN"] = int(cols[2])
].ct["Buy_CountN"] = int(cols[2])
self.__symbols_data_by_id[cols[0]
].ct["Buy_I_Volume"] = int(cols[3])
].ct["Buy_I_Volume"] = int(cols[3])
self.__symbols_data_by_id[cols[0]
].ct["Buy_N_Volume"] = int(cols[4])
].ct["Buy_N_Volume"] = int(cols[4])
self.__symbols_data_by_id[cols[0]
].ct["Sell_CountI"] = int(cols[5])
].ct["Sell_CountI"] = int(cols[5])
self.__symbols_data_by_id[cols[0]
].ct["Sell_CountN"] = int(cols[6])
].ct["Sell_CountN"] = int(cols[6])
self.__symbols_data_by_id[cols[0]
].ct["Sell_I_Volume"] = int(cols[7])
].ct["Sell_I_Volume"] = int(cols[7])
self.__symbols_data_by_id[cols[0]
].ct["Sell_N_Volume"] = int(cols[8])
].ct["Sell_N_Volume"] = int(cols[8])

def read_symbols(self):
page_body = self.__get_data_from_server(BASE_URL)
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
setuptools.setup(
name="pytse",
author="Milad Jahromi",
version="1.5.0",
version="1.6.0",
long_description=Path("README.md").read_text(),
long_description_content_type='text/markdown',
description="A small web crawler for tsetmc.com",
Expand Down
2 changes: 1 addition & 1 deletion tests/sampledata.txt

Large diffs are not rendered by default.

29 changes: 15 additions & 14 deletions tests/test_response.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,25 @@

from pytse.pytse import PyTse,SymbolData
from pytse.pytse import PyTse, SymbolData
from unittest.mock import patch
from pathlib import Path
from nose.tools import assert_equal,assert_is_not_none,assert_is_instance
from nose.tools import assert_equal, assert_is_not_none, assert_is_instance


def test_server_response():

with patch('pytse.pytse.PyTse._PyTse__get_data_from_server') as mock_get:
mock_get.return_value=Path("tests/sampledata.txt").read_text()
pytse=PyTse()
symbols=pytse.symbols_data
symbol=symbols["IRO1NIKI0001"]

mock_get.return_value = Path("tests/sampledata.txt").read_text()

pytse = PyTse()
symbols = pytse.symbols_data
symbol = symbols["IRO1TAMN0001"]
print(symbol)
assert_is_not_none(symbol)
assert_is_instance(symbol,SymbolData)
assert_equal(symbol.tvol,8566607)
assert_equal(symbol.pmax,11396)
assert_equal(symbol.pmin,10570)
assert_is_instance(symbol, SymbolData)
assert_equal(symbol.tvol, 8566607)
assert_equal(symbol.pmax, 11396)
assert_equal(symbol.pmin, 10570)
assert_equal(symbol.pe, 6.01)
assert_equal(symbol.mv, 1452660000000000)
assert False


0 comments on commit 0453002

Please sign in to comment.