"Expert Advisor yazarken MQL5 Standard Alım Satım Sınıfı kitaplıklarının kullanımı" makalesi için tartışma

 

Yeni makale Expert Advisor yazarken MQL5 Standard Alım Satım Sınıfı kitaplıklarının kullanımı yayınlandı:

Bu makalede, bir alım satım işlemi yapmadan önce pozisyon kapatma ve değiştirme, bekleyen talimat verme ve Marjın silinmesi ve doğrulanmasını uygulayan Expert Advisor'ları yazarken MQL5 Standart Kitaplık Alım Satım Sınıflarının başlıca işlevlerinin nasıl kullanılacağı açıklanmaktadır. Ayrıca, talimat ve yatırım ayrıntılarını elde etmek için Alım Satım sınıflarının nasıl kullanılabileceğini de gösterdik.

Şimdiye kadar bir Expert Advisor yazarken Alım Satım sınıfı kitaplıklarını nasıl kullanabileceğimizi gözden geçirdik. Sonraki adım , Expert Advisor'ımızı strateji test cihazı ile test etmek ve performansını görmek.

EA kodunu derleyin ve ardından Strateji Test Cihazına yükleyin.

EA için raporu derleyin

         Şekil 3. Expert Advisor rapor derleme

Şu varsayılan ayarları kullanarak GBPUSD Günlük grafiğinde: Kar Al - 270, Zararı Durdur - 100 ve Takip Noktası (TP/SL) - 32, şu sonuçları elde ederiz:

 

Şekil 4. Expert Advisor test raporu - GBPUSD günlük grafiği

Yazar: Samuel Olowoyo

 

Benim için çok faydalı bir makale. Kütüphaneleri kullanırsanız her şey çok daha kolay olur!

Geliştiricilere istek: High[i] , Low[i] ile çalışmak için bir sınıf yazın. Open[i], Close[i]. Bu sınıfın herkes için faydalı olacağını düşünüyorum! Bu sorunu kendim için çözdüm, ancak doğru olduğundan emin değilim, çünkü test etmek çok zaman alıyor....

 
Timeseries Sınıf Grubu bölümüne göz atın
 
#include <Indicators\Series.mqh>

double High[];
 CiHigh z;

bu kod neden hata veriyor

'1.mq5' 1.mq5 1 1

'Series.mqh' Series.mqh 1 1

'ArrayObj.mqh' ArrayObj.mqh 1 1

'Array.mqh' Array.mqh 1 1

'Object.mqh' Object.mqh 1 1

'StdLibErr.mqh' StdLibErr.mqh 1 1

'ArrayDouble.mqh' ArrayDouble.mqh 1 1

'CiHigh' - türü olmayan bildirim 1.mq5 12 2

1 hata(lar), 0 uyarı(lar) 2 1

tüm örneklerde tip bildirmek gerekli değildir...

nasıl elde edileceğini yazmak zor değilse

Örneğin, Yüksek[2] yazdırın.

 
dimeon:

bu kod neden hata veriyor


tüm örneklerde tip bildirmek gerekli değildir...

eğer zor değilse, lütfen nasıl elde edileceğini yazın

Örneğin, Yüksek[2] yazdırın.

dokümantasyonda bir baskı hatası var. Bu sınıf TimeSeries.mqh dosyasında bulunur.

Kullanım örneği (kod, geçerli grafiğin son üç Yüksek değerini yazdırır):

#include <Indicators\TimeSeries.mqh>
//+------------------------------------------------------------------+
//| Komut dosyası programı başlatma işlevi|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double High[];
   CiHigh z;
   int count=3;
   if(z.Create(_Symbol,_Period)==true)
     {
      if(z.GetData(0,count,High)==count)
        {
         for(int i=0; i<count; i++) Print(i,"=",High[i]);
        }
      else
         Print("Alınamadı",count," zaman serisi verileri.");
     }
   else Print("Zaman serisi oluşturulurken hata oluştu.");
  }
//+------------------------------------------------------------------+
 
Quantum:

belgelerde bir yanlış basım var. Bu sınıf TimeSeries.mqh dosyasındadır.

Kullanım örneği (kod, mevcut grafiğin son üç Yüksek değerini verir):

Çok teşekkür ederim! Beynimi zorluyordum!
 

Herkesin kendisi ve ihtiyaçları için programladığını anlıyorum, ancak temelde zaman serisi sınıfları grubunu sevmiyorum, çünkü temelde hepsi bir yöntemden ve işlevsellikten daha fazla açıklayıcı kısımdan oluşuyor ve genellikle belirli bir enstrüman için tüm zaman serilerine sahip olmak gerekiyor, gerekli enstrüman için tüm zaman serilerinin bulunduğu bir sınıf yaptım, yöntemlerde geçmiş yaklaşık olarak bu şekilde pompalanır:

