Nektodron, помогите довести скрипт до робастности, надеюсь, пригодится ни одному мне пример использования реал-тайм с возможностью фиксации части прибыли/позиции.
Вот на что хватила интуитивных навыков программирования с включением подсказанного выше Вами кода:
Code:
using System.Collections.Generic;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.Script.Optimization;
using TSLab.Script.Helpers;
using TSLab.Script.Realtime;

namespace TSLab.Samples
{
	public class Final : IExternalScript
	{
		public …
		
		public virtual void Execute(IContext ctx, ISecurity sec, ISecurityRt rtSec, out double curQty, out double curPrice)
		{
			var …
			
			IList<double> …
			
			{
				int barsCount = sec.Bars.Count;
				for (int i = 50; (i < barsCount); i++)
				{
					if …
					else …
					{
						BT = …
						ST = …
					}
				}
			}
			// Торговля.
			if (!sec.Positions.IsRealtime) return;
			{
				int i = sec.Bars.Count - 1;
				if (i < 0) return;
				curQty = 0;
				curPrice = 0;
				if (rtSec != null)
				{
					var orders = rtSec.Orders.OrderBy(ord => ord.Date);
					foreach (var order in orders)
					{
						if (order.IsExecuted)
						{
							int bs = (order.IsBuy ? 1 : -1);
							double qty = order.Quantity * bs;
							double price = order.Price;
							double newQty = curQty + qty;
							bool isGrowPos = Math.Abs(newQty) > Math.Abs(curQty);
							if (isGrowPos)
							{
								curPrice = newQty == 0 ? 0 : (curQty*curPrice + qty*price)/newQty;
							}
							curQty = newQty;
						}
					}
				}
				curPrice = curQty == 0 ? 0 : curPrice;
				
				//текущая позиция. если больше нуля-в лонге. меньше нуля-в шорте
				double lotsBalance = 0;
				//пробегаемся по всем исполненным ордерам. необходимо текущее число лотов
				foreach (IOrder order in secRt.Orders)
				//Проверка что мы на этом баре не ставили заявки!!!
				if (order.Date >= sec.Bars[i].Date) return;
				else
				if (order.OrderType == TSLab.DataSource.OrderType.Limit)
				{
					lotsBalance += order.IsBuy ? (order.Quantity-order.RestQuantity):(-order.Quantity+order.RestQuantity);
					//для примера-если ордер не исполнился-убиваем
					if (!order.IsExecuted) secRt.CancelOrder(order);
				}
					//условие-у нас нулевой баланс лотов
				if (lotsBalance == 0)
				{
					//ставим стоп-лимит на бай
					secRt.NewOrder(TSLab.DataSource.OrderType.Growth, true, BT, Contracts, "LE");
					//ставим стоп-лимит на селл				
					secRt.NewOrder(TSLab.DataSource.OrderType.Fall, false, ST, Contracts, "SE");
				}
				else
				if (lotsBalance < 0)
				{
					//закрываем отрицательный баланс покупкой
					secRt.NewOrder(TSLab.DataSource.OrderType.Growth, true, BT, -lotsBalance + Contracts, "SXLE");
					{
						//если есть промежуточный профит закрываем nn контрактов
						if (sec.LowPrices[i] <= price - OtskokS)
						secRt.NewOrder(TSLab.DataSource.OrderType.Growth, true, price - buS, nn, "SXTP");
					}
				}
				else
				{
					//закрываем положительный баланс лотов продажей
					secRt.NewOrder(TSLab.DataSource.OrderType.Fall, false, ST, lotsBalance - Contracts, "LXSE");
					{
						//если есть промежуточный профит закрываем nn контрактов
						if (sec.HighPrices[i] >= price + OtskokL)
						secRt.NewOrder(TSLab.DataSource.OrderType.Fall, false, price + buL, nn, "LXTP");
					}
				}
			}
		}
	}
}
При компиляции выдаёт ошибку:
'TSLab.Samples.Final' не реализует член интерфейса 'TSLab.Script.Handlers.IExternalScript.Execute(TSLab.Script.Handlers.IContext, TSLab.Script.ISecurity)' (CS0535) - C:\Users\Пользователь\Documents\SharpDevelop Projects\DT+AverRT\DT+AverRT\Properties\AssemblyInfo.cs:10,15