tmt
|
Дата: 12.01.2012
|
|
|
|
|
Попробовал вот так.. Но ошибки показывает..
**Элемент "ChildStrategies" не существует в текущем контексте.
**Наиболее подходящий перегруженный метод для "StockSharp.Algo.Strategies.StrategyRule<System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.MyTrade>>.
Do(System.Action<StockSharp.Algo.Strategies.StrategyRule<System.Collections.Generic.
IEnumerable<StockSharp.BusinessEntities.MyTrade>>,System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.MyTrade>>)"
имеет несколько недопустимых аргументов
**Вместе с аргументами-типами нельзя использовать не универсальный тип "System.Collections.IEnumerable"
**Аргумент "1": преобразование типа из "группа методов" в "System.Action<StockSharp.Algo.Strategies.StrategyRule<System.Collections.Generic.
IEnumerable<StockSharp.BusinessEntities.MyTrade>>,System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.MyTrade>>" невозможно
Помогите пожалуйста
namespace SampleSmartConsole
{
using System;
using System.Net;
using System.Linq;
using System.Threading;
using System.Collections;
using Ecng.Collections;
using Ecng.Common;
using StockSharp.BusinessEntities;
using StockSharp.Smart;
using StockSharp.Algo;
using StockSharp.Algo.Strategies;
class Program
{
private static Security _instrument;
private static Portfolio _portfolio;
private static MarketDepth _depth;
private static Position _position;
public class buy : Strategy
{
public void OpenPosition()
{
// создаем заявку для открытия длинной позиции
var longPos = this.BuyAtMarket();
// регистрируем правило, отслеживающее появление новых сделок по заявке
this
.When(longPos.NewTrades())
.Do(OnNewOrderTrades)
.Periodical(() => longPos.IsMatched());
// отправляем заявку на регистрацию
RegisterOrder(longPos);
}
}
private void OnNewOrderTrades(IEnumerable<MyTrade> trades)
{
// для каждой сделки добавляем для защитную пару стратегии
var protectiveStrategies = trades.Select(t =>
{
// выставляет тейк-профит в 40 пунктов
var takeProfit = new TakeProfitStrategy(t, 40);
// выставляет стоп-лосс в 20 пунктов
var stopLoss = new StopLossStrategy(t, 20);
return new TakeProfitStopLossStrategy(takeProfit, stopLoss);
});
ChildStrategies.AddRange(protectiveStrategies);
}
static void Main()
{
try
{
// для теста выбираем бумагу
const string secCode = "RIH2";
//Console.Write("Введите логин: ");
//var login = Console.ReadLine();
var login = "ST12858";
//Console.Write("Введите пароль: ");
//var password = Console.ReadLine();
var password = "8YDJ7E";
//Console.Write("Введите номер счета, через который будет выставлена заявка: ");
//var account = Console.ReadLine();
var account = "ST12858-RF-01";
IPAddress ipadress = IPAddress.Parse("95.131.26.246");
IPEndPoint ip = new IPEndPoint(ipadress, 8090);
using (var waitHandle = new AutoResetEvent(false))
{
// создаем шлюз к Smart-у
using (var trader = new SmartTrader(login, password, ip))
{
// подписываемся на событие успешного подключения
// все действия необходимо производить только после подключения
trader.Connected += () =>
{
Console.WriteLine("Подключение было произведено успешно.");
// извещаем об успешном соединени
waitHandle.Set();
};
Console.WriteLine("Производим подключение...");
trader.Connect();
// дожидаемся события об успешном соединении
waitHandle.WaitOne();
// подписываемся на все портфели-счета
trader.NewPortfolios += portfolios =>
{
// необходимое условие работы в SmartCOM
portfolios.ForEach(trader.RegisterPortfolio);
if (_portfolio == null)
{
_portfolio = portfolios.FirstOrDefault(p => p.Name == account);
if (_portfolio != null)
{
Console.WriteLine("Портфель {0} появился.", account);
if (_instrument != null && _depth != null && _position != null)
waitHandle.Set();
}
}
};
// подписываемся на событие появление инструментов
trader.NewPositions += positions =>
{
if (_position == null)
{
_position = positions.FirstOrDefault(sec => sec.Security.Code == secCode);
if (_position != null)
{
Console.WriteLine("Информация о портфеле появилась.");
if (_portfolio != null && _depth != null && _instrument != null)
waitHandle.Set();
}
}
};
trader.NewSecurities += securities =>
{
if (_instrument == null)
{
// находим инструмент и присваиваем ее переменной _instrument
_instrument = securities.FirstOrDefault(sec => sec.Code == secCode && sec.Type == SecurityTypes.Future);
if (_instrument != null)
{
Console.WriteLine("Инструмент появился.");
trader.RegisterQuotes(_instrument); // запускаем экспорт стакана
if (_portfolio != null && _depth != null && _position != null)
waitHandle.Set();
}
}
};
// подписываемся на событие обновления стакана
trader.QuotesChanged += depths =>
{
if (_depth == null && _instrument != null)
{
_depth = depths.FirstOrDefault(d => d.Security == _instrument);
if (_depth != null)
{
Console.WriteLine("Стакан появился.");
if (_portfolio != null && _position != null)
waitHandle.Set();
}
}
};
// подписываемся на событие появления моих новых сделок
trader.NewMyTrades += myTrades =>
{
foreach (var myTrade in myTrades)
{
var trade = myTrade.Trade;
Console.WriteLine("Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}.", trade.Id, trade.Price, trade.Security.Code, trade.Volume, trade.Time);
}
};
Console.WriteLine("Дожидаемся появления в программе инструмента и портфеля {0}...".Put(account));
// запускаем экспорт по инструментам и портфелям
trader.StartExport();
// дожидаемся появления портфеля и инструмента
waitHandle.WaitOne();
trader.SecuritiesChanged += securities =>
{
// если инструмент хоть раз изменился (по нему пришли актуальные данные)
if (securities.Contains(_instrument))
waitHandle.Set();
};
Console.WriteLine("Дожидаемся обновления данных по инструменту...");
// запускаем обновление по инструменту
trader.RegisterSecurity(_instrument);
waitHandle.WaitOne();
// запоминаем первоначальное значение середины спреда
var totb = _depth.TotalBidsVolume;
var tota = _depth.TotalAsksVolume;
int maxaskv = 0;
int maxbidv = 0;
int maxaskp = 0;
int maxbidp = 0;
var asks = _depth.Asks;
var bids = _depth.Bids;
for (int i = 0; i < 50; i++)
{
if (asks[i].Volume > maxaskv) { maxaskv = (int)asks[i].Volume; maxaskp = (int)asks[i].Price; }
if (bids[i].Volume > maxbidv) { maxbidv = (int)bids[i].Volume; maxbidp = (int)bids[i].Price; }
//Console.WriteLine("asks {0}", asks[i].Price);
//Console.WriteLine("asks {0}", asks[i].Volume);
}
Console.WriteLine("maxask {0}", maxaskv);
Console.WriteLine("maxbid {0}", maxbidv);
if (_instrument.BestBid == null)
throw new Exception("Нет лучшего бида для котировки.");
Console.WriteLine("общий объем bid {0}", totb);
Console.WriteLine("общий объем ask {0}", tota);
// objem = _instrument.OpenInterest;
//Console.WriteLine("открытые позиции {0}", objem);
//Console.WriteLine("asks {0}", asks[0]);
while (true)
{
var objem = _position.CurrentValue;
Console.WriteLine("открытые позиции {0}", objem);
// если спред вышел за пределы нашего диапазона
/*if (totb > tota)
{*/
var order = new Order
{
Portfolio = _portfolio,
Price = _instrument.ShrinkPrice(_instrument.BestAsk.Price),
Security = _instrument,
Volume = 1,
Direction = OrderDirections.Sell,
};
trader.RegisterOrder(order);
Console.WriteLine("Заявка {0} зарегистрирована.", order.Id);
//break;
/*}
else
{
var order = new Order
{
Portfolio = _portfolio,
Price = _instrument.ShrinkPrice(_instrument.BestBid.Price),
Security = _instrument,
Volume = 1,
Direction = OrderDirections.Buy,
};
trader.RegisterOrder(order);
Console.WriteLine("Заявка {0} зарегистрирована.", order.Id);
//break;
}
//Console.WriteLine("Текущее значение середины спреда {0:0.##}", _instrument.BestBid.Price + mid);
*/
// ждем 1 секунду
Thread.Sleep(1000);
}
// останавливаем экспорт
trader.StopExport();
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
}
|
|
|
|
Спасибо:
|
|
|
|
|
|
ak
|
Дата: 12.01.2012
Форматируйте код (значек справа от "Цитата" - "Выберите тип подсветки кода"), потому что так понять что-либо очень сложно.
- Обработчик OnNewOrderTrades должен быть методом класса стратегии (находиться внутри ).
- Generic тип IEnumerable<Type> принадлежит сборке System.Collections.Generic (using System.Collections.Generic;)
А логин и пароль в коде измененные, правда? Я на это очень надеюсь.
|
|
|
|
|
|
|
tmt
|
Дата: 13.01.2012
|
|
|
|
|
Спасибо сделал вот так, а насчет логина(пароля) они реальные.. от демки правда..
А как теперь этот класс вызвать? (можно ли так)
var ord = new buy();
public class buy : Strategy
{
public void OpenPosition()
{
// создаем заявку для открытия длинной позиции
//var longPos = this.BuyAtMarket();
var longPos = new Order
{
Portfolio = _portfolio,
Price = _instrument.ShrinkPrice(_instrument.BestAsk.Price),
Security = _instrument,
Volume = 1,
Direction = OrderDirections.Sell,
};
// регистрируем правило, отслеживающее появление новых сделок по заявке
this
.When(longPos.NewTrades())
.Do(OnNewOrderTrades)
.Periodical(() => longPos.IsMatched());
// отправляем заявку на регистрацию
RegisterOrder(longPos);
}
private void OnNewOrderTrades(IEnumerable<MyTrade> trades)
{
// для каждой сделки добавляем для защитную пару стратегии
var protectiveStrategies = trades.Select(t =>
{
// выставляет тейк-профит в 40 пунктов
var takeProfit = new TakeProfitStrategy(t, 40);
// выставляет стоп-лосс в 20 пунктов
var stopLoss = new StopLossStrategy(t, 20);
return new TakeProfitStopLossStrategy(takeProfit, stopLoss);
});
ChildStrategies.AddRange(protectiveStrategies);
}
}
|
|
|
|
Спасибо:
|
|
|
|
|
|
ak
|
Дата: 13.01.2012
tmt:
Спасибо сделал вот так, а насчет логина(пароля) они реальные.. от демки правда..
А как теперь этот класс вызвать? (можно ли так)
var ord = new buy();
А вы сами попробуйте ;-) Не могу сейчас проверить, но насколько я помню родительский класс Strategy содержит конструктор без параметров (или конструктор по умолчанию - не важно). Ваш класс также имеет конструктор по умолчанию - так что такой конструкцией вы создадите объект стратегии. Но вот чтобы ее запустить (заставить работать) надо переопределить (override) как минимум один метод, какой - внимательно читать тут http://stocksharp.com/doc/html/8c0327db-494a-4fe0-aba8-0d4b93dea60e.htm
|
|
|
|
Спасибо:
|
|
|
|
|
|
tmt
|
Дата: 13.01.2012
ak:
tmt:
Спасибо сделал вот так, а насчет логина(пароля) они реальные.. от демки правда..
А как теперь этот класс вызвать? (можно ли так)
var ord = new buy();
>
> А вы сами попробуйте ;-) Не могу сейчас проверить, но насколько я помню родительский класс Strategy содержит конструктор без параметров (или конструктор по умолчанию - не важно). Ваш класс также имеет конструктор по умолчанию - так что такой конструкцией вы создадите объект стратегии. Но вот чтобы ее запустить (заставить работать) надо переопределить (override) как минимум один метод, какой - внимательно читать тут http://stocksharp.com/doc/html/8c0327db-494a-4fe0-aba8-0d4b93dea60e.htm
Да так то я уже попробовал)) выяснил что не работает. Сейчас прочту и снова попробую
|
|
|
|
Спасибо:
|
|
|
|
|
|
Alexander
|
Дата: 13.01.2012
tmt:
Да так то я уже попробовал)) выяснил что не работает. Сейчас прочту и снова попробую
У нас если что есть поддержка платная, там на подобные вопросы как раз отвечаем.
Это если лень разбираться по документации и примерам.
|
|
|
|
Спасибо:
|
|
|
|
|
|
tmt
|
Дата: 13.01.2012
|
|
|
|
|
Это выходит нужно добавить override примерно вот так, а потом он сам запустится, как вызов метода Strategy.Start произойдет? и условия для открытия уже в OpenPosition нужно добавлять, а не в programm..
public class buy : Strategy
{
public override void OpenPosition()
{
// создаем заявку для открытия длинной позиции
//var longPos = this.BuyAtMarket();
var longPos = new Order
{
Portfolio = _portfolio,
Price = _instrument.ShrinkPrice(_instrument.BestAsk.Price),
Security = _instrument,
Volume = 1,
Direction = OrderDirections.Sell,
};
// регистрируем правило, отслеживающее появление новых сделок по заявке
this
.When(longPos.NewTrades())
.Do(OnNewOrderTrades)
.Periodical(() => longPos.IsMatched());
// отправляем заявку на регистрацию
RegisterOrder(longPos);
}
private void OnNewOrderTrades(IEnumerable<MyTrade> trades)
{
// для каждой сделки добавляем для защитную пару стратегии
var protectiveStrategies = trades.Select(t =>
{
// выставляет тейк-профит в 40 пунктов
var takeProfit = new TakeProfitStrategy(t, 40);
// выставляет стоп-лосс в 20 пунктов
var stopLoss = new StopLossStrategy(t, 20);
return new TakeProfitStopLossStrategy(takeProfit, stopLoss);
});
ChildStrategies.AddRange(protectiveStrategies);
}
}
|
|
|
|
Спасибо:
|
|
|
|
|
|
tmt
|
Дата: 13.01.2012
просмотрев пример sma для quik. Увидел, что сначало объявляется класс SmaStrategy, а потом _strategy присваиваем саму стратегию, после уже _strategy.Start();
_strategy = new SmaStrategy(_candleManager, new SimpleMovingAverage { Length = 80 }, new SimpleMovingAverage { Length = 10 }, _timeFrame)
{
Volume = 1,
Security = _lkoh,
Portfolio = Portfolios.SelectedPortfolio,
Trader = _trader,
};
Но вот мне не нужны машки... как реализовать?
|
|
|
|
Спасибо:
|
|
|
|
|
|
tmt
|
Дата: 13.01.2012
|
|
|
|
|
сделал вот так, вроде как должно работать, но ошибка ""SampleSmartConsole.Program.buy.OpenPosition()": не найден метод, пригодный для переопределения"
namespace SampleSmartConsole
{
using System;
using System.Net;
using System.Linq;
using System.Threading;
using System.Collections.Generic;
using Ecng.Collections;
using Ecng.Common;
using StockSharp.BusinessEntities;
using StockSharp.Smart;
using StockSharp.Algo;
using StockSharp.Algo.Strategies;
class Program
{
private static Security _instrument;
private static Portfolio _portfolio;
private static MarketDepth _depth;
private static Position _position;
private static buy _strategy;
static void Main()
{
try
{
// для теста выбираем бумагу
const string secCode = "RIH2";
//Console.Write("Введите логин: ");
//var login = Console.ReadLine();
var login = "ST12858";
//Console.Write("Введите пароль: ");
//var password = Console.ReadLine();
var password = "8YDJ7E";
//Console.Write("Введите номер счета, через который будет выставлена заявка: ");
//var account = Console.ReadLine();
var account = "ST12858-RF-01";
IPAddress ipadress = IPAddress.Parse("95.131.26.246");
IPEndPoint ip = new IPEndPoint(ipadress, 8090);
using (var waitHandle = new AutoResetEvent(false))
{
// создаем шлюз к Smart-у
using (var trader = new SmartTrader(login, password, ip))
{
// подписываемся на событие успешного подключения
// все действия необходимо производить только после подключения
trader.Connected += () =>
{
Console.WriteLine("Подключение было произведено успешно.");
// извещаем об успешном соединени
waitHandle.Set();
};
Console.WriteLine("Производим подключение...");
trader.Connect();
// дожидаемся события об успешном соединении
waitHandle.WaitOne();
// подписываемся на все портфели-счета
trader.NewPortfolios += portfolios =>
{
// необходимое условие работы в SmartCOM
portfolios.ForEach(trader.RegisterPortfolio);
if (_portfolio == null)
{
_portfolio = portfolios.FirstOrDefault(p => p.Name == account);
if (_portfolio != null)
{
Console.WriteLine("Портфель {0} появился.", account);
if (_instrument != null && _depth != null && _position != null)
waitHandle.Set();
}
}
};
// подписываемся на событие появление инструментов
trader.NewPositions += positions =>
{
if (_position == null)
{
_position = positions.FirstOrDefault(sec => sec.Security.Code == secCode);
if (_position != null)
{
Console.WriteLine("Информация о портфеле появилась.");
if (_portfolio != null && _depth != null && _instrument != null)
waitHandle.Set();
}
}
};
trader.NewSecurities += securities =>
{
if (_instrument == null)
{
// находим инструмент и присваиваем ее переменной _instrument
_instrument = securities.FirstOrDefault(sec => sec.Code == secCode && sec.Type == SecurityTypes.Future);
if (_instrument != null)
{
Console.WriteLine("Инструмент появился.");
trader.RegisterQuotes(_instrument); // запускаем экспорт стакана
if (_portfolio != null && _depth != null && _position != null)
waitHandle.Set();
}
}
};
// подписываемся на событие обновления стакана
trader.QuotesChanged += depths =>
{
if (_depth == null && _instrument != null)
{
_depth = depths.FirstOrDefault(d => d.Security == _instrument);
if (_depth != null)
{
Console.WriteLine("Стакан появился.");
if (_portfolio != null && _position != null)
waitHandle.Set();
}
}
};
// подписываемся на событие появления моих новых сделок
trader.NewMyTrades += myTrades =>
{
foreach (var myTrade in myTrades)
{
var trade = myTrade.Trade;
Console.WriteLine("Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}.", trade.Id, trade.Price, trade.Security.Code, trade.Volume, trade.Time);
}
};
Console.WriteLine("Дожидаемся появления в программе инструмента и портфеля {0}...".Put(account));
// запускаем экспорт по инструментам и портфелям
trader.StartExport();
// дожидаемся появления портфеля и инструмента
waitHandle.WaitOne();
trader.SecuritiesChanged += securities =>
{
// если инструмент хоть раз изменился (по нему пришли актуальные данные)
if (securities.Contains(_instrument))
waitHandle.Set();
};
Console.WriteLine("Дожидаемся обновления данных по инструменту...");
// запускаем обновление по инструменту
trader.RegisterSecurity(_instrument);
waitHandle.WaitOne();
// запоминаем первоначальное значение середины спреда
var totb = _depth.TotalBidsVolume;
var tota = _depth.TotalAsksVolume;
int maxaskv = 0;
int maxbidv = 0;
int maxaskp = 0;
int maxbidp = 0;
var asks = _depth.Asks;
var bids = _depth.Bids;
for (int i = 0; i < 50; i++)
{
if (asks[i].Volume > maxaskv) { maxaskv = (int)asks[i].Volume; maxaskp = (int)asks[i].Price; }
if (bids[i].Volume > maxbidv) { maxbidv = (int)bids[i].Volume; maxbidp = (int)bids[i].Price; }
//Console.WriteLine("asks {0}", asks[i].Price);
//Console.WriteLine("asks {0}", asks[i].Volume);
}
Console.WriteLine("maxask {0}", maxaskv);
Console.WriteLine("maxbid {0}", maxbidv);
if (_instrument.BestBid == null)
throw new Exception("Нет лучшего бида для котировки.");
Console.WriteLine("общий объем bid {0}", totb);
Console.WriteLine("общий объем ask {0}", tota);
// objem = _instrument.OpenInterest;
//Console.WriteLine("открытые позиции {0}", objem);
//Console.WriteLine("asks {0}", asks[0]);
while (true)
{
var objem = _position.CurrentValue;
Console.WriteLine("открытые позиции {0}", objem);
_strategy = new buy();
_strategy.Start();
//Strategy.Start();
/*
// если спред вышел за пределы нашего диапазона
if (totb > tota)
{
var order = new Order
{
Portfolio = _portfolio,
Price = _instrument.ShrinkPrice(_instrument.BestAsk.Price),
Security = _instrument,
Volume = 1,
Direction = OrderDirections.Sell,
};
trader.RegisterOrder(order);
Console.WriteLine("Заявка {0} зарегистрирована.", order.Id);
//break;
}
else
{
var order = new Order
{
Portfolio = _portfolio,
Price = _instrument.ShrinkPrice(_instrument.BestBid.Price),
Security = _instrument,
Volume = 1,
Direction = OrderDirections.Buy,
};
trader.RegisterOrder(order);
Console.WriteLine("Заявка {0} зарегистрирована.", order.Id);
//break;
}
//Console.WriteLine("Текущее значение середины спреда {0:0.##}", _instrument.BestBid.Price + mid);
*/
// ждем 1 секунду
Thread.Sleep(1000);
}
// останавливаем экспорт
trader.StopExport();
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
public class buy : Strategy
{
public override void OpenPosition()
{
var objem = _position.CurrentValue;
if (objem == 0)
{
// создаем заявку для открытия длинной позиции
//var longPos = this.BuyAtMarket();
var longPos = new Order
{
Portfolio = _portfolio,
Price = _instrument.ShrinkPrice(_instrument.BestAsk.Price),
Security = _instrument,
Volume = 1,
Direction = OrderDirections.Sell,
};
// регистрируем правило, отслеживающее появление новых сделок по заявке
this
.When(longPos.NewTrades())
.Do(OnNewOrderTrades)
.Periodical(() => longPos.IsMatched());
// отправляем заявку на регистрацию
RegisterOrder(longPos);
}
}
private void OnNewOrderTrades(IEnumerable<MyTrade> trades)
{
// для каждой сделки добавляем для защитную пару стратегии
var protectiveStrategies = trades.Select(t =>
{
// выставляет тейк-профит в 40 пунктов
var takeProfit = new TakeProfitStrategy(t, 40);
// выставляет стоп-лосс в 20 пунктов
var stopLoss = new StopLossStrategy(t, 20);
return new TakeProfitStopLossStrategy(takeProfit, stopLoss);
});
ChildStrategies.AddRange(protectiveStrategies);
}
}
}
}
|
|
|
|
Спасибо:
|
|
|
|
|
|
vfreeman
|
Дата: 13.01.2012
tmt:
сделал вот так, вроде как должно работать, но ошибка ""SampleSmartConsole.Program.buy.OpenPosition()": не найден метод, пригодный для переопределения"
namespace SampleSmartConsole
{
using System;
using System.Net;
using System.Linq;
using System.Threading;
using System.Collections.Generic;
using Ecng.Collections;
using Ecng.Common;
using StockSharp.BusinessEntities;
using StockSharp.Smart;
using StockSharp.Algo;
using StockSharp.Algo.Strategies;
}
возможно не хватает нужного
```csharp
using XXX;
где собственно и реализован метод OpenPosition
на нечто подобное недавно наступал
|
|
|
|
Спасибо:
|
|
|
|
|