Merhabalar,
1- Evet, MatriksIQ ile ALGO Lisansınız olduğu sürece ING Yatırım üzerinden otomatik emir verebilirsiniz.
2- MatriksIQ'da sadece Most indikatörü ile değil IQ üzerinde yüklü/yüklediğiniz tüm indikatörlere long ve short işlemleri için emir verebilirsiniz. Açığa sat ve açığa sat gün içinde pozisyonu kapat gibi emirleri belirlediğiniz koşullarda kullanabilirsiniz. Bu tarz emir girişlerini Algoritma Sihirbazını kullanarak kendiniz manuel oluşturabilirsiniz.
Aşağıdaki linkten Algoritma Sihirbazı ile ilgili detaylara ulaşabilirsiniz.
https://destek.matriksdata.com/?qa=6289/algoritma-sihirbazi-farkli-parametreler-oldu%C4%9Funda
3- Aşağıdaki kod örneği Most indikatörüne göre bakiyeye göre al sat yapan belirtilen miktar ile başlayıp bu miktarın kar/zarar oranına göre ilerleyen bir yapısı mevcuttur. Dilerseniz inceleyiniz.
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 MostTumBakiyeStrategy : 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 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()
{
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 başla
public override void OnInitComplated()
{
var SymbolDetail = GetSymbolDetail(Symbol);
MinSize = 1 / (decimal) Math.Pow(10, SymbolDetail.TradeFraction);
}
// 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
}
}