project:: #bibasCopy
# Импорт
Для начала импортим все что нужно
```python
from decisionManager_v2 import *
from indicators_v2 import *
from signals_v2 import *
```

Подготавливаем данные по которым собирется модель. Модель представляет из себя словарь в следующем формате:
```json
{
	'название_cигнала_1':{
		'className': класс_сигнала_1,
		'params': { параметры_для_сигнала_1 },
		'indicators':{
			'название_индикатора_1':{
				'className': класс_индикатора_1,
				'params': { параметры_для_индикатора_1 }
			},
			'название_индикатора_2':{
				'className': класс_индикатора_2,
				'params': { параметры_для_индикатора_2 }
			},			
		}
	},
	'название_cигнала_2':{
		'className': класс_сигнала_2,
		'params': { параметры_для_сигнала_2 },
		'indicators':{
			'название_индикатора_1':{
				'className': класс_индикатора_1,
				'params': { параметры_для_индикатора_1 }
			},
			'название_индикатора_3':{
				'className': класс_индикатора_3,
				'params': { параметры_для_индикатора_3 }
			},			
		}
	
	},	
}
```

Пример такого словаря, который будет дальше использоваться 
```python
sigAgrReq = {
    'sig_BB':{
        'className':sig_BB,
        'params':{'source':'close','target':'close'},
        'indicators':{
            'ind_BB':{
                'className':ind_BB,
                'params':{'MeanType':'SMA','window':30,'valueType':'close','kDev':2.5}
            }            
        }
    },
    'sig_BB_2':{
        'className':sig_BB,
        'params':{'source':'close','target':'close'},
        'indicators':{
            'ind_BB':{
                'className':ind_BB,
                'params':{'MeanType':'SMA','window':30,'valueType':'close','kDev':2}
            }            
        }
    }
}
```

Далее нужно создать объект класса decisionManager_v2,  например с именем "Pipa"
```python
test = decsionManager('Pipa', sigAgrReq)
```

# Ретро
## Описание
Ретро-тестирование нужно для
1. Проверки сигналов
2. Проверки параметров сигналов и индикаторов
3. Создания вероятностной матрицы решений

## Получение данных
Для ретро-тестирования нужны данные в следующем формате

|     | date                      | open    | close   | high    | low     |
| --- | ------------------------- | ------- | ------- | ------- | ------- |
| 0   | 2020-09-01 03:00:00+03:00 | 1.19370 | 1.19388 | 1.19391 | 1.19368 |
| 1   | 2020-09-01 03:00:05+03:00 | 1.19370 | 1.19388 | 1.19391 | 1.19383 |
| ... | ...                       | ...     | ...     | ...     | ...     |
 
Данные сохраняются в DataFrame

```python
import pandas as pd

df_candle = pd.read_csv("data.csv")
```

## Шиблон загрузки данных
Для  ретро-тестирования необходимо задать, в каком формате будут приходить данные. Шаблон должен быть в следующем формате
```json
{
    'имя_сигнала_1':{
        'signalData': None,
        'indicatorData' :{'имя_индикатора_1': None, 'имя_индикатора_2': None}
    },
    'имя_сигнала_2':{
        'signalData': None,
        'indicatorData' :{'имя_индикатора_3': None}
    }
```

Пример шаблона который дальше будет использоваться
```python
sigAgrRetroTemplate = {
    'sig_BB':{
        'signalData': None,
        'indicatorData' :{'ind_BB': None}
    },
    'sig_BB_2':{
        'signalData': None,
        'indicatorData' :{'ind_BB': None}
    }     
}
```

## Получение результатов
Для получение результаов нужно задать размер скользящего окна. В примере ниже он равен 40. Так же нужно указать шаблон и какие данные нужно падать на вход.
```python
retroAns = test.getRetroTrendAns(sigAgrRetroTemplate,df_candle[:5000],40)
```

Результатом будет словарь в формате 
```json
{
	'signalsAns':[
		{'sig_BB': 'none', 'sig_BB_2': 'none'},
		{'sig_BB': 'none', 'sig_BB_2': 'down'},
		],
	'rightAns':['up','down']

}
```

