0 beğenilme 0 beğenilmeme
1,581 kez görüntülendi
Önce bazı bilgiler:

 

1-Oninit içerisinde SetTimerInterval(60) ile periyodu 60 saniyeye ayarlıyorum.

2-timer fonksiyonu içerisinde global bir değişken ile fonksiyonun aktif olup olmadığını kontrol ettiriyorum.

Soru:

Ben timer fonksiyonunu aktif hale getirdiğim andan itibaren 60 saniye geçsin istiyorum. Yani kendi 60 saniyelik çalışma periyodunu geçersiz kılıp, benim aktif ettiğim andan 60 saniye sonra işleme-döngüye başlasın istiyorum. Nasıl yapabilirim?
Algoritmik Trading kategorisinde (240 puan) tarafından | 1,581 kez görüntülendi
0 0
şöyle birşey işe yarar mı?

SetTimerInterval(1)//60 saniyelik periyodu sıfırlamak amacıyla

SetTimerInterval(60)

timer_aktif=true;
0 0
gercek zaman (dakika) ile senkronize mi etmek istiyorsunuz? Orn. 00:17:00'da calismaya baslasin seklinde.
0 0
Hayır, öyle değil.

Şimdi ontimer fonksiyonunu başlatma durdurma olayı yok. oninite yazdığımız SetTimerInterval(60) ile çalışma periyodunu 60 saniyeye ayarlayarak başlıyor çalışmaya.

Ben stratejiyi 10:45:25 de çalıştırdım diyelim. ontimer her dakikanın 25. saniyesinde içindeki kodu çalıştıracak.

Stratejimin içinde sinyal geldi ve ben artık emir gönderdim. timer=true yaptım(ontimer başlangıcında yaptığım bir kontrol). Saat:11:00:20 diyelim. Ontimer her dakikanın 25. saniyesinde işleme girdiği için ve ben artık timer=true  yaptığım için 5 saniye sonra ontimer içindeki kodlarım işleme girecek. Ben, emir gönderdikten, yani ontimer=true yaptıktan 60 saniye(ontimer için belirlediğim periyot kadar) sonra ontimer içindeki kod devreye girsin istiyorum.

//60 saniye sadece bir örnek, 75 saniye de olabilir, 120 saniye de.

 
Ontimer konusunda diğer durumlar:
1-Tüm stratejilerime ontimer kodu ekledim ve işlemci kullanımı artık %40 a seviyesinde. Bellek kullanımı da aynı oranda arttı. Ontimer kodu eklenmemiş statejilerim çalışırken işlemci kullanımı %3-5 civarındaydı. (Ek: Yaklaşık 4 saat geçtikten sonra iq dondu, prime bile işlem yapamaz duruma geldi.)

2-Sanıyorum oninit dışında veya bir kez belirlendikten sonra artık periyodu değiştirmemize izin vermiyor sistem. oninit içerisine SetTimerInterval(600000) gibi büyük bir sayı yazdım (işlemci kullanımı azalır umuduyla). Emir sonrasında ise SetTimerInterval(60) yazdım, periyodu değişmedi, yani oninit içerisine yazdığım uzun periyot devam etti.

3-Yapmak istediğim şey, belirlediğim periyotta (örneğin 60 saniyede bir) çalışan bir döngü kurup, istediğim şart oluştuğunda bu döngüden çıkmak. Bu olayı ontimer harici bir fonksiyonla yapabilir miyim?

1 cevap

0 beğenilme 0 beğenilmeme

Merhaba, asagidaki kodu dener misiniz. System.Timers kutuphanesi kullaniliyor, comment'ler mevcut. Bu sekilde OnCustomTimer altindaki kod sureye gore calistirip durdurulabilir.

Timer fonksiyonlari farkli thread'de calistigi icin CPU kullanimi daha yuksek olacaktir, ama verimli kod ve yeterli donanim olduktan sonra %40'li seviyelere gelmesi beklenmemekte.

using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using Matriks.Engines;
using System.Windows.Media;
using Matriks.Indicators;
using Matriks.Symbols;
using Matriks.AlgoTrader;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;
using Matriks.Trader.Core.TraderModels;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Lean.Algotrader.Trading;
using System.Timers;

namespace Matriks.Lean.Algotrader
{
	public class CustomTimer : MatriksAlgo
	{
		// Strateji çalıştırılırken kullanacağımız parametreler. Eğer sembolle ilgili bir parametre ise,
		// "SymbolParameter" ile, değilse "Parameter" ile tanımlama yaparız. Parantez içindeki değerler default değerleridir.

		[SymbolParameter("GARAN")]
		public string Symbol;

		[Parameter(SymbolPeriod.Min5)]
		public SymbolPeriod SymbolPeriod;
		
		public Timer _customTimer;

		/// <summary>
		/// Strateji ilk çalıştırıldığında bu fonksiyon tetiklenir. Tüm sembole kayit işlemleri,
		/// indikator ekleme, haberlere kayıt olma işlemleri burada yapılır. 
		/// </summary>
		public override void OnInit()
		{
			AddSymbol(Symbol, SymbolPeriod);

			//Eger backtestte emri bir al bir sat seklinde gonderilmesi isteniyor bu true set edilir. 
			//Alttaki satırı silerek veya false geçerek emirlerin sirayla gönderilmesini engelleyebilirsiniz. 
			SendOrderSequential(true);
			
			// milisaniye cinsinden.
			_customTimer = new Timer(6000);
			_customTimer.Elapsed += OnCustomTimer;
			
			// Timer baslatilmak istendiginde.
			_customTimer.Start();
			
			// Timerin durdurulacagi yere asagidaki satir kopyalanilmali.
			// _customTimer.Stop();
			
			// Timer her durdurulup baslatildiginda 0dan baslar. Zaten baslatilmis olan bir timer
			// a tekrar start cagrilmamalidir. Yeniden baslatilmak isteniyorsa once durdurulmali.
		}

