stratejide emir miktarı yerine hep aynı miktarda bakiyeyle al sat yaptırmak istiyorum
- Soruldu
- Kategori
- Algoritmik Trading
- Görüntülenme
- 1.436 görüntülenme
- Durum
- Cevaplandı
Matriks Ürünleri ile ilgili tüm sorularınız için bizlere buradan ulaşabilirsiniz. Daha önce sorulan soruları ve verilen cevapları ilgili sekmelerden ve arama üzerinden inceleyebilirsiniz. Sağ taraftaki kategoriler üzerinden İlgilendiğiniz özelliklerle ilgili soruları filtreleyebilirsiniz. Soru ve cevapları sosyal medyada paylaşabilirsiniz. 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.
Merhabalar,
Önceden sayfamızda paylaşmış olduğumuz Tüm Bakiye ile ilgili yazılmış olan örnek stratejimizden,
Bakiye + = Tutar; ve Bakiye -= Tutar; satırlarını silerseniz yeni derlediğiniz strateji sadece belirlediğiniz tutar kadar alım işlemi gerçekleştirecektir.
Aşağıda örnek bir strateji mevcuttur.
Dilerseniz inceleyiniz.
İyi çalışmalar.
***STRATEJİLERİ TEST/DENEME ORTAMINDA SINAMADAN VE SİZİN İSTEDİĞİNİZ ŞEKİLDE ÇALIŞTIĞINA EMİN OLMADAN GERÇEK ORTAMDA HİÇBİR ZAMAN ÇALIŞTIRMAYINIZ ***
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 deneme1 : 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şlangıç bakiyesi
[Output][Parameter(15)]
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
[Parameter(1)]
public decimal MinSize;
// Tutar
public decimal Tutar;
// Al sat adedi
[Output]
public decimal Adet;
// Bakiye kontrolü-sil
public bool BakiyeKontrolu = true;
// #Gerekli
/// <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);
// Algoritmanın kalıcı veya geçici sinyal ile çalışıp çalışmayacağını belirleyen fonksiyondur.
// true geçerseniz algoritma sadece yeni bar açılışlarında çalışır, bu fonksiyonu çağırmazsanız veya false geçerseniz her işlem olduğunda algoritma tetiklenir.
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, Side.All);
}
/// <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(most, most, 1, 0))
{
FX_Alis();
}
if (CrossBelow(most, most, 1, 0))
{
FX_Satis();
}
}
// Gerekli
// 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;
}
public void FX_Alis()
{
decimal _close = FX_Sonfiyat();
if (FX_BalanceKontrolu())
{
// 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))
{
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);
}
}
/// <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)
{
decimal _fiyat;
if (LiveMode)
{
_fiyat = order.LastPx;
}
else
{
_fiyat = FX_Sonfiyat();
}
if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy)
{
// Tutar
Tutar = Adet * _fiyat; ;
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);
}
}
}
if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
{
// Tutar
Tutar = Adet * _fiyat;
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);
}
}
}
// # Gerekli
}
}
Sitenin çalışması için gerekli çerezleri kullanıyoruz. Ziyaretleri anlamak için analitik çerezleri yalnızca onayınızla kullanırız. Çerez Politikası