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");
}
}
}
}
}
}