В signalsAns находится список из ответов сигналов для каждого окна
В rightAns находится список верных решений для этих окон
Возможные решения
- none - не изменится
- up - вверх
- down - вниз

## Вероятностная матрица решений
### Описание
Вероятностная матрица решения - таблица, с помощью которой по заданным ответов сигналов можно опрделить вероятность исходов
Фомат матрицы для 2ух сигналов
|               |               | up  | none | donw |
| ------------- | ------------- | --- | ---- | ---- |
| имя_сигнала_1 | имя_сигнала_2 |     |      |      |
| up            | up            |     |      |      |
| up            | none          |     |      |      |
| up            | donw          |     |      |      |
| none          | up            |     |      |      |
| none          | none          |     |      |      |
| none          | donw          |     |      |      |
| donw          | up            |     |      |      |
| donw          | none          |     |      |      |
| donw          | donw          |     |      |      |

### Генерация
Для расчета вероятностной матрицы решений необходим передать словарь с ретро-ответами
```python
test.generateMatrixProbabilityFromDict(retroAns)
```
## Итоговый код
```python
from decisionManager_v2 import *
from indicators_v2 import *
from signals_v2 import *
import pandas as pd


df_candle = pd.read_csv("data.csv")


sigAgrReq = {
    'sig_BB':{
        'className':sig_BB,
        'params':{'source':'close','target':'close'},
        'indicators':{
            'ind_BB':{
                'className':ind_BB,
                'params':{'MeanType':'SMA','window':30,'valueType':'close','kDev':2.5}
            }            
        }
    },
    'sig_BB_2':{
        'className':sig_BB,
        'params':{'source':'close','target':'close'},
        'indicators':{
            'ind_BB':{
                'className':ind_BB,
                'params':{'MeanType':'SMA','window':30,'valueType':'close','kDev':2}
            }            
        }
    }
}

sigAgrRetroTemplate = {
    'sig_BB':{
        'signalData': None,
        'indicatorData' :{'ind_BB': None}
    },
    'sig_BB_2':{
        'signalData': None,
        'indicatorData' :{'ind_BB': None}
    }     
}


test = decsionManager('Pipa', sigAgrReq)


retroAns = test.getRetroTrendAns(sigAgrRetroTemplate,df_candle[:5000],40)


test.generateMatrixProbabilityFromDict(retroAns)

```

# Онлайн ответ
## Условия
Для работы онлай ответа неоходимо, чтобы были определны
1. dealManager
2. trandeVoter
3. riskManager
4. signalAgrigator
## Запуск
Для запуска нужно передать в метод текущую цену и данные, на основе которыйх будут рассчитаны сигналы и индикаторы в следующем формате
```json
{
    'sig_BB':{
        'signalData': data,
        'indicatorData' :{'ind_BB': data}
    },
    'sig_BB_2':{
        'signalData': data,
        'indicatorData' :{'ind_BB': data}
    }     
}
```
Пример словаря, который будет использорваться дальше
```python
sigAgrData = {
    'sig_BB':{
        'signalData': df_candle[990:1000],
        'indicatorData' :{'ind_BB': df_candle[:1000]}
    },
    'sig_BB_2':{
        'signalData': df_candle[990:1000],
        'indicatorData' :{'ind_BB': df_candle[:1000]}
    }    
}
```

Далее передам значения в мето 
```python
test.getOnlineAns(sigAgrData, 0.0)
```
и получаем ответ в формате
```json
{'decision': 'none'}
```
# Дампы

Сохранение объекта
```python
test.createDump('pupa')
```
По итогу выполнения создается файл в текущей директории с названием data_pupa.pickle

Загруיזть объеקт можно следующим образом
```python
import pickle

with open('C:\\Users\\Redsandy\\PyProj\\Trade\\MVP\\data_pupa.pickle', 'rb') as f:
    data_new = pickle.load(f)
```
