0 beğenilme 0 beğenilmeme
417 kez görüntülendi
merhaba aşağıda ki kodu inceleyebilir misiniz düşük bakiye ile başlatırsam opt yapmıyor

 

using System;

using System.Collections.Generic;

using System.Linq;

using Matriks.Data.Symbol;

using Matriks.Engines;

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;

 

//===========================================ACIKLAMA============================================//

// Başlangıçta belirlenen bakiyeye ve elinizdeki estrüman adetine göre strateji çalışmaya başlar.//

// Alış sinyali oluştuysa bakiye varsa bakiye kadar alış yapar.                                  //

// Satış sinyali oluştuysa pozisyonunuz varsa hepsini satar.                                     //

// Backtest yapıp test hesablarından denedikten sonra küçük miktarlarla gerçek hesapta deneyiniz //

 

namespace Matriks.Lean.Algotrader

{

public class MostBakiye : 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(3)]

public int Period;

 

[Parameter(2)]

public decimal Percentage;

 

MOST most;

 

// Gerekli başla

 

// Başlangıç bakiyesi

[Output][Parameter(1000)]

public decimal Bakiye;

 

// Başlangıçta elinde olan adet

[Parameter(0)]

public decimal BaslangıctakiEnstrumanAdedi;

 

[Parameter(true)]

public bool KomisyonuDahilEt;

 

[Parameter(0.001)]

public decimal KomisyonOranı;

 

// Kripto için geçerli

public decimal MinSize;

 

// Tutar

public decimal Tutar;

 

// Al sat adedi

[Output]

public decimal Adet;

 

// Bakiye kontrolü-sil

public bool BakiyeKontrolu = true;

 

// #Gerekli bitti

 

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

 

most = MOSTIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period, Percentage, MovMethod.Exponential);

 

WorkWithPermanentSignal(true);

 

SendOrderSequential(true, Side.All);

}

 

public override void OnDataUpdate(BarDataEventArgs barData)

{

if (CrossAbove(most, most, 1, 0))

{

FX_Alis();

}

 

if (CrossBelow(most, most, 1, 0))

{

FX_Satis();

}

}

 

// Gerekli başla

public override void OnInitComplated()

{

var SymbolDetail = GetSymbolDetail(Symbol);

MinSize = 1 / (decimal) Math.Pow(10, SymbolDetail.TradeFraction);

 

 

FX_PiyasaTipi();

}

 

// Sonfiyat çekilir.

public decimal FX_Sonfiyat()

{

var barDataModel = GetBarData();

decimal _close = Ref(barDataModel, OHLCType.Close, 0);

return _close;

}

 

// hisse

public bool FX_BalanceKontrolu()

{

if (piyasaTipleri == PiyasaTipleri.BISTPP || piyasaTipleri == PiyasaTipleri.BISTVIOP)

{

return (Math.Floor(Bakiye / FX_Sonfiyat()) >0) ? true: false;

}else

{

return true;

}

}

 

// kriptolar için minimum değişim miktarı

public decimal FX_MinSize(decimal quantity)

{

return Math.Truncate((quantity - (quantity % MinSize)) / MinSize) * MinSize;

}

 

[Output]

public string Sembol1 = "";

 

[Output]

public string Sembol2 = "";

 

enum PiyasaTipleri

{

BISTPP,

BISTVIOP,

KRIPTOBINANCE,

KRIPTOBINANCEFUTURE,

KRIPTOBITMEX,

KRIPTOBTCTURK

}

 

PiyasaTipleri piyasaTipleri = PiyasaTipleri.BISTPP;

 

public void FX_PiyasaTipi()

