Давайте представим себе человека, который не умеет торговать от слова «совсем». Пришел на рынок и сразу купил. Или продал. Может, монетку бросил — не важно. Выбор инструментов, тренды-откаты, индикаторы… Неее, ни о чем подобном не слышал.
Вариантов два:
1. пареньку не повезло — обычная история. Рынок пошел не туда. А чего ожидал этот
лошара мальчуган? Или
блондинка девица.
В этом варианте три стандартные возможности: закрыться с убытком, еще купить (усредниться: цена-то интереснее стала), просто сидеть и ждать (авось, цена обратно вернется, хоть в ноль удастся закрыться).
2. случилось невероятное — наш перец оказался везучим и увидел прибыль.
Тут тоже три возможности: зафиксировать прибыль, ничего не делать (авось, цена дальше пойдет), и бредовая: еще купить (вдруг он додумался не на всю котлету сразу закупиться и что-то в загашнике у него еще осталось).
Давайте мыслить позитивно. Пусть наш персонаж будет на этот раз везучим, и он получил-таки прибыль. Однако, он все же торговать не умеет, поэтому он не додумался зафиксировать прибыль, а… что бы поабсурднее-то придумать. А, так он еще купил! Не, он не дожидался отката. Прямо в ночь, на вечерке, на самых хаях по рынку вмазал с диким
проскальзыванием. Ну, вообще не в теме человек… Бывает.
Веселиться, так веселиться… А пусть ему во второй раз повезет и цена еще чуть дальше пойдет. Что должен сделать здравомыслящий человек, когда увидит не просто прибыль, а очень приличную прибыль? Не, это не наш случай. Наш-то опять купил!
В общем, я сокращу тут историю. Он был совсем упоротым и накуренным, поэтому каждый раз покупал и покупал, когда можно было зафиксировать жирную-прежирную прибыль. И получил результаты, указанные ниже.
Тут нет ни
фундаментального анализа рынка, ни технического. Тут вообще ничего нет, кроме прикольного money management, который позволяет вам сократить риски.
Желаете писать роботов в 90 строк кода — изучайте
OsEngine. Чат
алготрейдеров здесь.
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. значения для оптимизатора: от, до, шаг
Можете на кошках потренироваться или на мне. Я не гурий, но охотно впитаю всё, что вы мне расскажете!
Тех.задания берете на создание робота?