Çoklu para birimi göstergesinin nasıl geliştirileceğini bilen var mı? - sayfa 3

 
4x_Gypsy :

Büyük ipucu "Ama bunu nasıl yapacağımı bilmiyorum" idi.

OP'den herhangi bir yanıt gelmemesi, bir şeylerin yanlış olduğunun bir göstergesidir. Benim "tahminim", OP'nin anlayış eksikliğinden dolayı hüsrana uğradığı ve konuyu terk ettiği yönünde. Yıllar önce benim de aynı şeyi yaptığım bir zaman vardı. Bundan farklı sitelerden/forumlardan daha fazlasını öğrendim çünkü kimse ne kadar yeni olduğumu fark etmek için zaman ayırmıyordu ve sürekli olarak örnekler yayınlıyordu ve o zamanlar benim anlayışımın tamamen üzerinde tartışmalar vardı.

Bakış açınıza göre haklı olabilirsiniz, diğer yandan, belgelere hızlı bir şekilde bakma riskini alırsanız basitçe cevaplanmış birçok soru gördüm ve bu soruları tekrar tekrar cevaplarken kendinizi gerçekten aptal gibi hissediyorsunuz.

Ayrıca google ve burada bir arama seçeneği var. Bir şeyi nasıl yapacağımı bilmiyorsam, bu benim bir sonraki adımım sorunu kendi başıma çözmeye çalışmaktır.

Bu konunun konusu olması durumunda, çok para birimli bir sistemin nasıl kodlanacağını bilmiyorum, google'a yanıt verirdim veya zaten mevcut kodu burada arardım.

 
gooly :

Bakış açınıza göre haklı olabilirsiniz, diğer yandan, belgelere hızlı bir şekilde bakma riskini alırsanız basitçe cevaplanmış birçok soru gördüm ve bu soruları tekrar tekrar cevaplarken kendinizi gerçekten aptal gibi hissediyorsunuz.

Ayrıca google ve burada bir arama seçeneği var. Bir şeyi nasıl yapacağımı bilmiyorsam, bu benim bir sonraki adımım sorunu kendi başıma çözmeye çalışmaktır.

Bu konunun konusu olması durumunda, çok para birimli bir sistemin nasıl kodlanacağını bilmiyorum, google'a yanıt verirdim veya zaten mevcut kodu burada arardım.

Geri bildiriminiz için teşekkür ederiz, olumlu olmasına sevindim. çok komik

Bu durumda karşılaştığım yol için endişelenenlerden özür dilerim. Ben gerçekten barışı seven, dramadan uzak, genellikle katılmadığım çoğu şeyi görmezden gelen bir insanım.

 

Merhaba millet,

Burada aktivite olmadan uzun süre için özür dilerim. İş için seyahat ediyordum ve ayrıca bazı projelerle meşguldüm ve bir süre projeyi bir kenara bırakmak zorunda kaldım..

Gönderi güncellemelerini okuduktan sonra, netleştirmem gereken bazı noktalar var:

  1. Birinin benim için her şeyi kodlamasını istemiyorum, sadece bana doğru yönü göstermesi gerekiyor ve gerisini ben hallediyorum. Pekala... şimdi WHRoeder çözümünü test edeceğim ve işlerimi yapacağım ve daha sonra sonucu buraya göndereceğim. WHRoeder önerisi: https://www.mql5.com/en/forum/158938
  2. Bu konuyu oluşturmadan önce benzer gönderiler için arama yaptım ama bulunamadı... sonra oluştur
  3. Kusura bakmayın yanıt vermem uzun zaman aldı ama gerçekten çok fazla çalıştı ama şimdi göstergeyle çalışmaya devam ediyorum
  4. Zavallı ingilizcem için özür dilerim! benim dilim portekizce ve ingilizce yayınladığımda google çevirmen kullanmam gerekiyor ve bu mükemmel değil.


 
İşte benim testim.

Kullanıcıların varlıklarını bilgilendirmelerine izin verin ve ardından tüm çiftleri Yüksek/Düşük değerlerini gösterin.

Selectec çiftlerinden herhangi biri aktif Pencere ile aynıysa, oranları güncellenir. Ancak diğer çiftler, yalnızca gösterge eklendiğinde oranları gösterir... ve artık güncelleme yapmaz...