{

Sembol1 = Symbol;

 

var SymbolDetail = GetSymbolDetail(Symbol);

 

if (SymbolDetail.ExchangeDetail.ExchangeCode == PiyasaTipleri.BISTPP.ToString())

{

piyasaTipleri = PiyasaTipleri.BISTPP;

}else if (SymbolDetail.ExchangeDetail.ExchangeCode == PiyasaTipleri.BISTVIOP.ToString())

{

piyasaTipleri = PiyasaTipleri.BISTVIOP;

}else if (SymbolDetail.ExchangeDetail.ExchangeCode == "")

{

var _split = Symbol.Split('_');

if (_split.Count() == 3)

{

if (Symbol.Split('_')[2].Contains("BIN"))

{

piyasaTipleri = PiyasaTipleri.KRIPTOBINANCE;

} else if (Symbol.Split('_')[2].Contains("FBIN"))

{

piyasaTipleri = PiyasaTipleri.KRIPTOBINANCEFUTURE;

}else if (Symbol.Split('_')[2].Contains("BMEX"))

{

piyasaTipleri = PiyasaTipleri.KRIPTOBITMEX;

}

}else

{

piyasaTipleri = PiyasaTipleri.KRIPTOBTCTURK;

}

Sembol1 = Symbol.Split('_')[0];

Sembol2 = Symbol.Split('_')[1];

}

}

 

bool ? AlisMI = null;

 

public void FX_Alis()

{

decimal _close = FX_Sonfiyat();

 

if (FX_BalanceKontrolu() && AlisMI != true)

{

// Alabileceği adet

if (piyasaTipleri == PiyasaTipleri.BISTPP || piyasaTipleri == PiyasaTipleri.BISTVIOP)

{

Adet = Math.Floor(Bakiye / _close);

}else

{

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("Alış sinyali oluştu. Bakiyeniz yetersiz. Bakiye: " + Bakiye);

}

}

 

public void FX_Satis()

{

if (((Adet != 0 || BaslangıctakiEnstrumanAdedi != 0)) && AlisMI != false)

{

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

}

 

}

 

decimal _fiyat;

 

public override void OnOrderUpdate(IOrder order)

{

_fiyat = order.Price;

 

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

{

// Tutar

Tutar = Adet * _fiyat; ;

 

// Güncel Bakiye

Bakiye -= Tutar;

 

BaslangıctakiEnstrumanAdedi = 0;

Debug("Alış gerçekleşti. Gerçekleşen fiyat: " + _fiyat + " - Adet: " + Adet + "- Tutar: " + Tutar + " - Bakiye: " + Bakiye);

Adet += BaslangıctakiEnstrumanAdedi;

 

if (KomisyonuDahilEt)

{

if (piyasaTipleri == PiyasaTipleri.BISTPP || piyasaTipleri == PiyasaTipleri.BISTVIOP)

{

Bakiye -= (Bakiye * KomisyonOranı);

}else

{

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

}

}

 

AlisMI = true;

}

 

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

{

// Tutar

Tutar = Adet * _fiyat;

 

// Güncel Bakiye

Bakiye += Tutar;

 

Debug("Satış gerçekleşti. Gerçekleşen fiyat: " + _fiyat + " - Adet: " + Adet + " - Tutar: " + Tutar + " - Kalan bakiye: " + Bakiye);

Adet = 0;

BaslangıctakiEnstrumanAdedi = 0;

if (KomisyonuDahilEt)

{

Bakiye -= (Bakiye * KomisyonOranı);

}

 

AlisMI = false;

}

}

 

// # Gerekli bitti

 

}

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

1 cevap

0 beğenilme 0 beğenilmeme
Merhabalar,

Başlangıç bakiyenizi o sembolün fiyatından yüksek girmelisiniz.

Sembol fiyatından düşük girerseniz işlem yapmayacaktır.

İyi çalışmalar.
(11,059 puan) tarafından
0 0
Anladım fakat aşağıda ki algoda aynı bakiye ile işlem açıyor ve ne kadar tutar girdiysem geçmişe dönük o sembolden alabildiği kadar alıyor arasında ki fark nedir anlayamadım tam olarak ?

 

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 kopyadeneme : 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.Day)]
public SymbolPeriod SymbolPeriod;

[Parameter(30)]
public int ATRPeriod;
[Parameter(3)]
public int MostPeriod;
[Parameter(2)]
public decimal MostPercent;

