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

Ben bunu denedim... 
Straji içindeki "SendOrderSequential(true);" yerine "SendOrderSequential(true,true);" kullandım.. 

Dün gece tüm stratejileri (23 adet) durdurdum. Kodu düzenledim yeniden çalıştırdım.
Bu arada 23 hissede portföyümde vardı yani robotlar gündüzden almıştı..

Beklentimiz ne idi : Sabah kaldığı yerden devam edecekti. Eğer ki "sat" emri gelirse satacaktı.. Böylece takip edip manuel satmak zorunda kalmayacaktık..

Sorunumuz ne idi : Strateji durdurulup yeniden çalıştırıldığında "SendOrderSequential(true); kullanılırsa ilk emir "sat" olunca emir iletilmiyor "al" olunca iletiliyor. İlk emir "al" dahi olsa "sat" dahi olsa ne olursa olsun ilk önce hangi koşul gerçekleşirse borsaya emir iletilmesini istiyordum bu sayede elektrik kesintisinde yada kodu yeniden düzenlememiz gerekirse vs. durumlarında strateji kaldığı yerden devam etmeli diye düşünüyordum. 

Ne oldu: Seans açılışında sabah saat 10:00 da 23 hisse zaten al pozisyonunun içinde olan tüm hisseleri yeniden satın aldı. Tek tek plan dışı aldıklarımı geri sattım. Sonra test için gün içinde zaten al pozisyonunun içinde olan başka bir hisseye backtest yapıp strateji oluşturdum çalıştır dedim 1 dk sonra al emri gönderdi.. :) Loglar aşağıdadır.

Olması gereken ne idi : Strateji ilk alım veya satım koşulunu beklemeliydi.
"Sat" koşulu gerçekleşirse borsaya emri iletecek, Portföyde satılacak hisse olmadığı için borsa red edecekti.
"al" koşulu gerçekleşirse de zaten alacaktı..

Ama kafadan pozisyon "al" da diye alım yapmamalıdır. (bu iyi mi kötü mü burası tartışılacak başka bir konudur)

Hem bir geri bildirim hem de durumun anlaşılabilir olması adına tane tane yazdım.. :)
Bunun bir çözümü varmı?  Saygılarımla

Log: 
5.02.2021 14:29:18 :Strateji calistirildi
5.02.2021 14:30:05 :Fonksiyon ismi : OnOrderUpdate, Detay :  Emir Gönderildi! 
                        Hesap : 0~00000 Yön : 1 Emir Tipi : PYS 
                        Sembol : XXXX Adet : 160 Fiyat : 0 Emir Id : 
5.02.2021 14:30:05 :Fonksiyon ismi : OnOrderUpdate, Detay :  Emir Durumu Değişti! 
                        Hesap : 0~00000 Yön : 1 Emir Tipi : PYS Emir Durumu : İletilmeyi Bekliyor
                        Sembol : XXXX Adet : 160 Fiyat :  Emir Id : XXXXXXXXXXX
5.02.2021 14:30:06 :Fonksiyon ismi : OnOrderUpdate, Detay :  Emir Durumu Değişti! 
                        Hesap : 0~00000 Yön : 1 Emir Tipi : PYS Emir Durumu : Gerçekleşti
                        Sembol : XXXX Adet : 160 Fiyat :  Emir Id : XXXXXXXXXXX

Algoritmik Trading kategorisinde (50 puan) tarafından | 1,677 kez görüntülendi
2 0
Kardeş senin sorunun başka. O fonksiyon sadece cross kullanan formüllerde işe yarar.

Ben de çok sayıda strateji kullanıyorum ve program ikinci gün hantallaştığından hepsini kapatıp yeniden açıyorum.

Aynı konu için ben şöyle yapıyorum. Pozisyonu her değiştirdiğimde, yeni pozisyonu bir txt dosyasına yazdırıyorum. Al için 1, sat için 2 yazdırıyorum, Stratejiyi kapatıp yeniden açtığımda ise, oninit fonksiyonunda son pozisyon yönünü not defterinden okuyor.

