0 beğenilme 0 beğenilmeme
540 kez görüntülendi
Merhaba herkese bol kazançlar dilerim. Ben alphatrend kullanarak alım supertrend ile satım yapmak istiyorum. Aynı zamanda alım ve satımlarımı tüm bakiyemle yapabilmem lazım. Timestamp hatasından kurtulmak ve emir durumlarını bildirim olarak (SMS, e-mail, telegram vs..) almak istiyorum. Bu mümkün müdür? Eğer mümkünse yardımcı olursanız sevinirim. Şimdiden teşekkür eder bol kazançlar dilerim
Algoritmik Trading kategorisinde (22 puan) tarafından | 540 kez görüntülendi

1 cevap

1 beğenilme 0 beğenilmeme

 Merhabalar,

İstediğiniz yapı aşağıda mevcuttur.

Bu yapıda sistem timestamp hatasına uğradığı zaman belirlediğiniz saniye kadar sonra aynı emri tekrar gönderiyor.

Aynı şekilde emirleriniz gönderildiğinde de mail gelecek şekilde düzenlenmiştir.

Formül içerisinde, aşağıdaki satırlara mail adresinizi yazınız.

--------------------------------------------------------------------------------------------------------------------------------------------------

// Gönderecek mail adresi

mail.From = new MailAddress("gonderecekmailadresi@gmail.com");

// gönderilecek adres

mail.To.Add("gonderilecekmailadresi@gmail.com");

------------------------------------------------------------------------------------------------------------------------------------------------

Ayrıca aşağıdaki kısma da adres ve şifre yazmanız gerekmektedir.

------------------------------------------------------------------------------------------------------------------------------------------------

// mail adresi ve şifresi

SmtpServer.Credentials = new System.Net.NetworkCredential("mailadresi@gmail.com", "mailadresisifresi");

SmtpServer.EnableSsl = true;

-------------------------------------------------------------------------------------------------------------------------------------------------

***STRATEJİLERİ TEST/DENEME ORTAMINDA SINAMADAN VE SİZİN İSTEDİĞİNİZ ŞEKİLDE ÇALIŞTIĞINA EMİN OLMADAN GERÇEK ORTAMDA HİÇBİR ZAMAN ÇALIŞTIRMAYINIZ ***

using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using Matriks.Engines;
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 Matriks.AI;
using Matriks.AI.AiParameters;
using Matriks.AI.Data;
using System.Net.Mail;
using System.Net;
using Matriks.Trader.Core.TraderModels;
using System.Text;

//========================================== by KRIPEX ==========================================//
// Başlangıçta belirlenen bakiyeye ve elinizdeki estrüman adetine göre strateji çalışmaya başlar.//
// Alış sinyali oluştuysa bakiye varsa bakiye kadar alış yapar.                                  //
// Satış sinyali oluştuysa pozisyonunuz varsa hepsini satar.                                     //


// ***** Bu strtaeji Bist ve Binance Spot piyasası için uygundur.                                //

namespace Matriks.Lean.Algotrader
{
	public class AlphaBakiyeTimeStamp : MatriksAlgo
	{
		[SymbolParameter("GARAN")]
						public string Symbol;

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

		[Parameter(1)]
			public decimal AlphatrendCoeff1;

		[Parameter(14)]
			public int AlphatrendPeriod1;

		[Parameter(Momentum.MFI)]
			public Momentum AlphatrendMomentum1;

		MatriksIndicator AlphaTrend_IQ;

		StringBuilder st = new StringBuilder();
		StringBuilder st1 = new StringBuilder();

		public override void OnDataUpdate(BarDataEventArgs barData)
		{

			st.AppendLine("alış emri gönderildi.");

			st1.AppendLine("satış emri gönderildi.");

			if (CrossBelow(AlphaTrend_IQ, AlphaTrend_IQ, 0, 1))
			{
				FX_Alis();
				MailGonder(st.ToString());
			}

			if (CrossAbove(AlphaTrend_IQ, AlphaTrend_IQ, 0, 1))
			{
				FX_Satis();
				MailGonder(st1.ToString());
			}
		}

