"MQL5'e Giriş: Basit Uzman Danışman (EA) ve Özel Gösterge nasıl yazılır" makalesi için tartışma - sayfa 2

 
Rosh:

Gösterge tamponları için SetIndexBuffer yazıyor:

Uzman Danışmanlar için benzer olmalıdır, kontrol edin

Henüz bir benzetme yok. Bu kodu kontrol ederken

//+------------------------------------------------------------------+
//|Test002.mq5 |
//+------------------------------------------------------------------+
double high[];
int bars;
//+------------------------------------------------------------------+
//| Uzman başlatma işlevi|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   bars=Bars(Symbol(),PERIOD_CURRENT);
   ArraySetAsSeries(high,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Uzman başlangıçtan kaldırma işlevi|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Uzman tik fonksiyonu|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int copied=CopyHigh(Symbol(),0,0,bars,high);
   return;
  }
//+------------------------------------------------------------------+

Dönüş operatörünün karşısına bir kesme noktası koydum. Hata ayıklayıcı şu sonucu üretiyor: high "dynamic array[8563], S". S'nin "Seri" anlamına geldiğini anlıyorum.

 
Yedelkin:

Benzetme henüz çalışmıyor. Bu kodu kontrol ederken

Dönüş operatörünün karşısına bir kesme noktası koydum. Hata ayıklayıcı şu sonucu üretiyor: high "dynamic array[8563], S". S'nin "Seri" anlamına geldiğini anlıyorum.

Peki neden çalışmıyor? Şüpheniz varsa, ArrayGetAsSeries işlevi ile seriler için açık bir kontrol ayarlayın:

//+------------------------------------------------------------------+
//|Test_ArraySetAsSeries.mq5 |
//| Telif Hakkı 2010, MetaQuotes Software Corp. | |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
double high[];
int bars;
//+------------------------------------------------------------------+
//| Uzman başlatma işlevi|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   bars=Bars(Symbol(),PERIOD_CURRENT);
   ArraySetAsSeries(high,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Uzman tik fonksiyonu|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int copied=CopyHigh(Symbol(),0,0,bars,high);
   bool IsSeries=ArrayGetAsSeries(high);
   return;
  }
//+------------------------------------------------------------------+

Sonuç


 
Rosh писал(а) :

Neden çalışmıyor? Şüpheniz varsa, ArrayGetAsSeries işleviyle serilik için açık bir kontrol ayarlayın:

Size neden bahsettiğimi hatırlatayım. Dizilerin her zaman yalnızca kopyalandıktan sonra indekslenip indekslenmeyeceğini soruyordum. SetIndexBuffer fonksiyon notuna atıfta bulundunuz ve EA'lar için de aynı olması gerektiğini söylediniz. Bu SetIndexBuffer fonksiyon notu, "bağlandıktan sonra, dinamik dizi tamponu[], bağlı dizi zaman dizilerinde olduğu gibi indekslenecek şekilde önceden ayarlanmış olsa bile, normal dizilerde olduğu gibi indekslenecektir" anlamına gelir.

Buna göre, EA'lar için CopyTime, CopyHigh ve CopyLow fonksiyonlarını kullandıktan sonra, alıcı dizilerin de normal dizilerde olduğu gibi indekslenmesi gerekeceği şeklinde bir benzetme gördüm. Bu benzetmeyi test etmek için, ArraySetAsSeries fonksiyonunu CopyHigh fonksiyonundan önce OnInit() fonksiyonuna yerleştirdim. Ancak benim örneğim ve sizin önerdiğiniz ArrayGetAsSeries fonksiyonunun serileştirme için yaptığı açık kontrol, CopyHigh fonksiyonunu kullandıktan sonra, high[] alıcı dizisinin önceden ayarlanmış indekslemesinin ( zaman serilerinde olduğu gibi) değişmediğini gösteriyor. Bu da, bahsettiğiniz SetIndexBuffer fonksiyonu ile benzerliğin henüz gözlemlenmediğini gösterir, çünkü aksi takdirde açık serilik kontrolü IsSeries=false olduğunu göstermeliydi.

 

Yedelkin:

Bu benzetmeyi test etmek için, ArraySetAsSeries işlevini OnInit() işlevinde CopyHigh işlevinden önce yerleştirdim. Ancak benim örneğim ve önerdiğiniz ArrayGetAsSeries işlevinin serileştirme için açık kontrolü, CopyHigh işlevini kullandıktan sonra, alıcı high[] dizisinin önceden ayarlanmış dizinlemesinin ( zaman serilerinde olduğu gibi) değişmediğini gösteriyor.

Aslında, OnInit() veya başka bir işlevde global dizi için serileştirme ayarlandıktan sonra, bu serileştirmenin başka hiçbir yerde değişmeyeceğini kastetmiştim. Tek istisna SetIndexBuffer() fonksiyonu ile ilgilidir.

