0 beğenilme 0 beğenilmeme
507 kez görüntülendi
Merhaba alphaTrendin buy sell sinyallerini fiyatın alphatrendi yukarı ve aşağı kırınca işlem açabilmesi ve kapatabilmesi yönünde güncelleyebilir misiniz lütfen ?

not :vadelide kullanıyorum

 

using System;

using System.Collections.Generic;

using System.Linq;

using Matriks.Data.Symbol;

using Matriks.Engines;

using Matriks.Indicators;

using Matriks.Symbols;

using Matriks.Trader.Core;

using Matriks.Trader.Core.Fields;

using Matriks.Lean.Algotrader.AlgoBase;

using Matriks.Lean.Algotrader.Models;

using Matriks.Lean.Algotrader.Trading;

 

namespace Matriks.Lean.Algotrader

{

public class AlphaTrendVadeliStratejisi : MatriksAlgo

{

[SymbolParameter("GARAN")]

public string Symbol;

 

[Parameter(SymbolPeriod.Min5)]

public SymbolPeriod SymbolPeriod;

 

[Parameter(5)]

public decimal BuyOrderQuantity;

 

[Parameter(5)]

public decimal SellOrderQuantity;

 

[Parameter(14)]

public int AlphatrendPeriod1;

 

[Parameter(1)]

public decimal AlphatrendCoeff1;

 

[Parameter(3)]

public int Kaldirac;

 

AlphaTrend alphaTrend;

 

public override void OnDataUpdate(BarDataEventArgs barData)

{

 

// alış koşulu

if (CrossBelow(alphaTrend, alphaTrend, 0, 1))

{

// Gerekli açığa satış

FX_Alis(Symbol, BuyOrderQuantity);

// #Gerekli açığa satış

}

 

// satış koşulu

if (CrossAbove(alphaTrend, alphaTrend, 0, 1))

{

// Gerekli açığa satış

FX_Satis(Symbol, SellOrderQuantity);

// #Gerekli açığa satış

}

 

}

 

public override void OnInit()

{

AddSymbol(Symbol, SymbolPeriod);

 

alphaTrend = AlphaTrendIndicator(Symbol, SymbolPeriod, OHLCType.Close, AlphatrendPeriod1, AlphatrendCoeff1);

 

// Gerekli açığa satış

WorkWithPermanentSignal(true);

 

if (HangiIslemleBaslasin == yon.Alis)

{

SendOrderSequential(true, Side.Buy);

}else if (HangiIslemleBaslasin == yon.Satis)

{

SendOrderSequential(true, Side.Sell);

}else

{

SendOrderSequential(true, Side.All);

}

 

SendOrderSequentialForShort(true, Side.All);

// #Gerekli açığa satış

 

// Gerekli - Kaldıraç

SetLeverage(Symbol, Kaldirac); // kaldıraç oranı

SetLeverageType(Symbol, true); // kaldıraç tipi - true isolated, false cross

// #Gerekli - Kaldıraç

 

// Gerekli - Timestamp

SetTimerInterval(1);

// #Gerekli - Timestamp

}

 

// Gerekli açığa satış

[Parameter(true)]

public bool AcigaSatisYapilsin;

 

[Parameter(false)]

public bool AksamSeansiniDahilEt;

 

[Parameter(yon.Farketmez)]

public yon HangiIslemleBaslasin;

 

public enum yon

{

Alis, Satis, Farketmez

}

 

public void FX_Alis(string Symbol, decimal quantity)

{

decimal _quantity = 0;

 

if (LastOrderSide.Obj != Side.Buy)

{

if (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin)

{

SendMarketOrder(Symbol, quantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);

_quantity = quantity;

}else

{

if (LastOrderSideForShort.Obj == Side.All)

{

SendMarketOrder(Symbol, quantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);

_quantity = quantity;

}else

{

SendMarketOrder(Symbol, quantity * 2, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);

_quantity = quantity * 2;

}

}

 

Debug("Alış emri gönderildi.[ " + _quantity + " adet ]");

LastOrderSide.Obj = Side.Buy;

LastOrderSideForShort.Obj = Side.Buy;

}

}

 

public void FX_Satis(string Symbol, decimal quantity)

{

decimal _quantity = 0;

 

if (LastOrderSide.Obj != Side.Sell)

{

if (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin)

{

SendMarketOrder(Symbol, quantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);

_quantity = quantity;

}else

{

if (LastOrderSideForShort.Obj == Side.All)

{

SendMarketOrder(Symbol, quantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);

_quantity = quantity;

 

}else

{

SendMarketOrder(Symbol, quantity * 2, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);

_quantity = quantity * 2;

}

}

 

Debug("Satış emri gönderildi.[ " + _quantity + " adet ]");

LastOrderSide.Obj = Side.Sell;

LastOrderSideForShort.Obj = Side.Sell;

}

}

 

// Gerekli - Timestamp

public class OrderListTimestamp

{

public string ID;

public string Symbol;

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()

{

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.Symbol, 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.Symbol, 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)

{

// Gerekli - Timestamp

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.Symbol = 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.CliOrdID);

Debug("Aynı emir üst üste " + AyniEmirKacSeferGonderilsin + " defa gönderildi.");

}

}

}

}

}

// #Gerekli - Timestamp

public override void OnSyntheticOrderTriggered(SyntheticAlgoOrder sOrder)

{

if (sOrder.EnableOrderSending)

{

LastOrderSide.Obj = LastOrderSideForShort.Obj;

Debug("Sentetik emir tetiklendi");

}

}

// #Gerekli açığa satış

}

}
Algoritmik Trading kategorisinde (70 puan) tarafından | 507 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Merhabalar,

Lütfen OnDataUpdate methodunuz içerisindeki satırları aşağıdaki kod yapısı ile değiştiriniz.

public override void OnDataUpdate(BarDataEventArgs barData)
		{
			var barData1 = GetBarData(Symbol, SymbolPeriod);
			
			
			// alış koşulu
			
			if(CrossAbove(barData1,alphaTrend,OHLCType.Close,1))
			
			{
				// Gerekli açığa satış
				FX_Alis(Symbol, BuyOrderQuantity);
				// #Gerekli açığa satış
			}

			// satış koşulu
			if (CrossBelow(barData1, alphaTrend, OHLCType.Close, 1))
			
			{
				// Gerekli açığa satış
				FX_Satis(Symbol, SellOrderQuantity);
				// #Gerekli açığa satış
			}

		}

İyi çalışmalar.

(11,069 puan) tarafından
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,637 soru
7,640 cevap
4,448 yorum
10,931 kullanıcı