		public void MailGonder(string icerik)
		{

			MailMessage mail = new MailMessage();
			SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");

			// Gönderecek mail adresi
			mail.From = new MailAddress("gonderecekmailadresi@gmail.com");

			// gönderilecek adres
			mail.To.Add("gonderilecekmailadresi@gmail.com");

			mail.Subject = "MatriksIQ ";

			mail.Body += "    <!DOCTYPE html>     ";
			mail.Body += "    <html lang='tr'>     ";
			mail.Body += "    <head>     ";
			mail.Body += "    <title>MatriksIQ</title>     ";
			mail.Body += "    <meta charset='utf-8'>     ";
			mail.Body += "    <meta name='viewport' content='width=device-width, initial-scale=1'>     ";
			mail.Body += "    </head>     ";
			mail.Body += "    <body>     ";
			mail.Body += "    <div style=‘width: 100%; max-width: 1140px; padding: 0 15px; margin: 0 auto;’>     ";
			mail.Body += "    <div style=‘text-align: center;’>     ";
			mail.Body += "    <img src=‘https://destek.matriksdata.com/assets/images/category-logo-matriks.png‘ alt=‘Matriks Data’ width=‘400’ height=‘auto’>     ";
			mail.Body += "    </div>     ";
			mail.Body += "    <h2 style=‘text-align: center; background-color: #539AC8; color: white; margin: 0 1px; padding: 10px 0;’>";
			mail.Body += icerik;
			mail.Body += "    </h2>     ";
			mail.Body += "    </div>     ";
			mail.Body += "    </body>     ";
			mail.Body += "    </html>    ";




			mail.BodyEncoding = System.Text.Encoding.GetEncoding(28599);
			mail.IsBodyHtml = true;
			SmtpServer.Port = 587;
			// mail adresi ve şifresi
			SmtpServer.Credentials = new System.Net.NetworkCredential("mailadresi@gmail.com", "mailadresisifresi");
			SmtpServer.EnableSsl = true;

			SmtpServer.Send(mail);
		}

		public override void OnInit()
		{
			AddSymbol(Symbol, SymbolPeriod);
			AlphaTrend_IQ = new AlphaTrend_IQ();

			AlphaTrend_IQ.SetIndicatorParameters("Coeff", AlphatrendCoeff1);
			AlphaTrend_IQ.SetIndicatorParameters("Period", AlphatrendPeriod1);
			AlphaTrend_IQ.SetIndicatorParameters("Momentum", AlphatrendMomentum1); RegisterUserIndicator(AlphaTrend_IQ, Symbol, SymbolPeriod, OHLCType.Close, 5);

			WorkWithPermanentSignal(true);

			SendOrderSequential(true, Side.All);

			// Gerekli - Timestamp
			SetTimerInterval(1);
			// #Gerekli - Timestamp
		}

		[Output][Parameter(50)]
						public decimal Bakiye;

		[Parameter(0)]
						public decimal BaslangıctakiEnstrumanAdedi;

		[Parameter(false)]
						public bool KomisyonuDahilEt;

		[Parameter(0.001)]
						public decimal KomisyonOranı;

		public decimal Adet;

		[Output]
						public string Sembol1 = "";

		[Output]
						public string Sembol2 = "";

		double tradeFraction;
		int exchangeID;

		public override void OnInitComplated()
		{
			var SymbolDetail = GetSymbolDetail(Symbol);
			tradeFraction = SymbolDetail.TradeFraction;
			exchangeID = SymbolDetail.ExchangeDetail.ExchangeID;

			if ((int) ExchangeType.Crypto == exchangeID)
			{
				Sembol1 = Symbol.Split('_')[0];
				Sembol2 = Symbol.Split('_')[1];
			}
		}

		public decimal FX_Sonfiyat()
		{
			var barDataModel = GetBarData();
			return Ref(barDataModel, OHLCType.Close, 0);
		}

		public bool FX_BalanceKontrolu()
		{
			bool _sonuc = false;

			if ((int) ExchangeType.Ise == exchangeID)
			{
				_sonuc = (Math.Floor(Bakiye / FX_Sonfiyat()) >0) ? true: false;
			}else if ((int) ExchangeType.Crypto == exchangeID)
			{
				_sonuc = Bakiye >= 10.5m? true:false;
			}

			return _sonuc;
		}

		public decimal FX_MinSize(decimal quantity)
		{
			double _kuvvet = Math.Pow(10, tradeFraction);
			return (decimal)(Math.Truncate((double) quantity * _kuvvet) / _kuvvet);
		}

		public void FX_Alis()
		{
			decimal _close = FX_Sonfiyat();
			decimal _adet = 0;

			if (FX_BalanceKontrolu() && LastOrderSide.Obj != Side.Buy)
			{
				if ((int) ExchangeType.Ise == exchangeID)
				{
					_adet = Math.Floor(Bakiye / _close);
				}else if ((int) ExchangeType.Crypto == exchangeID)
				{
					_adet = FX_MinSize(Bakiye / _close);
				}

				if (_adet != 0)
				{
					SendMarketOrder(Symbol, _adet, (OrderSide.Buy));
					Debug("Alış sinyali oluştu. Sinyal fiyatı: " + _close + " - Adet: " + _adet);
				}
			}else
			{
				Debug("XXXXX - Alış sinyali oluştu ama emir gönderilmedi. Bakiye: " + Bakiye);
				Debug("                      1 - Bakiyenin işlem açmak için yeterli olup olmadığınız kontrol ediniz.");
				Debug("                      2 - Enstrümanın Bist ya da Binance Spot piyasasından olup olmadığını kontrol ediniz.");
			}
		}

