function ninetwork()
global price isRunning

data = price
csv_data=csvread('test.csv');
csv_data=csv_data(1:end,:);
%data = csv_data(:,1); %uncomment to test test.csv


%Нормировка
max_data = max(abs(data));
data = data / max_data;

hid_nn=10;  %Число нейронов в скрытом слое

tr_epoch = 2000; %Число итераций обучения


n=10; %Количество элементов, которые участвуют в вычислении прогноза
last_t=30; %Количество первых элементов, по которым обучается сеть

Xt=[];
Yt=[];

%Создются матрицы для настройки нейронной сети

for i=1:last_t-n-1
Xt(i,1:n+1)=data(i:i+n);
Yt(i)=data(i+n+1);
end

numInputs = size(Xt,2); % Кол-во входов
numLayers = 3;        % Кол-во слоев
biasConnect = zeros(numLayers,1); % К каким слоям нужен биас
biasConnect(1)=1;  %Включаем смещения в первом слое
biasConnect(2)=1;  %Включаем смещения в втором слое
inputConnect = zeros(numLayers,numInputs); % К каким слоям какие входы подключены
inputConnect(1,:) = ones(1,numInputs); % В данном случае все входы подкл к первому слою
layerConnect = zeros(numLayers,numLayers); % К каким слоям какие слои подключены. 
layerConnect(2,1) = 1; %Первый подключен ко второму
layerConnect(3,2) = 1; %Второй подключен ко третьему
outputConnect = zeros(1,numLayers);  % Куда подключены выходы  
outputConnect(3) = 1; % Все к третьему
net = network(numInputs,numLayers,biasConnect,inputConnect,...  %Создаем сеть
layerConnect,outputConnect);

% Inputs диапазон входных значений
for k=1:numInputs 
net.inputs{k}.range =[0 1];
end
% Тип активационной функции
net.layers{1}.transferFcn = 'logsig'; % Дляслоя 1
net.layers{2}.transferFcn = 'logsig'; % Дляслоя 2
net.layers{3}.transferFcn = 'purelin'; % Дляслоя 3
net.layers{1}.size=hid_nn;  
net.layers{2}.size=hid_nn;

% Input weights
for k=1:numInputs
net.IW{1,k} = rand(hid_nn,1);  %Устанавливаем случайные биасы и коэффициенты в входном слое
end
net.b{1} = rand(hid_nn,1);
net.b{2} = rand(hid_nn,1);
net.LW{2,1} = rand(hid_nn,hid_nn);   % Устанавливаем случайные коэффициенты в скрытом слое
net.LW{3,2} = rand(1,hid_nn); % Устанавливаем случайные коэффициенты в выходном слое

%Обучение
net.performFcn = 'msereg';  %Критерий оценки 
net.trainFcn = 'trainlm';  %Метод обучения (минимизация Маркварда Левенберга)
net.trainParam.epochs=tr_epoch;
net = train(net,Xt',Yt);  %Обучение

%Моделирование
Xt=[];
Yt=[];

%Формирование данных для модлирования (аналогично обучению, только на всей
%выборке)
for i=1:length(data)-1-n
Xt(i,1:n+1)=data(i:i+n); 
Yt(i)=data(i+n+1);
end

Ynet=sim(net,Xt');


figure, subplot(2, 1, 1), plot(data(n+1:end)) % Реальные значения
subplot(2,1, 2), plot(Ynet(1:end)) %Прогноз



e=(data(n+1:end-1)-Ynet')./data(n+1:end-1); %Вычисляем ошибку предсказания

figure(2)
stairs(e,'-r') %Строим график ошибки предсказания
figure(3)
hist(e) %Строим гистограмму ошибки предсказания

se=sqrt(sum(e.^2)/length(e));  
fprintf('Среднеквадратическая относительная ошибка предсказания (СКО): %f\n',se)

isRunning = 0;
end