0 beğenilme 0 beğenilmeme
317 kez görüntülendi
Merhaba

kodlama bilgim hiç yok göndermiş olduğunuz kodu basit bir stratejiye uygulamak istedim ama tonlarca hata alıyorum yardımcı olabilirmisiniz..Saygılar..

 

using System;

using System.Collections.Generic;

using System.Linq;

using Matriks;

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;

using Matriks.AI;

using Matriks.AI.AiParameters;

using Matriks.AI.Data;

using Matriks.Trader.Core.TraderModels;

 

namespace Matriks.Lean.Algotrader

{

public class tumbakiye : 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("JASMY_USDT_BIN")]

public string Symbol1;

 

 

[Parameter(SymbolPeriod.Min60)]

public SymbolPeriod SymbolPeriod1;

 

 

 

[Parameter(14)]

public int RsiPeriod1;

 

[Parameter(9)]

public int İftcci2MovPeriod1;

 

[Parameter(5)]

public int İftcci2CciPeriod1;

 

[Parameter(1)]

public decimal Percentage;

 

 

RSI rsi;

MatriksIndicator IFTCCI2;

 

 

 

public override void OnInit()

{

 

rsi = RSIIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, Period, Percentage, RsiPeriod1);

IFTCCI2 = new IFTCCI2();

 

IFTCCI2.SetIndicatorParameters("MovPeriod", İftcci2MovPeriod1);

IFTCCI2.SetIndicatorParameters("CciPeriod", İftcci2CciPeriod1); RegisterUserIndicator(IFTCCI2, Symbol1, SymbolPeriod1, OHLCType.Close, Period, Percentage, 5);

 

 

 

SendOrderSequential(true, Side.All);

WorkWithPermanentSignal(true);

// 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.");

}

}

//Alttaki fonksiyon açıldıktan sonra parametre olarak verilen saniyede bir OnTimer fonksiyonu tetiklenir.

// SetTimerInterval(3600);

 

//Alttaki fonksiyon ile tanımlanan sembol ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.

//AddNewsSymbol(Symbol);

 

//Alttaki fonksiyon ile tanımlanan anahtar kelime ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.

//AddNewsKeyword("KAP");

}

 

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

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

}

}

}

}

 

if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy)

{

var tutar = order.OrderQty * order.Price;

 

Bakiye -= tutar;

 

Adet += BaslangıctakiEnstrumanAdedi + order.OrderQty;

BaslangıctakiEnstrumanAdedi = 0;

 

if (KomisyonuDahilEt)

{

if ((int) ExchangeType.Ise == exchangeID)

{

Bakiye -= (Bakiye * KomisyonOranı);

}else if ((int) ExchangeType.Crypto == exchangeID)

{

Adet = FX_MinSize(Adet - Adet * KomisyonOranı);

}

}

Debug("Alış gerçekleşti. Gerçekleşen fiyat: " + order.Price + " - Adet: " + order.OrderQty + "- Tutar: " + tutar + " - Bakiye: " + Bakiye + " Toplam Adet: " + Adet);

 

}

 

if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)

{

var tutar = order.OrderQty * order.Price;

 

Bakiye += tutar;

 

Adet = 0;

BaslangıctakiEnstrumanAdedi = 0;

 

if (KomisyonuDahilEt)

{

Bakiye -= (Bakiye * KomisyonOranı);

}

 

 

/// <summary>

/// Init islemleri tamamlaninca, bardatalar kullanmaya hazir hale gelince bu fonksiyon tetiklenir. Data uzerinde bir defa yapilacak islemler icin kullanilir

/// </summary>

public override void OnInitCompleted()

{

 

}

 

/// <summary>

/// SetTimerInterval fonksiyonu ile belirtilen sürede bir bu fonksiyon tetiklenir.

/// </summary>

public override void OnTimer()

{

 

}

 

/// <summary>

/// AddNewsSymbol ve AddNewsKeyword ile haberlere kayit olunmuşsa bu fonksiyon tetiklenir.

/// </summary>

/// <param name="newsId">Gelen haberin id'si</param>

/// <param name="relatedSymbols">Gelen haberin ilişkili sembolleri</param>

public override void OnNewsReceived(int newsId, List<string> relatedSymbols)

{

 

}

 

/// <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(BarDataEventArgs barData)

{

if (CrossAbove(rsi, 30m, 0) || CrossAbove(IFTCCI2, -0.5m, 0))

{

SendMarketOrder(Symbol1, OrderQuantity1, OrderSide.Buy, includeAfterSession:false);

SendMarketOrder(Symbol1, OrderQuantity2, OrderSide.Buy, includeAfterSession:false);

}

if (CrossBelow(rsi, 70m, 0) || CrossBelow(IFTCCI2, 0.5m, 0))

{

SendMarketOrder(Symbol1, OrderQuantity3, OrderSide.Sell, includeAfterSession:false);

SendMarketOrder(Symbol1, OrderQuantity4, OrderSide.Sell, includeAfterSession:false);

}

 

}

 

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

{

}

 

/// <summary>

/// Strateji durdurulduğunda bu fonksiyon tetiklenir.

/// </summary>

public override void OnStopped()

{

}

}

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

1 cevap

0 beğenilme 0 beğenilmeme
Merhabalar,

Yazdığınız sistemde eksik pek çok yapı mevcut.

Yazmak istediğiniz sistemin koşullarını bizimle paylaşırsanız elimizden geldiğince yardımcı olmaya çalışalım.

İyi çalışmalar.
(11,059 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.



8,636 soru
8,590 cevap
4,821 yorum
19,785 kullanıcı