		public void FX_Satis()
		{
			if (((Adet != 0 || BaslangıctakiEnstrumanAdedi != 0)) && LastOrderSide.Obj != Side.Sell)
			{
				Adet += BaslangıctakiEnstrumanAdedi;

				SendMarketOrder(Symbol, Adet, (OrderSide.Sell));
				Debug("Satış sinyali oluştu. Sinyal fiyatı: " + FX_Sonfiyat() + " - Adet: " + Adet);
			}else
			{
				Debug("Satış sinyali oluştu. Satılacak enstrüman yok. Bakiye: " + Bakiye);
			}
		}

		// Gerekli - Timestamp
		public class OrderListTimestamp
		{
			public string ID;
			public string Sembol;
			public decimal Adet;
			public decimal Fiyat;
			public OrdType EmirTipi;
			public OrderSide orderSide;
			public string EmirYonu;
			public DateTime TetiklenmeZamani;
			public int Sayac;
			public bool AktifMI;
		}

		Dictionary<string, OrderListTimestamp> timestampDict = new Dictionary<string, OrderListTimestamp>();

		[Parameter(3)]
						public int AyniEmirKacSeferGonderilsin;

		[Parameter(10)]
						public int KacSaniyeSonraTekrarGonderilsin;

		string orderIDTimestamp = string.Empty;

		public override void OnTimer()
		{
			if ((int) ExchangeType.Crypto == exchangeID)
			{
				var tutt = timestampDict.Where(x => x.Value.AktifMI == true && DateTime.Now >= x.Value.TetiklenmeZamani);

				if (tutt.Count() >0)
				{
					foreach (var deger in tutt)
					{
						LastOrderSide.Obj = deger.Value.orderSide == OrderSide.Buy? Side.Sell:Side.Buy;

						if (deger.Value.EmirTipi.Obj == OrdType.Limit)
						{
							orderIDTimestamp = SendLimitOrder(deger.Value.Sembol, deger.Value.Adet, deger.Value.orderSide, deger.Value.Fiyat);
							Debug(deger.Value.EmirYonu + " emri tekrar gönderildi.");
						}else if (deger.Value.EmirTipi.Obj == OrdType.Market)
						{
							orderIDTimestamp = SendMarketOrder(deger.Value.Sembol, deger.Value.Adet, deger.Value.orderSide);
							Debug(deger.Value.EmirYonu + " emri tekrar gönderildi.");
						}

						deger.Value.ID = orderIDTimestamp;
						deger.Value.AktifMI = false;
						timestampDict[orderIDTimestamp] = deger.Value;
						timestampDict.Remove(deger.Key);

					}
				}
			}
		}
		// #Gerekli - Timestamp

		public override void OnOrderUpdate(IOrder order)
		{
			if (order.OrdStatus.Obj == OrdStatus.Filled)
			{
				if (timestampDict.ContainsKey(order.CliOrdID))
				{
					timestampDict.Remove(order.CliOrdID);
					Debug("Timestamp hatasına takılan emriniz gerçekleşti.");
				}
			}

			if (order.OrdStatus.Obj == OrdStatus.Rejected)
			{
				if (!timestampDict.ContainsKey(order.CliOrdID))
				{
					OrderListTimestamp orderList = new OrderListTimestamp();
					orderList.ID = order.CliOrdID;
					orderList.Sembol = order.Symbol;
					orderList.Adet = order.OrderQty;
					orderList.Fiyat = order.Price;
					orderList.EmirTipi = order.OrdType;
					orderList.TetiklenmeZamani = DateTime.Now;
					orderList.Sayac = 0;
					orderList.AktifMI = false;

					if (order.Side.Obj == Side.Buy)
					{
						orderList.orderSide = OrderSide.Buy;
						orderList.EmirYonu = "Alış";
					}else
					{
						orderList.orderSide = OrderSide.Sell;
						orderList.EmirYonu = "Satış";
					}

					timestampDict[order.CliOrdID] = orderList;
				}

				if (order.Text.Contains("Timestamp"))
				{
					if (timestampDict.ContainsKey(order.CliOrdID))
					{
						if (timestampDict[order.CliOrdID].Sayac < AyniEmirKacSeferGonderilsin)
						{
							timestampDict[order.CliOrdID].TetiklenmeZamani = DateTime.Now.AddSeconds(KacSaniyeSonraTekrarGonderilsin);
							timestampDict[order.CliOrdID].Sayac++;
							timestampDict[order.CliOrdID].AktifMI = true;

							Debug("Emir Timestamp hatasından dolayı iptal oldu tekrar gönderilecek");
						}else
						{
							timestampDict.Remove(order.CliOrdI
(11,059 puan) tarafından
hata bildirimi
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,636 soru
8,590 cevap
4,821 yorum
19,786 kullanıcı