5 basamak algılama

 
double pointsPerPip(){
   string suffix = StringSubstr ( Symbol (), 6 );
   int digits = MarketInfo( "EURUSD" + suffix, MODE_DIGITS);
   if (digits == 0 ){
      digits = MarketInfo( "EURUSD" , MODE_DIGITS);
   }
   if (digits == 0 ){
       return ( 1 );
   } else {
       if (digits == 5 ){
         return ( 10 );
      }
   }
   return ( 1 );
}
Şu anda pip çarpanı olarak 1'e mi yoksa 10'a mı ihtiyacımız olduğunu tespit etmenin en kusursuz yolunu bulmaya çalışıyorum. Yukarıdaki benim ilk Fikrimdi, sadece EURUSD'nin kaç basamaklı olduğuna bakmak. bu sembolün EURUSDm veya EURUSDiam olarak adlandırıldığı veya komisyoncular tarafından kodumuzu kırmak için başka bir neden olmaksızın eklenen diğer komik saçmalıklar ve ayrıca örneğin GOLD veya GOLDm gibi tam 6 karaktere sahip olmayan Sembol adları ve yukarıdakiler bunu halledemez.

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ı?
 

Genellikle init bölümünde sadece bir kez kontrol ederim:

 int mypoint;
int init()
{
if (MarketInfo( Symbol (), MODE_DIGITS)== 3 ||MarketInfo( Symbol (), MODE_DIGITS)== 5 )
mypoint= 10 ;
else mypoint= 1 ;
}
...
 
Roger :

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.

 
7bit :
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).

 
Roger'ınkine benzer bir yöntem kullanıyorum ve henüz bana bir sorun yaratmadı.
Ç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; }
 
WHRoeder :
 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.
 
cloudbreaker :
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.
 
7bit wrote >>
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.


Yukarıdaki kodun 'buggy' olduğunu söyleyemem - sadece .. kullanıcıların çok iyi bildiği sınırlamaları vardır.
Felsefenin güzelliği, pratiklik ile asenkron olarak çalışabilmesidir :)
-BB-
 
Belirli bir fiyata göre bir noktanın ne olduğunu bulmak ve ardından fiyatın rakamlarına kıyasla hangi hanede olduğuna karar vermek basit (belki de matematik açısından o kadar basit değil) meselesi değil mi?
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.