mql5 - son işlemden bu yana belirli bir süre sonra dikey çizgi - sayfa 2

 
Vladimir Karputov :

"Son anlaşma" terimini açıklığa kavuşturmak istiyorum.

Geçerli gün içindeki son ticareti aramanız mı gerekiyor? Yoksa son N-günler için mi?

geçen 24 saat içinde anlaşma - geçmişi gözden geçirmeye gerek yok.

 
renatmt5 :

geçen 24 saat içinde anlaşma - geçmişi gözden geçirmeye gerek yok.

Bunun anlamı şudur:

Gösterge, OBJ_VLINE yardımından dikey bir çizgi oluşturmak, taşımak ve silmek için kodu kullanır. (şimdiye kadar göstergede yalnızca satır oluşturma çalışır). Hat adı, " Dikey hat adı " giriş parametresinde verilir.

Son anlaşma Dikey çizgiyi taşı

Dikey çizgi OnOnit () içinde oluşturulur :

 //+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   VLineCreate( 0 ,InpVLineName);
//---
   return ( INIT_SUCCEEDED );
  }


Yükü en aza indirmek için hikayeleri dakikada bir yoklıyoruz. Bu amaçlar için, programımızın global değişkenleri alanında (bu durumda gösterge), ExtLastMove değişkenini bildireceğiz.

 //---
datetime ExtLastMove= 0 ;                   // "0" -> D'1970.01.01 00:00';

- bu değişken, ticaret geçmişine son erişim zamanını saklayacaktır.


OnCalculate() içinde ayrıca geçerli zamandan ( TimeCurrent herhangi bir sembol için son alıntının zamanı) kaydedilen ExtLastMove zamanını çıkarın ve fark 60 saniyeden azsa - çıkın

 //---
   datetime time_current= TimeCurrent ();
   if (time_current-ExtLastMove< 60 ) // 60 seconds
       return (rates_total);
   ExtLastMove=time_current;

fark daha büyükse, yeni zamanı ExtLastMove'a yazarız .


Ticaret geçmişine LastProfitForPeriod() içinde erişilebilir.

Burada iki tarih kullanılır: from ve to. "Kime" geleceğe ayarlanır (şimdiki saat artı bir gün) ve " kimden", geçerli saatten bir gün çıkarılarak elde edilir

   datetime from_date   = time_current- 60 * 60 * 24 ;   // time one day ago
   datetime to_date     = time_current+ 60 * 60 * 24 ;   // time from the future :)
   double    last_profit = LastProfitForPeriod(from_date,to_date);

   Comment ( "Last profit: " , DoubleToString (last_profit, 2 ));


Şimdilik bu kadar, bir sürü serseri...

 
Vladimir, kodunuz için ve özellikle de onun parçalarıyla ilgili yorumlarınız için çok teşekkür ederim!
Neden to_date'e geleceği vurmaya eşit ihtiyacımız olduğunu anlamadım? Belki şimdiye kadar? Gelecekte , işlemin sonucu belli değil gibi görünüyor :) Yoksa gelecek zamanda bir çizgi çekmek için bu günlere mi ihtiyacımız var?
Serideki bir başka soru.
Anladığım kadarıyla, diziyi fırsatlarla ilgili verilerle yüklüyoruz ve sıfır anlaşmadan sonuncuya kadar diziyi yineliyoruz, zamanı kaydedilen son ile karşılaştırıyoruz ve anlaşma_zamanı daha sonraysa son_zaman değişkeninin üzerine yazıyoruz. Ya da belki dizinin sonundan itibaren yineleyebilirsiniz? Aslında, dizinin en son elemanı, veriye ihtiyacımız olan son kapalı anlaşma mı olacak?
Belki bazı mantıksal hatalar yapıyorum - lütfen kesinlikle yargılamayın :)
 
for(uint i=0;i<total;i++) for(uint i=total;i>=0;i--) ile değiştirildi
 
ancak genel olarak, o zaman döngü gerekli değildir - hemen i=total seri numarası altındaki dizi öğesine dönüyoruz
 
Neden to_date'e geleceği vurmaya eşit ihtiyacımız olduğunu anlamadım?

Bu yüzden gerekli. Şu anki zamandan ve öncesinden "gelecek" garantili olmak.

Ya da belki dizinin sonundan itibaren yineleyebilirsiniz?

Görev son anlaşmayı bulmaksa, o zaman Dizinin tam olarak sıralanması ve aranması gerekir - bir şeyin nasıl olacağını asla bilemezsiniz veya çekirdeğin iç mantığı değişecek ve anlaşmalar bozulacaktır.

 
Vladimir Karputov :

Bu yüzden gerekli. Şu anki saatten önce ve sonra "başlangıç" alma garantisi olmak.

Görev son anlaşmayı bulmaksa, o zaman Dizinin tam olarak sıralanması ve aranması gerekir - bir şeyin nasıl olacağını asla bilemezsiniz veya çekirdeğin iç mantığı değişecek ve anlaşmalar bozulacaktır.

Tamam anladım. Prensip olarak, 24 saatlik geçmiş sınırlaması dikkate alındığında, veriler arasında sıralama yapılırken açıkçası önemli bir yük olmayacaktır :)

 
renatmt5 :

Tamam anladım. Prensip olarak, 24 saatlik geçmiş sınırlaması dikkate alındığında, veriler arasında sıralama yapılırken açıkçası önemli bir yük olmayacaktır :)

Böylece, son dokunuş kalır - alınan kâra bağlı olarak çizgiyi hareket ettirin.

Bana hareketin kurallarının ne olduğunu hatırlat.

 
Last_time ve sonuç değişkenlerinin çalıştığımız istenen değerler olduğunu doğru anladım. Ve sonuç adı, çizginin ne kadar süreyle geleceğe kaydırılacağını (yeniden çizileceğini) belirler. Daha sonra, son anlaşmada alınan verileri dikkate alarak satırı hareket ettirmek için " Dönem Karı" kod bloğu "Dikey satırı taşı" bloğunun önüne yerleştirilmelidir.
Bu doğru mu yoksa bir şeyi mi karıştırıyorum?
 

Burada "önce" parametresinin neden gelecekte yapılması gerektiğine dair bir açıklama buldum:

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hatalar, hatalar, sorular

Renat Fatkhullin , 2016.11.04 12:43

Bitiş tarihi olarak asla TimeCurrent()'i kullanmayın, tüm son işlemlerin yakalanmasını sağlamak için TimeCurrent()+86400'ü kullanın.

TimeCurrent tam olarak en son zaman değil, %100 doğru bir zaman olmayan "güncellemeler sırasında bilinen son sunucu zamanı"dır. Özellikle başlangıçta.


Neden: