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
İki çift maksimum değer platosu içeren bir fonksiyonun başka bir testini ekleyeceğim:
z = abs(tanh(x) + tanh(y))
0.1'lik bir adımla X,Y'yi -20'den +20'ye değiştirirken, tam numaralandırma 160801 yineleme alır.
Testte, her iki plato da ayrıntılı aramanın yüzde birinden daha az olan 1400 yinelemede görülebilir.
Bunu GA'da çalıştıran var mı? Karşılaştırmak ilginç.
Maksimum değerlerin iki eşit platosunu içeren bir fonksiyonun başka bir testini ekleyeceğim:
z = abs(tanh(x) + tanh(y))
0.1'lik bir adımla X,Y'yi -20'den +20'ye değiştirirken, tam numaralandırma 160801 yineleme alır.
Testte, her iki plato da ayrıntılı aramanın yüzde birinden daha az olan 1400 yinelemede görülebilir.
Bunu GA'da çalıştıran var mı? Karşılaştırmak ilginç.
GA'yı aramıyor musunuz?
Optimize edilen fonksiyonun iki argümanıyla çalışmak bir gösterge değildir. Yalnızca arama alanı küçük olduğu için değil, aynı zamanda arama algoritmasının kendisinin "kötü" özellikleri de görünebilir.
Formülü, en az 10 argüman olacak şekilde dönüştürün - algoritmanın tüm olumlu ve olumsuz özellikleri hemen görünecektir.
GA'yı aramıyor musunuz?
Optimize edilen fonksiyonun iki argümanıyla çalışmak bir gösterge değildir. Yalnızca arama alanı küçük olduğu için değil, aynı zamanda arama algoritmasının kendisinin "kötü" özellikleri de görünebilir.
Formülü, en az 10 argüman olacak şekilde dönüştürün - algoritmanın tüm olumlu ve olumsuz özellikleri hemen görünecektir.
Bu GA değil, iş parçacığında makaleye bir bağlantı var.
Yukarıda altı parametreli bir örnek verilmiştir. Birçok parametrenin görüntülenmesiyle tüm karmaşıklık.
Çok sayıda parametre içeren bir işlev sunarsanız, bir test yapacağım.
Çok sayıda parametre içeren bir işlev sunarsanız, bir test yapacağım.
Y=a+b;
nerede:
a=Deri(x1, y1)+Deri(x2, y2)+Deri(x3, y3)+Deri(x4, y4)+Deri(x5, y5);
b=Dış (x6, y6)+Dış (x7, y7)+Dış (x8, y8)+Dış (x9, y9)+Dış (x10, y10);
Dış Görünüm işlevini nerede arayacağınızı zaten biliyorsunuz.
Ve bu: 20 değişken ve Y fonksiyonunu görselleştirmek çok kolaydır. Bu prensibe göre, sınırsız sayıda argümana sahip bir fonksiyon oluşturabilir, ancak aynı zamanda görselleştirebilirsiniz.
Ve buna göre, nihai sonuç, n'nin toplam argüman sayısı olduğu bilinen ekstremum değeriyle karşılaştırmalı olarak Y*2/n olarak kontrol edilir.
Ve "yetersiz testçi" de tam bir numaralandırma on saat ve MT - ay sürdüğünde bir algoritma örneği verebilir misiniz?
Bu yaklaşımla, neredeyse tüm hesaplamalar önbelleğe alındığından, geçişlerin sırası büyük önem taşır. Optimize edicideki hemen hemen her (tüm bağımsız için) TS giriş parametresi için, her zaman önceki geçişlerin değerlerini depolayan global tamponlar vardır.
Örneğin, Mashka ve PriceChannel kullanıyorsunuz. Bu göstergelerin her birinin kendi bağımsız girdi parametreleri vardır. Bu nedenle, her gösterge için, karşılık gelen global arabelleği doldurma işlevi belirtilir (aslında birkaç satır, OOP ile daha da güzel olmalıdır). Ardından, göstergelerin her birinin kaynak yoğunluğu karşılaştırılır (PriceChannel, Mashka'dan daha ağırdır). En ağır göstergelerin girdi parametreleri dış kontur üzerinde (ilk için) numaralandırılmaya başlarken, en basit göstergelerin girdi parametreleri iç kontur üzerinde (iç içe geçmiş fors) iletilmeye başlar.
İşte büyük zafer burada devreye giriyor. Artı C++, tamsayı hesaplamaları ve gereksiz kontroller olmadan kendi sipariş sistemi. Sonuç bu şekilde elde edilir. Sonuç olarak, tekli çalıştırmalar, en azından bir büyüklük sırasına göre MT'den daha hızlıdır. Ve optimizasyon - zaten büyüklük sıralarında.
MT optimizer, elde edilen optimizasyon sonuçları matrisine tam erişime sahip olacak OnOptimization işlevinden yoksundur. Orada, ortaya çıkan matrisin çeşitli analizlerini yapıyorum: TS'nin işlem süresi açısından kesişmeyen pasajlarını filtreliyorum, birleştiriyorum, vb. Ancak daha da yararlı olan, meta-TC'yi karşılık gelen bir portföy şeklinde oluşturmak için her geçiş için ağırlıkların hesaplanmasıdır. Bunu yapmak için OnOptimization, umutsuz olmayan geçişlerin her biri için bir Eşitlik vektörüne sahiptir.
Ancak eller undertester'a çalışan bir araç arama aşamasında değil, ne yazık ki zaten bulunduğunda ulaşır. Aramanın kendisi tamamen farklı bir aşamadır: açıklama olmadan.
Bunu GA'da çalıştıran var mı? Karşılaştırmak ilginç.
Y=a+b;
nerede:
a=Deri(x1, y1)+Deri(x2, y2)+Deri(x3, y3)+Deri(x4, y4)+Deri(x5, y5);
b=Dış (x6, y6)+Dış (x7, y7)+Dış (x8, y8)+Dış (x9, y9)+Dış (x10, y10);
Dış Görünüm işlevini nerede arayacağınızı zaten biliyorsunuz.
Ve bu: 20 değişken ve Y fonksiyonunu görselleştirmek çok kolaydır. Bu prensibe göre, sınırsız sayıda argümana sahip bir fonksiyon oluşturabilir, ancak aynı zamanda görselleştirebilirsiniz.
Ve buna göre, nihai sonuç, n'nin toplam argüman sayısı olduğu bilinen ekstremum değeriyle karşılaştırmalı olarak Y*2/n olarak kontrol edilir.
Değişkenlerin hesaplanmasında kaç geçiş ve hangi adımla?
Resmi beğenmesen ne fark eder ki?
MT5'te 64-bit GA çok iyidir, herhangi bir sorunu çözer, asıl mesele sorunu doğru formüle etmektir.
Ve hız açısından, eşiti yok, bu konudaki GA hakkında bir konuşmayı hangi atlamanın başlattığını anlamıyorum.
Sorun GA'da değil, test cihazının kendisinin, özellikle borsada, kotasyon geçmişinin yanlış depolanması ve geçmişinizi kaydıramaması nedeniyle işe yaramaz olmasıdır.
Umarım bu sorun çözülür, korkarım 3-5 yıl beklemek zorunda kalacağım.
Örneğin, Mashka ve PriceChannel kullanıyorsunuz. Bu göstergelerin her birinin kendi bağımsız girdi parametreleri vardır. Bu nedenle, her gösterge için, karşılık gelen global arabelleği doldurma işlevi belirtilir (aslında birkaç satır, OOP ile daha da güzel olmalıdır). Ardından, göstergelerin her birinin kaynak yoğunluğu karşılaştırılır (PriceChannel, Mashka'dan daha ağırdır). En ağır göstergelerin girdi parametreleri dış kontur üzerinde (ilk için) numaralandırılmaya başlarken, en basit göstergelerin girdi parametreleri iç kontur üzerinde (iç içe geçmiş fors) iletilmeye başlar.
Bir şey bana bu yaklaşımın GA ile kolayca uygulanabileceğini söylüyor. İş miktarı aşağı yukarı aynı. "İç döngü" her geçişte yinelenir ...
Ama en önemlisi, ne kadar talep görecek? Şüphelendiğim gibi, sadece özel bir OnTester() işlevi bile herkes tarafından kullanılmaz. Ancak çok güçlü bir optimizasyon aracıdır.
Örneğin, işte benim uygulamalarımdan biri:
double CDoublePeakBottomAdvisorPartsFactory::MyOnTester(CMyExpertT* pmeExpert)
{
ulong ulTickedTime = pmeExpert.GetTickedTime();
uint uiTotalNumberOfSL = pmeExpert.GetNumOfLosePositions();
double dDDPercent = TesterStatistics(STAT_EQUITY_DDREL_PERCENT);
double dStartBalance = TesterStatistics(STAT_INITIAL_DEPOSIT);
double dProfit = TesterStatistics(STAT_PROFIT);
double dNumOfTrades = TesterStatistics(STAT_TRADES);
double dNumOfProfitTrades = TesterStatistics(STAT_PROFIT_TRADES);
double dMaxNumOfSL = TesterStatistics(STAT_MAX_CONLOSS_TRADES);
double dRecoveryFactor = TesterStatistics(STAT_RECOVERY_FACTOR);
double dProfitTradesPerWeek = dNumOfProfitTrades/ulTickedTime*SECS_IN_WEEK;
double dProfitPerDay = dProfit/ulTickedTime*SECS_IN_DAY;
Print("Ticked time (days): ",DoubleToString(ulTickedTime/SECS_IN_DAY,2));
Print("Number Of Trades: ",DoubleToString(dNumOfTrades,1));
if(dNumOfTrades == 0)
{
Print("Ни одного трейда !");
return(-100000);
};
if(dMaxNumOfSL > uiIMaxNumOfSeqSL)
return(-10000 - dMaxNumOfSL*100 + dProfit/1000);
double dBarsPerTrade = ((double)ulTickedTime/PeriodSeconds(m_didData.m_etTimeFrame))/dNumOfTrades;
if((bILongAllow == false) || (bIShortAllow == false))
dBarsPerTrade /= 2;
if(dBarsPerTrade < MIN_BARS_PER_TRADE)
return(dBarsPerTrade-MIN_BARS_PER_TRADE + dRecoveryFactor);
Print("Max number Of SL: ",DoubleToString(dMaxNumOfSL,1));
if(iIMaxNumOfSeqSLForQualify > 0 && dMaxNumOfSL > iIMaxNumOfSeqSLForQualify)
{
Print("Слишком много СЛ подряд !");
return(dRecoveryFactor - (dMaxNumOfSL-iIMaxNumOfSeqSLForQualify)*1000)-10000;
};
Print("Bars Per Trade (half): ",DoubleToString(dBarsPerTrade,1));
if(dBarsPerTrade > MAX_BARS_PER_TRADE)
{
Print("Слишком редкие трейды !");
return(dRecoveryFactor - dBarsPerTrade/100);
};
Print("Profit: ",DoubleToString(dProfit,3));
Print("Profit per day: ",DoubleToString(dProfitPerDay,3));
Print("Число СЛ: ",IntegerToString(uiTotalNumberOfSL));
Print("Приемлемая торговля.");
return(dRecoveryFactor + (1-(uiTotalNumberOfSL/dNumOfTrades))*100);
};
Burada temel, kurtarma faktörüdür, ancak arka arkaya minimum sayıda SL ile çalışır ve oldukça sık işlemlerle öne çıkar.
Ancak, gördüğüm gibi - çoğu standart seçenekleri kullanıyor.