Учимся работать в 1b bot PRO.

Дата: 03.09.2014
Интерфейс программы.


Основной интерфейс бота в документации к версии LITE (можно почитать тут).
В версии PRO появилось несколько новых отличий.
Панель запуска бота :

Учимся работать в 1b bot PRO.


Кнопки слева направо:
1. Запуск бота
2. Установка\снятие бота на паузу
3. Остановка бота
4. Выбор валютной пары
5. Редактор встроенной программы-стратегии бота.

Окно отладки переменных (Watch):
Учимся работать в 1b bot PRO.


Окно событий стратегии(Strategy log):
Учимся работать в 1b bot PRO.


Вкладка ORDERS (активные отложенные ордера)

Учимся работать в 1b bot PRO.


и добавился пункт в настройках (Trade options -> Listeners)

Учимся работать в 1b bot PRO.





Алгоритм работы.


Все стратегии для бота 1b bot pro пишутся на языке PASCAL. Если в версии Lite было три таблицы с правилами покупки или продажи, в новой версии это все одна программа.

Описание языка можете почитать тут или тут

Для редактирования стратегий бота желательно пользоваться внешним редактором. Например скачать программу Notepad++ и выставить в ней подсветку синтаксиса Pascal:
Учимся работать в 1b bot PRO.


У любой стратегии для бота версии 1B bot PRO есть единая структура данных программы.
В новой версии за торговлю отвечает предопределенный класс TBaseStrategy. Этот класс имеет несколько предопределенных процедур(список будет расширятся по мере обновлений бота):

ВАЖНО!! Все программы-стратегии начинаются со unit ИМЯ_ФАЙЛА СТРАТЕГИИ; Если имя файла будет отличаться - будет ошибка


ПОСЛЕДНЯЯ ВЕРСИЯ ШАБЛОНА - СТРАТЕГИИ ТУТ


// ТУТ ОПИСАН СТАНДАРТНЫЙ ШАБЛОН СТРУКТУРЫ СТРАТЕГИИ (НАЧАЛЬНЫЙ ВИД)
// это образец, костяк для стратегии

unit code;
// ВНИМАНИЕ! модуль должен называться точно также, как файл, т.е. если файл code.pas - то unit code;

interface

uses Bot_RW, BaseStrategy; 

type
TTradeStrategy = class(TBaseStrategy)
  public
    //тут можно добавить свои переменные
    myVar1 : integer;
    myVar2 : Double;
    procedure OnCreate;override;
    procedure OnDestroy;override;

    procedure CanBuy(var RCanBuy:boolean; var RAmnt, RPrice:Double);override;
    procedure CanSell(var RCanSell:boolean; var RAmnt, RPrice:Double);override;
    procedure CanSellMax(var RCanSellMax:boolean; var RAmnt, RPrice:Double);override;

    procedure OnSaveState(AWriter:IDataWriter);override;
    procedure onloadState(AReader:IDataReader);override;
    procedure OnSendData(AWriter:IDataWriter);override;
    procedure OnWatch(AWriter:IDataWriter);override;

    function CanCancelOrder(const AID:string;const AType:Boolean;const AAmnt,APrice:Double;const ADate:TDateTime):boolean;override;

    procedure OnBuyCompleted(const AAmnt,APrice:double;var RIncome1,RIncome2:Double);override;
    procedure OnSellCompleted(const AAmnt,APrice:double;var RIncome1,RIncome2:Double);override;
    procedure OnProfit(var RIncome1, RIncome2:Double);override;

    procedure OnStart;override;
    procedure OnStop;override;
    procedure OnPause;override;
    procedure OnResume;override;
  end;

implementation

uses Bot_Vars, Bot_Log, Bot_Funcs, Bot_Remote,Bot_Pairs,Bot_Charts,Bot_Orderbook,Bot_Orders,Bot_Parties,Bot_DateTime; //это по потребности


procedure TTradeStrategy.OnCreate();
var i:integer;
begin
  // тут описываем  инициализацию переменных при загрузке бота, например
  myVar1:=GetPairsCnt();

 myVar2:=GetCandleOpen(0);
end;


procedure TTradeStrategy.OnDestroy();
begin
  // выполняется при остановке бота
end;


procedure TTradeStrategy.OnSendData(AWriter:IDataWriter);
begin
  // тут описываем передачу данных другим ботам, например
  AWriter.WriteDouble('buy',currTicker.buy);
end;

procedure TTradeStrategy.CanBuy(var RCanBuy:boolean; var RAmnt, RPrice:Double);
begin
  // тут описываем правила покупки ботом
  //Пример : для покупки 50 единиц валюты по 1.5  
   RCanBuy:=True; RAmnt:=50; RPrice:=1.5;
