Блог им. robotrade


using System.Collections.Generic;
using OsEngine.Entity;
using OsEngine.OsTrader.Panels;
using OsEngine.OsTrader.Panels.Tab;
namespace OsEngine.Robots.Trend
{
public class MyTrend : BotPanel
{
public MyTrend(string name, StartProgram startProgram) : base(name, startProgram)
{
TabCreate(BotTabType.Simple);
_tab = TabsSimple[0];
_tab.CandleFinishedEvent += _tab_CandleFinishedEvent;
Percentage = CreateParameter("Percentage", 0.2m, 0.1m, 3, 0.1m);
}
public StrategyParameterDecimal Percentage; // процент от цены, через который мы пирамидимся
private BotTabSimple _tab;
decimal LastPrice = 0; // цена последней сделки
Direction CurDirection = Direction.None; // текущее направление торговли
public enum Direction
{
None = 0, Up = 1, Down = -1
}
public override string GetNameStrategyType()
{
return "MyTrend";
}
public override void ShowIndividualSettingsDialog()
{
}
private void _tab_CandleFinishedEvent(List candles)
{
List positions = _tab.PositionsOpenAll;
if (positions.Count == 0)
{
if (CurDirection != Direction.Up) // в первый раз вообще пофиг, куда и когда открываться - сразу покупаем, если позиций нет
{
_tab.BuyAtMarket(1);
CurDirection = Direction.Up;
LastPrice = _tab.PriceBestAsk;
}
else
{
_tab.SellAtMarket(1);
CurDirection = Direction.Down;
LastPrice = _tab.PriceBestBid;
}
return;
}
// здесь уже точно есть поза - проверяем направление и цену
if (CurDirection == Direction.Up && (_tab.PriceBestAsk - LastPrice) / LastPrice * 100 > Percentage.ValueDecimal)
{ // добавляем лонг - пирамидимся
_tab.BuyAtMarket(1);
LastPrice = _tab.PriceBestAsk;
return;
}
else if (CurDirection == Direction.Down && (LastPrice - _tab.PriceBestBid) / LastPrice * 100 > Percentage.ValueDecimal)
{ // добавляем шорт - пирамидимся
_tab.SellAtMarket(1);
LastPrice = _tab.PriceBestBid;
return;
}
if ((CurDirection == Direction.Up && (LastPrice - _tab.PriceBestAsk) / LastPrice * 100 > Percentage.ValueDecimal)
|| (CurDirection == Direction.Down && (_tab.PriceBestBid - LastPrice) / LastPrice * 100 > Percentage.ValueDecimal))
{ // поехали против тренда - кроем всё
//_tab.CloseAllAtMarket(); -- не срабатывает корректно почему-то: не закрывает все на одной свече
foreach (Position p in positions)
{
if (p.State == PositionStateType.Open)
{
_tab.CloseAtMarket(p, p.OpenVolume);
}
}
}
} // _tab_CandleFinishedEvent()
}
}
вы пользуетесь.
пользуйтесь тогда голубями.
и сделки тоже письмами брокеру отправляйте.
так нет терминалом пользуетесь.
и автоматизацию ругаете.
напоминает феминистку которая пользуется всем что создано мужчинами вокруг (придумано и реализовано).
и называет мужиков козлами.
Тесты сами сделайте. Исходник выложен.
Я не оптимизировал ничего. Картинки — по двум разным Percentage на одной и той же выборке.
По основному функционалу все баги давно выловлены. Уже несколько лет торгую — все нормально.
Там правда постоянно что-то новое добавляется. Но туда не лезу, поэтому не знаю глючно ли…
да я понимаю)
Это я из любопытства спросил. Обычно такие простые вещи с очень маленькой средней сделкой — т.е. в реальном мире совершенно не торгуемые. Или торгуемые, но через танцы с бубном
Percentage = CreateParameter("Percentage", 0.2m, 0.1m, 3, 0.1m);что за параметры 0.2m, 0.1m, 3, 0.1m?1. метка/название в форме параметров
2. стандартное значение
3-5. значения для оптимизатора: от, до, шаг
Можете на кошках потренироваться или на мне. Я не гурий, но охотно впитаю всё, что вы мне расскажете!
Тех.задания берете на создание робота?