Romoti
Зарегистрирован: 07.06.2008
Сообщения: 17
Откуда: Екатеринбург
|
Робот под КВИК для любителей рисования, на базе кода Механизатора (окно с АМИ должно быть обязательно открыто иначе сигналы в tri не пишутся), т.к. вроде код с рисованными линиями в АА не запихивается.
Создаем индикатор и запихиваем в него код :
Код: |
//// TradeBot v.1.1. Последние изменения 29.09.2009 /////
///////// Установки аккаунта =======================================================================================================================
TickerID=1; // уникальный для каждого индикатора номер
Ticker="SBER"; // название бумаги в Амиброкере. На другой бумаге работать не будет
TimeFrame=5; // таймфрейм в минутах. На других таймфреймах работать не будет
Classcode="EQBR"; // код класса бумаги
Seccode="SBER03"; // код бумаги
Account="L00-00000000"; // ваш аккаунт на бирже
Client="00000"; // код клиента
Lots=Param("количество лотов",1,0,1000,1); // сколько лотов желаете торговать
FileName="F:/Program Files/trans.tri"; // слэши прямые!!! имя файла с транзакциями для квика F:\Program Files\trans.tri
Otstup=0.4; // в процентах. заявка будет выставлена хуже текущей цены на столько процентов
Point=2; // количество знаков после запятой в цене
Lot = Prec(12500/Close,0); // здесь можно указать свой капиталл, чтобы высчитывалось количество доступных лотов (сейчас это -> 12500)
//Покупка-продажа вручную ==========================================================================================================================
triggerBay = ParamTrigger("купить", "Нажмите кнопку, чтобы купить");
if( triggerBay ) { PopupWindow( "КУПЛЕНО", "Ami сказал", timeout = 1, left = -1, top = -1 ); }
triggerSel = ParamTrigger("продать", "Нажмите кнопку, чтобы продать");
if( triggerSel ) { PopupWindow( "ПРОДАНО", "Ami сказал", timeout = 1, left = -1, top = -1 ); }
//сигналы на пересечении линии =====================================================================================================================
up = Study("UP", GetChartID());
dn = Study("DN", GetChartID());
st = Study("ST", GetChartID());
////////// Правила системы ==========================================================================================================================
Buy = L < dn AND H > dn AND st<dn ;
Sell = H > up OR L < st ;
Short = H > up AND L < up AND st>up ;
Cover = L < dn OR H > st ;
//определяем передавать сигнал или нет ==============================================================================================================
if (ParamToggle("выводить сигналы в tri ?", "No|Yes" )) //выбираем выводить сигналы в tri или нет
triggerBot = 1;
else
triggerBot = 0;
////// Убираем лишние сигналы =======================================================================================================================
Buy=ExRem(Buy ,Sell) OR triggerBay;
Sell=ExRem(Sell,Buy);
Short=ExRem(Short ,Cover) OR triggerSel;
Cover=ExRem(Cover,Short);
// Титры. ===========================================================================================================================================
Title = "Бот по рисованным линиям \n\n"+
"Возможно лотов : "+Lot+"\n"+
"Фактически лотов : "+Lots+"\n"+
"Up: "+Up+"\n"+
"Dn: "+Dn+"\n"+
"St: "+St+"\n\n"+
"High: "+H+"\n"+
"Low: "+L+"\n"+
"Open: "+O+"\n"+
"Close: "+C;
///////////// Рисуем всякое ========================================================================================================================
Plot(C,"price",1,128);
PlotShapes((H > up) *shapeHollowSmallCircle , colorBlue,0,H,17); // рисуем точки на пробоях
PlotShapes((L < dn)*shapeHollowSmallCircle , colorRed, 0, L,-17); // рисуем точки на пробоях
PlotShapes(IIf(Buy,shapeUpArrow,shapeNone),colorGreen,0,L,-10);
PlotShapes(IIf(Sell,shapeDownArrow,shapeNone),colorRed,0,H,-25);
PlotShapes(IIf(Short, shapeHollowDownArrow,shapeNone),colorRed,0,H,-10);
PlotShapes(IIf(Cover,shapeHollowUpArrow,shapeNone),colorGreen,0,L,-25);
if (triggerBot == 0)//выбираем выводить сигналы в tri или нет=======================================================================================
{
Buy = Sell = Short = Cover = 0;
FazaText = "PAUSE !!!";
}
else
FazaText = "---->--->";
//подписываем состояние на последнем баре, переданное в tri ==========================================================================================
EndNum = BarCount-1;
if (Buy[EndNum]==1)
FazaText = "Buy";//
if (Sell[EndNum]==1)
FazaText = "Sell";//
if (Short[EndNum]==1)
FazaText = "Short";//
if (Cover[EndNum]==1)
FazaText = "Cover";//
if (Buy[EndNum] + Sell[EndNum]+ Short[EndNum] + Cover[EndNum] > 1)
FazaText = "???";//
GfxSetOverlayMode(1);
GfxSelectFont("Tahoma", Status("pxheight")/20);
GfxSetTextAlign( 0 | 24 );// по вертикали
GfxSetTextColor( ColorRGB( 230, 230, 230 ) );
GfxSetBkMode(1); // TRANSPARENT = 1 OPAQUE = 2
GfxTextOut( FazaText, Status("pxwidth")/1.3, Status("pxheight")/14 ); // GfxTextOut( ''text'', x, y )
//////////// Формируем транзакцию.//////////////=====================================================================================================
////////////////////////////////////////////////=====================================================================================================
//////// !!!!СЮДА РУКАМИ НЕ ЛАЗИТЬ!!!! /////////=====================================================================================================
////////////////////////////////////////////////=====================================================================================================
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);
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, http://www.russian-trader.ru |
Кидаем код на график и в окне с графиком цены надо вручную нарисовать линиии от которых робот будет торговать:
стоп-линию (в свойствах указать ST)
верхнюю (в свойствах указать UP)
нижнюю (в свойствах укзать DN как на примере)
Также в свойствах можно указать "расширение вправо", чтобы линия автоматически продлялась за правую границу, т.к. если линия не будет отрисована в какой то момент, сигналы задаваемые ей перестанут генерироваться (кому интересно поэксперементируйте). Также конструкции не всегда нравится, когда линии начинаются на предыдущем дне а заканчиваются на сегодняшнем(начинают неправильно рисоваться стрелки), поэтому линии приходится перетаскивать на текущий день, впрочем коридор все равно надо переодически настраивать.
В результате должно получиться примерно так (в открытом окошке настройки для линии DN):
Порядок работы:
перетаскиваем линии на текущий день Up -сверху, DN - ниже, ST- если хотим торговать вверх под обоими линиями, если вниз- над ними. Робот торгует только в одну сторону, естесственно в напрвлении глобальной тенденции, как ее определить придумайте сами, , естесственно если цена пойдет против вас ,при достижении ST-линии позиция будет закрыта.
когда все красиво, жмем правой кнопкой на графике и в открывшемся окне "параметры" настраиваем необходимое количество торгуемых лотов и нажимаем кнопку "выводить сигнал в tri" после этого все вновь сформировавшиеся сигналы начнут записываться в tri. При этом в правом верхнем углу отображается текущее состояние системы на последнем баре. Также чтобы убедиться, что все работает можно нажат кнопки купить/продать, чтобы убедиться, что все работатет и сигналы пишутся. Если кнопка "выводить сигнал в tri" не нажата НИКАКИЕ сигналы не пишутся в том числе и "ручные", это сделано для того, чтобы в течении дня можно было безболезнеенно отключать вывод сигналов и подстраивать линии. |
_________________ Romoti.
Последний раз редактировалось: Romoti (Ср Сен 30, 2009 7:52 pm), всего редактировалось 7 раз(а) |
|