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

Merhaba alttaki "satış şartı"  ve "alış şartı" kodlarını şu şekilde eklemeler yapmak istiyorum.   Mümkünmüdür.

Satış şartı için...

"veya alış fiyatından %0.5 düşmüş ise"
 

// Satış şartı - son barda açılış kapanıştan büyük ve kapanış 2 bar önceki kapanıştan büyük ise
			if (Close<Open && Close>ClosePrev2)
			{
				SendMarketOrder(Symbol, Quantity, OrderSide.Sell);
				Debug("Satış emri gönderildi.");
			}

 

Alış şartı için de şunu eklemek istiyorum.

"veya satış fiyatından %0.5 yükselmiş ise"
 

// Alış şartı - son barda kapanış açılıştan büyük ve kapanış 2 bar önceki kapanıştan küçük ise
			if (Close>Open && Close<ClosePrev2)
			{
				SendMarketOrder(Symbol, Quantity, OrderSide.Buy);
				Debug("Alış emri gönderildi.");

Teşekkürler.

Algoritmik Trading kategorisinde (50 puan) tarafından
tarafından düzenlendi | 1,415 kez görüntülendi

2 Cevaplar

0 beğenilme 0 beğenilmeme
En İyi Cevap

Open ve Close icin degerleriniz yanlisti. OnDataUpdate() her yeni bar ACILISINDA data geldigi anda tetiklenmektedir. Open ve close alirken

barDataCurrentValues.LastUpdate.Open;

seklinde alirsaniz yeni acilan barin acilis ve kapanis bilgilerini verir, bunlar da birbirine esit olur bar acildiginda, istediginiz sonuca ulasamazsiniz. Bar acildiginda update geldiginden bir onceki bara bakmaniz gerekir. Bunu da barData.Open[barDataCurrentValues.LastUpdate.BarDataIndex - 1];  seklinde yapabilirsiniz - duzeltildi.

Ayni sekilde canli strateji calistirdiginizda

var ClosePrev2 = Ref(barData, OHLCType.Close, 2);

 yeni acilan bardan 3 onceki barin kapanisini vermektedir. Bundan bilginiz var mi emin olamadim, bu sekilde biraktim.

Son olarak backtest'de OnOrderUpdate ile gerceklesen emir fiyati saglikli gelmedigi icin (siz de anladigim kadariyla backtest yapiyorsunuz) alis ve satis emirlerinin kapanis fiyatindan gerceklestigi farz edilmistir.

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;

namespace Matriks.Lean.Algotrader
{
	public class SonBar : 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.Min)]
		public SymbolPeriod SymbolPeriod;
		[Parameter(100)]
		public decimal Quantity;
		[Parameter(0.5)]
		public decimal AlisSartiYuzde;
		[Parameter(0.5)]
		public decimal SatisSartiYuzde;
		
		//Emir takibi degiskenleri
		decimal LastBuyOrderPrice = 0;
		decimal LastSellOrderPrice = 0;
		int realposition = 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()
		{
			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(false);
			WorkWithPermanentSignal(true);
		}

		/// <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)
		{
			// bardata verileri çağırılıyor.
			var barData = GetBarData();

			// Aktif barın open ve close değerleri alınıyor.
			var Open = barData.Open[barDataCurrentValues.LastUpdate.BarDataIndex - 1]; 
			var Close = barData.Close[barDataCurrentValues.LastUpdate.BarDataIndex - 1]; 

			// ref fonksiyonu ile 2 önceki close değeri alınıyor.
			var ClosePrev2 = Ref(barData, OHLCType.Close, 2);
			var alisnoktasi = LastSellOrderPrice*(1+AlisSartiYuzde/100);
			var satisnoktasi = LastBuyOrderPrice*(1-SatisSartiYuzde/100);
			
			Debug("******************************************");
			Debug($"Open = {Open}, Close = {Close}, PrevClose = {ClosePrev2}");
			Debug($"alisnoktasi = {alisnoktasi}, satisnoktasi = {satisnoktasi}, Pozisyon = {realposition}");

			// Alış şartı - son barda kapanış açılıştan büyük ve kapanış 2 bar önceki kapanıştan küçük ise
			//"veya satış fiyatından %0.5 yükselmiş ise"
			if (Close > Open && Close < ClosePrev2 && realposition == 0)
			{
				SendMarketOrder(Symbol, Quantity, OrderSide.Buy);
				Debug("Alim kosulu olustu, alış emri gönderildi.");
				//LastBuyOrderPrice = Close;
			}
			if(Close > alisnoktasi && realposition == 0 && alisnoktasi!=0)
			{
				Debug($"Close @ {Close} > {alisnoktasi} alisnoktasi ALIM kosulu olustu.");
				SendMarketOrder(Symbol, Quantity, OrderSide.Buy);
				Debug("Alış emri gönderildi.");
				//LastBuyOrderPrice = Close;
			}

			// Satış şartı - son barda açılış kapanıştan büyük ve kapanış 2 bar önceki kapanıştan büyük ise
			//"veya alış fiyatından %0.5 düşmüş ise"
			if (Close < Open && Close > ClosePrev2 && realposition == 1)
			{
				SendMarketOrder(Symbol, Quantity, OrderSide.Sell);
				Debug("Satış kosulu olustu, satış emri gönderildi.");
				//LastSellOrderPrice = Close;
			}
			if(Close < satisnoktasi && realposition == 1 && satisnoktasi!=0)
			{
				Debug($"Close @ {Close} < {satisnoktasi} satisnoktasi SATIS kosulu olustu.");
				SendMarketOrder(Symbol, Quantity, OrderSide.Sell);
				Debug("Satış emri gönderildi.");
				//LastSellOrderPrice = Close;
			}
		}

		/// <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 && order.Side.Obj == Side.Buy)
			{
				LastBuyOrderPrice = order.Price;
				Debug("Alis emri gerceklesti @ " + LastBuyOrderPrice);
				realposition++;
				Debug("OnorderUpdate: IN LONG POSITION. Position = " + realposition);
			}
			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
			{
				LastSellOrderPrice = order.Price;
				Debug("Satis emri gerceklesti @ " + LastSellOrderPrice);
				realposition--;
				Debug("OnorderUpdate: SOLD POSITION. Position = " + realposition);
			}
		}
	}
}

 

(8,035 puan) tarafından
tarafından düzenlendi
1 0
Emeğinize elinize sağlık size de zahmet verdim. Paylaştığınız kodun içinden bir iki düzenleme de ben yaptım neredeyse istediğim sonuca ulaştım. çok teşekkürler. Saygılar
0 0
Rica ederim ne demek. Biz ilginiz ve detayli aciklamalariniz icin tesekkur ederiz.

Kodda ufak bir duzenleme daha yaptim OnOrderUpdate ile gerceklesen emir fiyati backtest icin de saglikli geliyor artik, OnDataUpdate icerisinde yaptigim tanimlamalara ve emrin kapanis fiyatindan isleme girdigini farz etmemize gerek kalmadi, bilginize.
1 beğenilme 0 beğenilmeme

Merhaba, bunun bir cok yolu var. En kolay yolu Stoploss ve TakeProfit fonksiyonlarini kullanmaktir.

TP = TakeProfit(Symbol, SyntheticOrderPriceType.Percent, Kar_AL_YuzdeMiktari);
SL = StopLoss(Symbol, SyntheticOrderPriceType.Percent, Zarar_Durdur_YuzdeMiktari);
Debug(TP + " ," + SL);

Ornek olarak sma_Bitmex_TPSL stratejisine bakabilirsiniz.

(8,035 puan) tarafından
0 0

Cevabınız için teşekkürler. Söylediğinizi anladım ama hiç C# bilgim olmadığından uygulayamıyorum. 
Size zahmet olmayacaksa aşağıda paylaştığım bütün kodun içine yerleştire bilirmisiniz.

 

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;

namespace Matriks.Lean.Algotrader
{
	public class SonBar : 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;

		[Parameter(5)]
public decimal Quantity;

		/// <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);
			WorkWithPermanentSignal(true);
		}

		/// <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)
		{
			// bardata verileri çağırılıyor.
			var barData = GetBarData();

			// Aktif barın open ve close değerleri alınıyor.
			var Open = barDataCurrentValues.LastUpdate.Open;
			var Close = barDataCurrentValues.LastUpdate.Close;

			// ref fonksiyonu ile 2 önceki close değeri alınıyor.
			var ClosePrev2 = Ref(barData, OHLCType.Close, 2);

			// Alış şartı - son barda kapanış açılıştan büyük ve kapanış 2 bar önceki kapanıştan küçük ise
			if (Close>Open && Close<ClosePrev2)
			{
				SendMarketOrder(Symbol, Quantity, OrderSide.Buy);
				Debug("Alış emri gönderildi.");
			}

			// Satış şartı - son barda açılış kapanıştan büyük ve kapanış 2 bar önceki kapanıştan büyük ise
			if (Close<Open && Close>ClosePrev2)
			{
				SendMarketOrder(Symbol, Quantity, 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

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

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;

namespace Matriks.Lean.Algotrader
{
	public class SonBar : 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;
		[Parameter(5)]
		public decimal Quantity;
		
		//Kar Al/Zarar Durdur Parametreleri
		[Parameter(true)]
		public bool Kar_AL;
		[Parameter(0.5)]
		public decimal Kar_AL_YuzdeMiktari;
		[Parameter(true)]
		public bool Zarar_Durdur;
		[Parameter(0.5)]
		public decimal Zarar_Durdur_YuzdeMiktari;
		ISyntheticOrderPrices TP, SL;

		/// <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);
			WorkWithPermanentSignal(true);
		}

		/// <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)
		{
			// bardata verileri çağırılıyor.
			var barData = GetBarData();

			// Aktif barın open ve close değerleri alınıyor.
			var Open = barDataCurrentValues.LastUpdate.Open;
			var Close = barDataCurrentValues.LastUpdate.Close;

			// ref fonksiyonu ile 2 önceki close değeri alınıyor.
			var ClosePrev2 = Ref(barData, OHLCType.Close, 2);

			// Alış şartı - son barda kapanış açılıştan büyük ve kapanış 2 bar önceki kapanıştan küçük ise
			if (Close>Open && Close<ClosePrev2)
			{
				SendMarketOrder(Symbol, Quantity, OrderSide.Buy);
				Debug("Alış emri gönderildi.");
				if (Kar_AL) TP = TakeProfit(Symbol, SyntheticOrderPriceType.Percent, Kar_AL_YuzdeMiktari);
				if (Zarar_Durdur) SL = StopLoss(Symbol, SyntheticOrderPriceType.Percent, Zarar_Durdur_YuzdeMiktari);
				Debug("KAR AL: " + TP + ", ZARAR DURDUR: "  + SL);
			}

			// Satış şartı - son barda açılış kapanıştan büyük ve kapanış 2 bar önceki kapanıştan büyük ise
			if (Close<Open && Close>ClosePrev2)
			{
				SendMarketOrder(Symbol, Quantity, 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

Sayın Matt Ricks ilginiz teşekkür ederim. Ancak bu benim istediğim koşulları sağlamıyor. :)
Şimdi size bir örnekle anlatmaya çalışacağım. 
İlk olarak satış için ana koşul "(Close<Open && Close>ClosePrev2)" haricinde %X stoploss kullanmak istiyorum burada sorun yok.

Alış emrinde ise durum daha farklı.
Ana koşul "(Close>Open && Close<ClosePrev2)" haricinde algoritmanın son satış yaptığı fiyatı takip etmesini yada aklında tutmasını, eğer satış yaptıktan sonra sattığı fiyattan %X kadar fiyat tekrar yukarı çıkmışsa tekrar alış emri göndermek istiyorum. 



Örneğin Üstteki resimde durum daha da anlaşılabilir. satış emrinden sonra aşağı yukarı işaretlediğim yerden alış yapmasını beklemekteyim. Algoritma dipten alıp az üstten satmış ama yükselişi de kaçırmış bunu engellemek için satış yaptıktan sonra hisse fiyatı bir ve ya birkaç mum ilerleyip veya aynı mum içinde de olabilir netice olarak sattığı fiyattan %X kadar yükselmişse o tekrar alış emri göndermek istiyorum.
tabi o arada alış için ana koşul "(Close>Open && Close<ClosePrev2)" çalışmışsa sorun yok ama çalışmamışsa bu devreye girsin istiyorum. Bu mümkünmüdür.

Saygılarımla

0 0
Rica ederim. Stratejiniz sadece uzun pozisyon aldigi icin, ilk mesajinizda alis kismini yanlis yazdiginizi dusundum aslinda.

Satis kosulu icin stoploss uyuyor, alis icin daha fazla kod yazmamiz gerekecek ve takeprofit fonksiyonu da sizin icin gereksiz bu durumda.
0 0
Evet satış koşulu uyuyor. Alış için take profit gereksiz ben kar al kullanmak istemiyorum. :) Satış yaptıktan sonra ters yönlü takip eden stop la belki çözülebilir die düşünüyorum.
0 0
Aciga satis olmadigi icin ters yonlu stop takip edemeyecektir cunku stop edebilecegi pozisyon bulunmayacak.
0 0

Asagidaki kodu dener misiniz?

Emirler sirali gonderildigi icin ve hizli cevap acisindan pozisyon takibi koymadim. Debug tab'inde surekli alis emri gonderildi diyebilir ama loglar tab'inde emrin iletilmedigini gorebilirsiniz.

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;

namespace Matriks.Lean.Algotrader
{
	public class SonBar : 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;
		[Parameter(5)]
		public decimal Quantity;
		[Parameter(0.5)]
		public decimal AlisSartiYuzde;
		
		//Kar Al/Zarar Durdur Parametreleri
		[Parameter(false)]
		public bool Kar_AL;
		[Parameter(0.5)]
		public decimal Kar_AL_YuzdeMiktari;
		[Parameter(true)]
		public bool Zarar_Durdur;
		[Parameter(0.5)]
		public decimal Zarar_Durdur_YuzdeMiktari;
		ISyntheticOrderPrices TP, SL;
		//Emir takibi degiskenleri
		decimal LastBuyOrderPrice = 0;
		decimal LastSellOrderPrice = 0;
		int realposition = 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()
		{
			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);
			WorkWithPermanentSignal(true);
		}

		/// <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)
		{
			// bardata verileri çağırılıyor.
			var barData = GetBarData();

			// Aktif barın open ve close değerleri alınıyor.
			var Open = barDataCurrentValues.LastUpdate.Open;
			var Close = barDataCurrentValues.LastUpdate.Close;

			// ref fonksiyonu ile 2 önceki close değeri alınıyor.
			var ClosePrev2 = Ref(barData, OHLCType.Close, 2);

			// Alış şartı - son barda kapanış açılıştan büyük ve kapanış 2 bar önceki kapanıştan küçük ise
			if ((Close>Open && Close<ClosePrev2 || Close>LastSellOrderPrice*(1+AlisSartiYuzde/100))) // && realposition==0)
			{
				SendMarketOrder(Symbol, Quantity, OrderSide.Buy);
				Debug("Alış emri gönderildi.");
				//if (Kar_AL) TP = TakeProfit(Symbol, SyntheticOrderPriceType.Percent, Kar_AL_YuzdeMiktari);
				if (Zarar_Durdur) SL = StopLoss(Symbol, SyntheticOrderPriceType.Percent, Zarar_Durdur_YuzdeMiktari);
				Debug("KAR AL: " + TP + ", ZARAR DURDUR: "  + SL);
			}

			// Satış şartı - son barda açılış kapanıştan büyük ve kapanış 2 bar önceki kapanıştan büyük ise
			if (Close<Open && Close>ClosePrev2)
			{
				SendMarketOrder(Symbol, Quantity, 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 && order.Side.Obj == Side.Buy)
			{
				LastBuyOrderPrice = order.LastPx;
				Debug("Alis emri gerceklesti @ " + LastBuyOrderPrice);
				realposition++;
				Debug("OnorderUpdate: IN LONG POSITION. Position = " + realposition);
			}
			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
			{
				LastSellOrderPrice = order.LastPx;
				Debug("Satis emri gerceklesti @ " + LastSellOrderPrice);
				realposition--;
				Debug("OnorderUpdate: SOLD POSITION. Position = " + realposition);
			}
		}
	}
}

 

0 0
Grafik üzerindeki al sat lar sıralı değil. Debug tab ile log tab birbirini tutmuyor. log tab ı asıl olarak alırsam iki kere üst üste satış geçiyor. Debug tab da Kar al emir gönerildi ard arda uyarılar var. Burada bir karmaşıklık oldu sanırsam tam kavrayamadım stratejinin nasıl davrandığını. Biraz daha inceleyeceğim.
0 0
Sayın Matt Ricks Kodlar üzerinde bayağı uğraştım forumda örneklere baktım yeniden derledim ama nafile. satışta StopLoss tamam ama Alış emri kısmında sorun var orayı rayına oturtamadım. Bazı düzenlemeler yaptım ama onlarda da emirler sıralı gidiyor gibi görünüyor ancak grafikte hatalı görünüyor. Ana mantık olarak stratejinin ilk hali backtest te overall doğrusal olarak yükselirken ve kar oranı %30 larda iken sonraki eklediğimiz kodlardan sonra kar oranının yükselmesini bekliyordum ancak tam tersi oluyor. Bir yerlerde yanlış birşey yaptığım aşikar.  Saygılarımla
0 0
Tamamdir, Stoploss'u da cikartip pozisyon takibi ekleriz buyuk ihtimalle sorununuz cozulur. Gun icerisinde post ederim.
0 0
Tekrar merhaba bir gelişme varmı acaba?
0 0
Merhaba, baska bir is ile ugrasiyorum, tamamlandigi anda sizin kodu da duzeltecegim. Aksam ustu de olsa gonderirim.
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,856 kullanıcı