Aşağıdaki görselde de görebileceğiniz gibi GBPUSD penceresine gösterge eklendi... ve GBPUSD oranları tik adım güncellendi. Ancak EURUSD güncelleme yapmıyor ve hala aynı değerde.

Ücretler kopyalandı


Aşağıda, gösterge kodu:

 //+------------------------------------------------------------------+
//|                                                MultiCurrency.mq4 |
//|                         Copyright 2016, Wemerson Couto Guimarães |
//|                  https://www.mql5.com/pt/users/wemersonrv/seller |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Wemerson Couto Guimarães"
#property link        "https://www.mql5.com/pt/users/wemersonrv/seller"
#property version    "1.00"
#property strict
#property indicator_separate_window

input string UsePairs= "EURUSD,GBPUSD" ; // Pares separados por vírgula.

struct pair_struct{
   string symbol;
   MqlRates rates[];
};
pair_struct pairs[];
bool initial;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit (){
   int i= 0 , j= 0 , c;
   string _pairs[], msg= "" ;
   bool pairok= false ;
   initial = true ;
   ENUM_INIT_RETCODE result = INIT_SUCCEEDED ;
   
   StringSplit (UsePairs, StringGetCharacter ( "," , 0 ), _pairs);
   
   for ( i= 0 ; i< ArraySize (_pairs); i++){
      pairok= false ;
      
       for ( j= 0 ; j< SymbolsTotal ( true ); j++){
         if ( SymbolName (j, true ) == _pairs[i]){
            pairok= true ;
             break ;
         }
      }
       if ( pairok ){
         c= ArraySize (pairs);
         ArrayResize (pairs, c+ 1 );
         pairs[c].symbol = _pairs[i];
      } else {
         msg += _pairs[i] + ", " ;
      }
   }
   if ( msg != "" ){
       string invalids = ArraySize (pairs)== 1 ? "Invalid Pair: " : "Invalid Pairs: " ;
      msg = invalids +   StringSubstr (msg, 0 , StringLen (msg)- 2 ) + ". Please Check!" ;
       Alert (msg);
      result = INIT_PARAMETERS_INCORRECT ;
   } else {
       for (i= 0 ; i< ArraySize (pairs); i++){
         ArrayCopyRates( pairs[i].rates, pairs[i].symbol, PERIOD_CURRENT );
      }
   }   
   
   return (result);

}

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason){
   
   Comment ( "" );
   
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {

   int i= 0 ;
   if ( initial ){
       for ( i= 0 ; i< ArraySize (pairs); i++){
         if (pairs[i].rates[ 0 ].time == 0 ) return (rates_total);
      }
      initial= false ;
   }
   
   string log = "" ;
   
   for (i= 0 ; i< ArraySize (pairs); i++){
       log += "\nPair: " + pairs[i].symbol + 
             " - High: " + DoubleToStr(pairs[i].rates[ 0 ].high, Digits ()) + 
             " - Low: " + DoubleToStr(pairs[i].rates[ 0 ].low, Digits ());
   }

   Comment ( "\n\n*** Pair Rates***\n" + log );
   return (rates_total);
   
}
//+------------------------------------------------------------------+

 
RefreshRates() kullanmaya çalışıyorum ama yine de aynı sonuçla... sadece aynı penceredeki çift çalışıyor, diğer çiftler güncellenmiyor.
 
wemersonrv :
RefreshRates() kullanmaya çalışıyorum ama yine de aynı sonuçla... sadece aynı penceredeki çift çalışıyor, diğer çiftler güncellenmiyor.

RefreshRates() 'in MqlRates verileriyle hiçbir ilgisi yoktur. WHRoeder'ın örnek kodu yalnızca 600 öncesi yapılar için geçerlidir. En son derleme için, ArrayCopyRates() dönüş kodlarının yanı sıra Hata kodları, Rates Array'in boyutu ve WHRoeder tarafından belirtilen ek bir önlem olarak test etme gibi gönderimde belirtilen çeşitli noktaları kontrol etmeniz gerekir. zaman özelliğinin geçerliliği.

not! İngilizcede zorlanıyorsan bana PM gönder. Ben Portekizliyim (Portekiz)

 

Merhaba millet.

Test ederken, önce çift dizisini tüm yinelemelerde ÜCRETSİZ, ardından oranları tekrar kopyalayan bir döngü ekleyerek OnCalculate işlevine oranların bir "tekrar kopyasını" ekledim. Çalışıyor gibi görünüyor ve hata döndürmüyor.

İhtiyacım olanı yapmanın en iyi yolu bu mu bilmiyorum ama görünüşe göre çalışıyor ve hatasız.


   int i= 0 ;
   if ( initial ){
       for ( i= 0 ; i< ArraySize (pairs); i++){
         if (pairs[i].rates[ 0 ].time == 0 ) return (rates_total);
      }
      initial= false ;
   }

   // My change to recopy rates every tick by adding a loop at starting of OnCalculate() to do this
   // AS FMIC says, ArrayCopyRates needs the array without content, 
   // then before recopy, free the array.
   for (i= 0 ; i< ArraySize (pairs); i++){
       ArrayFree (pairs[i].rates);
      ArrayCopyRates(pairs[i].rates, pairs[i].symbol, PERIOD_CURRENT );
   }
 
wemersonrv : Test ediyorum, OnCalculate işlevine oranların bir "tekrar kopyasını" ekledim... önce çift dizisini tüm yinelemelerde SERBEST GEÇEN, ardından oranları yeniden kopyalayan bir döngü ekleyerek. Çalışıyor gibi görünüyor ve hata döndürmüyor.
  1. Belgelerde belirtildiği gibi.
    Başka bir çizelgeden veri (sembol adı ve/veya zaman çerçevesi mevcut olanlardan farklı) isteniyorsa, ilgili tablonun istemci terminalinde açılmamış olması ve sunucudan gerekli verilerin talep edilmesi durumu mümkündür. Bu durumda, ERR_HISTORY_WILL_UPDATED hatası (4066 - istenen geçmiş verileri güncelleniyor) last_error değişkenine yerleştirilecek ve birinin yeniden talep etmesi gerekecek
    Veburada doğrulandı
    Hiç geçmiş yoksa ArrayCopyRates bir hata döndürür (ERR_NO_HISTORY_DATA = 4073.) İndirme tamamlanana kadar yinelenen çağrılar da başarısız olur. Geçmiş olduğunda ancak güncel olmadığında, ArrayCopyRates geçerli döndürür VE ayrıca `_LastError` öğesini ERR_HISTORY_WILL_UPDATED (= 4066) olarak ayarlar.
  2. Dönüş kodunuzu test edin, uyuyun ve gerekirse yeniden deneyin. İşlev dönüş değerleri nelerdir? Onları nasıl kullanırım? - MQL4 forumu ve MQL4 Programlarında Sık Karşılaşılan Hatalar ve Bunların Önlenmesi - MQL4 Makaleleri
 

Bu konuyu takip edenler için bir güncelleme!

OP'nin PM aracılığıyla kodunu düzeltmesine yardım ediyorum, çünkü İngilizce'de zorluk çekiyor ve ikimiz de Portekizce konuşuyoruz. Testlerimizde " ArrayCopyRates() " işleviyle gerçekleşen başka bir "komik" ile karşılaştık. Bir EA'da " ArrayCopyRates() " ile bir MqlRates dizisi kullanırken, veri dizisi her zaman şeylerin mevcut durumunu bildiren sanal bir dizidir, bu nedenle veriler her zaman tazedir.

Ancak, bir Göstergede durum böyle görünmüyor. Dizi sanal bir kopya değil, bunun yerine " ArrayCopyRates() " çağrıldığı anda ayarlanmış statik bir kopyadır. Sembol, grafik sembolünden farklı olduğunda veriler güncellenmez. Grafikle aynı sembol olduğunda, dizi verileri "canlıdır" ve beklendiği gibi güncellenir, ancak başka bir sembole ait olduğunda statik bir kopyadır.

Bu nedenle, bir Göstergede çalışması için, taze verilere ihtiyaç duyulursa, OnCalculate() olayına yapılan her çağrıda " ArrayCopyRates() " işlevi çağrılmalıdır.

 

Herkese selam.

  • FMIC , desteğiniz için teşekkürler!
  • WHRoeder , sana da teşekkür ederim... Hepimizin her zaman yanındasın!
  • Düşünceleriniz için tüm forum üyelerine teşekkürler ve hatta bu başlıkta oluşturulan tüm tartışma için teşekkürler. Çok ilginçti. !

Bu (neredeyse) daha sonra yaptığım şeyin aynısı, ancak fark şu ki, ArrayCopyRates'ten önce bir ArrayFree çalıştırıyorum... ve bana yardım ettiğiniz doğrulamaları yapmıyorum.

İşte FMIC'in bana yardım ettiği son kod. Şimdi bir gösterge kodunda normal çalışıyor ..:

 input string UsePairs= "NZDCAD,EURUSD,GBPUSD,USDJPY" ; // pairs separated by commas
struct pair_struct{
   string symbol;
   MqlRates rates[];
   bool valid;
};
pair_struct pairs[];
bool initial;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit (){
   
   int i= 0 , j= 0 , c;
   string _pairs[], msg= "" ;
   bool pairok= false ;
   initial = true ;
   ENUM_INIT_RETCODE result = INIT_SUCCEEDED ;
   
   StringSplit (UsePairs, StringGetCharacter ( "," , 0 ), _pairs);
   
   for ( i= 0 ; i< ArraySize (_pairs); i++){
      pairok= false ;
      
       for ( j= 0 ; j< SymbolsTotal ( true ); j++){
         if ( SymbolName (j, true ) == _pairs[i] ){
            pairok= true ;
             break ;
         }
      }
       if ( pairok ){
         c= ArraySize (pairs);
         ArrayResize (pairs, c+ 1 );
         pairs[c].symbol = _pairs[i];
         pairs[c].valid = false ;
      } else {
         msg += _pairs[i] + ", " ;
      }
   }
   if ( msg != "" ){
       string invalids = ArraySize (pairs)== 1 ? "Invalid Pair: " : "Invalid Pairs: " ;
      msg = invalids +   StringSubstr (msg, 0 , StringLen (msg)- 2 ) + ". Please Check!" ;
       Alert (msg);
      result = INIT_PARAMETERS_INCORRECT ;
   }
   return (result);

}

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason){
   
   Comment ( "" );
   
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {

   InitializeRates();
   
   int i= 0 ;
   string log = "" ;
   for (i= 0 ; i< ArraySize (pairs); i++){
       log += "\nPar: " + pairs[i].symbol;
       if ( pairs[i].valid ){
         log += " - Time: " + TimeToString ( pairs[i].rates[ 0 ].time ) + 
                 " - Open: " + DoubleToString ( pairs[i].rates[ 0 ].open, ( int )MarketInfo( pairs[i].symbol, MODE_DIGITS ) ) +
                 " - Close: " + DoubleToString ( pairs[i].rates[ 0 ].close, ( int )MarketInfo( pairs[i].symbol, MODE_DIGITS ) ) +
                 " - High: " + DoubleToString ( pairs[i].rates[ 0 ].high, ( int )MarketInfo( pairs[i].symbol, MODE_DIGITS ) ) +
                 " - Low: " + DoubleToString ( pairs[i].rates[ 0 ].low, ( int )MarketInfo( pairs[i].symbol, MODE_DIGITS ) );
      } else {
         log += " - Currently not valid!" ;
      }
   }

   Comment ( "\n\n*** Pair Rates***\n" + log );
   return (rates_total);
   
}
//+------------------------------------------------------------------+

void InitializeRates(){
 
   for ( int i= 0 ; i< ArraySize ( pairs ); i++ ){
      pairs[i].valid = false ;
       ResetLastError ();
       if ( ArrayCopyRates(pairs[i].rates, pairs[i].symbol, PERIOD_CURRENT ) > 0 ){
         if ( _LastError == 0 ){
             if ( ArraySize (pairs[i].rates) > 0 ){
               if ( pairs[i].rates[ 0 ].time > 0 )
                  pairs[i].valid = true ;
            }
         }
      }
   }

}