2 Cevaplar

0 beğenilme 0 beğenilmeme

 Merhaba, burada ne oldugunu anlamak icin once stratejinin mantigina bakmaniz gerekiyor. Yazdigim ornekte strateji CrossAbove ve CrossBelow fonksiyonlarini kullaniyordu. Bu fonksiyonlar dogru calistigi surece, binary sekilde isliyor. Yani ya 1 ya 0 (true,false) olur ve sinyali verdikten sonra tekrar sifira doner. Eger bunun yerine relational operatorler yani >, < operatorlerini kullaniyorsaniz bunlar da true ya da false doner ama mantigina dikkat ederseniz, sinyalden sonra sifira donmez. Yani 15>10 yazarsam bu dogrulugunu koruyacaktir, bu nedenle surekli tetiklenecektir, fakat cross(x, y) yazarsam, bu sadece cross ettiginde dogru olur, sonraki barlarda tekrar cross gerceklesmeyecegi icin bir daha cross gerceklesene kadar dogru olmaz.

Bu durumda cross kullandigimizda SendOrderSequential(true,true); ve bu sorudaki sekliyle strateji dogru calisacaktir.

Bunlari goz onunde bulundurarak stratejinizi gozden geciriniz. Isterseniz stratejiyi buraya yapistirabilir, ozelse iqalgodestek@matriksdata.com adresine gonderebilirsiniz, istediginiz sekilde duzenleyebiliriz.

(8,035 puan) tarafından
0 0

Merhaba Öncelikle ilginiz için teşekkür ederim.
Söylediklerinizi anladım. Bu strateji de sadece cross olmadığından kaynaklandı.
Çözüm için pozisyon kaydı tutmak adına şu linkteki kodu entegre etmeye çalıştım dosya oluşturdu içine veri yazdı hata vermiyor ama çalışmıyor da. 

Aklımda başka bir soru daha var.
Diyelimki bu stratejide tek sembol ile işlem yaptım txt ye sadece 1 - 2 yazıp pozisyonu takip etti sorun yok diyelim. 
Birden fazla sembolü bu stratejide çalıştırdığımda txt ye sadece 1 - 2 yazdığında bu txt de ki verinin hangi sembol için geçerli olacağını nasıl bilecek. 
Örnek
GARAN - 1
THY - 2  
gibi mi olacak yoksa her sembol için ayrı ayrı stratejiyi kopyalamak mı gerekecek.

Teşekkürler

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Matriks.Data.Symbol;
using Matriks.Engines;
using Matriks.Indicators;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;
using Matriks.Trader.Core.TraderModels;
using Matriks.Symbols;
using Matriks.AlgoTrader;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Lean.Algotrader.Trading;
using System.IO;

//*******************************************************ACIKLAMA*******************************************************//
//Kıvanç Özbilgiç'in hazirladigi PMAX indikatorunun kullanildigi bir stratejidir. Alim/Satim sinyalleri Cross Fonksiyonu 
//kullanilarak elde edilir. Strateji LONG/SHORT pozisyon almaktadir. Kalici sinyal ve sirasiz emir ile calismaktadir.
//Ilk emir gonderildiginde isaretlenir, ve daha sonraki emirler ilk emrin 2 kati olarak gonderilir. Boylece pozisyon 1/0 
//seklinde degil, 1/-1 seklinde alinabilmektedir (LONG/NEUTRAL yerine LONG/SHORT). Ek olarak OnOrderUpdate fonksiyonu ile
//Algo icerisinde gercek zamanli pozisyon takibi de yapilmaktadir. AcigaSatisYapilsin kutusu isaretlenmedigi taktirde
//aciga satis yapilmayacaktir ve emirler sirali olarak gonderilecektir.

