Başka bir döviz çiftinden teklif/talep nasıl içe aktarılır? - sayfa 5

 
HosseinKOGO :

Bu, tüm gün GBPAUD H4 3.12.2018! Ve bu sefer bitirmek için atlamadım.

Yazdırma işlevi , yazdırılacak çok fazla şey olduğunda bazı raporları kaybedebilir mi?
Sanırım başka bir sorun, bu 3 enstrümanın kenelerinin farklı milisaniyelerde çıkması olabilir, bu nedenle GBPAUD'da start/OnTick işlevini kullandığımızda, GBPAUD kenesi çıktığında sadece başlatma işlevini yapar. Ve sanırım kodunuz, hiçbiri 0 olmadığında bu 3 çift fiyatların tümünü döndürmek için diyor olabilir. Eğer öyleyse, tüm enstrümanların tüm satış/teklif fiyatları aynı anda çıktığında geri döner.

Veriler iyi görünüyor...

Yazdırma işlevi konusunda haklısın... Testlerimde de birçok eksik satır görüyorum. Ancak her şeyi dosyaya yazdırdığımda hiçbir şey kaçırılmıyor.

İşte kodla ilgili bazı bilgiler: Her GBPAUD işaretinin zamanı, diğer çiftlerin en son işaretlerini almak için kullanılacaktır (aynı zamana kadar), bu nedenle her zaman bir şey döndürür, sıfır olmaz.

İşlevi daha düzenli olması gereken bir sınıfa koymaya karar verdim. Eke bakınız. EA'nızla birlikte uzman klasörünüze yerleştirin. Değiştirmekten çekinmeyin.

Aşağıdaki örnek, onu kullanmanın bir yolunu gösterir (vurgulanan satırlar önemlidir):

 #include "TicksInfo.mqh"
CTicksInfo ticksInfo;

string otherPairs[] = { "GBPUSD" , "EURUSD" };
string allPairs[] = {};

int tickCount = 0 ;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   ticksInfo.init(otherPairs);
   int numSym = ArraySize (otherPairs)+ 1 ;
   ArrayResize (allPairs,numSym);
   allPairs[ 0 ] = _Symbol ;
   for ( int i= 1 ; i<numSym; i++)
      allPairs[i] = otherPairs[i- 1 ];
   
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   ticksInfo.deInit();
   Print ( "Total Ticks = " , tickCount);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   tickCount++;
   Print ( "=== Now process tick " , tickCount);
   MqlTick myTick;
   
   for ( int i= 0 ; i< ArraySize (allPairs); i++)
   {
       if (ticksInfo.getTick(allPairs[i],myTick))
         printTick (allPairs[i],myTick);
       else
         Print (allPairs[i], " Error" );
   }
  }
//+------------------------------------------------------------------+

void printTicktoFile( string sym, MqlTick &tick)
{
   int file = FileOpen ( "LogFile.log" , FILE_WRITE | FILE_READ | FILE_TXT );
   FileSeek (file, 0 , SEEK_END );
   FileWrite (file, sym, " tick number " , tickCount, ", at " , 
          tick.time, " " ,
           IntegerToString (tick.time_msc-(tick.time* 1000 ), 3 , '0' ),
           " Ask = " , tick.ask, " Bid = " , tick.bid);
   FileClose (file);
}

void printTick( string sym, MqlTick &tick)
{
   Print (sym, " tick number " , tickCount, ", at " , 
          tick.time, " " ,
           IntegerToString (tick.time_msc-(tick.time* 1000 ), 3 , '0' ),
           " Ask = " , tick.ask, " Bid = " , tick.bid);
}

Yani gerçekten anahtar şu satırdır: ticksInfo.getTick(<SYMBOL String>,<MqlTick Struct>) . Yanlış döndürürse, hata mesajı için günlüğü kontrol etmeniz gerekir.

Dosyalar:
TicksInfo.mqh  5 kb
 
Seng Joo Thio :

Veriler iyi görünüyor...

