"MQL5 Tarif Defteri: Pozisyon Özelliklerini Elde Etmek için İşlemler Geçmişi ve Fonksiyon Kitaplığı" makalesi için tartışma

 

Yeni makale MQL5 Tarif Defteri: Pozisyon Özelliklerini Elde Etmek için İşlemler Geçmişi ve Fonksiyon Kitaplığı yayınlandı:

Pozisyon özellikleri ile ilgili önceki makalelerde verilen bilgileri kısaca özetlemenin zamanı geldi. Bu makalemizde, işlemler geçmişine erişimin ardından edinilebilecek özellikleri elde etmek için birkaç ek fonksiyon oluşturacağız. Ayrıca pozisyon ve sembol özelliklerine daha rahat erişmemizi sağlayacak veri yapılarını da öğreneceğiz.

Aşağıdaki önceki makalede değiştirilen Uzman Danışmanda yeni fonksiyonların çalışmasını görmek için, pozisyon halihazırda buradayken tekrar açılış sinyali gelirse pozisyon hacmini artırma imkanını ekleyeceğiz: "MQL5 Tarif Defteri: Alım Satım Seviyelerini Ayarlarken/Değiştirirken Hatalardan Nasıl Kaçınılır?"

Pozisyon geçmişinde birkaç işlem olabilir; ve alım satım sırasında pozisyon hacminde değişiklikler olmuşsa, mevcut pozisyon fiyatında da değişiklikler olmuş olmalıdır. İlk giriş noktasının fiyatını bulmak için, bu belirli pozisyonla ilgili işlemlerin geçmişine erişmemiz gerekir. Aşağıdaki şekil, bir pozisyonun yalnızca bir işleminin (giriş noktası) olduğu durumun bir gösterimidir:

Şekil 1. Pozisyondaki ilk işlem

Yazar: Anatoli Kazharski

 
Makale güzel, beğendim. Genellikle mevcut pozisyon birkaç anlaşmadan oluşur ve ilk ve sonuncunun yanı sıra 2, 3, vb. anlaşmaların parametrelerini bilmek isterim. Böyle bir fonksiyon makaleyi zenginleştirecektir.
 
paladin800:
Makale güzel, beğendim. Genellikle mevcut pozisyon birkaç anlaşmadan oluşur ve ilk ve sonuncunun yanı sıra 2, 3, vb. anlaşmaların parametrelerini bilmek isterim. Böyle bir özellik makaleyi zenginleştirecektir.
Şimdilik bir ev ödevi olarak kalsın. Ama bu konuda daha sonra bir şeyler yazmaya çalışacağım.
 

Makalenin yazarına soru.

Pozisyon açıldıktan hemen sonra işlemin dahil olduğu pozisyonunkimliğini nasıl alabilirim ?



 
denkir:

Makalenin yazarına soru.

Pozisyon açıldıktan hemen sonra işlemin dahil olduğu pozisyonuntanımlayıcısı nasıl alınır ?

PositionSelect() fonksiyonunu kullanarak pozisyonu seçin ve PositionGetInteger() fonksiyonunu ve mql5 tanımlayıcısını - POSITION_IDENTIFIER kullanarak tanımlayıcısını alın.

Yardım'dan örnek:

//+------------------------------------------------------------------+
//| Ticaret fonksiyonu|
//+------------------------------------------------------------------+
void OnTrade()
  {
//--- pozisyonun mevcut olup olmadığını kontrol edin ve değişim zamanını yazdırın
   if(PositionSelect(_Symbol))
     {     
//--- onunla daha fazla çalışmak için konum tanımlayıcısını alın
      ulong position_ID=PositionGetInteger(POSITION_IDENTIFIER);
      Print(_Symbol," postion #",position_ID);
//--- 01.01.1970 tarihinden itibaren pozisyon oluşum zamanını milisaniye cinsinden al
      long create_time_msc=PositionGetInteger(POSITION_TIME_MSC);
      PrintFormat("Position #%d  POSITION_TIME_MSC = %i64 milliseconds => %s",position_ID,
                  create_time_msc,TimeToString(create_time_msc/1000));
//--- 01.01.1970 tarihinden bu yana son konum değişikliğinin zamanını saniye cinsinden alır
      long update_time_sec=PositionGetInteger(POSITION_TIME_UPDATE);
      PrintFormat("Position #%d  POSITION_TIME_UPDATE = %i64 seconds => %s",
                  position_ID,update_time_sec,TimeToString(update_time_sec));
//--- 01.01.1970 tarihinden itibaren son konum değişikliğinin zamanını milisaniye cinsinden alır
      long update_time_msc=PositionGetInteger(POSITION_TIME_UPDATE_MSC);
      PrintFormat("Position #%d  POSITION_TIME_UPDATE_MSC = %i64 milliseconds => %s",
                  position_ID,update_time_msc,TimeToString(update_time_msc/1000));
     }
//---
  }
 