MOST most;
ATR atr;
decimal HighAtCross, LowAtCross;
bool CrossAboveFlag, CrossBelowFlag;

// Gerekli başla

// Başlangıç bakiyesi
[Output][Parameter(1000)]
public decimal Bakiye;

// Başlangıçta elinde olan adet
[Parameter(0)]
public decimal BaslangıctakiEnstrumanAdedi;

[Parameter(true)]
public bool KomisyonuDahilEt;

[Parameter(0.001)]
public decimal Komisyon;

// strateji hisse senedi ile mi coin ile mi kullanılacak
[Parameter(true)]
public bool HisseSenediMI;

// Kripto için geçerli
public decimal MinSize;

// Tutar
public decimal Tutar;

// Al sat adedi
[Output]
public decimal Adet;

// Bakiye kontrolü-sil
public bool BakiyeKontrolu = true;

// #Gerekli bitti

/// <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()
{
atr = ATRIndicator(Symbol, SymbolPeriod, OHLCType.Close, ATRPeriod);
most = MOSTIndicator(Symbol, SymbolPeriod, OHLCType.Close, MostPeriod, MostPercent, MovMethod.Exponential);

AddSymbol(Symbol, SymbolPeriod);

WorkWithPermanentSignal(true);
//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>
/// 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 close = barDataCurrentValues.LastUpdate.Close;
var high = barDataCurrentValues.LastUpdate.High;
var low = barDataCurrentValues.LastUpdate.Low;

var close_print = Math.Round(close, 2);
var HighAtCross_print = Math.Round(HighAtCross, 2);
var LowAtCross_print = Math.Round(LowAtCross, 2);
var most_print = Math.Round(most.CurrentValue, 2);
var ATR_print = Math.Round(atr.CurrentValue, 2);
var ATR1_print = Math.Round(HighAtCross + atr.CurrentValue / 2, 2);
var ATR2_print = Math.Round(LowAtCross - atr.CurrentValue / 2, 2);

string header, line1;
Debug("*******************");
header = String.Format("{0,-10} {1,-10} {2,-10} {3,-10} {4,-10} {5,-10} {6,-10}", "Close", "H.@Cross", "L.@Cross", "MOST", "ATR", "High+atr", "Low-atr");
line1 = String.Format("{0,-10} {1,-10} {2,-10} {3,-10} {4,-10} {5,-10} {6,-10}", close_print, HighAtCross_print, LowAtCross_print, most_print, ATR_print, ATR1_print, ATR2_print);
Debug(header);
Debug(line1);

if (CrossAbove(barDataModel, most, OHLCType.Close))
{
HighAtCross = high;
CrossAboveFlag = true;
Debug("Price crossed ABOVE MOST");
}

if (close>most.CurrentValue && close>(HighAtCross + atr.CurrentValue / 2) && CrossAboveFlag)   //c>K2+ATR(30)/2
{
Debug("Alış emri verildi.");
FX_Alis();
CrossAboveFlag = false;
}

if (CrossBelow(barDataModel, most, OHLCType.Close))
{
LowAtCross = low;
CrossBelowFlag = true;
Debug("Price crossed BELOW MOST");
}

if (close<most.CurrentValue && close<(LowAtCross - atr.CurrentValue / 2))   //c<K2-ATR(30)/2
{
Debug("Satış emri verildi.");
FX_Satis();
CrossBelowFlag = false;

}
}
// Gerekli başla
public override void OnInitComplated()
{
var SymbolDetail = GetSymbolDetail(Symbol);
if (SymbolDetail != null)
MinSize = 1 / (decimal) Math.Pow(10, SymbolDetail.TradeFraction);
else MinSize = 1;
}

// Sonfiyat çekilir.
public decimal FX_Sonfiyat()
{
var barDataModel = GetBarData();
decimal _close = Ref(barDataModel, OHLCType.Close, 0);
return _close;
}

