0 beğenilme 0 beğenilmeme
1,484 kez görüntülendi
Merhabalar,

Programın anlık olarak kapanmasına ilişkin arka tarafa bir batch yazmak istiyorum . program kapalı ise tekrar açık konuma getirsin diye.

yalnız aşağıdakileri nasıl halledebilirim, programı başlattıktan sonra consoledan yapabilir miyim?

1-oluşturmuş olduğum  portföye giriş sağlatmak. anladığım kadarıyla portföye giriş yapınca otomatik olarak portföy firmasına da giriş yapıyor.

2- kapanmış olan robotları tekrar aktif hale getirmek.
Genel Kullanım kategorisinde (117 puan) tarafından | 1,484 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme
Merhaba, oncelikle programin anlik olarak kapanmasi problem. Bu sorun hangi senaryolarda gerceklesiyor yazabilirseniz, duzeltmeye calisiriz.

Cozumu disaridan yapmaniz guc olabilir. Iceriden bu tip bir ozellik eklemek icin ek bir ozellik uzerinde konusacagiz. Uygun gorulurse, onumuzdeki versiyondan bir sonraki versiyon icin bir calisma yapmis oluruz.
(8,035 puan) tarafından
1 0
Yazdığınız programa gerçekten bir programcı olarak saygım var ki matriks firması olarak siz çalışanlardan da %100 memnuniyetim mevcut.Sürekli biriniz destek veremiyorsa diğeri ilgilieniyor, hafta içi sonu geç saatlere kadar telefon üzerinden bile destek veriyorsunuz.  Burada eleştirdiğim kısım benim programın kapanması , neden kapandığı noktaları değil. Bunlar bir şekilde düzeltilir , halledilir. belki dikkat etmişsinizdir arkaya batch filan yazıp bir şekilde yeniden başladığında kendime mail veya telegram üzerinden bilgi verdirip anın bağlanıp ayarları yapmayı planlıyorum.

Kendi çalıştığım firmada şu anda tüm Türkiye'nin sürekli karşılaştığı firmalara yazılım desteği vermektedir ama onların onayı olmadan bir çivi çakamayız.  Daha önce bir arkadaşınız bağlanıp tarihsel bazı ayarlamalar yapmıştı. Bu makul bir ayarlamalar ama benim bilgisayarımdaki güvenlikle alakalı ayarlamalar vb işlemler yapıldığında onayımın alınması lazım. Matriks tarafında istediğiniz işlemleri yapabilirsiniz. Logları alabilirsiniz ki bunuda benim iznim alarak almanız gereklidir vb işlemler.

Bu konuyu bence çok uzatmaya gerek yok . Genel olarak sizlerden ve desteğinizden memnunum :)

Bu arada kullandığım sunucu 6 çekirdekli Xeon , 16Gb ram , SSD ve 1Gbps hat var.
Şunu söyleyebilirim donduğu sırada ne grafik,bot vb hiç birşey programda açık değildi.

şu ana kadar anca %85 işlemci ve 4-5GB ram anlık olarak anca tüketmişliğim var.aynı anda 2 tane backtest çalıştırmıştım.  Bunlarla alakalı olduğunu düşünmüyorum.

İstediğinizde bilgisayara bağlanıp sizde inceleyebilirsiniz
0 0
Hakan Bey Selam,
Anlayışınız ve övgüleriniz için teşekkür ederiz. Geri bildiriminizi ilgili ekibin yöneticilerine ileteceğim.
Yeni versiyon ile birlikte bir çok sıkıntının giderileceğini düşünüyorum. Eğer hala devam eden sorunlar olursa beraber incelemek ve çözmek isterim.

Sağlıcakla kalın,
1 0

Konu programın kapanması sonucu nasıl bir işlem yapabilirim? ile başlayıp IQ sorununa dönmüş. İki konu hakkında da yazacaklarım olacak

 

Bu sorun için iki çözüm var.

Biri bir txt dosyasına değerleri tutmak ve sonra program çalıştığında okutmak.

