Запись урока: Часть 1 [vk]http://vk.com/video_ext.php?oid=-66674957&id=167888006&hash=825d8ae1bd796058&hd=3[/vk]
Часть 2 [vk]http://vk.com/video_ext.php?oid=-66674957&id=167888010&hash=04c36384a310b279&hd=3[/vk]
Темы занятия:1. Продолжение работы с проектом SimpleTicker: 
- добавление SMA-индикатора; 
 
- работа с шортом и лонгом;
 
- установление направления заявки, определение цены и создание;
2. Рассмотрение примера библиотеки StockSharp - Sample.
3. Подключение к своей программе индикатора SMA, прописанного в StockSharp; тестирование.
Домашнее задание:1. Дописать различные варианты тестов для проекта SimpleTicker
2. Нарисовать иерархию классов под IIndicatorValue
Пример решения домашнего задания:ValueWinnerIndicatorTest.cs:
Code
using SimpleTicker;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Indicators.Trend;
namespace SimpleTickerTest
{
    [TestClass()]
    public class ValueWinnerIndicatorTest
    {
        private SimpleMovingAverage _sma1;
        private SimpleMovingAverage _sma2;
        private ValueWinnerIndicator/*<decimal, decimal>*/ _winner;
        #region Дополнительные атрибуты теста
        // 
        //При написании тестов можно использовать следующие дополнительные атрибуты:
        //
        //ClassInitialize используется для выполнения кода до запуска первого теста в классе
        //[ClassInitialize()]
        //public static void MyClassInitialize(TestContext testContext)
        //{
        //}
        //
        //ClassCleanup используется для выполнения кода после завершения работы всех тестов в классе
        //[ClassCleanup()]
        //public static void MyClassCleanup()
        //{
        //}
        //
        //TestInitialize используется для выполнения кода перед запуском каждого теста
        //[TestInitialize()]
        //public void MyTestInitialize()
        //{
        //}
        //
        //TestCleanup используется для выполнения кода после завершения каждого теста
        //[TestCleanup()]
        //public void MyTestCleanup()
        //{
        //}
        //
        #endregion
        //TestInitialize используется для выполнения кода перед запуском каждого теста
        [TestInitialize()]
        public void MyTestInitialize()
        {
            _sma1 = new SimpleMovingAverage { Length = 2 };
            _sma2 = new SimpleMovingAverage { Length = 3 };
            _winner = new ValueWinnerIndicator/*<decimal, decimal>*/(_sma1, _sma2);
        }
        [TestMethod()]
        public void IsFormedTest()
        {
            Assert.IsFalse(_winner.IsFormed);
            _winner.Process((DecimalIndicatorValue)1m);
            Assert.IsFalse(_winner.IsFormed);
            _winner.Process((DecimalIndicatorValue)2m);
            Assert.IsFalse(_winner.IsFormed);
            _winner.Process((DecimalIndicatorValue)3m);
            Assert.IsTrue(_winner.IsFormed);
        }
        [TestMethod()]
        public void ProcessWhileNotFormedTest()
        {
            IIndicatorValue biv = null;
            biv = _winner.Process((DecimalIndicatorValue)1m);
            Assert.IsFalse(biv.GetValue<bool>());
            biv = _winner.Process((DecimalIndicatorValue)2m);
            Assert.IsFalse(biv.GetValue<bool>());
            biv = _winner.Process((DecimalIndicatorValue)3m);
            Assert.IsFalse(biv.GetValue<bool>());
        }
        [TestMethod()]
        public void Process55012Test()
        {
            _winner.Process((DecimalIndicatorValue)5m);
            _winner.Process((DecimalIndicatorValue)5m);
            _winner.Process((DecimalIndicatorValue)0m);
            // Short = 2.5; Long = 3.3;
            bool firstWinWasCalled = false;
            bool secondWinWasCalled = false;
            bool? winnerChangedWasCalled = null;// Nullable<bool>
            _winner.FirstWin += () => firstWinWasCalled = true;
            _winner.SecondWin += () => secondWinWasCalled = true;
            _winner.WinnerChanged += isFirstWin => winnerChangedWasCalled = isFirstWin;
            IIndicatorValue biv = null;
            biv = _winner.Process((DecimalIndicatorValue)12m);
            Assert.IsTrue(biv.GetValue<bool>());
            // Short = 6; Long = 17/3;
            Assert.IsTrue(firstWinWasCalled);
            Assert.IsFalse(secondWinWasCalled);
            Assert.IsNotNull(winnerChangedWasCalled);
            Assert.IsTrue(winnerChangedWasCalled.Value);
        }
        [TestMethod()]
        public void Process5550Test()
        {
            _winner.Process((DecimalIndicatorValue)5m);
            _winner.Process((DecimalIndicatorValue)5m);
            _winner.Process((DecimalIndicatorValue)5m);
            // Short = 5; Long = 5;
            bool firstWinWasCalled = false;
            bool secondWinWasCalled = false;
            bool? winnerChangedWasCalled = null;// Nullable<bool>
            _winner.FirstWin += () => firstWinWasCalled = true;
            _winner.SecondWin += () => secondWinWasCalled = true;
            _winner.WinnerChanged += isFirstWin => winnerChangedWasCalled = isFirstWin;
            IIndicatorValue biv = null;
            biv = _winner.Process((DecimalIndicatorValue)0m);
            Assert.IsTrue(biv.GetValue<bool>());
            // Short = 2.5; Long = 3.333;
            Assert.IsFalse(firstWinWasCalled);
            Assert.IsTrue(secondWinWasCalled);
            Assert.IsNotNull(winnerChangedWasCalled);
            Assert.IsFalse(winnerChangedWasCalled.Value);
        }
        [TestMethod()]
        public void Process5555Test()
        {
            _winner.Process((DecimalIndicatorValue)5m);
            _winner.Process((DecimalIndicatorValue)5m);
            _winner.Process((DecimalIndicatorValue)5m);
            // Short = 5; Long = 5;
            bool firstWinWasCalled = false;
            bool secondWinWasCalled = false;
            bool? winnerChangedWasCalled = null;// Nullable<bool>
            _winner.FirstWin += () => firstWinWasCalled = true;
            _winner.SecondWin += () => secondWinWasCalled = true;
            _winner.WinnerChanged += isFirstWin => winnerChangedWasCalled = isFirstWin;
            IIndicatorValue biv = null;
            biv = _winner.Process((DecimalIndicatorValue)5m);
            Assert.IsFalse(biv.GetValue<bool>());
            // Short = 5; Long = 5;
            Assert.IsFalse(firstWinWasCalled);
            Assert.IsFalse(secondWinWasCalled);
            Assert.IsNull(winnerChangedWasCalled);
        }
    }
}
 SmaIndicatorTest.cs:
