Нейросети,как их освоить с чего начать? - страница 17

 
Andrey4-min писал(а) >>

У Вас в примере во всех трёх строчках стоит w1, так и должно быть?

Не, это я ошибся. Прошу прощения.

я пытаюсь понять, какую функцию будет выполнять w0, и предположил, что это какбы шаг в историю, ну как в циклах, если нет, объясните поподробнее...

Представте себе, что вам необходимо рассмотреть текстуру поверхности доски прибитой на крыше дома. Что вы будете делать? Правильно, вы залезете на крышу и внимательно, в близи, всё рассмотрите. Если подобное задание дать нашей НС, то она выполнит задание с присущей только ей ответственностью, она не полезет под самую крышу, а изучит доску вместе со всем домом, на крыше которого эта доска находится!

Вот, что бы исключить не нужной работы НС (а обучение, процесс очень ресурсоёмкий), мы вводим "лишний" вход с фиксированным смещением. Теперь смотрите: НС, в процессе обучения сама подберёт необходимый вес к этому входу (+/-1 или другой), это равносильно тому, что вы приставите к дому лестницу для того, что бы поднятся к интересующей вас доске! Теперь, НС не будет лопатить гору не нужной информации, а просто, лёгким движением займёт с помощью этого входа, удобное (в её понимании) положение, для дальнейшего комфортного обучения.

 
int    w0=1;
double w1=(High[1]-Low[1])/Point*(Close[1]-Open[1])/Point;
double w2=(High[2]-Low[2])/Point*(Close[2]-Open[2])/Point;
double w3=(High[3]-Low[3])/Point*(Close[3]-Open[3])/Point;
double w4=(High[4]-Low[4])/Point*(Close[4]-Open[4])/Point;
double w5=(High[5]-Low[5])/Point*(Close[5]-Open[5])/Point;
double w6=(High[0]-Low[0])/Point*(Close[0]-Open[0])/Point;
Если мы вход осуществляем по результатам бара номер 1, то 
w6=(High[0]-Low[0])/Point*(Close[0]-Open[0])/Point;

будет образована уже после открытия сделки, то есть этот вход (w6) не коим образом не может влиять на качество открытой сделки.

Если я правильно понял, то w6 введён для того, чтобы распознать в какую сторону двинулась цена после открытия сделки на отснове анализа предыдущих пяти баров (w1, w2, w3, w4, w5)?

 

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

Правильно так:

double w0=1.;
double w1=(High[1]-Low[1])/Point*(Close[1]-Open[1])/Point;
double w2=(High[2]-Low[2])/Point*(Close[2]-Open[2])/Point;
double w3=(High[3]-Low[3])/Point*(Close[3]-Open[3])/Point;
double w4=(High[4]-Low[4])/Point*(Close[4]-Open[4])/Point;
double w5=(High[5]-Low[5])/Point*(Close[5]-Open[5])/Point;

Введём нормировочные коэффициенты для ряда High-Low - HL и для ряда Close-Open - CO. Определим их как стандартное отклонение от соответствующих приращений с окном усреднения, например 100.

double HL=0.;

double CO=0.;

for(i=0;i<100;i++) {

HL=HL+(High[i] -Low[i] )*(High[i] -Low[i] );

CO=CO+(Close[i]-Open[i])*(Close[i]-Open[i]);

}

HL=MathSqrt(HL/100);

CO=MathSqrt(CO/100);

Ведём нормализующую функцию (отображает всю числовую ось в отрезок +/-1):

double th(double x)
{
if(MathAbs(x)<100.)S=(MathExp(x)-MathExp(-x))/(MathExp(x)+MathExp(-x));
else S=MathAbs(x)/x;
return(S);
}

Тогда нормализованные входа для НС будут считаться следующим образом:

double d0=1.;
double d1=th((High[1]-Low[1])/HL*(Close[1]-Open[1])/CO);
double d2=th((High[2]-Low[2])/HL*(Close[2]-Open[2])/CO);
double d3=th((High[3]-Low[3])/HL*(Close[3]-Open[3])/CO);
double d4=th((High[4]-Low[4])/HL*(Close[4]-Open[4])/CO);
double d5=th((High[5]-Low[5])/HL*(Close[5]-Open[5])/CO);