		/// <summary>
		/// Init islemleri tamamlaninca, bardatalar kullanmaya hazir hale gelince bu fonksiyon tetiklenir. Data uzerinde bir defa yapilacak islemler icin kullanilir
		/// </summary>
		public override void OnInitComplated()
		{

		}

		/// <summary>
		/// Eklenen sembollerin bardata'ları ve indikatorler güncellendikçe bu fonksiyon tetiklenir. 
		/// </summary>
		/// <param name="barData">Bardata ve hesaplanan gerçekleşen işleme ait detaylar</param>
		public override void OnDataUpdate(BarDataCurrentValues barDataCurrentValues)
		{
			
		}
		
		private void OnCustomTimer(object sender, ElapsedEventArgs e)
		{
			
		}

		/// <summary>
		/// Gönderilen emirlerin son durumu değiştikçe bu fonksiyon tetiklenir.
		/// </summary>
		/// <param name="barData">Emrin son durumu</param>
		public override void OnOrderUpdate(IOrder order)
		{
			if (order.OrdStatus.Obj == OrdStatus.Filled)
			{

			}
		}
	}
}

***STRATEJILERI TEST/DENEME ORTAMINDA CALISTIRMADAN VE SIZIN ISTEDIGINIZ SEKILDE CALISTIGINA EMIN OLMADAN GERCEK ORTAMDA HIC BIR ZAMAN CALISTIRMAYINIZ***

(8,035 puan) tarafından
1 0
Kod tam istediğim gibi görünüyor, akşam test eder sonucu yazarım.

İşlemci kullanımı da, fonksiyonu başlatıp durdurma imkanı olduktan sonra çok sorun olmaz. Çünkü gün içerisinde toplamda 10 dakikadan fazla çalışacaklarını düşünmüyorum. Bir de zaten bütün stratejilerimde aynı anda başlatmayacağımı düşününce işlemci kullanımında çok farkedeceği kesin.

İlginiz ve çözümünüz için teşekkür ederim.
0 0

Merhaba,

Maalesef işlemci kullanımı açısından önceki koddan bir farkı olmadı.

_customTimer.Start(); kodunu sinyal geldikten sonraya ekledim, timer içine de görev tamamlanınca stop kodunu ekledim. Oninit içerisine ise aşağıdaki kodları ekledim

            _customTimer = new Timer(60000);
            _customTimer.Elapsed += OnCustomTimer;

Tüm stratejilerimi çalıştırdığımda henüz hiç bir sinyal gelmemesine ( yani timer başlamamasına) rağmen staretjiler başladığı anda işlemci kullanımı yine fırladı. timer kodu olmadığında işlemci kullanımı %3-5 civarında oluyor.

Timer kodu çalışıyor, istediğim eksiksiz olarak yerine geliyor. Sorun işlemci kullanımından dolayı 4. saat civarında programın donması, hatta bilgisayarın etkilenmesi.

Kullanabilseydim iyi olacaktı ama ne yapalım, sağlık olsun.

İlginiz için tekrardan teşekkür ederim.

0 0
Biz tesekkur ederiz.

Timer kullanimi bizim tarafimizda, CPU kullaniminda bir miktar artisa yol acsa da, bu kadar asiri yukselmelere neden olmuyor. IQ icerisinde siz timer baslatmasaniz bile timer ile halihazirda calisan bir cok fonksiyon/thread bulunmakta. Ozellikle sinyal gelmedigi durumda ise hic bir etkisi olmamasi gerekiyor. Yani hala kod yazimiyla alakali olabilecegi ihtimalini de goz onunde bulundurunuz.

Isterseniz kodunuzu buradan, ozelse iqalgodestek@matriksdata.com adresinden, ayni forum basligi ile paylasabilirsiniz, vakit elverdigince incelemeye calisiriz.
0 0

Hocam büyük ihtimal siz bir adet strateji üzerinde deniyorsunuz. Ben timer kodunu bütün çalışan stratejilerime uygulamıştım. Normalde %3-5 olan işlemci kullanımı aşağıdaki timer kodu eklenince %40 civarına çıkıyor ve üç dört saat sonra program tepki vermez hale geliyor.

Kod farklılığı aslında sadece sizin yazdıklarınızdan oluşuyor. Yani;

 

using System.Timers;
public Timer _customTimer;

Oninit:

            _customTimer = new Timer(60000);
            _customTimer.Elapsed += OnCustomTimer;

Sinyalden sonra:

_customTimer.Start();

Timer içinde işlem tamamdandığında:

_customTimer.Stop();

 

Stratejiler başlar başlamaz işlemci kullanımı artıyor. Timer henüz başlamamış halde olduğundan timer içindeki kodlarımın işlemci kullanımında bir etkisi olmaması gerekiyor diye düşünüyorum.

Hocam kod çalışıyor, hem de tam istediğim gibi. Problem, yüksek işlemci kullanımından kaynaklı donma.

Bekleme kodu ile bir döngü oluşturulabilir mi ona bakacağım bir, Olmazsa da bırakacağım peşini.

Tekrar teşekkür ederim. İyi çalışmalar.


 

Hoş geldiniz, Matriks Destek Platformu sizlere sorularınızın hızlıca cevaplanması için bir ortam sağlar. Sorduğunuz ve cevapladığınız soruların ve yorumlarınızın aldığı oylar üzerinden puan kazanırsınız. Puan sistemine bağlı kampanyamızla ücretsiz kullanım avantajlarından faydalanabilirsiniz.



8,639 soru
8,593 cevap
4,826 yorum
19,832 kullanıcı