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)
{
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;
//текущая позиция. если больше нуля-в лонге. меньше нуля-в шорте
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] <= sec.Positions.LastPositionActive.EntryPrice - OtskokS)
secRt.NewOrder(TSLab.DataSource.OrderType.Growth, true, sec.Positions.LastPositionActive.EntryPrice - buS, nn, "SXTP");
}
}
else
{
//закрываем положительный баланс лотов продажей
secRt.NewOrder(TSLab.DataSource.OrderType.Fall, false, ST, lotsBalance - Contracts, "LXSE");
{
//если есть промежуточный профит закрываем nn контрактов
if (sec.HighPrices[i] >= sec.Positions.LastPositionActive.EntryPrice + OtskokL)
secRt.NewOrder(TSLab.DataSource.OrderType.Fall, false, sec.Positions.LastPositionActive.EntryPrice + buL, nn, "LXTP");
}
}
}
}
}
}