Merhaba, sorunuza istinaden size bir örnek paylaşıyorum.
Bu örneği önce Matriks Deneme Ortamında test ediniz.
Gerçek hesapta ufak miktarlarla test ediniz.
Doğru çalıştığına emin olmadan kullanmayınız.
İlk işlemi seçmek için "HangiIslemleBaslasin" Seçeneğinden seçimizi yapabilirsiniz.
Vadeli bir sembolde kullanmak için "AcigaSatisYapilsin" kutucuğu onaylı olmalıdır.
Spot piyasa için "AcigaSatisYapilsin" kutucuğu onaylı olmamalıdır.
Olası sorularınız için iqdestek@matriksdata.com adresine yazabilirsiniz.
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;
/*
Bu şablon AcigaSatisYapilsin seçeneği aktif olduğunda Viop ve Binance Future piyasaları için uygun olur.
AcigaSatisYapilsin seçeneği pasif olduğunda istenilen piyasada işlem yapacaktır.
Stratejinin çift yönlü ilerlemesi istendiğinde AcigaSatisYapilsin seçeneğinin aktif edilmesi gerekir ( varsayılan aktif )
Akşam seansında da oluşan sinyallere emir gönderilmesi için AksamSeansiniDahilEt seçeneğinin aktif edilmesi gerekir ( varsayılan pasif )
Kripto piyasası 7/24 açık olduğu için bu seçeneğin aktif ya da pasif seçilmesi birşey değiştirmez.
HangiIslemleBaslasin değişkeni ile stratejinin ilk Long ya da Short pozisyon ile başlaması sağlanabilir.
*** Stratejiye eklenen sentetik emirler tetiklendiğinde pozisyon sıfırlanıp ilk gelecek sinyale göre işleme girecektir.
*/
namespace Matriks.Lean.Algotrader
{
public class VIOP2KOSUL_Kopyaol : 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("X30YVADE")]
public string Symbol1;
[Parameter(SymbolPeriod.Min5)]
public SymbolPeriod SymbolPeriod1;
[Parameter(3)]
public int MostPeriod1;
[Parameter(2)]
public decimal MostPercentage1;
[Parameter(MovMethod.E)]
public MovMethod MostMovMethod1;
// senetik emir
[Parameter(3)]
public decimal kar_al;
[Parameter(2)]
public decimal zarar_durdur;
[Parameter(1)]
public decimal iz_suren;
// senetik emir
//_____________BURAYI KOPYALA________________//
[Parameter(5)]
public decimal BuyOrderQuantity;
[Parameter(5)]
public decimal SellOrderQuantity;
//_____________BURAYI KOPYALA________________//
MOST most;
public override void OnInit()
{
most = MOSTIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, MostPeriod1, MostPercentage1, MostMovMethod1);
//_____________BURAYI KOPYALA________________//
// Gerekli başla - Açığa satış
WorkWithPermanentSignal(true);
SendOrderSequential(true, HangiIslemleBaslasin);
SendOrderSequentialForShort(true, Side.All);
// #Gerekli bitti - Açığa satış
//_____________BURAYI KOPYALA________________//
//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");
}
/// <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(most, most, 1, 0))
{
//_____________BURAYI KOPYALA________________//
// Gerekli başla - Açığa satış
FX_Alis(Symbol1, BuyOrderQuantity);
// #Gerekli bitti - Açığa satış
//_____________BURAYI KOPYALA________________//
}
if (CrossBelow(most, most, 1, 0))
{
//_____________BURAYI KOPYALA________________//
// Gerekli başla - Açığa satış
FX_Satis(Symbol1, SellOrderQuantity);
// #Gerekli bitti - Açığa satış
//_____________BURAYI KOPYALA________________//
}
}
//_____________BURAYI KOPYALA________________//
// Gerekli başla - Açığa satış
[Parameter(true)]
public bool AcigaSatisYapilsin;
[Parameter(false)]
public bool AksamSeansiniDahilEt;
[Parameter(Side.All)]
public Side HangiIslemleBaslasin;
public bool FX_Alis(string sembol, decimal quantity)
{
bool sonuc = false;
if (LastOrderSide.Obj != Side.Buy)
{
var _quantity = (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin) ? quantity:(LastOrderSideForShort.Obj == Side.All) ? quantity:quantity * 2;
SendMarketOrder(sembol, _quantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
Debug("Alış emri gönderildi.[ " + _quantity + " adet ]");
// senetik emir
TakeProfit(Symbol1, SyntheticOrderPriceType.Percent, kar_al, includeAfterSession:AksamSeansiniDahilEt);
StopLoss(Symbol1, SyntheticOrderPriceType.Percent, zarar_durdur, includeAfterSession:AksamSeansiniDahilEt);
TrailingStopLoss(Symbol1, SyntheticOrderPriceType.Percent, iz_suren, includeAfterSession:AksamSeansiniDahilEt);
// senetik emir
LastOrderSideForShort = LastOrderSide;
sentetikEmirdenMI = false;
sonuc = true;
}
return sonuc;
}
public bool FX_Satis(string sembol, decimal quantity)
{
bool sonuc = false;
if (LastOrderSide.Obj != Side.Sell)
{
var _quantity = (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin) ? quantity:(LastOrderSideForShort.Obj == Side.All) ? quantity:quantity * 2;
SendMarketOrder(sembol, _quantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
Debug("Satış emri gönderildi.[ " + _quantity + " adet ]");
// senetik emir
TakeProfit(Symbol1, SyntheticOrderPriceType.Percent, kar_al, includeAfterSession:AksamSeansiniDahilEt);
StopLoss(Symbol1, SyntheticOrderPriceType.Percent, zarar_durdur, includeAfterSession:AksamSeansiniDahilEt);
TrailingStopLoss(Symbol1, SyntheticOrderPriceType.Percent, iz_suren, includeAfterSession:AksamSeansiniDahilEt);
// senetik emir
LastOrderSideForShort = LastOrderSide;
sentetikEmirdenMI = false;
sonuc = true;
}
return sonuc;
}
bool sentetikEmirdenMI = false;
public override void OnSyntheticOrderTriggered(SyntheticAlgoOrder sOrder)
{
if (sOrder.EnableOrderSending)
{
if (AcigaSatisYapilsin)
{
LastOrderSide.Obj = Side.All;
sentetikEmirdenMI = true;
}
Debug("Sentetik emir tetiklendi");
}
}
// #Gerekli bitti - Açığa satış
//_____________BURAYI KOPYALA________________//
/// <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()
{
}
}
}