5 basamak algılama
Genellikle init bölümünde sadece bir kez kontrol ederim:
Kodunuz hatasız değil, 1 veya 2 (altın) veya diğer basamaklı Semboller var.
Daha iyi bir yol buldum (yine de birkaç broker ile test etmem gerekiyor). Eurusd adını bulmak için geçmiş klasöründe symbol.raw'ı okur ve ardından MarketInfo()'yu kullanır;
/** * determine the pip multiplier (1 or 10) depending on how many * digits the EURUSD symbol has. This is done by first * finding the exact name of this symbol in the symbols.raw * file (it could be EURUSDm or EURUSDiam or any other stupid name * the broker comes up with only to break other people's code) * and then usig MarketInfo() for determining the digits. */ double pointsPerPip(){ int i; int digits; double ppp = 1 ; string symbol; int f = FileOpenHistory( "symbols.raw" , FILE_BIN | FILE_READ ); int count = FileSize (f) / 1936 ; for (i= 0 ; i<count; i++){ symbol = FileReadString (f, 12 ); if ( StringFind (symbol, "EURUSD" ) != - 1 ){ digits = MarketInfo(symbol, MODE_DIGITS); if (digits == 4 ){ ppp = 1 ; } else { ppp = 10 ; } break ; } FileSeek (f, 1924 , SEEK_CUR ); } FileClose (f); return (ppp); }
Sadece bir para birimi için bir koddu. EA'nızı çoklu para birimleri için kullanmak istiyorsanız, her bir durum için ayrı ayrı hesaplamanız gerekir.
Daha iyi bir yol buldum (yine de birkaç broker ile test etmem gerekiyor). eurusd adını bulmak için geçmiş klasöründe symbol.raw'ı okur ve ardından MarketInfo()'yu kullanır;
Bu, symbol.raw dosyasını değiştirirlerse bozulur (ve MT4'ün eski sürümleriyle çalışmayabilir... gerçi bu muhtemelen bir sorun değildir).
Çoğu olasılık için işe yarayacaktır. Geleceğe uymayan birini bulursanız, bulduğunuzda o köprüyü geçmeniz yeterli.
CB
//++++ These are adjusted for 5 digit brokers. double pips2points, // slippage 3 pips 3=points 30=points pips2dbl; // Stoploss 15 pips 0.0015 0.00150 int Digits.pips; // DoubleToStr(dbl/pips2dbl, Digits.pips) int init() { if (Digits == 5 || Digits == 3) { // Adjust for five (5) digit brokers. pips2dbl = Point*10; pips2points = 10; Digits.pips = 1; } else { pips2dbl = Point; pips2points = 1; Digits.pips = 0; }
if ( Digits == 5 || Digits == 3 ) { // Adjust for five (5) digit brokers.Zaten yetersiz bulduğum şeyi tekrar ediyorsun. Digits değişkenini tek başına kullanmak soruna yardımcı olmaz (ilk gönderide tanımlanan sorun ben olabilirim), çünkü o anda hangi sembol üzerinde çalıştığını ve bu sembolün kaç basamaklı olması gerektiğini hesaba katmaz. Bazı egzotik çiftlerde 0'dan 5'e kadar herhangi bir sayıda rakam olabilir, sadece 5 veya 3'e karşı 4 veya 2 değil. Bu kadar basit olsaydı bu konuyu açmamıştım. Bu nedenle, hangi çiftte çalışırsa çalışsın, şimdi sadece eurusd'un rakamlarını kullanıyorum. En büyük problem eurusd'un gerçek adını bulmaktı ve şu ana kadar symbol.raw yöntemi en basit ve en güvenilir yöntem gibi görünüyor.
Geleceğe uymayan birini bulursanız, bulduğunuzda o köprüyü geçmeniz yeterli.
Kırılmayacak kusursuz bir kod yazmaya çalışıyorum. (Bilerek) buggy kodu yazmak ve düzeltmeden önce bozulana kadar beklemek, yazılım geliştirmenin nasıl yapılması gerektiği konusundaki felsefeme uymuyor.
Felsefenin güzelliği, pratiklik ile asenkron olarak çalışabilmesidir :)
-BB-
Bunu başarmanın basit bir yolu, bir fiyat almak ve bir nokta eklemek olabilir ve sonucunuz aynı değilse, çarpanı aynı değilse, eşleşene kadar bir döngüde çoğaltıcınızı artırın.
Doğru rakamları bulmak için daha karmaşık bir algoritmaya sahip olan var mı? Bence her şey önce EURUSD'nin sembol adının tam olarak nasıl olduğunu bulma sorununa bağlı ve gerisi kolay. Örneğin, "EURUSD" içeren veya onunla başlayan bir isim arayabilmem için mevcut tüm sembolleri numaralandırmanın kolay bir yolu var mı?