Bu konuda bir anlaşmaya vardığımıza inanıyorum ve bunu bitmiş olarak kabul edebiliriz.

 

Evet, soru yanıtlandı. Açıklama için teşekkür ederiz!

 

Birkaç sorum var.

1.

   if(CopyTime(Symbol(),0,0,i,t)<i || CopyHigh(Symbol(),0,0,i,h)<i || CopyLow(Symbol(),0,0,i,l)<i)
     {
      Print("Zaman serisi kopyalanamadı!");
      return;
     }

" If... işlecinde, OnTick işlevinin yürütülmesini sonlandırmak için return işleci kullanılır." denilmektedir.

OnTick mi? if (....) {...}'den değil mi?

2.

   for(i=0;i<PositionsTotal();i++) {…}

MQL4'te ters arama önerilmiştir.

for(i= PositionsTotal();i>0;i--) {…}
Hangisi daha iyi?

3. Uzman Danışmanı ve göstergeyi indirdim ( Opera 10.54 moderatörleri için, ekli dosyaların indirilmesiyle ilgili sorunlar). Hepsi derlendi. M5'teki test cihazında geçen ay seçilmeye başlandı.

Günlük

2010.05.15 13:16:02 Çekirdek 1 Bağlantı Kesildi

2010.05.15 13:16:01 Core 1 Günlük dosyası "D:\MetaTrader 5\Tester\Agent-127.0.0.1-3000\logs\20100515.log" yazıldı

2010.05.15 13:16:01 Core 1 EURUSD,M5: 1431016 ms içinde 553908 tik (2580 çubuk) oluşturuldu (geçmişteki toplam çubuk 100352)

2010.05.15 13:16:01 Core 1 OnTester sonucu 0

2010.05.15 12:52:13 Core 1 EURUSD,Günlük: geçmiş 2009.01.02 00:00'dan başlar

2010.05.15 12:52:13 Core 1 EURUSD,Daily: geçmiş önbelleği tahmini 355 çubuk için ayrıldı

2010.05.15 12:52:13 Core 1 EURUSD: 2009.01.02 06:01'den 2010.05.03 00:00'a kadar 484483 M1 başlangıç verisi kaydı içerir

2010.05.15 12:52:10 Core 1 Lots=0.100000

2010.05.15 12:52:10 Çekirdek 1 MAper=240

2010.05.15 12:52:10 Core 1 EndHour=19

2010.05.15 12:52:10 Çekirdek 1 StartHour=7

2010.05.15 12:52:10 Core 1 EURUSD,M5: Experts\expert.ex5'in 2010.05.01 00:00 ile 2010.05.14 00:00 arasındaki testi girdilerle başladı:

