Получить настройки скрипта и агента

В блок Внешний скрипт надо добавить TSLab.DataModel.dll и TSLab.ScriptEngine.dll.

using System.Text;
using TSLab.DataModel;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.ScriptExecution.Realtime;

namespace MyLib
{
    public class TestSettings : IExternalScript
    {
        public void Execute(IContext ctx, ISecurity sec)
        {
            // В блок 'Внешний скрипт' необходимо добавить TSLab.DataModel.dll, TSLab.ScriptExecution.dll.
                        
            // Получить настройки скрипта
            var labOptions = ctx.GetLabOptions();
            if (labOptions != null)
            {
                var sb = new StringBuilder();
                sb.AppendLine($"=== LabOptions ===");
                sb.AppendLine($"Дата от: ({labOptions.UseDateFrom}) {labOptions.DateFromEdit}");
                sb.AppendLine($"Дата к: ({labOptions.UseDateTo}) {labOptions.DateToEdit}");
                ctx.Log(sb.ToString(), MessageType.Info, true);
            }

            // Получить настройки агента
            var rtOptions = ctx.GetRtOptions();
            if (rtOptions != null)
            {
                var sb = new StringBuilder();
                sb.AppendLine($"=== RtOptions ===");
                sb.AppendLine($"Исполнять входы сразу: {rtOptions.DefEntryApprove}");
                sb.AppendLine($"Исполнять выходы сразу: {rtOptions.DefExitApprove}");
                ctx.Log(sb.ToString(), MessageType.Info, true);
            }
        }
    }

    public static class TSLabExtensions
    {
        public static LabOptions GetLabOptions(this IContext ctx)
        {
            var fi = ctx.Runtime.GetType().GetProperty("Options");
            return fi?.GetValue(ctx.Runtime) as LabOptions;
        }

        public static RealtimeScriptOptions GetRtOptions(this IContext ctx)
        {
            var fi = ctx.Runtime.GetType().GetProperty("Manager");
            var val = fi?.GetValue(ctx.Runtime) as RealtimeDataManager;
            return val?.RtData?.Options;
        }
    }
}

Полный список настроек агента:

var rtOptions = Ctx.GetAgentSettings();
if (rtOptions != null)
{
	var sb = new StringBuilder();
	sb.AppendLine($"=== AgentSettings ===");
	
	sb.AppendLine($"\n\n=== Исполнение агента ===");
	sb.AppendLine($"\nИсполнять входы сразу: {rtOptions.DefEntryApprove}"); // True
	sb.AppendLine($"\nИсполнять выходы сразу: {rtOptions.DefExitApprove}"); // True
	sb.AppendLine($"\nАвтооткрытие (баров): {rtOptions.AutoEntryBars}"); // 0
	sb.AppendLine($"\nБлок по рынку с фиксированной ценой для автооткрытия: {rtOptions.AutoEntryIgnoreByMarketAsLimit }"); // False
	sb.AppendLine($"\nАвтозакрытие (баров): {rtOptions.AutoCloseBars }"); // 0
	sb.AppendLine($"\nБлок по рынку с фиксированной ценой для автозакрытия: {rtOptions.AutoCloseIgnoreByMarketAsLimit }"); // False
	sb.AppendLine($"\nИгнорировать позиции вне история: {rtOptions.RemoveInactivePositions }"); // False
	sb.AppendLine($"\nУведомлять о пропущенных входах: {rtOptions.WarnSkippedOpenPositions }"); // True
	sb.AppendLine($"\nНе открывать если пропущен вход: {rtOptions.NotOpenIfHasSkippedExit}");
	sb.AppendLine($"\nНе уведомлять пересчет: {rtOptions.NoCalcInfo}");
	sb.AppendLine($"\nВиртуальная позиция макс. свечей: {rtOptions.MaxBarsForSignal}");
	sb.AppendLine($"\nИгнорировать сигнал выхода не на последней свече: {rtOptions.ExitSignalOnlyForLastBar}");
	sb.AppendLine($"\nЖдать исполнения выхода: {rtOptions.WaitExecutionExitBars}");
	sb.AppendLine($"\nЖдать исполнения входа: {rtOptions.WaitExecutionEntryBars}");
	sb.AppendLine($"\nУчитывать комиссию: {rtOptions.UseCommissionInProfit}");

	sb.AppendLine($"\n\n=== Выставление заявок ===");
	sb.AppendLine($"\nПроскальзывание в шагах: {rtOptions.Slippage}");
	sb.AppendLine($"\nПроскальзывание в %: {rtOptions.SlippagePct}");
	sb.AppendLine($"\nTakeProfit без проскальзывания: {rtOptions.TakeProfitNoSlippage}");
	sb.AppendLine($"\nОткрытие лимитными заявками: {rtOptions.OpenPositionNoSlippage}");
	sb.AppendLine($"\n\"По рынку\" с фиксированной ценой: {rtOptions.ByMarketAsLimt}");
	sb.AppendLine($"\n\"Плохие\" заявки по рынку: {rtOptions.InvalidStopsByMarket}");

	sb.AppendLine($"\n\n=== События ===");
	sb.AppendLine($"\nЗаявка отклонена: {rtOptions.EventOrderRejected}");
	sb.AppendLine($"\nЗаявка выполнена полностью: {rtOptions.EventOrderFilled}");
	sb.AppendLine($"\nОткрытие позиции: {rtOptions.EventPositionOpening}");
	sb.AppendLine($"\nЗакрытие позиции: {rtOptions.EventPositionClosing}");
	sb.AppendLine($"\nИзменение кол-ва в заявке: {rtOptions.EventOrderQtyChanged}");
	sb.AppendLine($"\nТорговля начата: {rtOptions.EventTradingIsStarted}");
	sb.AppendLine($"\nТорговля остановлена: {rtOptions.EventTradingIsStopped}");
	sb.AppendLine($"\nЗаявка отменена: {rtOptions.EventOrderCanceled}");
	sb.AppendLine($"\nОграничение претрейда: {rtOptions.EventPretradeLimitation}");

	ctx.Log(sb.ToString(), MessageType.Info, true);
}

Last updated