Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Ben de 2013'te benzer bir algoritma uygulamaya çalıştım... Doğru, 7 gösterge kullandım ve Zigzag NN'nin öğrenme vektörünü oluştururdu. Ama öz aynı - ben ters pozisyonlar arıyordum ... ne göstergelerden gelen verilerden ne de onlardan gelen ticaret sinyallerinden iyi bir şey gelmedi ... kazara kalıplara rastlayana kadar. Bu da aracımı kökten değiştirdi. Şimdi algoritmam daha basit:
1. Geçen yıl için dakika ve saat zaman dilimlerinde kalıpların hesaplanması;
2. Bir dönüm noktası sözlüğünün derlenmesi ("dakika düzeni - saat düzeni" çiftleri);
3. Dönüş noktaları sözlüğüne göre NS öğretimi (150-160 çift için);
İşte yaklaşımımın sonucu:
Yaklaşımımın dezavantajlarına:
1) Yüksek TS riski - kırılma fiyatının değerini doğru bir şekilde belirlemek imkansız olduğundan, TS lotlu 9 bekleyen emir verir: 1, 1, 3, 6, 14, 31, 70, 158, 355;
2) Çıkış algoritmasını (TS trolünü) uygulamak zordur;
Yani NN ticaret için kullanılabilir, ancak soru NN'ye ne öğretileceğidir...
P/s: kalıplarla, A. Merrill'in (M & W) kalıplarını kastediyorum.
Akıllı yaklaşım. Ve kalıplar, gerçek fiyat deltasını hesaba katmadan sadece çubukların matristeki konumu olarak tanımlandı - sadece göreceli konum mu?
Gösterge modellerini denemek için bir fikrim var, ancak farklı bir çerçeveyle - son 5 göstergedeki göstergelerin ilk beş çubuğunu ve trend analizi için iki göstergeyi analiz ediyoruz - 10'luk artışlarla analiz ediyoruz ve aynı zamanda hesap mutlak değişiklikler.
Zig-zag hakkında mantıklı bir fikir, ancak düz yalpalardan tepe noktaları nasıl filtrelenebilir ki, bir trend değişikliğinin yanlış noktaları olabilir?
Akıllı yaklaşım. Ve kalıplar, gerçek fiyat deltasını hesaba katmadan sadece çubukların matristeki konumu olarak tanımlandı - sadece göreceli konum mu?
Gösterge modellerini denemek için bir fikrim var, ancak farklı bir çerçeveyle - son 5 göstergedeki göstergelerin ilk beş çubuğunu ve trend analizi için iki göstergeyi analiz ediyoruz - 10'luk artışlarla analiz ediyoruz ve aynı zamanda hesap mutlak değişiklikler.
Zig-zag hakkında mantıklı bir fikir, ancak düz yalpalardan tepe noktaları nasıl filtrelenebilir ki, bir trend değişikliğinin yanlış noktaları olabilir?
Bunu seviyorum:
Yalnızca kalıp çiftlerini depolayan dinamik bir dizi var (ben buna sözlük diyorum), sözlüğe ikinci kez bir çift kalıp girerse, onu yazmam; ve daha yüksek ve daha düşük olanın sayacının iki dizisi - sözlüğe yazılmamış olsa bile, kalıbın çift oluşumuna ne sıklıkta katıldığını sayarlar.
Öğrenme vektörünün oluşumu sözlüğe göre gerçekleşir, ayrı bir kalıbın ağırlığı = kalıp_sayıcı / maksimum_sayıcı. Onlar. çiftlerin oluşumunda en sık yer alan model 1'dir ve diğerlerinin tümü 1'den küçüktür. NN'yi eğittikten sonra elde edilen bir tablo:
NS yapısı: Girişte 64 nöron, 4 dahili, 1 çıkış. Onlar. bir giriş nöronu bir modeli tanımlar. Şebeke 40-50 dakikada eğitilir, NN hatası 0.00001'i geçmez.
Böylece, daha önce sözlükte olmasa bile, kalıp çiftlerinin önemini tahmin edebilen bir modelim var.
Uzun zamandır düz ve yanlış tepelerle uğraşıyorum ama ZigZaga hesabı düzeyinde. Standart Zigzag kodunu biraz değiştirdim, yani bazında bir yüzde ZZ uyguladım. Şimdiye kadar, az ya da çok gerekli kod şöyle görünür:
int MyCExtremum::GetCombiZigzag(const double &high[], // буфер цен high
const double &low[], // буфер цен low
const datetime &time[], // буфер время
int ExtDepth, // глубина поиска экстремумов(первого прохода)
double ExtDeviation,// "пороговое значение": жесткая ступенька + % роста цены
int ExtBackstep // глубина поиска экстремумов(второго прохода)
)
{
//--- value
int shift=0, whatlookfor=0, lasthighpos=0, lastlowpos=0, Deviat=1;
double lasthigh=0.0, lastlow=0.0, percent=0.0;
int rates_total = ArraySize(time); // размер входных таймсерий
int limit = rates_total - ExtDepth; // лимит на расчеты...
//+---------------------------------------------------------------+
//| ОЧЕНЬ ВАЖНАЯ ПРОВЕРКА ВЛИЯЮЩАЯ НА КОРРЕКТНОСТЬ ВЫЧИСЛЕНИЙ! |
//+---------------------------------------------------------------+
if(ArrayIsSeries(high)) ArraySetAsSeries(high,false);
if(ArrayIsSeries(low)) ArraySetAsSeries(low,false);
if(ArrayIsSeries(time)) ArraySetAsSeries(time,false);
//+---------------------------------------------------------------+
//| ПРОВЕРКИ ВХОДНЫХ ПЕРЕМЕННЫХ |
//+---------------------------------------------------------------+
if(rates_total<20)
{
Print(__FUNCTION__," ERROR: the small size of the buffer.");
return(-1);
}
if(ExtDeviation<0 || ExtDeviation>100)
{
Print(__FUNCTION__," ERROR: Is\'not correct a Deviation. The value of Deviation should be in the interval [0..100].");
return(-1);
}
//--- Проверка: Depth and Backstep
if((ExtDepth < ExtBackstep)||(ExtDepth < 2))
{
Print(__FUNCTION__+" ERROR: Is\'not correct a Depth and Backstep. The value of Depth should be greater than Backstep.");
return(-1);
}
//--- готовим буфер ZigzagBuffer[]
if(ArraySize(ZigzagBuffer)>0) ArrayFree(ZigzagBuffer); // Удаляем старые данные
ArrayResize(ZigzagBuffer,rates_total, EXTREMUM_RESERVE);
ArrayFill(ZigzagBuffer,0,rates_total,0.0);
if(ArrayIsSeries(ZigzagBuffer)) ArraySetAsSeries(ZigzagBuffer, false);
//---
if(ArraySize(HighMapBuffer)>0) ArrayFree(HighMapBuffer); // Удаляем старые данные
ArrayResize(HighMapBuffer,rates_total, EXTREMUM_RESERVE);
ArrayFill(HighMapBuffer,0,rates_total,0.0);
if(ArrayIsSeries(HighMapBuffer)) ArraySetAsSeries(HighMapBuffer, false);
//---
if(ArraySize(LowMapBuffer)>0) ArrayFree(LowMapBuffer); // Удаляем старые данные
ArrayResize(LowMapBuffer,rates_total, EXTREMUM_RESERVE);
ArrayFill(LowMapBuffer,0,rates_total,0.0);
if(ArrayIsSeries(LowMapBuffer)) ArraySetAsSeries(LowMapBuffer, false);
//---
if(ArraySize(TimeBuffer)>0) ArrayFree(TimeBuffer); // Удаляем старые данные
ArrayResize(TimeBuffer, rates_total, EXTREMUM_RESERVE);
ArrayFill(TimeBuffer, 0, rates_total, 0);
if(ArrayIsSeries(TimeBuffer)) ArraySetAsSeries(TimeBuffer, false);
//--- корректировка Deviation
if(ExtDeviation < 1)
{
Deviat = 1;
}else
{
Deviat = (int)ExtDeviation;
}
//--- получаем "свежие" минимумы и максимумы
if(GetHighMapZigzag(high,ExtDepth,Deviat,ExtBackstep) < 0) return(0);
if(GetLowMapZigzag(low,ExtDepth,Deviat,ExtBackstep) < 0) return(0);
//--- final rejection
for(shift=ExtDepth;shift<rates_total;shift++)
{
switch(whatlookfor)
{
case Start: // search for peak or lawn
if(lastlow==0 && lasthigh==0)
{
if(HighMapBuffer[shift]!=0)
{
lasthigh=high[shift];
lasthighpos=shift;
whatlookfor=Sill;
ZigzagBuffer[shift]=lasthigh;
TimeBuffer[shift]=time[shift];
}
if(LowMapBuffer[shift]!=0)
{
lastlow=low[shift];
lastlowpos=shift;
whatlookfor=Pike;
ZigzagBuffer[shift]=lastlow;
TimeBuffer[shift]=time[shift];
}
}
break;
case Pike: // search for peak
if(LowMapBuffer[shift]!=0.0 && LowMapBuffer[shift]<lastlow && HighMapBuffer[shift]==0.0)
{
//---
ZigzagBuffer[lastlowpos] = 0.0;
TimeBuffer[lastlowpos] = 0;
//---
lastlowpos=shift;
lastlow=LowMapBuffer[shift];
ZigzagBuffer[shift]=lastlow;
TimeBuffer[shift]=time[shift];
//--- Обязательно: покинуть switch
break;
}
//--- Обход "двойственности"
if(LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]<lastlow)
{
//---
ZigzagBuffer[lastlowpos] = 0.0;
TimeBuffer[lastlowpos] = 0;
//---
lastlowpos=shift;
lastlow=LowMapBuffer[shift];
ZigzagBuffer[shift]=lastlow;
TimeBuffer[shift]=time[shift];
//--- Обязательно: покинуть switch
break;
}
if(HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]==0.0)
{
//--- Проверка: % роста цены
percent = (HighMapBuffer[shift]-lastlow)/(lastlow/100);
if(percent > ExtDeviation)
{
lasthigh=HighMapBuffer[shift];
lasthighpos=shift;
ZigzagBuffer[shift]=lasthigh;
TimeBuffer[shift]=time[shift];
whatlookfor=Sill;
}
percent = 0.0;
}
break;
case Sill: // search for lawn
if(HighMapBuffer[shift]!=0.0 && HighMapBuffer[shift]>lasthigh && LowMapBuffer[shift]==0.0)
{
//---
ZigzagBuffer[lasthighpos] = 0.0;
TimeBuffer[lasthighpos] = 0;
//---
lasthighpos=shift;
lasthigh=HighMapBuffer[shift];
ZigzagBuffer[shift]=lasthigh;
TimeBuffer[shift]=time[shift];
//--- Обязательно: покинуть switch
break;
}
if(HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]>lasthigh)
{
//---
ZigzagBuffer[lasthighpos] = 0.0;
TimeBuffer[lasthighpos] = 0;
//---
lasthighpos=shift;
lasthigh=HighMapBuffer[shift];
ZigzagBuffer[shift]=lasthigh;
TimeBuffer[shift]=time[shift];
//--- Обязательно: покинуть switch
break;
}
if(LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]==0.0)
{
//--- Проверка: % роста цены
percent = (lasthigh-LowMapBuffer[shift])/(lasthigh/100);
if(percent > ExtDeviation)
{
lastlow=LowMapBuffer[shift];
lastlowpos=shift;
ZigzagBuffer[shift]=lastlow;
TimeBuffer[shift]=time[shift];
whatlookfor=Pike;
}
percent = 0.0;
}
break;
default:
return(-1);
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
MyCextremum dosyasında - ZigZag hesaplamak için bir sınıf...
Akıllı yaklaşım. Ve kalıplar, gerçek fiyat deltasını hesaba katmadan sadece çubukların matristeki konumu olarak tanımlandı - sadece göreceli konum mu?
Gösterge modellerini denemek için bir fikrim var, ancak farklı bir çerçeveyle - son 5 göstergedeki göstergelerin ilk beş çubuğunu ve trend analizi için iki göstergeyi analiz ediyoruz - 10'luk artışlarla analiz ediyoruz ve aynı zamanda hesap mutlak değişiklikler.
Zig-zag hakkında mantıklı bir fikir, ancak düz yalpalardan tepe noktaları nasıl filtrelenebilir ki, bir trend değişikliğinin yanlış noktaları olabilir?
Andrey Emelyanov :
NS yapısı: Girişte 64 nöron, 4 dahili, 1 çıkış. Onlar. bir giriş nöronu bir modeli tanımlar.
Bunu seviyorum:
Yalnızca kalıp çiftlerini depolayan dinamik bir dizi var (ben buna sözlük diyorum), sözlüğe ikinci kez bir çift kalıp girerse, onu yazmam; ve daha yüksek ve daha düşük olanın sayacının iki dizisi - sözlüğe yazılmamış olsa bile, kalıbın çift oluşumuna ne sıklıkta katıldığını sayarlar.
Öğrenme vektörünün oluşumu sözlüğe göre gerçekleşir, ayrı bir kalıbın ağırlığı = kalıp_sayıcı / maksimum_sayıcı. Onlar. çiftlerin oluşumunda en sık yer alan model 1'dir ve diğerlerinin tümü 1'den küçüktür. NN'yi eğittikten sonra elde edilen bir tablo:
NS yapısı: Girişte 64 nöron, 4 dahili, 1 çıkış. Onlar. bir giriş nöronu bir modeli tanımlar. Şebeke 40-50 dakikada eğitilir, NN hatası 0.00001'i geçmez.
Böylece, daha önce sözlükte olmasa bile, kalıp çiftlerinin önemini tahmin edebilen bir modelim var.
Uzun zamandır düz ve yanlış tepelerle uğraşıyorum ama ZigZaga hesabı düzeyinde. Standart Zigzag kodunu biraz değiştirdim, yani bazında bir yüzde ZZ uyguladım. Şimdiye kadar, az ya da çok gerekli kod şöyle görünür:
Bir dizi hakkında ilginç bir çözüm. Çiftler/dönemler arasında istatistiklerde herhangi bir fark var mı, olumlu bir tahmin sonucu veren bir kalıbın ortaya çıkma sıklığındaki değişkenliğin kararlılığı nedir?
Zigzag hakkında da bir yüzde çözümüm var, ancak referans zikzak segmentini hesaplamak için daha derin bir geçmiş kullanıyorum, bununla diğerlerindeki değişimi yüzde olarak karşılaştırıyorum.
Kalıpları kullanarak göstergelerin analizine gelince, bu çok ilginç ... Göstergelerde daha az gürültü olduğunu düşünüyorum, ancak bazılarının "düşük gürültüyü" ve diğerlerinin "yüksek gürültüyü" bastırması için göstergeler seçmeniz gerekiyor, o zaman bir çoklu filtre.
Bu modelle sonuç almayı umuyor musunuz? İç katmanınız bir sınıflandırıcı değil, bir ara kompresör görevi görür.
Bir dizi hakkında ilginç bir çözüm. Çiftler/dönemler arasında istatistiklerde herhangi bir fark var mı, olumlu bir tahmin sonucu veren bir kalıbın ortaya çıkma sıklığındaki değişkenliğin kararlılığı nedir?
Zigzag hakkında da bir yüzde çözümüm var, ancak referans zikzak segmentini hesaplamak için daha derin bir geçmiş kullanıyorum, bununla diğerlerindeki değişimi yüzde olarak karşılaştırıyorum.
Herkesin bildiği gibi, A. Merrill'in kalıpları, kalıbın daha da gelişeceği (eğilimi sürdüreceği) veya başka bir kalıba geçeceği (fiyat toparlanması) konusunda kesin bir cevap vermez. Bu nedenle, bir saat ve bir dakikalık iki zaman dilimini kullanarak bir cevap aramaya karar verdim. Çiftlerin sıklığına ilişkin istatistikler topluyorum ve şu ana kadar evrensel bir öğrenme sözlüğüm yok. Ancak, bu bağlantının olması gerektiğinden eminim... aksi takdirde uyumlu desenler olmazdı: kelebekler, yarasalar vb.
Bebeğim hala dilsiz, ama zaten bir şeyler biliyor.. Girişte 8 gösterge, 1 çıkış, örtülü katmanda 15 nöron. 2000 girdi vektörü, 10000 eğitim dönemi.
Genel olarak, bu zaten 3. veya 4., tüm sonuçlar yaklaşık olarak aynı. Bence öyle, daha fazla nörona ve bir girdi vektörüne ihtiyacımız var, ancak öğrenene kadar uzun bir süre bekleyin.
Yakalaması gereken modeli kabaca hayal ediyorum ve özellikle farklı TF'lerden göstergeleri aldım ve çıkışlara görünüşte anlamlı bilgiler verildi.