Смотри, как бесплатно скачать роботов
Ищи нас в Telegram!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Библиотеки

Вероятностная сеть - библиотека для MetaTrader 4

Просмотров:
4856
Рейтинг:
(8)
Опубликован:
2008.10.21 07:34
Обновлен:
2016.11.22 07:33
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Эта вероятностная нейронная сеть создана в виде библиотеки dll специально для советников, написанных на MQL4. Б

иблиотека способна содержать несколько сетей одновременно. Я старался сделать сеть максимально самостоятельной, однако вкоре решил вынести ряд функций во внешнее управление для большего контроля на первых порах. В таком виде ее и представляю. Особенностью данной сети является тот факт, что ее размер меняется динамически в зависимости от ситуации. Сеть может проходить первичное обучение и обучение по ходу дела. При этом новые нейроны будут рождаться самостоятельно, а также подстраиваться и умирать. На каждый класс необходимо создавать свою сеть. Например, для генерации сигналов перекупленности и перепроданности необходимо создать одну сеть для первого случая и отдельную для второго.

Обучение

На вход сети подается нормированный на единицу вектор. Выходом сети будет являться чило [0..1] обозначающее принадлежность входного вектора классу сети. При этом, если сеть в процессе обучения не нашла образ с заданной вероятностью, то она автоматически добавит его себе в память посредством нового нейрона. В случае первичного обучения рекомендую прогонять 2-3 повторения. В любом случае наступает момент, когда сеть хорошо усвоила первичные данные. Это наступает обычно не более чем через 5 прогонов.

Предсказание, а точнее классификация

Задачей сети является классификация представленного входного образа на соответствие классу сети. Если сеть обучалась классифицировать сигналы разворота тренда с медвежьего на бычий, то подобные ситуации должны сопровождаться высоким выходным значением, близким к 1. Дальнейшие действия с полученными откликами сетей и их интеграцией в советники оставляю на усмотрение экспертописателя.

Основные необходимые функции для работы с сетью

Для создания сети используется функция CreateNet

double CreateNet(string NN, // Создает сеть с названием <NN>
int InputVectorSize, // c количеством нейронов во входном векторе <InputVectorSize>
double MinTV, // порог конфликтов нейронов
double MaxTV, // порог индивидуальности
double MW, // критерий слабости нейронов
int NL); // время жизни нейронов (в барах) если 0, то живут вечно

Для удобства я решил обращаться к сетям по имени. Напоминаю, что можно одновременно работать с целым набором сетей. Настройки каждой сети указываются во время ее создания и остаются неизменными до уничтожения.

Порог нидивидуальности нужен для принятия решений о рождении новых нейронов в процессе обучения. Обычно 0.95. При более низких значения (меньшей степени индивидуальности) сеть будет пытаться модернизироваться так, чтобы небольное количество нейронов соответствовало бОльшему числу вариантов. В этос случае точность предсказания падает. При высоких значениях MaxTV сеть будет стремиться создать новый нерон почти на каждый новый вектор, и сеть может достигать очень больших размеров. Сеть постоянно модернизирутся таким образом, чтобы нейроны не конфликтовали друг с другом(образы не должны быть похожи друг на друга). Для этой цели предусмотрен MinTV, который у меня обычно 0,2. Параметры MaxTV,MinTV и MW достаточно определить один раз. В дальнейшем применение оптимизации для нахождения лучших параметров не требуется.

Выживают сильнейшие! Этот принцип используется и тут. Слабые нероны, это те, веса которых понизились ниже минимального значения MW. Такие нейроны несут скорее вредную информацию и должны погибнуть дабы не породить случайно другой сигнал.

При необходимости более старые нероны можно убивать, и такм образом, освобождаться от "старых стереотипов". Для этого укажите время жизни неронов в барах NL. При создании каждого нейрона запоминается время его создания, в последствии, эта метка позволяет его удалить. Поэтому при вводе любых данных в сеть указание временного фактора обязательно.

Для уничтожения сети используем DestroyNet. Очень просто. Не забывайте уничтожать ненужные сети, а то они останутся жить в памати компьютера до момента закрытия MetaTrader.

int DestroyNet(string NN); // Уничтожает сеть <NetName>, возвращает количество оставшихся сетей

Я не поставил функцию проверки уникальности имен, и вы можете наплодить много сетей под одним именем. Хотя они и будут отличаться порядковым номером.

string NetName(int i); // Возвращает имя сети по заданному порядковому номеру
int GetNetsNumber(); // Возвращает общее количество сетей в библиотеке
int NetNumber(string NetName); // Возвращает порядковый номер сети <NetName> в библиотеке

Тренеровать сеть нужно функцией TrainNet. Правильный ответ скорее нужен для внесения порядка. Например для сигналов BUY принимаем 1, а для SELL -1. Так как для BUY своя сеть, а для SELL своя, то внутри сети он не учитывается. Время берем текущее, или время создания бара.