tol64:

PositionSelect() işlevini kullanarak bir konum seçin ve PositionGetInteger() işlevini ve mql5 tanımlayıcısını - POSITION_IDENTIFIER kullanarak tanımlayıcısını alın.

Yardım'dan örnek:

Teşekkürler, tol64! Prensip olarak haklısınız.

Ve ilk soru kısa olduğu için özür dilerim... pozisyon tanımlayıcısına bir referans vermeme rağmen.

Sorun şu şekilde. Bir pozisyon açıldıktan sonra, ::PositionId() yöntemini kullanarak CDealInfo sınıfı yardımıyla işlem geçmişinde bu açılışı yakalamak gerekir. Ve tercihen, açılış anı ile geçmiştebir DEAL_ENTRY_IN veya DEAL_ENTRY_INOUT tipi anlaşmanın göründüğü an arasındaki en küçük zaman aralığı ile.

Bunu bu şekilde yapmak mümkün mü? Aktif pozisyonlar listesi üzerinden değil, geçmişteki anlaşmalar listesi üzerinden...
 
denkir:

Teşekkürler, tol64! Prensip olarak, gerçek sizindir.

Ve ilk sorunun kısalığı için özür dilerim... pozisyon kimliğine bir bağlantı vermiş olmama rağmen.

Sorun şu şekilde. Bir pozisyon açıldıktan sonra, CDealInfo sınıfını kullanarak ::PositionId() yöntemi ile işlem geçmişinde bu açılışı yakalamak gerekir. Ve tercihen açılış anı ile DEAL_ENTRY_IN veya DEAL_ENTRY_INOUT türündebir anlaşmanın geçmiştegöründüğü an arasındaki en küçük zaman aralığı ile.

Bunu bu şekilde yapmak mümkün mü? Aktif pozisyonların listesi üzerinden değil, geçmişteki işlemlerin listesi üzerinden...

Bence, yukarıdaki örnekte olduğu gibi OnTrade() içindeki olayı izlemek bunun için oldukça uygundur. Ancak aniden bir pozisyonun bir ticaret olayı tarafından seçilemeyeceğini ve bir sonrakinin yakında olmayacağını düşünürdüm. O zaman ortamı zamanlayıcı ile izlemeniz gerekir. Artık milisaniyeler bile ayarlanabilir.

Peki, ya da açık pozisyonu izlemek yerine, işlem geçmişini (işlem sayısı) tarayın. Bir öncekini hatırlıyoruz ve mevcut olanla karşılaştırıyoruz. Bunu zamanlayıcıda da yapabilirsiniz. Çok fazla varyant var. Her şey belirli göreve bağlıdır.

 

Anatoly, burada bir sorunla karşılaştım. Lütfen deneyiminizi paylaşın. Ya fonksiyonlarla çalışırken bir hata var ya da ben "yanlış" yapıyorum. Ama her şeyi doğru yaptığımı düşünüyorum....

İkincisinin "çalışmadığı" fonksiyon varyantları hakkında bir sorum var.

Örneğin:

1)

double  HistoryOrderGetDouble(
   ulong                       ticket_number,     // bilet
   ENUM_ORDER_PROPERTY_DOUBLE  property_id        // özellik tanımlayıcısı
   );

2)

bool  HistoryOrderGetDouble(
   ulong                       ticket_number,     // bilet
   ENUM_ORDER_PROPERTY_DOUBLE  property_id,       // özellik tanımlayıcısı
   double&                     double_var         // burada özelliğin değerini alıyoruz
   );

Kaynak kodunu ekledim.

Dosyalar:
 
denkir:

Anatoly, burada bir sorunla karşılaştım. Lütfen deneyiminizi paylaşın. Ya fonksiyonlarla çalışırken bir hata var ya da ben "yanlış" yapıyorum. Ama her şeyi doğru yaptığımı düşünüyorum....

Soru, ikincisinin "çalışmadığı" fonksiyon varyantlarıyla ilgili.

...

Günlükte ne görüyorsunuz? Komut dosyasını çalıştırırken hiçbir sorun yaşamıyorum.
 
tol64:
Günlükte ne görüyorsunuz? Betiği çalıştırırken herhangi bir sorun görmüyorum.

Kodun varsayılan ayarlarında "Failure to return HistoryOrderGetDouble() function" gibi bir girdi olduğunu görüyorum.

Yani fonksiyonun boolean versiyonu özellik değerini alamıyor.

 
denkir:

Varsayılan kod ayarlarında "Failure to return HistoryOrderGetDouble() function" gibi bir kayıt olduğunu görüyorum.

Yani, fonksiyonun boolean versiyonu özellik değerini alamıyor.

Benim için her şey başarıyla geçiyor. Nedenini bulmak için her şeye daha ayrıntılı bakın (günlüğe çıktı). Sipariş sayısı, bilet sayısı, hata sayısı vb.