//+------------------------------------------------------------------+ //| RNN.mq5 | //| Copyright 2012, Yury V. Reshetov | //| http://www.mql5.com/ru/articles/366 | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, Yury V. Reshetov" #property link "http://www.mql5.com/ru/articles/366" #property version "1.00" //--- входные параметры советника input int x0 = 50; // Вероятность для правила №0 в процентах input int x1 = 50; // Вероятность для правила №1 в процентах input int x2 = 50; // Вероятность для правила №2 в процентах input int x3 = 50; // Вероятность для правила №3 в процентах input int x4 = 50; // Вероятность для правила №4 в процентах input int x5 = 50; // Вероятность для правила №5 в процентах input int x6 = 50; // Вероятность для правила №6 в процентах input int x7 = 50; // Вероятность для правила №7 в процентах //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ double res=0; int OnInit() { //--- int in[8][3] = { {0, 0, 0}, {0, 0, 1}, {0, 1, 0}, {0, 1, 1}, {1, 0, 0}, {1, 0, 1}, {1, 1, 0}, {1, 1, 1} }; int out[8] = { 0,1,1,0,0,1,1,0}; //XOR по 1 и 2 входу, 3-й вход (0-й вход) шумовой не должен влиять double k_split=0.75; if(MQLInfoInteger(MQL_OPTIMIZATION)){//обучение на половине данных (содержит 1 полный XOR + шумомвой вход) for(int i=0; i<((double)ArrayRange(in,0)*k_split); i++){//обучение на 1-й половине данных double results=RNN(in[i][0],in[i][1],in[i][2]); if(results > 0.5){results=1;}else{results=0;} if (results==out[i]){res++;}//правильный ответ } }else{ // одиночный запуск в тестере или в терминале при лучших выбранных входных параметрах Print ("Проверка на данных обучения"); for(int i=0 ;i<(int)MathFloor(ArrayRange(in,0)*k_split); i++){//проверка на новых данных double results=RNN(in[i][0],in[i][1],in[i][2]); if(results > 0.5){results=1;}else{results=0;} if (results==out[i]){res++;Print("Правильно:",in[i][0],in[i][1],in[i][2]," вычислил ",out[i]);}//правильный ответ else{Print("ошибка:",in[i][0],in[i][1],in[i][2]," вычислил ",(int)results,", должен вычислсть ",out[i]);} } Print ("\nПроверка на новых данных"); for(int i=(int)MathFloor(ArrayRange(in,0)*k_split) ;i 0.5){results=1;}else{results=0;} if (results==out[i]){res++;Print("Правильно:",in[i][0],in[i][1],in[i][2]," вычислил ",out[i]);}//правильный ответ else{Print("ошибка:",in[i][0],in[i][1],in[i][2]," вычислил ",(int)results,", должен вычислсть ",out[i]);} } } //--- return(0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { return; } //+------------------------------------------------------------------+ //| Tester function | //+------------------------------------------------------------------+ double OnTester() { return(res); } //+------------------------------------------------------------------+ //| Экспертная система Ю. В. Решетова | //| вычисляет вероятности по входным параметрам | //| p1, p2, pn - вероятности анализируемых признаков объекта | //+------------------------------------------------------------------+ double RNN(double p1,double p2,double p3) { //--- вероятности для правил из базы знаний экспертной системы double y0 = x0; // Вероятность правила №0 в процентах double y1 = x1; // Вероятность правила №1 в процентах double y2 = x2; // Вероятность правила №2 в процентах double y3 = x3; // Вероятность правила №3 в процентах double y4 = x4; // Вероятность правила №4 в процентах double y5 = x5; // Вероятность правила №5 в процентах double y6 = x6; // Вероятность правила №6 в процентах double y7 = x7; // Вероятность правила №7 в процентах //--- база знаний, состоящая из набора взаимоисключающих правил double probability= (1.0 - p1) * (1.0 - p2) * (1.0 - p3) * y0 + // Правило №0 (1.0 - p1) * (1.0 - p2) * p3 * y1 + // Правило №1 (1.0 - p1) * p2 * (1.0 - p3) * y2 + // Правило №2 (1.0 - p1) * p2 * p3 * y3 + // Правило №3 p1 * (1.0 - p2) * (1.0 - p3) * y4 + // Правило №4 p1 * (1.0 - p2) * p3 * y5 + // Правило №5 p1 * p2 * (1.0 - p3) * y6 + // Правило №6 p1 * p2 * p3 * y7; // Правило №7 //--- конвертируем проценты в вероятности probability=probability/100.0; //--- возвращаем результат в виде вероятности return(probability); } //+------------------------------------------------------------------+