double TrainNet(string NetName,
double& iX[], // входной нормированный вектор размера InputVectorSize
int T, // правильный ответ
datetime sT); // время создания вектора

В процессе обучения можно определить распознала ли сеть образ и модернизироавлаь или добавила как новый. Для этого используем SizeOfNet

int SizeOfNet(string NetName); // Возвращает количесво Гауссовских нейронов

Считывать отклик нужно функцией GetPredict. Параметры как и у TrainNet. Ели подать на вход точно такой же вектор какому была обучена сеть, то ответ будет 1.

double GetPredict(string NetName, // Выдает вероятность [0..1] принадлежности входного вектора к классу
double& iX[],
datetime sT);

А вот эти функции необходимы для внутренней работы сети. Просто используйте их как показано в примере.

void Shrink(string NetName);
void WReset(string NetName);
void AEqual(string NetName);
void CW(string NetName);
void KillWeaks(string NetName);
void KillOlds(string NetName,datetime sT);

Примеры использования

Пример кода из функции init()

Print("Net Created with number: ",CreateNet("OverBought",24,0.2,0.95,0.001,Period()*60*1000)); // Создаем сеть для сигналов Sell
Print("Net Created with number: ",CreateNet("OverSold",24,0.2,0.95,0.001,Period()*60*1000)); // Создаем сеть для сигналов Buy

//~~
Print("Initial training started ...");
for (int R = 1; R <= Repetitions; R++) // Процесс первичного обучения
{ // на исторических данных
WReset("OverBought"); // Обнуляем значения весов
InitialTraining("OverBought",HistoryBars,-1); // Прогоняем обучение
Shrink("OverBought"); // Модернизируем сеть
AEqual("OverBought"); // Устанавливаем все веса =1
CW("OverBought"); // Рассчитываем веса
KillWeaks("OverBought"); // Убиваем слабые нейроны
CW("OverBought"); // Рассчитываем веса

WReset("OverSold"); // Обнуляем значения весов
InitialTraining("OverSold",HistoryBars,1); // Прогоняем обучение
AEqual("OverSold"); // Устанавливаем все веса =1
Shrink("OverSold"); // Модернизируем сеть
CW("OverSold"); // Рассчитываем веса
KillWeaks("OverSold"); // Убиваем слабые нейроны
CW("OverSold"); // Рассчитываем веса
FlushReport("OverSold",R); // Выводим отчет в файл

}

Пример кода из функции start()

KillOlds("OverBought",iTime(Symbol(),0,1)); // Убиваем старые нейроны
PostTraining("OverBought",-1); // Дообучаем по ходу дела
Shrink("OverBought"); // Модернизируем сеть
AEqual("OverBought"); // Устанавливаем все веса =1
CW("OverBought"); // Рассчитываем веса
KillWeaks("OverBought"); // Убиваем слабые нейроны
CW("OverBought"); // Рассчитываем веса

KillOlds("OverSold",iTime(Symbol(),0,1));
PostTraining("OverSold",1); // Дообучаем по ходу дела
AEqual("OverSold"); // Устанавливаем все веса =1
Shrink("OverSold"); // Модернизируем сеть
CW("OverSold"); // Рассчитываем веса
KillWeaks("OverSold"); // Убиваем слабые нейроны
CW("OverSold"); // Рассчитываем веса

//--------------------------------------------------------------------
double OverBought = Predict("OverBought");
double OverSold = Predict("OverSold");
Out = (OverBought - OverSold)/(OverBought+OverSold);

Пример кода из функции deinit()

Print("Destroying net=>",Destroy ("OverBought")); // Убиваем, что породили
Print("Destroying net=>",Destroy ("OverSold")); // Убиваем, что породили

Сеть проверена на работоспособность успешно. Хорошие результаты зависят от способа создания входящего вектора. Важно понимать, что во время обучения в сеть должны подаваться вектора заведомо зная, что они отвечают критериям класса. Простым языком - если сеть создана для сигналов SELL, то на баре, с которого снимается обучающий вектор, должен действительно быть сигнал SELL. В противном случае сеть нахватает противоречивых данных и желаемого результата не будет.

Приглашаю обсудить следующие вопросы:

1. Формирование входного ветора - В настоящее время использую 24 параметра (разницу между скользящими средними), нормированную на 1 за промежуток в 24 бара. Т.е. вычисляю матрицу 24x24. Потом ее нормирую и беру последние значения.

2. Определения "правильного ответа" - т.е когда входной вектор является сигналом. В настоящее время использую AMA. Получается что о том, был ли на этом баре сигнал, я узнаю через 2 бара.

Macd Support and Resistance Macd Support and Resistance

MACD на графике.

Советник по Trend Follower Советник по Trend Follower

Эксперт по стратегии "Trend Follower".

RSI_Test RSI_Test

Основан на индикаторе RSI

GRFLeadingEdge GRFLeadingEdge

Индикатор полос Боллинджера.