Code
using SimpleTicker;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
namespace SimpleTickerTest
{
    [TestClass()]
    public class SmaIndicatorTest
    {
        #region Дополнительные атрибуты теста
        // 
        //При написании тестов можно использовать следующие дополнительные атрибуты:
        //
        //ClassInitialize используется для выполнения кода до запуска первого теста в классе
        //[ClassInitialize()]
        //public static void MyClassInitialize(TestContext testContext)
        //{
        //}
        //
        //ClassCleanup используется для выполнения кода после завершения работы всех тестов в классе
        //[ClassCleanup()]
        //public static void MyClassCleanup()
        //{
        //}
        //
        //TestInitialize используется для выполнения кода перед запуском каждого теста
        //[TestInitialize()]
        //public void MyTestInitialize()
        //{
        //}
        //
        //TestCleanup используется для выполнения кода после завершения каждого теста
        //[TestCleanup()]
        //public void MyTestCleanup()
        //{
        //}
        //
        #endregion
        [TestMethod()]
        public void AddTestLength2()
        {
            var ind = new SmaIndicator(2);
            Assert.IsFalse(ind.IsFormed);
            ind.Process(1);
            Assert.IsFalse(ind.IsFormed);
            ind.Process(2);
            Assert.IsTrue(ind.IsFormed);
            Assert.AreEqual(1.5m, ind.LastValue);
            ind.Process(5);
            Assert.IsTrue(ind.IsFormed);
            Assert.AreEqual(3.5m, ind.LastValue);
        }
        [TestMethod()]
        public void AddTestLength3()
        {
            var ind = new SmaIndicator(3);
            Assert.IsFalse(ind.IsFormed);
            ind.Process(2);
            Assert.IsFalse(ind.IsFormed);
            ind.Process(2);
            Assert.IsFalse(ind.IsFormed);
            ind.Process(5);
            Assert.IsTrue(ind.IsFormed);
            Assert.AreEqual(3m, ind.LastValue);
            ind.Process(8);
            Assert.IsTrue(ind.IsFormed);
            Assert.AreEqual(5m, ind.LastValue);
        }
    }
}