Официальный сайт ТелеТрейд

Система автоматической торговли из Квика и Амиброкера

Создание собственной системы автоматической торговли из Квика и Амиброкера

Файл с транзакциями лучше регулярно чистить перед торгами, чтоб лишних тормозов Амиброкеру не навешивать

торговый автомат из Квика и Амиброкера
торговый автомат из Квика и Амиброкера

Имейте в виду что коды бумаг должны быть указаны латинскими буквами поскольку у Амиброкера с русскими проблема.

Создаем где-нибудь папочку куда будет складываться файл для передачи транзакций в квик. Адрес этого файла нужно будет прописать в FileName индикатора. Затем в Амиброкере нажимаем Indicator Builder, создаем новый индикатор нажав Add, называем его как-нибудь по-человечески нажав Rename. Далее кладем в окно редактора следующий текст:

///// TradeBot v.1.1. Последние изменения 6.12.2004 /////

///////// Установки аккаунта ///////////

TickerID=1;         // уникальный для каждого индикатора номер

Ticker="EESR";      // название бумаги в Амиброкере. На другой бумаге работать не будет

TimeFrame=30;       // таймфрейм в минутах. На других таймфреймах работать не будет

Classcode="EQBR";   // код класса бумаги

Seccode="EESR";     // код бумаги

Account="L01-00000000";  // ваш аккаунт на бирже

Client="";        // код клиента

Lots=1;             // сколько лотов желаете торговать

FileName="e:/trading/amibroker/trans.tri"; // слэши прямые!!! имя файла с транзакциями для квика

Otstup=1.5; // в процентах. заявка будет выставлена хуже текущей цены на столько процентов

Point=3; // количество знаков после запятой в цене

////////// Правила системы ///////////////

Амиброкер
Амиброкер

bars=20;

HLine=Ref(HHV(H,bars),-1);

LLine=Ref(LLV(L,bars),-1);

Buy=H>Hline;

Sell=L<LLine;

Short=Sell;

Cover=Buy;

////// Убираем лишние сигналы /////////////

Buy=ExRem(Buy,Sell);

Sell=ExRem(Sell,Buy);

Short=ExRem(Short,Cover);

Cover=ExRem(Cover,Short);

///////////// Рисуем всякое ///////////////

Plot(C,"price",1,128);

PlotShapes(IIf(Buy,shapeUpArrow,0),5,0,Graph0,-15);

PlotShapes(IIf(Sell,shapeDownArrow,0),4,0,Graph0,-15);

PlotShapes(IIf(Cover,shapeHollowUpArrow,0),5,0,Graph0,-15);

PlotShapes(IIf(Short,shapeHollowDownArrow,0),4,0,Graph0,-15);

Квик
Квик

//////////// Формируем транзакцию.//////////////

////////////////////////////////////////////////

//////// !!!!СЮДА РУКАМИ НЕ ЛАЗИТЬ!!!! /////////

////////////////////////////////////////////////

procedure savetrifile(stransid,sstr) {

f=fopen(FileName,"r");

found=0;

if (f) {

while (!feof(f)) {

s=fgets(f);

if (StrFind(s,stransid)>0) {

found=1;

}

}

fclose(f);

}

if (found==0) {

f=fopen(FileName,"a");

if (f) {

fputs(sstr+"\n",f);

fclose(f);

}

}

}

function makeandsave(sOper,sOperID,sprice) {

CCS="";

if (Client!="") { CCS=" CLIENT_CODE="+Client+";"; }

transid=StrFormat("TRANS_ID=%g%g%g%g;",TickerID,sOperID,LastValue(Ref(DayOfYear(),-1)),LastValue(Ref(TimeNum(),-1)));

str=StrFormat(transid+"PRICE=%1."+Point+"f;QUANTITY=%g;OPERATION="+sOper+";CLASSCODE="+Classcode+"; ACTION=NEW_ORDER; TYPE=L; SECCODE="+Seccode+"; ACCOUNT="+Account+";"+CCS,sprice,Lots);

savetrifile(transid,str);

}

if ((Now(3)==LastValue(DateNum()))AND(BarCount>1)AND(Name()==Ticker)AND(TimeFrame==Interval()/60)AND((Buy[BarCount-1]==1)OR(Sell[BarCount-1]==1)OR(Short[BarCount-1]==1)OR(Cover[BarCount-1]==1))) {

ifbuy=IIf(Buy[BarCount-1]==1,1,0); 

TickerID
TickerID

ifsell=IIf(Sell[BarCount-1]==1,1,0); 

ifshort=IIf(Short[BarCount-1]==1,1,0); 

ifcover=IIf(Cover[BarCount-1]==1,1,0);   

if (ifbuy) {

price=(1+Otstup/100)*Close[BarCount-1];

makeandsave("B",1,price);

}

if (ifsell) {

price=(1-Otstup/100)*Close[BarCount-1];

makeandsave("S",2,price);

}

if (ifshort) {

price=(1-Otstup/100)*Close[BarCount-1];

makeandsave("S",3,price);

}

if (ifcover) {

price=(1+Otstup/100)*Close[BarCount-1];

makeandsave("B",4,price);

}

}

