Merhaba.
Tillson renk değişim stratejisi için linkteki stratejiyi alıp inceleyiniz lütfen.
https://destek.matriksdata.com/?qa=blob&qa_blobid=16504233577959275486
Sonraki talebinizi biz önermiyoruz.
İyice düşünün lütfen. Zarar çok derinleşirse ne yapacaksınız.
Aşağıya zararda ise satmayan örnek bir strateji ekliyorum. onu inceleyip, kendiniz ona göre düzenlemeyi deneyebilirsiniz.
Mutlaka uygulayacaksanız, bizce mutlaka bir zarar stopu eklemelisiniz.
İyi çalışmalar
ZARARDA İSE SATMA için örnek kod:
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=======================================//
// TSF indikatöründe, fiyat çubuklarınının TSF bandının üstüne kırdığı anda al, //
// altına kırdığı anda sat sinyali üretilir. //
// Emirler piyasa fiyatından gönderilecektir. //
// Emir gönderimi ile birlikte strateji raporunda Debug sekmesine "Alış emri gönderildi." //
// ve "Satış emri gönderildi." ifadesi yazdırılmaktadır. //
namespace Matriks.Lean.Algotrader
{
public class TSFmartingale : 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("ASELS")]
public string Symbol;
[Parameter(SymbolPeriod.Min)]
public SymbolPeriod SymbolPeriod;
[Parameter(100)]
public int BuyOrderQuantity;
[Parameter(100)]
public int SellOrderQuantity;
[Parameter(5)]
public int Period;
TSF tsf;
/// <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()
{
tsf = TSFIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period);
AddSymbol(Symbol, SymbolPeriod);
// 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);
}
//Dictionary<string, Dictionary<string, IOrder>> orders = new Dictionary<string, Dictionary<string, IOrder>>();
string lastBUYorderid = "NULL";
string lastSELLorderid = "NULL";
decimal LastBuyOrderPrice = 0;
decimal LastSellOrderPrice = 0;
int position = 0;
public override void OnDataUpdate(BarDataEventArgs barData)
{
var barDataModel = GetBarData();
Debug("Working...");
if (CrossAbove(barDataModel, tsf, OHLCType.Close))
{
lastBUYorderid = SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
Debug("Alış Emri Gönderildi");
Debug("Close:" + Math.Round(barData.BarData.Close,2));
Debug("Tsf:" + Math.Round(tsf.CurrentValue,2));
//LastBuyOrderPrice = orders[Symbol][lastBUYorderid].LastPx; //islem yapilan fiyati kaydediyoruz
//Debug("orders[Symbol][lastBUYorderid].LastPx = " + orders[Symbol][lastBUYorderid].LastPx);
}
if (CrossBelow(barDataModel, tsf, OHLCType.Close))
{
if(barData.BarData.Close < LastBuyOrderPrice)
{
Debug("Satis fiyati alis fiyatindan dusuk. Emir gonderilmedi");
}
if(barData.BarData.Close > LastBuyOrderPrice)
{
lastSELLorderid =SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
Debug("Satış Emri Gönderildi");
Debug("Close:" + Math.Round(barData.BarData.Close,2));
Debug("Tsf:" + Math.Round(tsf.CurrentValue,2));
}
}
}
public override void OnOrderUpdate(IOrder order)
{
//if (!orders.ContainsKey(order.Symbol)) orders.Add(order.Symbol, new Dictionary<string, IOrder>());
//orders[order.Symbol][order.CliOrdID] = order;
if (lastBUYorderid == order.CliOrdID && order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy)
{
LastBuyOrderPrice = order.LastPx;
Debug("Buy Order filled @ " + LastBuyOrderPrice);
position += 1;
}
if (lastSELLorderid == order.CliOrdID && order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
{
LastSellOrderPrice = order.LastPx;
Debug("Sell Order filled @ " + LastSellOrderPrice);
position -= 1;
}
}
}
}