struct str_bars{
   datetime    time[];     // Geçerli grafiğin her çubuğunun açılış zamanını içeren zaman serisi dizisi
   double      open[];     // Geçerli grafiğin her çubuğunun açılış fiyatlarını içeren zaman serisi dizisi.
   double      close[];    // Geçerli grafiğin her çubuğunun kapanış fiyatlarını içeren zaman serisi dizisi.
   double      high[];     // Geçerli grafiğin her çubuğunun maksimum fiyatlarını içeren zaman serisi dizisi.
   double      low[];      // Geçerli grafiğin her çubuğunun minimum fiyatlarını içeren zaman serisi dizisi.
};
struct str_info{
   double   point;         // Teklif para biriminde geçerli enstrüman puan boyutu
   int      spread;        // Güncel yayılma
};
//____________________________________________________________________
class currency {
   public:
//---- данные      
      MqlTick TICK;        // tik verileri
      str_bars  BAR;       // zaman serisi verileri
      str_info INFO;       // araç bilgileri
      int error;
//---- методы      
      int create(string sym,ENUM_TIMEFRAMES period, int numbars);
      int refresh(void);
   private:
      string            symbol;
      ENUM_TIMEFRAMES   per;
      int               num;
      datetime          lastbar_time;
      int               tmpint1,tmpint2;
      int ch_load(void);
};
//____________________________________________________________________

Sınıfımla yalnızca önceden hazırlanmış veriler kısmında çalışıyorum ve tabii ki sınıfın kendisi refresh() yöntemini çağırarak veri alıyor

 
Faydalı bir makale!
 

Makalede bir yanlışlık var.

double lot_price = myaccount.MarginCheck(_Symbol,otype,Lot); // lot fiyatı/ gerekli marj sayısı

olmalı

   double lot_price=myaccount.MarginCheck(_Symbol,otype,Lot,price);  //--- lot fiyatı/ gerekli marj sayısı
[Silindi]  

Harika bir makale. Yazara çok teşekkürler. Ayrıca bir sipariş vermeden önce Stop_Level'in bir kontrolünü ve spread değerinin bir kontrolünü yazmak istiyorum. Mesele şu ki, eğer spread dalgalanıyorsa, o zaman yüksek değerlerde piyasaya giremezsiniz, çünkü karlı değildir. Bu, Uzman Danışmanın haberler sırasında ticaret yapmamasına yardımcı olacaktır. Ayrıca sapmayı da kontrol etmek istiyorum - mantık benzer. Ayrıca kütüphane hakkında da bir soru var: fonksiyon nedir (ne tür bir süreci ifade eder ve tanımlar)?

FreezeLevel

Ticaret işlemlerinin dondurulma mesafesini nokta cinsinden döndürür.

int FreezeLevel() const

basit bir dille - eğer biliyorsanız lütfen açıklayın.

Ve bir soru daha. Sınırları, örneğin şu andaki Stop_Level'i öğrenebiliriz (diyelim ki 10 puan). SL=10 puan ile bekleyen bir emir veriyoruz. Örneğin bir saat sonra fiyat emirde belirtilen fiyata ulaşır, ancak şu anda Stop_Level örneğin 15 pip'e eşittir. Ne olacak - bekleyen emir çalışacak mı yoksa reddedilecek mi? Ayrıca, fiyat emirde belirtilen fiyata ulaştığında, ancak spread değiştiğinde - bu, emrin açıldığı sırada beklenen fiyata göre daha kötü bir fiyattan giriş veya çıkışın mümkün olduğu veya emrin hiç çalışmayacağı anlamına mı gelir?

 

Neyi yanlış yapıyorum? Teklif neden yazdırılmıyor?

İşte çalışma kaydı


2011.01.31 20:20:18 00(EURUSD,M1) EURUSD 0

İşte kod

#include <Trade\SymbolInfo.mqh>  //--- CSymbolInfo sınıfı
CSymbolInfo    my_symbol;        //--- CSymbolInfo sınıfının nesnesi
//+------------------------------------------------------------------+
//| Uzman başlatma işlevi|
//+------------------------------------------------------------------+
int OnInit()
  {   return(0);  }
//+------------------------------------------------------------------+
//| Uzman başlangıçtan kaldırma işlevi|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {  }
//+------------------------------------------------------------------+
//| Uzman tik fonksiyonu|
//+------------------------------------------------------------------+
void OnTick()
  {
   my_symbol.Name(_Symbol);
   my_symbol.Refresh();
   Print(_Symbol," ",my_symbol.Bid());
  }
//+------------------------------------------------------------------+