namespace Matriks.Lean.Algotrader
{
	public class Pmax_Recorder : 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.Min60)]
		public SymbolPeriod SymbolPeriod;
		[Parameter(100)]
		public decimal BuyOrderQuantity;
		[Parameter(100)]
		public decimal SellOrderQuantity;
		[Parameter(10)]
		public int ATRPeriod;
		[Parameter(10)]
		public int MovPeriod;
		[Parameter(3)]
		public decimal Coefficient;
		[Parameter(MovMethod.E)]
		public MovMethod MovMethod;
		[Parameter(0)]
		public int Position;


		int FirstRun = 0;
		int realposition = 0;
		PMaxIndicator pmax;
		
		[Parameter(false)]
		public bool DosyadanOku;
		[Parameter("C:\\IQData")]
		public string FolderPath;
		[Parameter("dosyaadi")]
		public string DosyaAdi;

		

		public override void OnInit()
		{
			pmax = PMaxIndicators(Symbol, SymbolPeriod, ATRPeriod, MovPeriod, (decimal) Coefficient, MovMethod);

			AddSymbol(Symbol, SymbolPeriod);

			// Algoritmanın kalıcı veya geçici sinyal ile çalışıp çalışmayacağını belirleyen fonksiyondur.
			// true geçerseniz algoritma sadece yeni bar açılışlarında çalışır, bu fonksiyonu çağırmazsanız veya false geçerseniz her işlem olduğunda algoritma tetiklenir.
			WorkWithPermanentSignal(true);

			//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(false);  //SendOrderSequential(true, true);
			
			
			if (DosyadanOku == true)
			{
				DegiskenleriDosyadanOku();
			}
			
			
		}	
			
			
			public override void OnDataUpdate(BarDataEventArgs barData)
		{
			// pozisyonKontrol=1 olduğpunda Alış gerçeşkleşmiş satış olması beklenir.
			// pozisyonKontrol=0 olduğpunda Satış gerçeşkleşmiş alış olması beklenir.

			Position++;
			Debug("Pozisyon = " + Position);
			
			Position += 2;
			Debug("Pozisyon = " + Position);
			
			DegiskenleriDosyayaYaz();

			

		}
		
		

		// Veri yaz
		public void DegiskenleriDosyayaYaz()
		{
			if (!System.IO.Directory.Exists(FolderPath))
				Directory.CreateDirectory(FolderPath);

			string fileName = Path.Combine(FolderPath, DosyaAdi + ".txt");

			if (!File.Exists(fileName))
			{
				File.AppendAllText(fileName, "0");
			}

			File.WriteAllText(fileName, Position.ToString());
			Debug(fileName + " dosyasina yazildi");
		}

		// Veri Oku
		public void DegiskenleriDosyadanOku()
		{
		
			if (!System.IO.Directory.Exists(FolderPath))
				Directory.CreateDirectory(FolderPath);

			string fileName = Path.Combine(FolderPath, DosyaAdi + ".txt");

			if (!File.Exists(fileName))
			{
				File.AppendAllText(fileName, "0");
			}

			// Open the file to read from.
			string readText = File.ReadAllText(fileName);

			Position = Convert.ToInt32(readText);
		}



		/// <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 close = barDataCurrentValues.LastUpdate.Close;
			var pmaxKline = Math.Round(pmax.KLine.CurrentValue, 6);
			var pmaxSTline = Math.Round(pmax.StLine.CurrentValue, 6);

			Debug("***********************************************");
			Debug("Pmax = " + pmaxSTline);
			Debug("Mov = " + pmaxKline);

			//Kline  = Mov  
			//STline = Pmax

			//"AL KOŞULLARI -----------------------------------

			if (CrossAbove(pmax.KLine, pmax.StLine))
			{


				SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy));
				Debug("Alış emri gonderildi.");


			}

			if (pmaxKline>pmaxSTline && close>pmaxKline)
			{


				SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy));
				Debug("Alış emri gonderildi.");


			}




			//"SAT KOŞULLARI -----------------------------------



			if (CrossBelow(pmax.KLine, pmax)) // Mov, pmax i aşağı keserse
			{


				SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
				Debug("Satış emri gonderildi.");


			}

			if (pmaxKline>pmaxSTline && close<pmaxSTline) // Mov büyükse pmax tan ve bar kapanışı pmax tan küçükse
			{


				SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
				Debug("Satış emri gonderildi.");



			}

			if (pmaxKline<pmaxSTline) // Mov küçükse pmax tan
			{


				SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell));
				Debug("Satış emri gonderildi.");



			}



		}

		public override void OnOrderUpdate(IOrder order)
		{
			//Gercek zamanli pozisyon takibi
			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy)
			{
				var positionChange = order.OrderQty;
				realposition += (int) positionChange;
				Debug("[ONORDERUPDATE]: Pozisyon = " + realposition);
			}
			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
			{
				var positionChange = order.OrderQty;
				realposition -= (int) positionChange;
				Debug("[ONORDERUPDATE]: Pozisyon = " + realposition);
			}
		}
	}
}




 