end;

procedure TTradeStrategy.CanSell(var RCanSell:boolean; var RAmnt, RPrice:Double);
begin
  // тут описываем правила продажи ботом от минимальной к максимальной партии
  //Пример : для продажи 50 единиц валюты по 1.5  
  RCanSell:=True; RAmnt:=50; RPrice:=1.5;
end;

procedure TTradeStrategy.CanSellMax(var RCanSellMax:boolean; var RAmnt, RPrice:Double);
begin
  // тут описываем правила продажи ботом от максимальной к минимальной  партии
  //Пример : для продажи 50 единиц валюты по 1.5  
  RCanSellMax:=True; RAmnt:=50; RPrice:=1.5;
end;

procedure TTradeStrategy.OnSaveState(AWriter:IDataWriter);
begin
  // сохранение состояния при остановке бота, например
  AWriter.WriteDouble('myVar2',myVar2);
end;

procedure TTradeStrategy.onloadState(AReader:IDataReader);
begin
  // восстановление состояния при старте бота, например
  myVar2:=AReader.ReadDouble('myVar2',0.25);
end;

procedure TTradeStrategy.OnWatch(AWriter:IDataWriter);
begin
  // для просмотра значений переменных в окне бота, например
  AWriter.WriteInt('myVar1',myVar1);
  AWriter.WriteDouble('myVar2',myVar2);
  AWriter.WriteDouble('myVars',myVar1+myVar2);
  //смотрим данные другого бота
  //AWriter.WriteDouble('ltc/btc buy',ReadBotDouble('LTCBTC','buy'));
 // AWriter.WriteDouble('ltc/btc sell',ReadBotDouble('LTCBTC','sell'));
end;

function TTradeStrategy.CanCancelOrder(const AID:string;const AType:Boolean;const AAmnt,APrice:Double;const ADate:TDateTime):boolean;override;
begin
  //вызывается для каждого открытого ордера 
  //номер - AID, кол-во AAmnt, цена APrice, дата ордера ADate, тип AType(true=buy, false=sell)
  //по умолчанию: result=true, т.е. ордер сразу отменится 
  //если нужно отменить этот ордер - то вернуть result:=true;
 result:=false; // если убрать эту строку или установить в true то ордера будут автоматически удалятся как в версии LITE
end;

procedure TTradeStrategy.OnBuyCompleted(const AAmnt,
  APrice: double; var RIncome1,RIncome2:Double);
begin
  //вызывается, когда зафиксирована покупка
  //возвращаемые переменные RIncome1,2 - фин. результат операции по обеим валютам пары
  //по умолчанию: RIncome1,2 = 0.000
  //RIncome1:=0.000;
  //RIncome2:=0.000;
end;

procedure TTradeStrategy.OnSellCompleted(const AAmnt,
  APrice: double; var RIncome1,RIncome2:Double);
begin
  //вызывается, когда зафиксирована продажа
  //возвращаемые переменные RIncome1,2 - фин. результат операции по обеим валютам пары
  //по умолчанию: RIncome1=0.000, RIncome2 - расчетная
  //RIncome1:=0.000;
  //RIncome2:=0.000;
end;

procedure TTradeStrategy.OnProfit(var RIncome1, RIncome2: Double);
begin
  //вызывается для отображения фин. результата
  //возвращаемые переменные RIncome1,2 - фин. результат по обеим валютам пары
  //по умолчанию: суммы соотв. Income1, Income2 по строкам торговли
  //RIncome1:=0.000;
  //RIncome2:=0.000;
end;

procedure TTradeStrategy.OnStart();
begin
  //вызывается при начале работы (start)
end;

procedure TTradeStrategy.OnStop();
begin
  //вызывается при остановке работы (stop)
  //например, здесь можно отменить все ордера: cancelAllOrders:=true;
end;

procedure TTradeStrategy.OnPause();
begin
  //вызывается при приостановке работы (pause)
end;

procedure TTradeStrategy.OnResume();
begin
  //вызывается при продолжении работы (resume)
end;

end.



При запуске бота создается экземпляр этого класса. Вам нужно переопределять процедуры под себя.

Описание методов класса :

procedure OnCreate; - вызывается ботом единоразово при запуске.
procedure OnDestroy; - вызывается ботом единоразово при закрытии.