Diğeri verileri db'de tutmak.

Ben ilk olarak txt'de tuttum ve şu an SQL Server'de tutuyorum. IQ güzel bir program fakat donma veya kullanılan symbol'de data keslimesi sorunu sık görüyorum. Bu soruna karşı bu çözümleri buldum. 4-5 farklı pc de sistem çalıştırıyorum. Ryzen, i5, i7 işlemci farketmeksizin bu sorunlarla karşılaşıyorum. Özellikle 1 gün sonra sistem inanılmaz şişiyor. Yani hiç donmasa bile 1-2 gün çalıştıktan sonra ister istemez IQ kapatılıp tekrar çalıştırılması gerekiyor.

Size txt ile çalışan bir yapı paylaşıyorum. Bu robot ilk çalıştığında var olan tüm parametreleri ve değişkenleri kaydedilen dosyadan okur. Dosya çalışan sybol ismi olarak masaüstüne kaydedilir. Yaptığım stratejide pozisyon takibini kendim yaptığımdan o bilgileri de kaydediyorum. Herhangi bir problem kaldığı yerden devam etmesini sağlıyorum.

Yapı olarak hantal fakat iş görür. Kodu kendinize göre uyarlamanız gerekir.

 

public class IzSuren_Close : 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("XBT_USD_BMEX")]
		public string Symbol;

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

		[Parameter(50)]
		public decimal BuySellQuantity;

		[Parameter(10)]
		public int MovPeriod;

		[Parameter(19)]
		public int DmiPeriod;
		[Parameter(40)]
		public int DmiUpLevel;
		[Parameter(30)]
		public int DmiDownLevel;

		// indikator tanımları.
		MOV movDmi;

		DemandIndex demandIndex;

		//Kar Al/Zarar Durdur Parametreleri
		[Parameter(true)]
		public bool Kar_AL;
		[Parameter(4)]
		public decimal Kar_AL_Yuzde;

		[Parameter(true)]
		public bool Zarar_Durdur;
		[Parameter(2)]
		public decimal Zarar_Durdur_Yuzde;

		decimal stock = 0;
		int SystemPosition = 0;

		public bool DosyadanOku;
		public string FolderPath = "C:\\Users\\user\\Desktop\\Pozisyonlar\\DMI";

		public string DosyaAdi;

		decimal sellPrice = 0;
		decimal buyPrice = 0;
		decimal karAlFiyat = 0;
		decimal shortZararDurdurFiyat = 0;
		decimal longZararDurdurFiyat = 0;


		/// <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()
		{
			DosyaAdi = Symbol;

			PozisyonOku();
			AddSymbol(Symbol, SymbolPeriod);
			demandIndex = DemandIndexIndicator(Symbol, SymbolPeriod, DmiPeriod);

			movDmi = MOVIndicator(demandIndex, MovPeriod, MovMethod.Exponential);

			WorkWithPermanentSignal(true);
			SendOrderSequential(false);

		}

		/// <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()
		{
			PozisyonYaz();
			Debug("########################################");
			Debug("Parametreler ve Pozisyonlar :");
			Debug("Symbol=" + Symbol);
			Debug("SystemPosition=" + SystemPosition);
			Debug("BuySellQuantity=" + BuySellQuantity);
			Debug("MovPeriod=" + MovPeriod);
			Debug("DmiPeriod=" + DmiPeriod);
			Debug("DmiUpLevel=" + DmiUpLevel);
			Debug("DmiDownLevel=" + DmiDownLevel);
			Debug("Kar_AL_Yuzde=" + Kar_AL_Yuzde);
			Debug("Zarar_Durdur_Yuzde=" + Zarar_Durdur_Yuzde);
			Debug("stock=" + stock);
			Debug("sellPrice=" + sellPrice);
			Debug("buyPrice=" + buyPrice);
			Debug("shortZararDurdurFiyat=" + shortZararDurdurFiyat);
			Debug("longZararDurdurFiyat=" + longZararDurdurFiyat);
			Debug("#########################################");




		}

		/// <summary>
		/// SetTimerInterval fonksiyonu ile belirtilen sürede bir bu fonksiyon tetiklenir.
		/// </summary>
		public override void OnTimer()
		{

		}

		/// <summary>
		/// AddNewsSymbol ve AddNewsKeyword ile haberlere kayit olunmuşsa bu fonksiyon tetiklenir.
		/// </summary>
		/// <param name="newsId">Gelen haberin id'si</param>
		/// <param name="relatedSymbols">Gelen haberin ilişkili sembolleri</param>
		public override void OnNewsReceived(int newsId, List<string> relatedSymbols)
		{

		}

		/// <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)
		{
			var lastPrice = barDataCurrentValues.LastUpdate.Close;
			if (SystemPosition == 1)
			{
				if (lastPrice>buyPrice)
				{
					Debug("******************************************************");
					Debug("Yeni LongStoploss Noktaları Hesaplanıyor...");
					Debug("Önceki Fiyat :" + buyPrice);
					Debug("Güncel Fiyat : " + lastPrice);
					longZararDurdurFiyat = lastPrice - ((lastPrice * Zarar_Durdur_Yuzde) / 100);
					buyPrice = lastPrice;
					Debug("Long Pozisyonda Stoploss Fiyatı:" + longZararDurdurFiyat);
					Debug("********************************************************");

				}
			}
			if (SystemPosition == -1)
			{

				if (lastPrice<sellPrice)
				{
					Debug("******************************************************");
					Debug("Yeni ShortStoploss Noktaları Hesaplanıyor...");
					Debug("Önceki Fiyat :" + sellPrice);
					Debug("Güncel Fiyat : " + lastPrice);
					shortZararDurdurFiyat = lastPrice + ((lastPrice * Zarar_Durdur_Yuzde) / 100);
					sellPrice = lastPrice;
					Debug("Short Pozisyonda Stoploss Fiyatı:" + shortZararDurdurFiyat);
					Debug("********************************************************");
				}
			}



			if (Al Koşulu)
			{
				Debug("CrossAbove");
				if (SystemPosition == 0)
				{
					
					SystemPosition = 1;
					

				}	else if (SystemPosition == -1)
				{
					SystemPosition = 1;
					
				}

			}
			if (Sat Koşulu)
			{
				if (SystemPosition == 0)
				{
					
					SystemPosition = -1;
					

				}	else if (SystemPosition == 1)
				{
					SystemPosition = -1;
					
				}

			}

			if (SystemPosition == 1)
			{
				if (lastPrice <= longZararDurdurFiyat)
				{
					Debug("||||||||||||||||||||||||||||||||||||||||");
					Debug("LongStoploss tetiklendi : Satış Fiyatı = " + lastPrice);
					SendMarketOrder(Symbol, BuySellQuantity, OrderSide.Sell, ChartIcon.PositionClose);
					stock = 0;
					SystemPosition = 0;
					Debug("||||||||||||||||||||||||||||||||||||||||");
				}


			}

			if (SystemPosition == -1)
			{
				if (lastPrice >= shortZararDurdurFiyat)
				{
					Debug("||||||||||||||||||||||||||||||||||||||||");
					Debug("ShortStoploss tetiklendi : Alış Fiyatı = " + lastPrice);
					stock = 0;
					SendMarketOrder(Symbol, BuySellQuantity, OrderSide.Buy, ChartIcon.StopLoss);
					SystemPosition = 0;
					Debug("||||||||||||||||||||||||||||||||||||||||");
				}

			}

		}

		/// <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)
		{

		}


		// Veri yaz
		public void PozisyonYaz()
		{
			if (!System.IO.Directory.Exists(FolderPath))
				Directory.CreateDirectory(FolderPath);
			string fileName = Path.Combine(FolderPath, DosyaAdi + ".txt");

			try
			{
				//Pass the filepath and filename to the StreamWriter Constructor
				StreamWriter sw = new StreamWriter(fileName);
				//Write a line of text
				sw.WriteLine(Symbol.ToString());
				sw.WriteLine(SystemPosition.ToString());
				sw.WriteLine(BuySellQuantity.ToString());
				sw.WriteLine(MovPeriod.ToString());
				sw.WriteLine(DmiPeriod.ToString());
				sw.WriteLine(DmiUpLevel.ToString());
				sw.WriteLine(DmiDownLevel.ToString());
				sw.WriteLine(Kar_AL_Yuzde.ToString());
				sw.WriteLine(Zarar_Durdur_Yuzde.ToString());
				sw.WriteLine(stock.ToString());
				sw.WriteLine(sellPrice.ToString());
				sw.WriteLine(buyPrice.ToString());
				sw.WriteLine(shortZararDurdurFiyat.ToString());
				sw.WriteLine(longZararDurdurFiyat.ToString());

				sw.Close();
			}
			catch (Exception e)
			{
				Console.WriteLine("Exception: " + e.Message);
			}
			finally
			{
				Console.WriteLine("Executing finally block.");
			}
			Debug(fileName + " dosyasina yazildi");
			//Debug($"SystemPozition = {SystemPosition}");
		}
		// Veri Oku
		public void PozisyonOku()
		{
			String line;
			int say = 0;
			//var dosya = new Dictionary<string,object>();
			var dosya = new List<object>();
			if (!System.IO.Directory.Exists(FolderPath))
				Directory.CreateDirectory(FolderPath);
			string fileName = Path.Combine(FolderPath, DosyaAdi + ".txt");


			try
			{

				//Pass the file path and file name to the StreamReader constructor
				StreamReader sr = new StreamReader(fileName);
				while ((line = sr.ReadLine()) != null)
				{
					dosya.Add(line);
					say++;
				}
				//Read the first line of text
				//line = sr.ReadLine();
				//SystemPosition = Convert.ToInt32(line);
				//close the file
				sr.Close();
				/*Pozisyonları değişkenlere eşliyoruz*/
				Symbol = Convert.ToString(dosya.ElementAt(0));
				SystemPosition = Convert.ToInt32(dosya.ElementAt(1));
				BuySellQuantity = Convert.ToDecimal(dosya.ElementAt(2));
				MovPeriod = Convert.ToInt32(dosya.ElementAt(3));
				DmiPeriod = Convert.ToInt32(dosya.ElementAt(4));
				DmiUpLevel = Convert.ToInt32(dosya.ElementAt(5));
				DmiDownLevel = Convert.ToInt32(dosya.ElementAt(6));
				Kar_AL_Yuzde = Convert.ToDecimal(dosya.ElementAt(7));
				Zarar_Durdur_Yuzde = Convert.ToDecimal(dosya.ElementAt(8));
				stock = Convert.ToDecimal(dosya.ElementAt(9));
				sellPrice = Convert.ToDecimal(dosya.ElementAt(10));
				buyPrice = Convert.ToDecimal(dosya.ElementAt(11));
				shortZararDurdurFiyat = Convert.ToDecimal(dosya.ElementAt(12));
				longZararDurdurFiyat = Convert.ToDecimal(dosya.ElementAt(13));


			}
			catch (Exception e)
			{
				Console.WriteLine("Exception: " + e.Message);
			}
			finally
			{
				Console.WriteLine("Executing finally block.");
			}

			Debug(fileName + " dosyasindan okundu");
		}



	}

 

1 0
Merhaba Çağlar Bey,

İlk versiyonda algoda yaşadığınız sorunları gidermiş olacağız. Bu hafta yeni versiyon yayınlayacağız. Algo taraflarında performans ve memory iyileştirmeleri yaptık.

İlginiz için teşekkürler,
1 0
Teşekkürler Çağlar Bey,

Programı kullanalı 1.5 hafta filan oldu daha yeni yeni alışıyorum.

DB ye de erişimimiz var ise o zaman çok güzel. Kullanıcyı  sadece gördüğümüz indikateörlerle filan sınırlayan bir program değil o zaman .
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.



7,511 soru
7,515 cevap
4,405 yorum
8,751 kullanıcı