0 0
Merhaba bu konuda bir gelişme varmı? yapabilecekmiyiz?
0 0
Iyi gunler, versiyon cikmak uzere oldugumuzdan cok yogunuz. Bugun vakit ayirip cevap yazmaya calisacagim. Hatirlatma icin tesekkur ederiz.
0 beğenilme 0 beğenilmeme

Merhaba, pozisyon kaydi takibi icin IQ arka planda calisan bir dictionary ve takibinin yapilabilmesi icin Algo icerisinde kullanabileceginiz LastOrderSide eklenmistir.

Asagidaki sekilde tanimlayabilir ve debug'a bastirabilirsiniz,
Side lastSide = LastOrderSide;
Debug("LastOrderSide = " + LastOrderSide);

Bu yeni ozelligi kullanmak icin IQ Algo menusunden, hazir stratejilere tiklayiniz. Acilan bir cok tab icerisinde Calistirilmis stratejiler sekmesine tiklayiniz. Burada istediginiz stratejileri toplu secip calistirabilirsiniz. Devam et butonuna bastiginizda stratejiniz (SendOrderSequential'in ilk parametresinin true olmasi durumunda) kaldigi yerden baslayacaktir. Son sinyal ve pozisyon stratejinin son calistirilmis hali ile iceride saklanmaktadir ve strateji kaldigi yerden devam edecektir.

Bu durumda, buradaki Pmax_Recorder stratejisi ve benzeri stratejilere gerek kalmamistir.

Bu yeni ozelligi halen test ediyoruz, ancak su ana kadar bir probleme rastlamadik. Lutfen siz de oncelikle test hesaplarindan calistirarak istediginiz sekilde calistigina emin olmadan gercek hesapta calistirmayiniz. Geri donuslerinizi cekinmeden iletebilirsiniz. Iyi calismalar dileriz.

(8,035 puan) tarafından
0 0

Merhaba Matt Ricks, 

Side lastSide = LastOrderSide;
Debug("LastOrderSide = " + LastOrderSide);

Bu özelliği kullanmak için aşağıdaki kodun neresine ekleme yapmam gerekiyor.

İlginiz için teşekkür ederim. Ayrıca yeni sürüm çok başarılı elinize sağlık.


 

using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using System.Windows.Media;
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;

//*******************************************************ACIKLAMA*******************************************************//
//Gecici sinyal ile kullaniniz. bufferlength strateji canli calistirildiginda averajlarin onceden hesaplanarak gelmesini//
//saglamaktadir. 200'un altina dusurmeyiniz. Hareketli ortalama PMAX in uzerinde kirdiginda alim, altina kirdiginda		//
//satim yapilmaktadir. Sirali emir gonderimi AKTIFTIR (Strateji ilk olarak alim emri bekleyecek ve sirayla gidecektir) 	//
//Ilk satis sinyali gelirse "Satış emri gönderildi" Debug ekraninda ciksa bile log ekranina baktiginizda Emir sinyali   //
//geldi fakat emirlerin sıralı gitmesi seçeneği aktif olduğundan emir gönderilmedi ifadesini goreceksiniz. 				//
//EMIR GONDERIMI SIRALI OLDUGU ICIN SIRASIZ GELEN EMIR BORSAYA ILETILMEMISTIR.											//


namespace Matriks.Lean.Algotrader
{
	public class PMaxStratejisi : 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("BTC_USDT_BIN")]
		public string Symbol;
		[Parameter(SymbolPeriod.Min)]
		public SymbolPeriod SymbolPeriod;
		[Parameter(5)]
		public decimal BuySellQuantity;

		[Parameter(14)]
		public int AtrPeriod;
		[Parameter(8)]
		public int MovPeriod;
		[Parameter(2)]
		public decimal Coeff;
		[Parameter(MovMethod.E)]
		public MovMethod MovMethod;

		public bool firstrun = true;
		int bufferlength = 200;
		WILDERS wilders;
		MOV mov;

		/// <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);
			wilders = new WILDERS(AtrPeriod);
			mov = new MOV(MovPeriod, MovMethod);

			// Algoritmanın kalıcı veya geçici sinyal ile çalışıp çalışmayacağını belirleyen fonksiyondur.
			// true geçerseniz algoritma sadece yeni bar açılışlarında çalışır, bu fonksiyonu çağırmazsanız veya false geçerseniz her işlem olduğunda algoritma tetiklenir.
			WorkWithPermanentSignal(false);

			//Eger 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);
		}

		Dictionary<int, decimal> fubDict = new Dictionary<int, decimal>();
		Dictionary<int, decimal> flbDict = new Dictionary<int, decimal>();
		Dictionary<int, decimal> PMAX_Dict = new Dictionary<int, decimal>();

		/// <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 currentBar = barDataCurrentValues.LastUpdate.BarDataIndex;
			if (currentBar < AtrPeriod)
			{
				fubDict[currentBar] = 0;
				flbDict[currentBar] = 0;
				PMAX_Dict[currentBar] = 0;
				return ;
			}

			if (firstrun)
			{
				int i = bufferlength;
				fubDict[currentBar - i -1] = 0;
				flbDict[currentBar - i -1] = 0;
				PMAX_Dict[currentBar - i -1] = 0;
				var _barData_ = GetBarData();
				if (currentBar - 1 < 0 || !_barData_.Close.ContainsKey(currentBar - 1) || currentBar <= bufferlength) return ;
				Debug("currentBar = " + currentBar + ", buffer LENGTH = " + bufferlength + " indikator buffer hesaplaniyor");
				for (; i >= 0; i--)
				{
					var _high_ = _barData_.High[currentBar - i];
					var _low_ = _barData_.Low[currentBar - i];
					var _diff_ = _high_ - _low_;
					var _range2_ = Math.Abs(_high_ - _barData_.Close[currentBar - 1 - i]);
					var _range3_ = Math.Abs(_low_ - _barData_.Close[currentBar - 1 - i]);
					var _value_ = Math.Max(_diff_, Math.Max(_range2_, _range3_));

					wilders.Update(_value_, currentBar - i, _barData_.Time[currentBar - i]);
					mov.Update((_high_ + _low_) / 2, (currentBar - i), _barData_.Time[currentBar - i]);
					//Debug($"mov Updated: with value: {(_high_ + _low_) / 2}, @{currentBar - i}, with TIME = {_barData_.Time[currentBar - i]}");
					var _k = mov.Value[0][currentBar - i];
					var _offset = Coeff * wilders.CurrentValue;
					var _str = _k + _offset;
					var _sts = _k - _offset;
					var _prev = PMAX_Dict[currentBar - i -1];
					var _fub = _str<_prev || mov.Value[0][currentBar -1 - i] >_prev? _str:_prev;
					var _flb = _sts>_prev || mov.Value[0][currentBar -1 - i] <_prev? _sts:_prev;
					fubDict[currentBar - i] = _fub;
					flbDict[currentBar - i] = _flb;
					var _pmax = _prev == fubDict[currentBar - i -1] && _k < _fub? _fub : (_prev == fubDict[currentBar - i -1] && _k>_fub? _flb:(_prev == flbDict[currentBar - i -1] && _k>_flb? _flb
								   :(_prev == flbDict[currentBar - i -1] && _k < _flb? _fub:_fub)));
					PMAX_Dict[currentBar - i] = _pmax;
					//Debug($"PMAX = {Math.Round(_pmax,4)}, mov = {Math.Round(mov.Value[0][currentBar-i],4)}, @{currentBar - i}");
				}
				firstrun = false;
			}
			else
			{
				var barData = GetBarData();
				if (currentBar - 1 < 0 || !barData.Close.ContainsKey(currentBar - 1)) return ;
				var high = barData.High[currentBar];
				var low = barData.Low[currentBar];
				var diff = high - low;

				var range2 = Math.Abs(high - barData.Close[currentBar - 1]);
				var range3 = Math.Abs(low - barData.Close[currentBar - 1]);
				var value = Math.Max(diff, Math.Max(range2, range3));

				wilders.Update(value, currentBar, barDataCurrentValues.LastUpdate.DTime);
				mov.Update((high + low) / 2, currentBar, barDataCurrentValues.LastUpdate.DTime);
				var k = mov.CurrentValue;
				var offset = Coeff * wilders.CurrentValue;
				var str = k + offset;
				var sts = k - offset;
				var prev = PMAX_Dict[currentBar -1];
				var fub = str<prev || mov.Value[0][currentBar -1] >prev? str:prev;
				var flb = sts>prev || mov.Value[0][currentBar -1] <prev? sts:prev;
				fubDict[currentBar] = fub;
				flbDict[currentBar] = flb;
				var pmax = prev == fubDict[currentBar -1] && k<fub? fub : (prev == fubDict[currentBar -1] && k>fub? flb:(prev == flbDict[currentBar -1] && k>flb? flb
												   :(prev == flbDict[currentBar -1] && k<flb? fub:fub)));
				PMAX_Dict[currentBar] = pmax;

				if (barDataCurrentValues.LastUpdate.IsNewBar == true)
				{
					Debug($"PMAX = {Math.Round(pmax,4)}, mov = {Math.Round(mov.Value[0][currentBar],4)}");
					if (mov.Value[0][currentBar -1] <PMAX_Dict[currentBar -1] && mov.Value[0][currentBar] > PMAX_Dict[currentBar])
					{
						SendMarketOrder(Symbol, BuySellQuantity, OrderSide.Buy);
						Debug("Alış emri gönderildi");
					}

					if (PMAX_Dict[currentBar -1] <mov.Value[0][currentBar -1] && PMAX_Dict[currentBar] >mov.Value[0][currentBar])
					{
						SendMarketOrder(Symbol, BuySellQuantity, OrderSide.Sell);
						Debug("Satış emri gönderildi");
					}
				}
			}
		}

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

			}
		}
	}
}

 

0 0
Cok tesekkur ederiz, bu tur yorumlar alabilmek icin yogun sekilde calisiyoruz, begendiginize cok memnun olduk.

Side lastSide = LastOrderSide;
Debug("LastOrderSide = " + LastOrderSide);

satirlarini direkt,

public override void OnDataUpdate(BarDataCurrentValues barDataCurrentValues) {

fonksiyonu icerisine yazabilirsiniz.

Bu arada kaldiginiz yerden baslama ozelligini kullanmak icin bir kod yazmaniza gerek yok, sadece calistirilmis stratejilerden devam et butonuna tiklamaniz yeterli. Sirali gonderme aktif oldugu surece, strateji kaldigi yerden devam edecektir.

Son olarak yukariya yazdiginiz stratejinin PMAX'in eski versiyonu oldugunu hatirlatmak isterim. Bunu kullanmaya devam edebilirsiniz tabi ki, ama yeni versiyon hazir stratejiler arasinda mevcuttur.
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,790 kullanıcı