1 beğenilme 0 beğenilmeme
596 kez görüntülendi
BTC_USDT_BIN paritesinde bakiyeye göre emir gönderiyorum. Ondalık emirleri trailing stop loss sıfır olarak alıyor. Ondalık emirler için trailing stop loss'u nasıl yazacağız?

Kodum--------------------------------

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 BakiyeKomistonCrossMov : 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.Day)]

public SymbolPeriod SymbolPeriod;

 

 

[Parameter(10)]

public int MovPeriod;

 

[Parameter(20)]

public int MovFark;

 

[Parameter(3.5)]

public decimal trlngstplss;

 

[Parameter(false)]

public bool izsurenstop;

 

// Başlangıç adet

[Parameter(0)]

public decimal StartQuantity;

 

// Tutar

public decimal Amount;

 

// Al sat adedi

public decimal Quantity;

 

public int OrderQuantity;

 

public decimal Bakiye = 100;

 

public int firstrun = 0;

// Bakiye kontrolü

public bool BalanceControl = true;

 

// strateji hisse senedi ile mi coin ile mi kullanılacak

[Parameter(false)]

public bool HisseSenedi;

 

ISyntheticOrderPrices TSL;

 

int SystemPosition = 0;

decimal 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>

///

MOV mov;

MOV mov2;

public override void OnInit()

{

AddSymbol(Symbol, SymbolPeriod);

mov = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod, MovMethod.Exponential);

mov2 = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod + MovFark, MovMethod.Exponential);

 

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

}

 

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

{

var barDataModel = GetBarData();

 

var Index = barDataCurrentValues.LastUpdate.BarDataIndex;

var Close = barDataCurrentValues.LastUpdate.Close;

// Güncel bakiye ile alış yapıp yapamayacağınız kontrolü ediliyor. true ise alış yapabilir

if (HisseSenedi)

{

BalanceControl = (Math.Floor(Bakiye / Close) >0) ? true: false;

}

 

if (CrossAbove(mov, mov2) && BalanceControl == true && Bakiye > 0.00000001m && SystemPosition == 0)

{

// Alabileceği adet

if (HisseSenedi)

{

Quantity = Math.Floor(Bakiye * 999 / 1000 / Close);

}else

{

Quantity = Bakiye * 999 / 1000 / Close;

}

 

// Tutar

Amount = Quantity * Close;

Debug("Komisyon Öncesi Amount: " + Amount);

Debug("Komisyon Öncesi Bakiye: " + Bakiye);

// Güncel bakiye

Bakiye -= Amount;

Debug("Komisyon ve Alış Sonrası Bakiye: " + Bakiye);

SendMarketOrder(Symbol, Quantity, (OrderSide.Buy));

if (izsurenstop) TSL = TrailingStopLoss(Symbol, SyntheticOrderPriceType.Percent, trlngstplss);

SystemPosition = 1;

Quantity += StartQuantity;

StartQuantity = 0;

Debug("Alış Sinayli Oluştu. Fiyat: " + Close + " - Adet: " + Quantity + " - Tutar: " + Amount + " -  Kalan Bakiye: " + Bakiye);

 

}else if (CrossAbove(mov, mov2) && (BalanceControl == false || Bakiye == 0))

{

Debug("Alış sinyali oluştu. Bakiyeniz yetersiz. Kalan Bakiye: " + Bakiye);

}

 

if (CrossBelow(mov, mov2) && (Quantity != 0 || StartQuantity != 0) && SystemPosition == 1)

{

Quantity += StartQuantity;

 

// Tutar

Amount = Quantity * Close;

 

// Güncel bakiye

Bakiye += Amount * 999 / 1000;

 

SendMarketOrder(Symbol, Quantity, OrderSide.Sell);

Debug("Satış sinyali oluştu. Fiyat: " + Close + " - Adet: " + Quantity + " - Tutar: " + Amount + " - Kalan Bakiye: " + Bakiye);

SystemPosition = 0;

Quantity = 0;

StartQuantity = 0;

}else if (CrossBelow(mov, mov2) && Quantity == 0)

{

Debug("Satış sinyali oluştu. Satılacak enstrüman yok. Kalan Bakiye: " + Bakiye);

}

}

 

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

{

//Gercek zamanli pozisyon takibi

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

{

var positionChange = order.OrderQty;

realposition += (decimal) positionChange;

Debug("[ONORDERUPDATE]: Pozisyon = " + realposition);

if (realposition == 0)

{

SystemPosition = 0;

Debug("Kar AL / Zarar Durdur tetiklendi");

}

}

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

{

var positionChange = order.OrderQty;

realposition -= (decimal) positionChange;

Debug("[ONORDERUPDATE]: Pozisyon = " + realposition);

if (realposition == 0 && SystemPosition == 1)

{

SystemPosition = 0;

Debug("Kar AL / Zarar Durdur tetiklendi");

Quantity += StartQuantity;

 

// Tutar

Amount = Quantity * order.Price;

Debug("Komisyon Öncesi Amount: " + Amount);

Debug("Komisyon Öncesi Bakiye: " + Bakiye);

 

// Güncel bakiye

Bakiye += Amount * 999 / 1000;

Debug("Komisyon Sonrası Bakiye: " + Bakiye);

Quantity = 0;

StartQuantity = 0;

}

}

}

}

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

Bu soruya cevap vermek için lütfen giriş yapınız veya kayıt olunuz.

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ı