Yürütülmesi çok uzun sürdü ve tek bir işlem açmadı. Otomatik ticarete izin verilir. Günlükte mesaj yok ((( (düzenleme muhtemelen onları nasıl bulacağımı henüz bilmiyorum). Gösterge ve Uzman Danışman olması gereken yerde bulunur. Windows XP, MT (yapı 274).

4. Hata ayıklama modunu denedim, çalışmıyor. Muhtemelen Cumartesi gününden dolayı. Tırnak işareti yok. Durma noktasını makalede olduğu gibi yaptım. Eğer haklıysam çok yazık, sadece iş günlerinde hata ayıklama yapabiliyorsunuz. Hata ayıklama için kendi dosyanızı gerekli verilerle ve (veya) bazı tipik verilerle (bir günlük tarihin bir parçası olsun) yükleyebilmek güzel olurdu, hata ayıklama için yeterli olacaktır.

5. Birisi Kopyalama işlevini araştırdıysa... lütfen eksik çubuklar varsa nasıl çalıştığı hakkında bilgi paylaşın. Yine de bir makale sipariş etmek muhtemelen daha iyi olacaktır.

 
Prival:

Birkaç sorum var.

1. " If... işlecinde, OnTick işlevinin yürütülmesini sonlandırmak için return işleci kullanılır." denilmektedir.

OnTick mi? if (....) {...}'den değil mi?

return işlecinin açıklamasından return:

Оператор return прекращает выполнение текущей функции и возвращает управление 
вызвавшей программе. Результат вычисления выражения возвращается вызываемой 
функции. Выражение может содержать оператор присваивания.

Bu örnekteki return deyimi için geçerli fonksiyon OnTick() fonksiyonudur.

Prival:

4. Hata ayıklama modunu denedim, gitmiyor. Muhtemelen Cumartesi gününden dolayı. Tırnak işareti yok. Durma noktasını makalede olduğu gibi yaptım. Eğer haklıysam çok yazık, sadece iş günlerinde hata ayıklama yapabiliyorsunuz. Hata ayıklama için kendi dosyanızı gerekli verilerle ve (veya) bazı tipik verilerle (bir günlük bir tarih parçası olsun) yükleyebilmek güzel olurdu, hata ayıklama için yeterli olacaktır.

Sitede hata ayıklama ile ilgili benzer sorular daha önce tartışılmıştı. Eğer ilgileniyorsanız, aramayı kullanın ve "Hata Ayıklama" kelimesini aratın.

 

Otomatik güncellemeyi yükledikten sonra (derleme 275), derleyici aşağıdaki türden koşulların kontrol edildiği satırlarda uyarılar oluşturmaya başladı

if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
Uyarılar aynı türdendir:
implicit enum conversion Perito02-04 temp3.mq5 1233 45
Sorular: Derleyicinin doğru çalışması, belirtilen durumda bu uyarıların ortaya çıkmasını gerektirir mi? Hangi "dönüşümden" bahsediyoruz?
 
Yedelkin :

Otomatik güncellemeyi (derleme 275) yükledikten sonra derleyici, türün koşullarının kontrol edildiği satırlarda uyarılar oluşturmaya başladı

Uyarılar aynı türdendir: Sorular: Derleyicinin doğru çalışması, belirtilen durumda bu uyarıların ortaya çıkmasını gerektirir mi? Hangi "dönüşümden" bahsediyoruz?

Uyarı, programcıların dikkatini çekmek ve kodlarını iki kez kontrol etmelerini sağlamak için eklenmiştir.

Fonksiyon sonucunu açıkça bir numaralandırıcıya veya numaralandırıcıyı int'e dönüştürerek uyarılardan kurtulabilirsiniz.

 
Prival:

Birkaç sorum var.

1. " If... işlecinde, OnTick işlevinin yürütülmesini sonlandırmak için return işleci kullanılır." denilmektedir.

OnTick? ve if (....) {...}'den değil mi?

Eğer operatördeki koşullardan en az biri

if(CopyTime(Symbol(),0,0,i,t)<i || CopyHigh(Symbol(),0,0,i,h)<i || CopyLow(Symbol(),0,0,i,l)<i)

koşullardan en az biri yerine getirilirse, yani dizilerden en az biri tamamen kopyalanamazsa (yeterli geçmiş veri yoksa veya bir hata meydana gelirse) - OnTick işlevi sonlandırılır, çünkü bu veriler olmadan daha fazla hesaplama yapmak mümkün değildir.

2. MQL4' te ters numaralandırma önerilmiştir.

Hangisi daha iyi?

Varyantlar

for(i=0;i<PositionsTotal();i++)

и

for(i=PositionsTotal()-1;i>=0;i--)

eşdeğerdir, ancak ilk varyant metin biçiminde daha kısadır, bu nedenle kullanılmıştır.

3. Uzman Danışmanı ve göstergeyi indirdim (moderatörler için Opera 10.54 ekli dosyaları indirirken sorun yaşıyor). Hepsi derlendi. Geçen ayı seçerek M5'teki test cihazında çalıştırdım.

Yürütülmesi çok uzun zaman aldı ve tek bir işlem açmadı. Otomatik ticarete izin verilir. Günlükte mesaj yok ((( (Muhtemelen onları nasıl bulacağımı henüz bilmiyorum). Gösterge ve Uzman Danışman olması gereken yerde bulunur. Windows XP, MT (yapı 274).

4. Hata ayıklama modunu denedim, gitmiyor. Muhtemelen Cumartesi gününden dolayı. Tırnak işareti yok. Durma noktasını makalede olduğu gibi yaptım. Eğer haklıysam çok yazık, sadece iş günlerinde hata ayıklama yapabiliyorsunuz. Hata ayıklama için kendi dosyanızı gerekli verilerle ve (veya) bazı tipik verilerle (bir günlük tarihin bir parçası olsun) yükleyebilmek güzel olurdu, hata ayıklama için yeterli olacaktır.

5. Birisi Kopyalama işlevini araştırdıysa... lütfen eksik çubuklar varsa nasıl çalıştığı hakkında bilgi paylaşın. Yine de bir makale sipariş etmek muhtemelen daha iyi olacaktır.

Dürüst olmak gerekirse, test cihazım da pek iyi çalışmıyor: test, MQL4'te benzer bir EA'yı test etmekten çok daha uzun sürüyor; işlemler yalnızca test aralığının ilk bir veya iki gününde açılır (bu, farklı Uzman Danışmanları test ederken gözlemlenir).

OnTick ve OnCalculate işlevleri yeni bir teklif alındığında başlatılır, bu nedenle hata ayıklama için teklif almak gerekir (hafta sonu çalışmaz). Aksi takdirde, hata ayıklayıcı normal şekilde çalışır (deneyin, bir şeye ihtiyacınız olursa bana sorun).

Diziler-zaman serileri ile ilgili olarak: - dizilerin yönü her iki yönde de herhangi bir zamanda değiştirilebilir, dizilerin bellekteki konumu değişmez, sadece indeksleme değişir ( 0,1,2,...,sondan sona,... ,2,1,0).