Merhaba,
MOTT4b kurgusu ile backtestini yaptığım be kod olarak hata almayan stratejim sinyal üretmesine rağmen işlem açmıyor. Binance üzerinde vadeli işlem izinlerim var. hesabımda yeterli bakiye var. Ama loglarda sadece starteji çalıştı ibaresi var. Debug işlemi koydum ama henüz yeni bir sinyal olmadığı için canlı sonucu paylaşamıyorum. Kalan ekran görüntüleri ektedir. Koduda paylaşıyorum.
using MOTT = Matriks.Lean.Algotrader.EmbeddedCustom137349840713791406282079679885865864340916501629.MOTT;
using Matriks.AlgoTrader;
using Matriks.Data.Identifiers;
using System.ComponentModel;
using System;
using System.Collections.Generic;
using System.Linq;
using Matriks;
using Matriks.Data.Symbol;
using Matriks.Data.Tick;
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;
using Matriks.Enumeration;
using Matriks.IntermediaryInstitutionAnalysis.Enums;
namespace Matriks.Lean.Algotrader
{
public class MOTT4KurguStratejisi_Kopya : MatriksAlgo
{
/*
MOTT_4.Kurgu
AL
Cross(MOV(C,opt1,VAR),OTT(HHV(H,opt2),2,opt3)) OR
Cross(MOV(C,opt1,VAR),(OTT(HHV(H,opt2),2,opt3)+(OTT(HHV(H,opt2),2,opt3)+OTT(LLV(L,opt2),2,opt3))/2)/2) OR
Cross(MOV(C,opt1,VAR),(OTT(HHV(H,opt2),2,opt3)+OTT(LLV(L,opt2),2,opt3))/2) OR
Cross(MOV(C,opt1,VAR),(OTT(LLV(L,opt2),2,opt3)+(OTT(HHV(H,opt2),2,opt3)+OTT(LLV(L,opt2),2,opt3))/2)/2) OR
Cross(MOV(C,opt1,VAR),OTT(LLV(L,opt2),2,opt3))
SAT
Cross(OTT(HHV(H,opt2),2,opt3),MOV(C,opt1,VAR)) OR
Cross((OTT(HHV(H,opt2),2,opt3)+(OTT(HHV(H,opt2),2,opt3)+OTT(LLV(L,opt2),2,opt3))/2)/2,MOV(C,opt1,VAR)) OR
Cross((OTT(HHV(H,opt2),2,opt3)+OTT(LLV(L,opt2),2,opt3))/2,MOV(C,opt1,VAR)) OR
Cross((OTT(LLV(L,opt2),2,opt3)+(OTT(HHV(H,opt2),2,opt3)+OTT(LLV(L,opt2),2,opt3))/2)/2,MOV(C,opt1,VAR)) OR
Cross(OTT(LLV(L,opt2),2,opt3),MOV(C,opt1,VAR))
*/
// ⒶⓀⒾⓃ ℍü
[SymbolParameter("BTC_USDT_FBIN")]
public string Symbol;
[Parameter(SymbolPeriod.Min)]
public SymbolPeriod SymbolPeriod;
[Parameter(Side.All)]
public Side orderSide;
[Parameter(4)]
public int MovPeriod;
[Parameter(MovMethod.VAR)]
public MovMethod MovMovMethod;
[Parameter(80)]
public int MottX1;
[Parameter(1.4)]
public decimal MottX2;
[Parameter(0)]
public int MottOteleme;
[Parameter(1)]
public decimal OrderQuantity;
[Parameter(false)]
public bool AcigaSatisYapilsin;
[Parameter(10)]
public int KaldiracOrani;
[Parameter(1)]
public decimal BuyOrderQuantity;
[Parameter(1)]
public decimal SellOrderQuantity;
List<string> orderIDList = new List<string>();
MOV mov;
MatriksIndicator MOTT;
public override void OnDataUpdate(BarDataEventArgs barData)
{
if (CrossAbove(mov, MOTT, 0, 0)
|| CrossAbove(mov, MOTT, 0, 1)
|| CrossAbove(mov, MOTT, 0, 2)
|| CrossAbove(mov, MOTT, 0, 3)
|| CrossAbove(mov, MOTT, 0, 4))
{
Debug("FX_Alis çalıştı");
FX_Alis();
}
if (CrossBelow(mov, MOTT, 0, 0)
|| CrossBelow(mov, MOTT, 0, 1)
|| CrossBelow(mov, MOTT, 0, 2)
|| CrossBelow(mov, MOTT, 0, 3)
|| CrossBelow(mov, MOTT, 0, 4))
{
Debug("FX_Satis çalıştı");
FX_Satis();
}
}
public override void OnInit()
{
AddSymbol(Symbol, SymbolPeriod);
mov = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod, MovMovMethod);
MOTT = new MOTT();
MOTT.SetIndicatorParameters("X1", MottX1);
MOTT.SetIndicatorParameters("X2", MottX2);
MOTT.SetIndicatorParameters("Oteleme", MottOteleme);
RegisterUserIndicator(MOTT, Symbol, SymbolPeriod, OHLCType.Close, 5);
WorkWithPermanentSignal(true);
if (AcigaSatisYapilsin)
{
SendOrderSequential(true, Side.Buy);
SendOrderSequentialForShort(true, Side.All);
}
else
{
SendOrderSequential(true, Side.Buy);
}
SetLeverage(Symbol, KaldiracOrani);
SetLeverageType(Symbol, false);
}
/// <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>
/// <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)
{
if (order.OrdStatus.Obj == OrdStatus.Filled)
{
Debug("Emir gönderildi");
// Senntetik emirler tanımlanıyor
// StopLoss(Symbol, SyntheticOrderPriceType.Percent, 1);
// TakeProfit(Symbol, SyntheticOrderPriceType.Percent, 1);
if (!orderIDList.Contains(order.CliOrdID) && AcigaSatisYapilsin)
{
LastOrderSideForShort.Obj = Side.All;
Debug("Sentetik emir tetiklendi");
}
}
}
/// <summary>
/// Strateji durdurulduğunda bu fonksiyon tetiklenir.
/// </summary>
public override void OnStopped()
{
}
public void FX_Alis()
{
string _orderID = string.Empty; ;
decimal _quantity = 0;
Debug("FX_Alis metoduna girildi");
if (LastOrderSide.Obj != Side.Buy)
{
if (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin)
{
_orderID = SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
_quantity = BuyOrderQuantity;
}
else
{
if (LastOrderSideForShort.Obj == Side.All)
{
_orderID = SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
_quantity = BuyOrderQuantity;
}else
{
_orderID = SendMarketOrder(Symbol, BuyOrderQuantity * 2, OrderSide.Buy);
_quantity = BuyOrderQuantity * 2;
}
}
Debug("OrderId : " + _orderID.ToString() + " // Quantity : " + _quantity.ToString());
if (_orderID != string.Empty && _quantity != 0)
{
orderIDList.Add(_orderID);
Debug("Alış emri gönderildi.[ " + _quantity + " adet ]");
LastOrderSide.Obj = Side.Buy;
LastOrderSideForShort.Obj = Side.Buy;
}
}
}
public void FX_Satis()
{
string _orderID = string.Empty; ;
decimal _quantity = 0;
if (LastOrderSide.Obj != Side.Sell)
{
if (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin)
{
_orderID = SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
_quantity = SellOrderQuantity;
}else
{
if (LastOrderSideForShort.Obj == Side.All)
{
_orderID = SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
_quantity = SellOrderQuantity;
}else
{
_orderID = SendMarketOrder(Symbol, SellOrderQuantity * 2, OrderSide.Sell);
_quantity = SellOrderQuantity * 2;
}
}
Debug("OrderId : " + _orderID.ToString() + " // Quantity : " + _quantity.ToString());
if (_orderID != string.Empty && _quantity != 0)
{
orderIDList.Add(_orderID);
Debug("Satış emri gönderildi.[ " + _quantity + " adet ]");
LastOrderSide.Obj = Side.Sell;
LastOrderSideForShort.Obj = Side.Sell;
}
}
}
}
public class EmbeddedCustom137349840713791406282079679885865864340916501629
{
//Ilk parametre indikatörün adı, sınıfın adıyla aynı olmalıdır.
//Ikinci parametre indikatörün Dataserisinin üzerine mi yeni pencereye mi ekleneceğini belirtir. Yeni pencere için ->IndicatorDrawingArea.NewWindow , Data Serisi için IndicatorDrawingArea.OnDataSeries
[IndicatorInformationAttribute("MOTT", IndicatorDrawingArea.OnDataSeries)]
//Indikatörün çizgilerinin isimleri
[IndicatorLineInformationAttribute(new []
{
"Line1(0,1)", "Line2", "Line3", "Line4", "Line5"
},
new []
{
"#FF87CEFA", "#FF87CEFA", "#FFFFF0F5",
"#FFFF00FF", "#FFFF00FF"
},
new []
{
false, false, false,
false, false
},
new []
{
0, 2, 2,
2, 0
}, new []
{
1, 1, 1,
1, 1
})]
public class MOTT : MatriksIndicator
{
[DefaultValue(80)]
public int X1
{
get; set;
}
[DefaultValue(1.4)]
public decimal X2
{
get; set;
}
[DefaultValue(3)]
public int Oteleme
{
get; set;
}
MOV mov, mov2, mov3;
OTT ott, ott2;
HighestHigh HHV;
LowestLow LLV;
public sealed override void OnInit()
{
ott = new OTT(2, X2, MovMethod.VAR, false);
ott2 = new OTT(2, X2, MovMethod.VAR, false);
HHV = new Hig