//+------------------------------------------------------------------+//| FindRetryPrices.mq5 |//| Copyright 2016, Vasiliy Sokolov. |//| http://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2016, Vasiliy Sokolov."#property link"http://www.mql5.com"#property version"1.00"#include <Dictionary.mqh>
inputint RatesPeriod = 10 ; // Период за который ищутся повторенияinputint RoundPoints = 10 ; // Загрубление цены в прайсстепахclass CBar : public CObject
{
private :
MqlRates m_bar;
public :
CBar( MqlRates & bar){m_bar = bar;}
datetime Date(){ return m_bar.time;}
doubleOpen (){ return m_bar.open;}
doubleHigh (){ return m_bar.high;}
doubleLow (){ return m_bar.low;}
doubleClose (){ return m_bar.close;}
};
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart ()
{
// Нахождение повторяющихся баровMqlRates rates[];
int total = CopyRates ( Symbol (), Period (), 0 , RoundPoints, rates);
CDictionary* BarsCollections = new CDictionary(total);
for ( int i = 0 ; i < total; i++)
{
double price = PriceToLevel(rates[i].high);
CBar* bar = new CBar(rates[i]);
if (!BarsCollections.ContainsKey(price))
BarsCollections.AddObject(price, new CList());
CList* equal_bars = BarsCollections.GetObjectByKey(price);
equal_bars.Add(bar);
}// Вывод повторов
FOREACH_DICT(BarsCollections)
{
CList* list = node;
if (list.Total() < 2 ) continue ;
string retry_bars = "" ;
for (CBar* bar = list.GetFirstNode(); bar != NULL ; bar = list.GetNextNode())
retry_bars += " [" + TimeToString (bar.Date()) + ", " + DoubleToString (bar. High (), Digits ()) + "]" ;
printf ( "Обнаружено совпадение баров:" + retry_bars);
}
delete BarsCollections;
}
//+------------------------------------------------------------------+//| Округляет цену в соответствии с параметром RoundPoints |//+------------------------------------------------------------------+double PriceToLevel( double price)
{
double price_step = RoundPoints* Point ();
double mn = MathFloor (price/price_step);
return mn * price_step;
}
//+------------------------------------------------------------------+
Komut dosyasının çalışması için Sözlük dosyasını MQL5\Include dizinine kopyalayın
Gerçek arama, sarı renkle vurgulanan döngü için tek geçişte yapılır. Sonuç listesi tekrar içermez (A, B'yi tekrar ederse ve B, A'yı tekrar ederse, iki {A, B} ve {B, A} yerine bir {A, B} kümesi görüntülenecektir).
Hepinize çok teşekkürler!! Bugün her şeyi anlamaya çalışacağım. Sadece bir kod parçasını bir Expert Advisor'a kopyalamak değil, kodun neden bu şekilde yazıldığını anlamak benim için önemli, bu yüzden muhtemelen daha fazla soru soracağım.
// строку int searchPeriod=(Search_Period<1)?1:Search_Period;// можно расписать так:inputint Search_Period= 10 ; // Количество копируемых свечей ... эту строку вы видите в настройкахint searchPeriod; // Сюда будем записывать входной параметрif (Search_Period< 1 ) searchPeriod= 1 ; // Если во входном параметре ввели ноль или меньше нуля, то параметр будет равен нулюelse searchPeriod=Search_Period; // иначе примем входной параметр// соответственно и строку int delta=(Delta<0)?0:Delta;// можно расписать точно так же
Bunun bir yazım hatası olduğunu düşünmekte haklı mıyım? 1 yerine 0 olmalıdır.
bunun gibi: int searchPeriod=(Search_Period<1)?0:Search_Period;
ve yürütülebilir komut dosyasında daha da ileri:
int copy_bars=(int)fmin( Search_Period ,Bars(Symbol(),Period())); // kopyalanan mum sayısı
tam orada, teorik olarak, şu değişkeni zaten kullanmalıyız: searchPeriod . Böyle?
------
Başka bir soru, bu hat ne işe yarıyor? ne için gerekli? Yapının her bir elemanının sıfırlandığı bulundu. Ve burada, teorik olarak, bu verileri yeni yazdıysak ve kullanmaya devam etmemiz gerekiyorsa, neden ve neyi sıfırladığımızı anlayamıyorum.
Bunun bir yazım hatası olduğunu düşünmekte haklı mıyım? 1 yerine 0 olmalıdır.
bunun gibi: int searchPeriod=(Search_Period<1)?0:Search_Period;
ve yürütülebilir komut dosyasında daha da ileri:
int copy_bars=(int)fmin( Search_Period ,Bars(Symbol(),Period())); // kopyalanan mum sayısı
tam orada, teorik olarak, şu değişkeni zaten kullanmalıyız: searchPeriod . Böyle?
------
Başka bir soru, bu hat ne işe yarıyor? ne için gerekli? Yapının her bir elemanının sıfırlandığı bulundu. Ve burada, teorik olarak, bu verileri yeni yazdıysak ve kullanmaya devam etmemiz gerekiyorsa, neden ve neyi sıfırladığımızı anlayamıyorum.
"böyle: int searchPeriod=(Search_Period<1)?0:Search_Period; "
Hayır böyle değil. Yani (tam anlamıyla): Kullanıcı tarafından ayarlarda Search_Period ayarlanırsa birden küçükse, searchPeriod sıfıra eşit olacaktır, aksi takdirde searchPeriod , kullanıcı tarafından ayarlarda ayarlanan Search_Period değerine eşit olacaktır . Bu doğru değil. Sıfıra eşit bir arama aralığına ihtiyacımız yok. Bu nedenle, bu aralık kullanıcı tarafından 0 veya sıfırdan küçük (birden küçük) olarak ayarlanırsa, bu aralığı minimuma - bire eşitleriz.
"int copy_bars=(int)fmin( Search_Period ,Bars(Symbol(),Period())); // kopyalanan mum sayısı tam orada, teorik olarak, şu değişkeni zaten kullanmalıyız: searchPeriod . Böyle? "
Evet, evet, bir yazım hatası oldu.
"Başka bir soru, bu satır ne işe yarıyor? Ne için? Yapının her bir öğesinin sıfırlandığını buldum. Ve sonra neden ve neyi sıfırladığımızı anlayamıyorum, eğer teorik olarak, az önce yazmışsak. bu veri ve onu kullanmaya devam etmelidir. ZeroMemory ( dataCandle); // Yapıdaki verileri sıfırlayın"
Bunu yapıyı verilerle doldurmadan önce yaparız. Önce sıfırlıyoruz, sonra dolduruyoruz. Bakın - döngüden önce sıfırlıyoruz. Ve sonra döngüde yapıyı verilerle doldururuz.
İşte tekrar bulma sorununa benim çözümüm:
Komut dosyasının çalışması için Sözlük dosyasını MQL5\Include dizinine kopyalayın
Gerçek arama, sarı renkle vurgulanan döngü için tek geçişte yapılır. Sonuç listesi tekrar içermez (A, B'yi tekrar ederse ve B, A'yı tekrar ederse, iki {A, B} ve {B, A} yerine bir {A, B} kümesi görüntülenecektir).
Bu betiğin çıktısı aşağıdakileri gösterdi:
Yardımdan:
İşte tekrar bulma sorununa benim çözümüm:
Standart RSI'yi hesaplamak için bir fonksiyon bulma konusunda yardım istiyorum, bunun gereksinimleri basit:
1. Belirli bir çubuktaki RSI değerini döndürün
2. Göstergeyi yalnızca istenen (arzu edilir) çubuklar (gerekirse) için hesaplayın
3. Belirli bir TF'ye güvenebilme
4. 2. nokta daha hızlı göstergesi sayesinde çalışır
Danışmana bir fonksiyon entegre etmek istiyorum, hazır olan varsa paylaşmanızı rica ediyorum.
Soruyorum çünkü gösterge çok yaygın ve bir sır değil.
Standart RSI'yi hesaplamak için bir fonksiyon bulma konusunda yardım istiyorum, bunun gereksinimleri basit:
1. Belirli bir çubuktaki RSI değerini döndürün
2. Göstergeyi yalnızca istenen (arzu edilir) çubuklar (gerekirse) için hesaplayın
3. Belirli bir TF'ye güvenebilme
4. 2. nokta daha hızlı göstergesi sayesinde çalışır
Danışmana bir fonksiyon entegre etmek istiyorum, hazır olan varsa paylaşmanızı rica ediyorum.
Soruyorum çünkü gösterge çok yaygın ve bir sır değil.
Neden standart iRSI'yi sevmiyorsunuz? Yeterince gizli değil mi?
İşlevde yapmam gereken değişiklikler var ...
Ardından bitmiş olanı alın ve gereksinimlerinize göre değiştirin:
Ardından bitmiş olanı alın ve gereksinimlerinize göre değiştirin:
İşte tekrar bulma sorununa benim çözümüm:
Vasily, #include <Dictionary.mqh> dosyasını açtığımda EA gövdesindekiyle aynı şey açılıyor. Böyle mi olmalı? Yoksa içinde başka bir kod mu var?
Çünkü gördüğüm kodda tekrarları nasıl aradığı net değil ((
Bunun bir yazım hatası olduğunu düşünmekte haklı mıyım? 1 yerine 0 olmalıdır.
bunun gibi: int searchPeriod=(Search_Period<1)?0:Search_Period;
ve yürütülebilir komut dosyasında daha da ileri:
int copy_bars=(int)fmin( Search_Period ,Bars(Symbol(),Period())); // kopyalanan mum sayısı
tam orada, teorik olarak, şu değişkeni zaten kullanmalıyız: searchPeriod . Böyle?
------
Başka bir soru, bu hat ne işe yarıyor? ne için gerekli? Yapının her bir elemanının sıfırlandığı bulundu. Ve burada, teorik olarak, bu verileri yeni yazdıysak ve kullanmaya devam etmemiz gerekiyorsa, neden ve neyi sıfırladığımızı anlayamıyorum.
ZeroMemory (dataCandle); // Yapıdaki verileri sıfırla
Bunun bir yazım hatası olduğunu düşünmekte haklı mıyım? 1 yerine 0 olmalıdır.
bunun gibi: int searchPeriod=(Search_Period<1)?0:Search_Period;
ve yürütülebilir komut dosyasında daha da ileri:
int copy_bars=(int)fmin( Search_Period ,Bars(Symbol(),Period())); // kopyalanan mum sayısı
tam orada, teorik olarak, şu değişkeni zaten kullanmalıyız: searchPeriod . Böyle?
------
Başka bir soru, bu hat ne işe yarıyor? ne için gerekli? Yapının her bir elemanının sıfırlandığı bulundu. Ve burada, teorik olarak, bu verileri yeni yazdıysak ve kullanmaya devam etmemiz gerekiyorsa, neden ve neyi sıfırladığımızı anlayamıyorum.
ZeroMemory(dataCandle); // Yapıdaki verileri sıfırla
"böyle: int searchPeriod=(Search_Period<1)?0:Search_Period; "
Hayır böyle değil. Yani (tam anlamıyla): Kullanıcı tarafından ayarlarda Search_Period ayarlanırsa birden küçükse, searchPeriod sıfıra eşit olacaktır, aksi takdirde searchPeriod , kullanıcı tarafından ayarlarda ayarlanan Search_Period değerine eşit olacaktır . Bu doğru değil. Sıfıra eşit bir arama aralığına ihtiyacımız yok. Bu nedenle, bu aralık kullanıcı tarafından 0 veya sıfırdan küçük (birden küçük) olarak ayarlanırsa, bu aralığı minimuma - bire eşitleriz.
"int copy_bars=(int)fmin( Search_Period ,Bars(Symbol(),Period())); // kopyalanan mum sayısı
tam orada, teorik olarak, şu değişkeni zaten kullanmalıyız: searchPeriod . Böyle? "
Evet, evet, bir yazım hatası oldu.
"Başka bir soru, bu satır ne işe yarıyor? Ne için? Yapının her bir öğesinin sıfırlandığını buldum. Ve sonra neden ve neyi sıfırladığımızı anlayamıyorum, eğer teorik olarak, az önce yazmışsak. bu veri ve onu kullanmaya devam etmelidir. ZeroMemory ( dataCandle); // Yapıdaki verileri sıfırlayın"
Bunu yapıyı verilerle doldurmadan önce yaparız. Önce sıfırlıyoruz, sonra dolduruyoruz. Bakın - döngüden önce sıfırlıyoruz. Ve sonra döngüde yapıyı verilerle doldururuz.