procedure CanBuy(var RCanBuy:boolean; var RAmnt, RPrice:Double); - вызывается вместе с обновлением данных, аналог таблицы покупки в версии Lite (выставляет ордер если RCanBuy = True). Если хотим выставить ордер на покупку - описываем условия в этом методе.
procedure CanSell(var RCanSell:boolean; var RAmnt, RPrice:Double); - вызывается вместе с обновлением данных, аналог таблицы продажи от минимальной партии к максимальной в версии Lite (выставляет ордер если RCanSell = True) Если хотим выставить ордер на продажу со списанием по партиям от минимальной к максимальной - описываем условия в этом методе.
procedure CanSellMax(var RCanSellMax:boolean; var RAmnt, RPrice:Double); - вызывается вместе с обновлением данных, аналог таблицы продажи SELL MAX в версии Lite (выставляет ордер если RCanSellMax = True). Если хотим выставить ордер на продажу со списанием по партиям от максимальной к минимальной - описываем условия в этом методе.

Для межбиржевого и внутрибиржевого арбитража используется следующий метод :

Учимся работать в 1b bot PRO.


procedure OnSendData(); - Процедура для обмена данными с другими ботами PRO. Вызывается по умолчанию каждую секунду.
В настройке каждого бота есть вкладка Listener.
Учимся работать в 1b bot PRO.

В этой вкладке указывается имя текущего бота PRO и имена ботов PRO от которых он будет получать данные.
После установки настроек просто указываете в этой процедуре какие данные ретранслировать.
Пример ( код процедуры на боте LTC/USD передает другим ботам свои цены тикера и расчет цены по биржевому стакану при покупке / продаже на определенный объем) :

procedure TTradeStrategy.OnSendData(AWriter:IDataWriter);
begin
  OneOperationVolume :=ReadBotDouble('BTCLTC', 'OneOperationVolume'); // Считываем объем покупки с бота настроенного на пару BTC/LTC
  AWriter.WriteDouble('buy', OBCalcPriceIfBuy(OneOperationVolume)); // Передаем другим ботам цену по стакану LTC/USD при покупке объема OneOperationVolume
  AWriter.WriteDouble('sell', OBCalcPriceIfSell(OneOperationVolume)); // Передаем другим ботам цену по стакану LTC/USD при продаже объема OneOperationVolume

  AWriter.WriteDouble('buyTicker', currTicker.buy); // передаем другим ботам цену покупки по тикеру  LTC/USD
  AWriter.WriteDouble('sellTicker', currTicker.sell); // передаем другим ботам цену продажи по тикеру

end;



Вы можете писать свои модули и сохранять их в папке Programs. После этого подключать уже свои процедуры и функции через Uses.


ОПИСАНИЕ МОДУЛЕЙ (ФУНКЦИИ И ПЕРЕМЕННЫЕ).

ПРИМЕРЫ


Переведем стратегию PROFIT с Lite на PRO версию.
Разберем когда стратегия говорит боту покупать:

Эта стратегия имеет три правила закупки активные по умолчанию в LITE версии.

1. BUY RULE (собственно правило покупки)


((buyPrice<botMinBuyPrice/1.005)
and
(deltaVolume1m>80)
and
(deltaVolume5m>80)
and
(deltaVolume15m>50))
or
((botFundsCurr1<0.011)
and
(deltaVolume5m>80))


2. PAUSE 2m (пауза между покупками)
minutesbetween(now,botLastBuyTime)>2


В Lite версии при срабатывании правил бот выставляет ордер и если он сразу не сработал то автоматически удаляет его
В Pro версии бот выставляет ордер по команде программы - стратегии и удаляет его также при срабатывании в стратегии.

Рассмотрим те же самые правила покупки в PRO.

За выставление ордера отвечает метод CanBuy:

procedure TTradeStrategy.CanBuy(var RCanBuy:boolean; var RAmnt, RPrice:Double);
begin
if ((currTicker.buy<botInfo.minParty.pPrice/1.005) and  (volStat.sAvg.b1m.delta>80) and (volStat.sAvg.b5m.delta>80) and (volStat.sAvg.b15m.delta>50))
or
((botInfo.c1Amnt<0.011) and (volStat.sAvg.b5m.delta>80)) 
and (minutesbetween(now,botInfo.lastBuyTime)>2) // тут сразу оба правила в одном условии
then
   begin
    RCanBuy:=true;  // При установке этой переменной метода CanBuy в TRUE  бот выставляет ордер на количество RAmnt по цене RPrice
    RAmnt:=botInfo.c2Amnt/10/currTicker.buy;   // определяем количество в ордере  1/10 часть от депозита во второй валюте
    RPrice:=currTicker.buy;           //определяем цену покупки ордера
   end;  
