Запись урока: Часть 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);
}
}
}
ВложенияИсходные коды