//// mehanizator (c) 2004

В установках системы нужно поставить следующие параметры:

TickerID - уникальный номер для каждого индикатора. Если вы собираетесь торговать несколько систем, нужно создавать несколько индикаторов с разными TickerID для каждой системы.

Ticker - название бумаги в базе данных Амиброкера. Если название в этом индикаторе не будет совпадать с названием графика, сигналы отрабатываться не будут. Это сделано чтобы исключить неожиданные моменты в случае необдуманного переключения графика.

Ticker
Ticker

TimeFrame - таймфрейм на котором будет работать система. На других таймфреймах работать не будет. Сделано чтобы исключить неожиданности при смене таймфрейма и при открытии нового окна.

Classcode - код класса бумаги.

Seccode - код бумаги.

Account - номер вашего счета в торговой системе.

Client - код клиента. Если не используется, оставьте пустым.

Lots - количество лотов которые будут указаны в заявке. Для полностью реверсивных систем в заявке будет указано вдвое больше лотов для переворота.

FileName - путь до файла куда будут записываться транзакции для экспорта в квик. Обратите внимание что слэши прямые!!!

Otstup - это лучше не трогать. Заявка будет выставляться на столько процентов хуже текущей цены. Это нужно затем чтобы она была немедленно исполнена по лучшей имеющейся в данный момент на рынке цене, т.е. получаем реализацию "рыночной" заявки.

Point - число знаков после запятой в цене.

В правилах системы пишем систему которую собираемся торговать. Сейчас там стоят правила тренд-следящей реверсивной системы на пробое ценового канала. Если будете писать свое, на выходе правил должны быть сигналы Buy, Sell, Short, Cover. Если в шорт играть не собираетесь, поставьте Short=0;Cover=0;

Все, нажав Apply вы прицепите к графику окошко в котором будут рисоваться графики и стрелочки системы. В момент появления сигнала в файл будет записываться команда транзакции. Теперь идем в Квик, открываем Дилер/Загружать транзакции динамически из файла и в строке "Файл с исходными данными о транзакциях" прописываем адрес этого файла. Можно начинать импорт транзакций.

Если вы собираетесь торговать одновременно несколько систем, нужно для каждой из них создать отдельный индикатор с разными TickerID. Затем создаете в Амиброкере столько окон сколько у вас бумаг, в каждое окно загружаете соответствующий график. Потом в каждое окно добавляете соответствующий индикатор. Если есть несколько систем на одну бумагу, можно к одному графику цеплять несколько индикаторов, а можно создавать отдельное окно с одним и тем же графиком для каждого индикатора - как вам удобнее.

Не забудьте что в момент запуска система не знает о том в позиции вы или нет. Если начать работу между сигналами покупки и продажи следующим сигналом будет продажа вашей несуществующей позиции, в результате вы получите внезапный шорт.

Файл с транзакциями лучше регулярно чистить перед торгами, чтоб лишних тормозов Амиброкеру не навешивать. Вообще последовательность работы рекомендую такую: перед началом торгов настраиваем системы при необходимости чтобы ничего не трогать во время торгов, чистим файл с транзакциями и запускаем импорт транзакций в квике. После этого лучше ничего не менять и не трогать. Запомните первую за

таймфрейм
таймфрейм

поведь программиста: РАБОТАЕТ - НЕ ТРОГАЙ!!! :)

И напоследок самое главное. Автор не несет ответственности за результаты использования этого индикатора. Используйте его на свой страх и риск.

Удачных трейдов :)

Добавление: отслежена проблема с пропадающими сигналами.

Дело в том, что метастоковский файлсервер скидывает данные в базу через какие-то промежутки времени. Если метастоковский файл тиковый, то сразу, а если минутный, то промежуток между скидыванием новых баров может быть НЕСКОЛЬКО МИНУТ. Соответственно когда амиброкер обновляет график, промежутки между обновлениями могут достигать нескольких минут, если соответствующий файл метастока не тиковый. Так как скрипт смотрит сигнал по последнему бару, если график у вас минутный и пришло несколько минутных баров, скрипт отрабатывает только сигнал на последнем баре, а если сигнал случился ранее, он не проходит.

Резюме.

Файл метастока должен быть меньшего таймфрейма, чем таймфрейм графика в амиброкере. Если таймфрейм у вас минутный, то соответствующий файл метастока должен быть тиковым и т.д.