// hisse
public bool FX_BalanceKontrolu()
{
if (HisseSenediMI)
{
return (Math.Floor(Bakiye / FX_Sonfiyat()) >0) ? true: false;
}else
{
return true;
}
}

// kriptolar için minimum değişim miktarı
public decimal FX_MinSize(decimal quantity)
{
return Math.Truncate((quantity - (quantity % MinSize)) / MinSize) * MinSize;
}

bool ? AlisMI = null;

public void FX_Alis()
{
decimal _close = FX_Sonfiyat();

if (FX_BalanceKontrolu() && AlisMI != true)
{
// Alabileceği adet
if (HisseSenediMI)
{
Adet = Math.Floor(Bakiye / _close);
}else
{
Adet = FX_MinSize(Bakiye / _close);
}

SendMarketOrder(Symbol, Adet, (OrderSide.Buy));
Debug("Alış sinyali oluştu. Sinyal fiyatı: " + _close + " - Adet: " + Adet);
}else
{
Debug("Alış sinyali oluştu. Bakiyeniz yetersiz. Bakiye: " + Bakiye);
}
}

public void FX_Satis()
{
if (((Adet != 0 || BaslangıctakiEnstrumanAdedi != 0)) && AlisMI != false)
{
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);
}

}

decimal _fiyat;
/// <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)
{
_fiyat = order.Price;

if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy)
{
// Tutar
Tutar = Adet * _fiyat; ;

// Güncel Bakiye
Bakiye -= Tutar;

Adet += BaslangıctakiEnstrumanAdedi;
BaslangıctakiEnstrumanAdedi = 0;
Debug("Alış gerçekleşti. Gerçekleşen fiyat: " + _fiyat + " - Adet: " + Adet + "- Tutar: " + Tutar + " - Bakiye: " + Bakiye);

if (KomisyonuDahilEt)
{
if (HisseSenediMI)
{
Bakiye -= (Bakiye * Komisyon);
}else
{
Adet = FX_MinSize(Adet - Adet * Komisyon);
}
}

AlisMI = true;
}

if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
{
// Tutar
Tutar = Adet * _fiyat;

// Güncel Bakiye
Bakiye += Tutar;

Debug("Satış gerçekleşti. Gerçekleşen fiyat: " + _fiyat + " - Adet: " + Adet + " - Tutar: " + Tutar + " - Kalan bakiye: " + Bakiye);
Adet = 0;
BaslangıctakiEnstrumanAdedi = 0;
if (KomisyonuDahilEt)
{
Bakiye -= (Bakiye * Komisyon);
}

AlisMI = false;
}
}

// # Gerekli bitti

}
}
0 0

Merhabalar,

BTC_USDT_BIN paritesi için bir örnek yaptım. 

BTC_USDT_BIN şu an 20328 bandında bulunmakta. Test edeceğim başlangıç miktarı bundan büyük olmak zorunda.  Yukarıdaki kodun testini yaptığımda şu anki fiyatından düşük olarak girdiğim tutarı kabul etmedi. 

Eğer buna dair örneğiniz varsa paylaşın inceleyelim.

Ben kendi örneklerimi aşağıya görüntü olarak ekledim.

İyi çalışmalar.

0 0
Ben 100 dolarlık robot çalıştıracağım zaman önce kendi sembol fiyatında test edip sonra başlatacağım o zaman ?

tamam diğer örneği paylaşacağım onu da siz yaptınız zaten :)

onda gerçekte robotu ne kadar tutarda çalıştıracaksam misal 100 dolar geçmişe dönük 100 dolara ne kadar btc alabiliyorsa o kadar alıp testi devam ettiriyor.fakat onda testi spotta yapıp future da robot çalıştırmama izin vermiyor.

ama sizin yukarda test ettiğiniz bakiye örneğinde bakiye ile strateji olmasına rağmen future da ıq robotu çalıştırmama izin veriyor.
0 0
Merhabalar,

Doğrudur, Future sembollerde bakiyeli işlem yapamazsınız.

İyi çalışmalar.
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,711 soru
8,659 cevap
4,853 yorum
20,340 kullanıcı