end;


теперь при срабатывании условий покупки программа будет выставлять ордер на покупку .

Рассмотрим условие продажи по умолчанию SELL MAX версии LITE:

(sellPrice/1.01)>=(botFundsCurr1Cost/botFundsCurr1)



в версии PRO это выглядит так (используем метод CanSellMax ):

procedure TTradeStrategy.CanSellMax(var RCanSellMax:boolean; var RAmnt, RPrice:Double);
begin
  if (currTicker.sell/1.01)>=(botInfo.c1Cost/botInfo.c1Amnt) then
    begin
        RCanSellMax:=true;      // При установке этой переменной метода RCanSellMax в TRUE  бот выставляет ордер на количество RAmnt по цене RPrice
        RAmnt:=botInfo.c1Amnt;  // Продаем все ордером
        RPrice:=currTicker.sell;      //определяем цену продажи ордера
    end;
end;


Финальная версия стратегии :

// Стратегия ПРОФИТ от Valeriy 2010 версия для PRO тестовый вариант

unit code;

interface

uses Bot_RW, BaseStrategy; 

type
TTradeStrategy = class(TBaseStrategy)
  public

     procedure CanBuy(var RCanBuy:boolean; var RAmnt, RPrice:Double);override;
     procedure CanSellMax(var RCanSellMax:boolean; var RAmnt, RPrice:Double);override;
     procedure OnWatch(AWriter:IDataWriter);override;
   
    function CanCancelOrder(const AID:string;const AType:Boolean;const AAmnt,APrice:Double;const ADate:TDateTime):boolean;override;
  end;

implementation

uses Bot_Vars, Bot_Log, Bot_Funcs, Bot_Remote,Bot_Pairs,Bot_Charts,Bot_Orderbook,Bot_Orders,Bot_Parties,Bot_DateTime; //это по потребности

procedure TTradeStrategy.CanBuy(var RCanBuy:boolean; var RAmnt, RPrice:Double);
begin
if ((currTicker.buy<botInfo.minParty.pPrice/1.005) and  (volStat.sAvg.b1m.delta>80) and (volStat.sAvg.b5m.delta>80) and (volStat.sAvg.b15m.delta>50))
or
((botInfo.c1Amnt<0.011) and (volStat.sAvg.b5m.delta>80)) 
and (minutesbetween(now,botInfo.lastBuyTime)>2) // тут сразу оба правила в одном условии
then
   begin
    RCanBuy:=true;                   // При установке этой переменной метода CanBuy в TRUE  бот выставляет ордер на количество RAmnt по цене RPrice
    RAmnt:=botInfo.c2Amnt/10/currTicker.buy;               // определяем количество в ордере
    RPrice:=currTicker.buy;                     //определяем цену покупки ордера
   end;  
end;

procedure TTradeStrategy.OnWatch(AWriter:IDataWriter);
begin
  // для просмотра значений переменных в окне бота, например
  
  AWriter.WriteBool('Buy rule',((currTicker.buy<botInfo.minParty.pPrice/1.005) and  (volStat.sAvg.b1m.delta>80) and (volStat.sAvg.b5m.delta>80) and (volStat.sAvg.b15m.delta>50))
or
((botInfo.c1Amnt<0.011) and (volStat.sAvg.b5m.delta>80)) );
  AWriter.WriteBool('Sell MAX',(currTicker.sell/1.01)>=(botInfo.c1Cost/botInfo.c1Amnt) );
  
end;

procedure TTradeStrategy.CanSellMax(var RCanSellMax:boolean; var RAmnt, RPrice:Double);
begin
  if (currTicker.sell/1.01)>=(botInfo.c1Cost/botInfo.c1Amnt) then
   begin
       RCanSellMax:=true;      // При установке этой переменной метода RCanSellMax в TRUE  бот выставляет ордер на количество RAmnt по цене RPrice
       RAmnt:=botInfo.c1Amnt;  // Продаем все ордером
       RPrice:=currTicker.sell;      //определяем цену продажи ордера
   end;
end;



function TTradeStrategy.CanCancelOrder(const AID:string;const AType:Boolean;const AAmnt,APrice:Double;const ADate:TDateTime):boolean;override;
begin
  //вызывается для каждого открытого ордера 
  //номер - AID, кол-во AAmnt, цена APrice, дата ордера ADate, тип AType(true=buy, false=sell)
  //если нужно отменить этот ордер - то вернуть result:=true;
end;




end.


Можно открыть у себя редактор стратегий в PRO и просто вставить этот код.
Учимся работать в 1b bot PRO.


0 комментариев