И ещё. w1...w5 это не входа НС, это настраиваемые в процессе её обцчения веса. Входа будем обозначать как d1, d2... d5
 

нормализация входа = свеча в пунктах

double a;
int CandleMax=20,CandleMin=-20,Diapazon;
Diapazon=CandleMax-CandleMin;

a=(Close[i]-Open[i])/Point;
if(a>CandleMax) a=CandleMax;
if(a<CandleMin) a=CandleMin;
a=(a-CandleMin)/Diapazon;
P.S. древний вариант
 
Korey, мы будем использовать "тонкую" нормализацию (когда отрезок +/-1 будет заполнен равномерно). Это принципиальный момент.
 

Neutron, ещё раз спасибо, за такое подробное объяснение.

Я с тем, что ты сейчас написал буду наверное 60 мин. разбираться, так что если не сложно загляни на эту тему через часик.

И ещё у меня есть к тебе предложение, по поводу прикручивания неросети к уже написанному советнику, если тебе интересно, как с тобой связаться, могу скинуть тебе графики с описанием алгоритма советника и описание коэффицентов для неросети.

 

Я, если честно, не фанат приватного общения. Если нет принципиальных ограничений, то лучше общаться тут. И ещё, я могу потерять интерес к данной теме (просто так, вдруг), поэтому не беру на себя обязательств по её обязательному ведению:-)

Договорились?

 
Neutron писал(а) >>
Korey, мы будем использовать "тонкую" нормализацию (когда отрезок +/-1 будет заполнен равномерно). Это принципиальный момент.

это тоже равномерно заполняет, но на краях нет загибов, т.е. древний вариант это не полное отображение в отрезок

 
Korey писал(а) >>

это тоже равномерно заполняет, но на краях нет загибов, т.е. древний вариант это не полное отображение в отрезок

Да, но нам нужно всё и сразу!

 
Neutron >>:

Я, если честно, не фанат приватного общения. Если нет принципиальных ограничений, то лучше общаться тут. И ещё, я могу потерять интерес к данной теме (просто так, вдруг), поэтому не беру на себя обязательств по её обязательному ведению:-)

Договорились?

Договорились.

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
//Введём нормировочные коэффициенты для ряда High-Low - HL и для ряда Close-Open - CO. 
//Определим их как стандартное отклонение от соответствующих приращений с окном усреднения, например 100.
double HL=0.;

double CO=0.;

for(int i=0;i<100;i++) {

HL=HL+(High[i] -Low[i] )*(High[i] -Low[i] ); //Эти значения умножаются друг на друга, 
                                             //чтобы в случае если значение будет отрицательным
CO=CO+(Close[i]-Open[i])*(Close[i]-Open[i]); //при умножении оно стало положительным?

}
HL=MathSqrt(HL/100);//Получилось среднее значение диапазона 100 последних баров
CO=MathSqrt(CO/100);//Получилось среднее значение диапазона между open b close 100 последних баров

//Ведём нормализующую функцию (отображает всю числовую ось в отрезок +/-1):
double th(double x); // что значит эта строчка?
{
if(MathAbs(x)<100.)S=(MathExp(x)-MathExp(-x))/(MathExp(x)+MathExp(-x));
else S=MathAbs(x)/x;
return(S); // для чего вычислялась S? 
}

//Тогда нормализованные входа для НС будут считаться следующим образом:
double w0=1.; // что значит точка после числа?
double w1=th((High[1]-Low[1])/HL*(Close[1]-Open[1])/CO);
double w2=th((High[2]-Low[2])/HL*(Close[2]-Open[2])/CO);
double w3=th((High[3]-Low[3])/HL*(Close[3]-Open[3])/CO);
double w4=th((High[4]-Low[4])/HL*(Close[4]-Open[4])/CO);
double w5=th((High[5]-Low[5])/HL*(Close[5]-Open[5])/CO);

//И ещё. w1...w5 это не входа НС, это настраиваемые в процессе её обцчения веса. Входа будем обозначать как d1, d2... d5

   
//----
   return(0);
  }
//+------------------------------------------------------------------+
Причина обращения: