0 beğenilme 0 beğenilmeme
284 kez görüntülendi
Yapmak istediğim şu:

Serbest çalışan bir strateji var. Açığa satış da yapıyor.

Emirler sıralı gönderilmiyor. Strateji al veya sat ile başlayabilir ve üst üste al veya sat yapabilir.

OnOrderUpdate içinde OrdStatus.Filled olduktan sonra TakeProfit koymak istiyorum. Mesela fiyat 70 dolara ulaşınca kar alsın. Bu fiyatı da her OnDataUpdate geldiğinde değiştirebilmeliyim. Mesela bir sonraki update gelince eğer OHLCType.DiffPercent negatifse TakeProfiti 60 dolara çekebilmeliyim.

SyntheticOrderPriceType.Percent kullanılmamalı. Sadece PricePoint kullanılmalı.

Yukarıdaki şartları sağlayacak örnek yapı nasıl olmalı? (Denemelerimde Long pozisyon take profit fiyatı: xxxxxxxxxx, Short pozisyon take profit fiyatı:  xxxxxxxxx  değerlerini bir türlü istediğim fiyata denk getiremedim. %3 takeprofit al deyip de 2 saniye sonra sadece %0.2 uzaktaki fiyattan stop yemek gibi bir sorunum var.)
Algoritmik Trading kategorisinde (543 puan) tarafından | 284 kez görüntülendi

1 cevap

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

Merhaba,

Elinizdeki pozisyon yönüne göre stop seviyesinden anlık fiyatı yada anlık fiyattan stop seviyesini çıkartıp puan cinsinden kar al tanımlayabilirsiniz. Aşağıdaki yapıyı inceleyebilirisiniz.

bool negatifKontrol = true;

public override void OnDataUpdate(BarDataEventArgs barData)
{
	if (barData.BarData.DiffPercent<0 && negatifKontrol)
	{
		var anlikFiyat = GetSelectedValueFromBarData(GetBarData(), OHLCType.Close);				
				
		var poz = GetPortfolio();
		var adet = poz.ContainsKey(order.Symbol) ? poz[order.Symbol] :0;
		if (adet>0)
		{					
			TakeProfit(order.Symbol, SyntheticOrderPriceType.PricePoint, KarAlSeviyesi_pozitif - anlikFiyat);
		}else if (adet<0)
		{
			TakeProfit(order.Symbol, SyntheticOrderPriceType.PricePoint, anlikFiyat-KarAlSeviyesi_negatif);
		}
				
		negatifKontrol = false;
	}
}

decimal KarAlSeviyesi_pozitif = 70, KarAlSeviyesi_negatif = 60;

public override void OnOrderUpdate(IOrder order)
{
	if (order.OrdStatus.Obj == OrdStatus.Filled)
	{
		var anlikFiyat = GetSelectedValueFromBarData(GetBarData(), OHLCType.Close);				
			
		var poz = GetPortfolio();
		var adet = poz.ContainsKey(order.Symbol) ? poz[order.Symbol] :0;
		if (adet>0)
		{					
			TakeProfit(order.Symbol, SyntheticOrderPriceType.PricePoint, KarAlSeviyesi_pozitif - anlikFiyat);
		}else if (adet<0)
		{
			TakeProfit(order.Symbol, SyntheticOrderPriceType.PricePoint, anlikFiyat-KarAlSeviyesi_negatif);
		}
				
		negatifKontrol = true;
	}
}

 

(15,892 puan) tarafından
tarafından seçilmiş
0 0

Benim gibi HEIKIN ASHI kullananlar için sentetik emirlerin doğru çalışmasını sağlayan çok önemli bir detayı öğrendim.  Matriks'den gelen cevabı paylaşıyorum. Eğer AddSymbol ilk olarak normal barlar ile çağrılmazsa sentetik emirler doğru uzaklığa ayarlanmıyor (HeikinAshi bar değerlerine göre ayarlanıyor) ve bazı durumlarda anında stop gelebiliyor. AddSymbol hem normal bar hem de HeaikinAshi ile çağrılınca da OnDataUpdate iki defa geliyor. Kodun buna göre yazılması gerekiyor.

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

Sentetik emirler tanımlandığı andaki değerleri referans almaktadır

Stratejide Heikenashi kullanılırsa sentetik emirler Heikenashi hesaplamasına göre tanımlanmaktadır.

Sentetik emrin normal barlara göre tanımlanması için OnInit() metodunda ilk olarak normal bar verisine kayıt olunması gerekir.

Aşağıdaki örnekte OnDataUpdate() üst üste 2 sefer tetikleneceği için istenmeyen sinyallerin önüne geçmek için çoklu periyot kontrolü eklemeniz gerekir.

PeriodInfo HeikenAshi;

                       
public override void OnInit()

{
            AddSymbol(Symbol,SymbolPeriod);                                 

            HeikenAshi=GetHeikinAshiPeriodInfo(SymbolPeriod);

            AddSymbol(Symbol,HeikenAshi);
}


public override void OnDataUpdate(BarDataEventArgs barData)

{
            if(barData.PeriodInfo==HeikenAshi){

                        // yapılacaklar
            }
}

 

8,635 soru
8,589 cevap
4,821 yorum
19,782 kullanıcı