Yazdırma işlevi konusunda haklısın... Testlerimde de birçok eksik satır görüyorum. Ancak her şeyi dosyaya yazdırdığımda hiçbir şey kaçırılmıyor.

İşte kodla ilgili bazı bilgiler: Her GBPAUD işaretinin zamanı, diğer çiftlerin en son işaretlerini almak için kullanılacaktır (aynı zamana kadar), bu nedenle her zaman bir şey döndürür, sıfır olmaz.

İşlevi daha düzenli olması gereken bir sınıfa koymaya karar verdim. Eke bakınız. EA'nızla birlikte uzman klasörünüze yerleştirin. Değiştirmekten çekinmeyin.

Aşağıdaki örnek, onu kullanmanın bir yolunu gösterir (vurgulanan satırlar önemlidir):

Yani gerçekten anahtar şu satırdır: ticksInfo.getTick(<SYMBOL String>,<MqlTick Struct>) . Yanlış döndürürse, hata mesajı için günlüğü kontrol etmeniz gerekir.

Yardımın için teşekkürler,

Tüm bu satırları her uygun alana kopyaladım. Ancak kodu anlamadığım için, lütfen bana SecondPair'in Ask ve Bid'ini Ask2, Bid2'ye nasıl koyacağımı ve ThirdPair için aynı şeyi nasıl yapacağımı söyleyin.
İşte benim küresel alanım:

 #include "TicksInfo.mqh"
CTicksInfo ticksInfo;

extern string SecondPair;
extern string ThirdPair;

string otherPairs[] = {SecondPair,ThirdPair};
string allPairs[] = {};

int tickCount = 0 ;
.
.
.

Ve bu kısım derlerken 2 hata veriyor. Onlarla ne yapmalıyım?:
'SecondPair' - sabit ifade gerekli MyEA!.mq4
'Üçüncü Çift' - sabit ifade gerekli MyEA!.mq4

 
HosseinKOGO :

Yardımın için teşekkürler,

Tüm bu satırları her uygun alana kopyaladım. Ancak kodu anlamadığım için, lütfen bana SecondPair'in Ask ve Bid'ini Ask2, Bid2'ye nasıl koyacağımı ve ThirdPair için aynı şeyi nasıl yapacağımı söyleyin.
İşte benim küresel alanım:

Ve bu kısım derlerken 2 hata veriyor. Onlarla ne yapmalıyım?:
'SecondPair' - sabit ifade gerekli MyEA!.mq4
'Üçüncü Çift' - sabit ifade gerekli MyEA!.mq4

Ardından otherPairs'inizi allPairs ile aynı şekilde bildirin. Ve OnInit'te şunu yapın:

 ArrayResize (otherPairs, 2 );
otherPairs[ 0 ] = SecondPair;
otherPairs[ 1 ] = ThirdPair;

Ve Ask2, Bid2, Ask3, Bid3'e değerler atamak için bunu OnTick'te yapın:

   MqlTick myTick;
   
   if (ticksInfo.getTick(SecondPair,myTick))
   {
      Ask2 = myTick.ask;
      Bid2 = myTick.bid;
   }
   else
       Print (SecondPair, " Error" );

   if (ticksInfo.getTick(ThirdPair,myTick))
   {
      Ask3 = myTick.ask;
      Bid3 = myTick.bid;
   }
   else
       Print (ThirdPair, " Error" );
 
Seng Joo Thio :

Ardından otherPairs'inizi allPairs ile aynı şekilde bildirin. Ve OnInit'te şunu yapın:

Ve Ask2, Bid2, Ask3, Bid3'e değerler atamak için bunu OnTick'te yapın:

Yine 00 veriyor :(
Küresel alanım:

 #include "TicksInfo.mqh"
CTicksInfo ticksInfo;

extern string SecondPair;
extern string ThirdPair;

string otherPairs[] = {};
string allPairs[] = {};

int tickCount = 0 ;
.
.
.

OnInit:

   ticksInfo.init(otherPairs);
   int numSym = ArraySize (otherPairs)+ 1 ;
   ArrayResize (allPairs,numSym);
   allPairs[ 0 ] = _Symbol ;
   for ( int i= 1 ; i<numSym; i++)
   allPairs[i] = otherPairs[i- 1 ];
   
   ArrayResize (otherPairs, 2 );
   otherPairs[ 0 ] = SecondPair;
   otherPairs[ 1 ] = ThirdPair;
.
.
.

OnDeinit:

   ticksInfo.deInit();
   Print ( "Total Ticks = " , tickCount);

OnTick:

   tickCount++;
   Print ( "=== Now process tick " , tickCount);
   MqlTick myTick;
   
   for ( int i= 0 ; i< ArraySize (allPairs); i++)
   {
       if (ticksInfo.getTick(allPairs[i],myTick))
         printTick (allPairs[i],myTick);
       else
         Print (allPairs[i], " Error" );
   }
   
   
   if (ticksInfo.getTick(SecondPair,myTick))
   {
      Ask2 = myTick.ask;
      Bid2 = myTick.bid;
   }
   else
       Print (SecondPair, " Error" );

   if (ticksInfo.getTick(ThirdPair,myTick))
   {
      Ask3 = myTick.ask;
      Bid3 = myTick.bid;
   }
   else
       Print (ThirdPair, " Error" );

Günlük:
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA! GBPAUD,H4: GBPCAD Hatası
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA! GBPAUD,H4: GBPUSD Hatası
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA! GBPAUD,H4: GBPAUD onay numarası 221179, 2018.01.03 23:36:58 000 Satış = 1.72479 Teklif = 1.72459
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA! GBPAUD,H4: === Şimdi 221179 onay işaretini işle



nerede yanılıyorum?
Sıfır seviye yeteneğim için üzgünüm :D

 
HosseinKOGO :

Yine 00 veriyor :(
Küresel alanım:

OnInit:

OnDeinit:

OnTick:

nerede yanılıyorum?
Sıfır seviye yeteneğim için üzgünüm :D

OnInit - 3 yeni satır her şeyden önce gitmeli.
 
HosseinKOGO :

Sıfır seviye yeteneğim için üzgünüm :D

Her şey değişkenler, işlevler ve deney yapma isteği ile ilgilidir.
 
Seng Joo Thio :
OnInit - 3 yeni satır her şeyden önce gitmeli.

Yaptım. Ama bu çok garip: Fazladan iki çift için zamanlayıcı çalışmıyor...

 2019.05 . 14 17 : 41 : 55.469      2018.01 . 05 11 : 11 : 24    MyEA! GBPAUD,H4: GBPCAD tick number 370711 , at 1970.01 . 01 00 : 00 : 00 000 Ask = 0.0 Bid = 0.0
2019.05 . 14 17 : 41 : 55.469      2018.01 . 05 11 : 11 : 24    MyEA! GBPAUD,H4: GBPUSD tick number 370711 , at 1970.01 . 01 00 : 00 : 00 000 Ask = 0.0 Bid = 0.0
2019.05 . 14 17 : 41 : 55.469      2018.01 . 05 11 : 11 : 24    MyEA! GBPAUD,H4: GBPAUD tick number 370711 , at 2018.01 . 05 11 : 11 : 24 000 Ask = 1.72644 Bid = 1.72624
2019.05 . 14 17 : 41 : 55.469      2018.01 . 05 11 : 11 : 24    MyEA! GBPAUD,H4: === Now process tick 370711
 
HosseinKOGO :

Yaptım. Ama bu çok garip: Fazladan iki çift için zamanlayıcı çalışmıyor...

Denemeyi bitirdikten ve nedenini hala çözemedikten sonra bana bütün ea'yı göster. Yaklaşık 8 saat sonra bakabilirim :). Şimdi ihtiyacım var 😴... 😂
 
  1. Seng Joo Thio : OnInit - 3 yeni satır her şeyden önce gitmeli.
    Henüz bağlantı/grafik olmayabileceğinden OnInit'te (veya yükteyken) fiyat veya sunucuyla ilgili işlevleri kullanmaya çalışmayın:
    1. Terminal başlar.
    2. Göstergeler/EA'lar yüklendi. Statik ve global olarak bildirilen değişkenler başlatılır. (Belirli bir sıraya bağlı kalmayın.)
    3. OnInit çağrılır.
    4. Göstergeler için OnCalculate , mevcut herhangi bir geçmişle çağrılır.
    5. İnsan şifre girmek zorunda kalabilir, sunucuya bağlantı başlar.
    6. Yeni geçmiş alındı, OnCalculate tekrar aradı.
    7. Yeni tick alınır, OnCalculate / OnTick çağrılır. Artık TickValue , TimeCurrent , hesap bilgileri ve fiyatlar geçerlidir.

  2. MT4'te: Mevcut tablo referans alınan belirli bir çift/TF değilse, fiyatlara erişmeden önce 4066/4073 hatalarını işlemeniz gerekir .
    MQL4 EA - MQL4 ve MetaTrader 4 - MQL4 programlama forumunda indirme geçmişi
    düzeltildi

    Bağlantılı işlev, söz konusu sembol/TF için gizli bir tablo açar (zaten açık değilse), böylece geçmişi günceller ve sembolü geçici olarak Piyasa İzleme'ye yerleştirir (zaten orada değilse), bu nedenle SymbolInfoDouble ( sembol , SYMBOL_BID ) veya MarketInfo ( symbol , MODE_BID ) ilk çağrıda da sıfır döndürmez.

 
William Roeder :
  1. Henüz bağlantı/grafik olmayabileceğinden OnInit'te (veya yükteyken) fiyat veya sunucuyla ilgili işlevleri kullanmaya çalışmayın:
    1. Terminal başlar.
    2. Göstergeler/EA'lar yüklendi. Statik ve global olarak bildirilen değişkenler başlatılır. (Belirli bir sıraya bağlı kalmayın.)
    3. OnInit çağrılır.
    4. Göstergeler için OnCalculate , mevcut herhangi bir geçmişle çağrılır.
    5. İnsan şifre girmek zorunda kalabilir, sunucuya bağlantı başlar.
    6. Yeni geçmiş alındı, OnCalculate tekrar aradı.
    7. Yeni tick alınır, OnCalculate / OnTick çağrılır. Artık TickValue , TimeCurrent , hesap bilgileri ve fiyatlar geçerlidir.

  2. MT4'te: Mevcut çizelge referans verilen belirli bir çift/TF değilse, fiyatlara erişmeden önce 4066/4073 hatalarını işlemeniz gerekir .
    MQL4 EA - MQL4 ve MetaTrader 4 - MQL4 programlama forumunda indirme geçmişi
    düzeltildi

    Bağlantılı işlev, söz konusu sembol/TF için gizli bir tablo açar (zaten açık değilse), böylece geçmişi günceller ve sembolü geçici olarak Piyasa İzleme'ye yerleştirir (zaten orada değilse), bu nedenle SymbolInfoDouble ( sembol , SYMBOL_BID ) veya MarketInfo ( symbol , MODE_BID ) ilk çağrıda da sıfır döndürmez.

Haklısın. Endişelenmeyin, çünkü burada OnInit'te yaptığımız tek şey, sembol adlarını depolamak için dizileri başlatmak ve kendi veri dosyalarımızı okumak için bazı dosya tanıtıcıları hazırlamaktır. MT4 strateji test cihazı, diğer sembollerin bu tür verileri üzerinde sorgulandığında her zaman sıfır döndürdüğünden, teklifler ve talep fiyatlarına (yani 'tik' verileri) gelince, bunlara yalnızca OnTick'te ve çoğunlukla kendi veri dosyalarımızdan erişiyoruz ( bu davranışın, insanların daha aşina olduğu OHLC verilerinin alınmasından farklı olduğuna dikkat edin).

Neden: