İlginç konu. Bir fikrim var ama daha basit. Soru sorarken :)
Giriş noktasının nasıl belirleneceği açıktır - bir zikzak alıyoruz, ancak girişi tahmin etmek için noktadan önce ne olduğunu bulmanız gerekiyor. Önceki verileri analiz etmek için çubuklardaki hangi pencere kullanılır?
Giriş ve çıkış fonksiyonlarını ayırmayı denediniz mi? Yoksa genellikle bir darbe mi kullanılır - karşı sinyalin alınması mı? Darbeye girmek yerine farklı kâr/zarar tespit yöntemlerini kullanırsanız sonuç ne olur?
İlginç konu. Bir fikrim var ama daha basit. Soru sorarken :)
Giriş noktasının nasıl belirleneceği açıktır - bir zikzak alıyoruz, ancak girişi tahmin etmek için noktadan önce ne olduğunu bulmanız gerekiyor. Önceki verileri analiz etmek için çubuklardaki hangi pencere kullanılır?
Giriş ve çıkış fonksiyonlarını ayırmayı denediniz mi? Yoksa genellikle bir darbe mi kullanılır - karşı sinyalin alınması mı? Darbeye girmek yerine farklı kâr/zarar tespit yöntemlerini kullanırsanız sonuç ne olur?
1 bar ileriyi, yani 1 bar geri kaymayı tahmin etmeye çalıştım. Ama sorun şu ki, son çubuklardaki zikzak kendi başına değerlerle doldurulmalı ve yeniden çiziliyor, bu yüzden her şey o kadar net değil, bana bunu yapmanın en iyi yolunu söyle..
Şimdiye kadar, ilginç bir şey olmadı. Kodda ve mantıkta hatalar olabilir. Sırf konuyu geliştirmek için yazıyorum, tabiri caizse birileri yeniden yapacak ya da hatalarımı düzeltecek.
Koddaki ana noktaları yorumladım. Tahmin çubukları - tahminin derinliği, ileriye baktığımız çubuk sayısı. Ardından, ızgarayı eğitmek için dizinin uzunluğu ve eğitim dönemlerinin sayısı. 30 nöron, kodda değiştirilebilir.
//+------------------------------------------------------------------+//| zzNeuro.mq5 |//| max dmitrievsky |//| https://www.mql5.com/ru/users/dmitrievsky |//+------------------------------------------------------------------+#property copyright"Copyright 2015, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>
#include "class_mlp.mqh"
CTrade m_Trade;
CPositionInfo m_Position;
CNetMLP *net;
inputdouble MaximumRisk= 0.01 ;
inputint ZZperiod = 300 ;
inputint PrognozBars = 30 ;
inputint vectorLength = 1000 ;
inputint epoch = 10000 ;
int zz_handle, RSI_handle, MA1_handle, MA2_handle; //хендлы индикаторовdouble a1[],a2[],a3[],a4[],a5[],ma1[],ma2[],MAbuff[],zzH[],zzL[]; //массивы индикаторовdouble inputs[], outputs[]; //массивы для нейросетиbool learn;
double in[ 6 ],out[ 1 ]; //количество входов и выходов нейросетиint snn[]={ 70 , 1 }; // параметры нейросетиdouble min,max, minMA, maxMA; //переменные для нормировки данных входящих векторов//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit ()
{
//--- инициализируем хендлы индикаторов
learn= false ;
zz_handle= iCustom ( Symbol (), 0 , "zz" ,ZZperiod);
RSI_handle= iRSI ( Symbol (), 0 , 14 , PRICE_CLOSE );
MA1_handle= iMA ( Symbol (), 0 , 200 , 0 , MODE_SMA , PRICE_CLOSE );
MA2_handle= iMA ( Symbol (), 0 , 20 , 0 , MODE_SMA , PRICE_CLOSE );
//---return ( INIT_SUCCEEDED );
}
void FillZZarray( double &a[]) //заполняем массив выходов для нейросети с индикатора зигзаг. Присваиваем значения зигзага каждому бару.
{ //1 растущий, -1 падающий.ArrayResize (a,vectorLength);
int lastcountbar = 0 ;
for ( int i= 0 ;i<vectorLength;i++)
{
if (zzH[i]> 0 )
{
a[i]= 1 ; lastcountbar = 1 ;
}
if (zzL[i]> 0 )
{
a[i]=- 1 ; lastcountbar = - 1 ;
}
if (zzH[i]== 0 && zzL[i]== 0 ) a[i] = lastcountbar;
}
}
void NormalizeArrays( double &a[]) //нормируем входные данные для рси
{
double d1=- 1.0 ;
double d2= 1.0 ;
double x_min=a[ ArrayMinimum (a)];
double x_max=a[ ArrayMaximum (a)];
min = x_min;
max=x_max;
for ( int i= 0 ;i< ArraySize (a);i++)
{
a[i]=(((a[i]-x_min)*(d2-d1))/(x_max-x_min))+d1;
}
}
void NormalizeArraysMA( double &a[]) //нормируем входные данные для МА
{
double d1=- 1.0 ;
double d2= 1.0 ;
double x_min=a[ ArrayMinimum (a)];
double x_max=a[ ArrayMaximum (a)];
minMA = x_min;
maxMA=x_max;
for ( int i= 0 ;i< ArraySize (a);i++)
{
a[i]=(((a[i]-x_min)*(d2-d1))/(x_max-x_min))+d1;
}
}
void NormalizeArrays2( double &a[]) //нормируем для рси на каждом новом баре
{
double d1=- 1.0 ;
double d2= 1.0 ;
for ( int i= 0 ;i< ArraySize (a);i++)
{
a[i]=(((a[i]-min)*(d2-d1))/(max-min))+d1;
}
}
void NormalizeArrays2MA( double &a[]) //нормируем для МА на каждом новом баре
{
double d1=- 1.0 ;
double d2= 1.0 ;
for ( int i= 0 ;i< ArraySize (a);i++)
{
a[i]=(((a[i]-minMA)*(d2-d1))/(maxMA-minMA))+d1;
}
}
void learnWeb()
{
CopyBuffer (zz_handle, 0 ,PrognozBars,vectorLength,zzH);
CopyBuffer (zz_handle, 1 ,PrognozBars,vectorLength,zzL);
FillZZarray(outputs); //заполняем массив выходов, предварительно скопировав хай и лоу зигзага.CopyBuffer (RSI_handle, 0 ,PrognozBars* 2 + 1 ,vectorLength,a1);
CopyBuffer (RSI_handle, 0 ,PrognozBars* 2 + 5 ,vectorLength,a2);
CopyBuffer (RSI_handle, 0 ,PrognozBars* 2 + 10 ,vectorLength,a3);
CopyBuffer (RSI_handle, 0 ,PrognozBars* 2 + 15 ,vectorLength,a4);
CopyBuffer (RSI_handle, 0 ,PrognozBars* 2 + 20 ,vectorLength,a5);
CopyBuffer (MA1_handle, 0 ,PrognozBars* 2 + 1 ,vectorLength,ma1);
CopyBuffer (MA2_handle, 0 ,PrognozBars* 2 + 1 ,vectorLength,ma2);
ArrayResize (MAbuff,vectorLength);
for ( int i= 0 ;i< ArraySize (ma1);i++) //вычисляем разницу между двумя МА
{
MAbuff[i]=ma1[i]-ma2[i];
}
NormalizeArrays(a1);
NormalizeArrays(a2);
NormalizeArrays(a3);
NormalizeArrays(a4);
NormalizeArrays(a5);
NormalizeArraysMA(MAbuff); //нормируем все входыint j = 0 ;
for ( int i= 0 ;i<vectorLength* 6 ;i=i+ 6 ) //компануем массив входов для нейросети
{
ArrayCopy (inputs,MAbuff,i,j, 1 );
ArrayCopy (inputs,a5,i+ 1 ,j, 1 );
ArrayCopy (inputs,a4,i+ 2 ,j, 1 );
ArrayCopy (inputs,a3,i+ 3 ,j, 1 );
ArrayCopy (inputs,a2,i+ 4 ,j, 1 );
ArrayCopy (inputs,a1,i+ 5 ,j, 1 );
j++;
}
ArraySetAsSeries (inputs, true );
ArraySetAsSeries (outputs, true );
//+------------------------------------------------------------------+//| Neuro Learn |//+------------------------------------------------------------------+
net= new CNetMLP( ArraySize (snn),snn, ArraySize (in), 1 );
net.Learn(vectorLength,inputs,outputs,epoch, 1.0 e- 8 ); Print ( "MSE=" ,net.mse, " Epoch=" ,net.epoch);
//--- сохранение сети в файл и удаление сетиint h= FileOpen ( "test.net" , FILE_BIN | FILE_WRITE );
net.Save(h);
FileClose (h);
learn= true ;
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit ( constint reason)
{
//---delete net;
FileDelete ( "test.net" );
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick ()
{
//---if (learn== false ) learnWeb();
//---if (fn_NEW_BAR()) //запускаем сеть на каждом новом баре, получаем выходы. Торгуем.
{
ArrayResize (a1, 1 );
ArrayResize (a2, 1 );
ArrayResize (a3, 1 );
ArrayResize (a4, 1 );
ArrayResize (a5, 1 );
ArrayResize (ma1, 1 );
ArrayResize (ma2, 1 );
ArrayResize (MAbuff, 1 );
CopyBuffer (RSI_handle, 0 , 1 , 1 ,a1);
CopyBuffer (RSI_handle, 0 , 5 , 1 ,a2);
CopyBuffer (RSI_handle, 0 , 10 , 1 ,a3);
CopyBuffer (RSI_handle, 0 , 15 , 1 ,a4);
CopyBuffer (RSI_handle, 0 , 20 , 1 ,a5);
CopyBuffer (MA1_handle, 0 , 1 , 1 ,ma1);
CopyBuffer (MA2_handle, 0 , 1 , 1 ,ma2);
for ( int i= 0 ;i< ArraySize (ma1);i++)
{
MAbuff[i]=ma1[i]-ma2[i];
}
NormalizeArrays2(a1);
NormalizeArrays2(a2);
NormalizeArrays2(a3);
NormalizeArrays2(a4);
NormalizeArrays2(a5);
NormalizeArrays2MA(MAbuff);
in[ 0 ] = MAbuff[ 0 ];
in[ 1 ] = a5[ 0 ];
in[ 2 ] = a4[ 0 ];
in[ 3 ] = a3[ 0 ];
in[ 4 ] = a2[ 0 ];
in[ 5 ] = a1[ 0 ];
net.Calculate(in,out); //подаем на вход данные индикаторов на текущем баре, получаем результат на выходе.//+------------------------------------------------------------------+//| Expert trade function |//+------------------------------------------------------------------+ if (out[ 0 ]> 0.9 ) //если на выходе больше этого значения, то покупаем
{
double Lot=LotsOptimized();
double priceBuy= SymbolInfoDouble ( Symbol (), SYMBOL_ASK );
if (m_Position.Select( Symbol ()))
{
if (m_Position.PositionType()== POSITION_TYPE_SELL ) m_Trade.PositionClose( Symbol ());
}
if (CountPosBuy()== 0 ) m_Trade.PositionOpen( Symbol (), ORDER_TYPE_BUY ,Lot,priceBuy, 0 , 0 , NULL );
}
if (out[ 0 ]<- 0.9 ) //если ниже, то продаем
{
double Lot=LotsOptimized();
double priceSell= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
if (m_Position.Select( Symbol ()))
{
if (m_Position.PositionType()== POSITION_TYPE_BUY ) m_Trade.PositionClose( Symbol ());
}
if (CountPosSell()== 0 ) m_Trade.PositionOpen( Symbol (), ORDER_TYPE_SELL ,Lot,priceSell, 0 , 0 , NULL );
}
}
}
//+------------------------------------------------------------------+//| Custom Functions |//+------------------------------------------------------------------+bool fn_NEW_BAR()
{
staticint nBars= 0 ;
if (nBars!= Bars ( Symbol (), 0 ))
{
nBars= Bars ( Symbol (), 0 );
return ( true );
}
return ( false );
}
//+------------------------------------------------------------------+//| Calculate optimal lot size |//+------------------------------------------------------------------+ double LotsOptimized()
{
CAccountInfo myaccount;
double lot;
//---- select lot size
lot= NormalizeDouble (myaccount.FreeMargin()*MaximumRisk/ 1000.0 , 1 );
//---- return lot sizeif (lot< 0.01 ) lot= 0.01 ;
if (lot> 50 ) lot= 50 ;
return (lot);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int CountPosBuy()
{
CPositionInfo myposition;
int result= 0 ;
for ( int k= 0 ; k< PositionsTotal (); k++)
{
if (myposition.Select( _Symbol )== true )
{
if (myposition.PositionType()== POSITION_TYPE_BUY )
{result++;}
else
{}
}
}
return (result);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int CountPosSell()
{
CPositionInfo myposition;
int result= 0 ;
for ( int k= 0 ; k< PositionsTotal (); k++)
{
if (myposition.Select( _Symbol )== true )
{
if (myposition.PositionType()== POSITION_TYPE_SELL )
{result++;}
else
{}
}
}
return (result);
}
Beyler, eğer danışmanlarınız temeli dikkate almıyorsa, o zaman kar / zarar olasılığı = 50/50 - yayılma! Ve danışmandaki hiçbir nöron ne kendilerine ne de başkalarına yardım etmeyecek :)
Rustam Karpunin : Beyler, eğer danışmanlarınız temeli dikkate almıyorsa, o zaman kar / zarar olasılığı = 50/50 - yayılma! Ve danışmandaki hiçbir nöron ne kendilerine ne de başkalarına yardım etmeyecek :)
Rustam Karpunin : Beyler, eğer danışmanlarınız temeli dikkate almıyorsa, o zaman kar / zarar olasılığı = 50/50 - yayılma! Ve danışmandaki hiçbir nöron ne kendilerine ne de başkalarına yardım etmeyecek :)
NS çok havalı, onlarla çalışmanın bazı özelliklerini almaya başladım, ilginç sonuçlar şimdiden ortaya çıkıyor, onları daha sonra yayınlayacağım. Sadece bir strateji bulmak çok zaman alıyor.
İlginç konu. Bir fikrim var ama daha basit. Soru sorarken :)
Giriş noktasının nasıl belirleneceği açıktır - bir zikzak alıyoruz, ancak girişi tahmin etmek için noktadan önce ne olduğunu bulmanız gerekiyor. Önceki verileri analiz etmek için çubuklardaki hangi pencere kullanılır?
Giriş ve çıkış fonksiyonlarını ayırmayı denediniz mi? Yoksa genellikle bir darbe mi kullanılır - karşı sinyalin alınması mı? Darbeye girmek yerine farklı kâr/zarar tespit yöntemlerini kullanırsanız sonuç ne olur?
İlginç konu. Bir fikrim var ama daha basit. Soru sorarken :)
Giriş noktasının nasıl belirleneceği açıktır - bir zikzak alıyoruz, ancak girişi tahmin etmek için noktadan önce ne olduğunu bulmanız gerekiyor. Önceki verileri analiz etmek için çubuklardaki hangi pencere kullanılır?
Giriş ve çıkış fonksiyonlarını ayırmayı denediniz mi? Yoksa genellikle bir darbe mi kullanılır - karşı sinyalin alınması mı? Darbeye girmek yerine farklı kâr/zarar tespit yöntemlerini kullanırsanız sonuç ne olur?
Dün demoda bir nöron başlattım https://www.mql5.com/ru/signals/129790 Henüz bir şey yok gibi görünüyor.
Harika, gözlemleyelim .. ama bunun temeli nedir?
Şimdiye kadar, ilginç bir şey olmadı. Kodda ve mantıkta hatalar olabilir. Sırf konuyu geliştirmek için yazıyorum, tabiri caizse birileri yeniden yapacak ya da hatalarımı düzeltecek.
Koddaki ana noktaları yorumladım. Tahmin çubukları - tahminin derinliği, ileriye baktığımız çubuk sayısı. Ardından, ızgarayı eğitmek için dizinin uzunluğu ve eğitim dönemlerinin sayısı. 30 nöron, kodda değiştirilebilir.
Beyler, eğer danışmanlarınız temeli dikkate almıyorsa, o zaman kar / zarar olasılığı = 50/50 - yayılma! Ve danışmandaki hiçbir nöron ne kendilerine ne de başkalarına yardım etmeyecek :)
Beyler, eğer danışmanlarınız temeli dikkate almıyorsa, o zaman kar / zarar olasılığı = 50/50 - yayılma! Ve danışmandaki hiçbir nöron ne kendilerine ne de başkalarına yardım etmeyecek :)