Блог им. 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 на одной и той же выборке.
По основному функционалу все баги давно выловлены. Уже несколько лет торгую — все нормально.
Там правда постоянно что-то новое добавляется. Но туда не лезу, поэтому не знаю глючно ли…
да я понимаю)
Это я из любопытства спросил. Обычно такие простые вещи с очень маленькой средней сделкой — т.е. в реальном мире совершенно не торгуемые. Или торгуемые, но через танцы с бубном
1. метка/название в форме параметров
2. стандартное значение
3-5. значения для оптимизатора: от, до, шаг
Можете на кошках потренироваться или на мне. Я не гурий, но охотно впитаю всё, что вы мне расскажете!
Тех.задания берете на создание робота?