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

  • Автор темы mehanizator1
  • Дата начала

empenoso

New member
так и не должен. автомат пишет в файл только сигналы, явно описанные в условиях Buy, Sell, Short, Cover.
Пришлось разбираться самому :)
Для того, чтобы писал необходимо добавить в проверку и запись по условию не только 1 (выход по правилам системы), но и, в моем случае, 4 (скользящий стоп (трейлинг) ) и все работает.

Но с корректной текущей чистой позицией что-то не могу разобраться...
 

SV

New member
Trans2Quik + Amibroker

Кто нибудь пытался прицепить АПИ Квика по отправке транзакций к Амиброкеру???
Подскажите как это можно реализовать? или хотяб в каком направлении копать?
 

Baldimkaz

New member
Пока осилил треть темы и концовку.
Описываемый алгоритм подключения АМИброкера к Квику делается через посредника Метасток, который сам не всегда правильно складывает(датирует) поступающие в него рыночные данные.
Амиброкер позволяет получать рыночные данные из Квика, что позволяет избавиться от Метастока в данной связке.

Всегда работал с Метастоком, но тут для уже реальной связки решил перейти на АМИброкера. Будет ли работать корректно обсуждаемый тут способ связки, если выкинуть Метасток?
Просто статья 2004 года, возможно тогда не было способа получать реалтайм данные из квика напрямую.

Попробовать пока не могу, жду аккаунта квика.

Заранее благодарен за ответ.
 

Baldimkaz

New member
Спасибо!
а в связи с чем изначально был выбран способ брать реалтайм котировки именно через метасток?

есть (были?) какие-то грабли при передаче реалтайм котировок непосредственно из квика в амиброкер?
 

mehanizator1

New member
Спасибо!
а в связи с чем изначально был выбран способ брать реалтайм котировки именно через метасток?

есть (были?) какие-то грабли при передаче реалтайм котировок непосредственно из квика в амиброкер?
возможность непосредственной передачи появилась только год назад.
 
Вот составляю первый свой Робокоп!

Скелет МТСа:
1) Создать базу за полгода (взять с финама) и добавить в Амиброкер;
2) Составить Робота с помощью Амиброкера, используя индикатор Ишимоку;
3) Протестировать;
4) Запустить Квик и натравить туда Робота.

Вот посмотрите содержимое robocop.afl:

Что можно добавить? Я только начинаю вникать в данный язык программирования...


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

TimeFrame = 300; // таймфрейм в секундах.
Account = "plusadinquik"; // ваш аккаунт на бирже
Client = "59946"; // код клиента
Lots = 1; // сколько лотов желаете торговать
Otstup = 2; // в процентах. Заявка будет выставлена хуже текущей цены на столько процентов
FileName = "K:/quik/quik__/trans.tri"; // слэши прямые!!! имя файла с транзакциями для квика
dir = 0;


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



// ICHIMOKU CHART //

n1 = Param("Ишимоку: период 1",9,1,200,1);
n2 = Param("Ишимоку: период 2",26,1,400,1);
n3 = Param("Ишимоку: период 3",40,1,600,1);

TenkanSen =(HHV(H,n1)+LLV(L,n1))/2; // Tenkan-sen (Тенкан-сен) – это среднее значение цены за первый промежуток времени (равна (high+low)/2, где high и low – максимум и минимум за период).
KijunSen =(HHV(H,n2)+LLV(L,n2))/2; // Kijun-sen (Киджун-сен) – это среднее значение цены за второй промежуток.
ChinkouSpan =Ref(C,-n2); // Chinkou Span (Чикоу спен) - цена закрытия текущего бара, сдвинутая назад на величину второго временного интервала.
Cks = Close; // Графический Chinkou Span, сдвиг назад засчет отрисовки.
SenkouSpanA =Ref((KijunSen+TenkanSen)/2,-n2); // Senkou Span A (Сенкоу спен А) / Up Kumo - середина расстояния между Tenkan-sen и Kijun-sen, сдвинутое вперед на величину второго временного интервала.
SpA =(KijunSen+TenkanSen)/2; // Графический Senkou Span A , сдвиг вперед засчет отрисовки.
SenkouSpanB =Ref((HHV(H,n3)+LLV(L,n3))/2,-n2); // Senkou Span B (Сенкоу спен В) / Down Kumo - среднее значение цены за третий временной интервал, сдвинутое вперед на величину второго временного интервала.
SpB =(HHV(H,n3)+LLV(L,n3))/2; // Графический Senkou Span B, сдвиг вперед засчет отрисовки.

Cond1 = Ref(Close > Max(SenkouSpanA,SenkouSpanB),-1); //цена выше облака -- бычье настроение
Cond2 = Ref(Close < Min(SenkouSpanA,SenkouSpanB),-1); //цена ниже облака -- медвежье настроение
Cond3 = Ref(Cross(TenkanSen,KijunSen),-1); //пересечение Тенкан и Киджун -- сигнал на покупку
Cond4 = Ref(Cross(KijunSen,TenkanSen),-1); //пересечение Тенкан и Киджун -- сигнал на продажу
Cond5 = Ref(Cross(Close,ChinkouSpan ),-1); //пересечение Чикоу и цены
Cond6 = Ref(Cross(ChinkouSpan ,Close),-1); //пересечение Чикоу и цены
Cond7 = Ref(Cross (Close , Max(SenkouSpanA,SenkouSpanB)),-1); //цена выходит вверх из облака -- сигнал на покупку
Cond8 = Ref(Cross ( Min(SenkouSpanA,SenkouSpanB), Close),-1); //цена выходит вниз из облака -- сигнал на продажу
Cond9 = Close > TenkanSen AND TenkanSen > KijunSen AND KijunSen > Max(SenkouSpanA,SenkouSpanB); // сигнал трех линий вверх
Cond10= Close < TenkanSen AND TenkanSen < KijunSen AND KijunSen < Min(SenkouSpanA,SenkouSpanB); // сигнал трех линий вниз
RemCond9=ExRem(Cond9,NOT Cond9);
RemCond10=ExRem(Cond10,NOT Cond10);

ColSenk =IIf (Cond1,colorGreen, IIf(Cond2,colorRed,colorLightGrey)); // задает цвет, если цена выше/ниже/внутри облака.
Flat = TenkanSen == Ref(TenkanSen,-1) OR (NOT(Cond1) AND NOT(Cond2)) ;

for( i = 0; i < BarCount; i++ ) //раскрашивает среднюю линию индикатора по взаиморасположению и направления движения TenkanSen, цены и облака.
{
if (Flat)
ColTenk = colorLightGrey;
else
{
if (Cond1 AND TenkanSen > TenkanSen[i-1])
ColTenk = colorGreen;
if (Cond1 AND TenkanSen < TenkanSen[i-1])
ColTenk = colorRed;
if (Cond2 AND TenkanSen < TenkanSen[i-1])
ColTenk = colorRed;
if (Cond2 AND TenkanSen > TenkanSen[i-1])
ColTenk = colorGreen;
}
}

AlertIf( Cond3 OR Cond4, "SOUND c:/WINDOWS/Media/notify.wav", "пересечение Тенкан и Киджун",0,1+2+4+8 );
AlertIf( Cond5 OR Cond6, "SOUND c:/WINDOWS/Media/notify.wav", "пересечение Чикоу и цены",0,1+2+4+8 );
AlertIf( Cond7 OR Cond8, "SOUND c:/WINDOWS/Media/notify.wav", "цена выходит из облака",0,1+2+4+8 );
AlertIf( RemCond9 OR RemCond10, "SOUND c:/WINDOWS/Media/notify.wav", "сигнал трех линий",0,1+2+4+8 );

PlotShapes(IIf(Cond7, shapeSmallUpTriangle ,shapeNone),colorGreen,0,H,10);
PlotShapes(IIf(Cond8, shapeSmallDownTriangle ,shapeNone),colorRed,0,L,10);
PlotShapes(IIf(Cond3, shapeHollowSmallUpTriangle,shapeNone),colorGreen,0,H,12);
PlotShapes(IIf(Cond4, shapeHollowSmallDownTriangle ,shapeNone),colorRed,0,L,12);
PlotShapes(IIf(Cond5, shapeSmallCircle ,shapeNone),colorGreen,0,H,4);
PlotShapes(IIf(Cond6, shapeSmallCircle + shapePositionAbove ,shapeNone),colorRed,0,L,4);
PlotShapes(IIf(RemCond9 , shapeHollowSquare ,shapeNone),colorGreen,0,H,18 );
PlotShapes(IIf(RemCond10, shapeHollowSquare + shapePositionAbove ,shapeNone),colorRed,0,L,18 );

//Plot (C,"Close",colorBlack,styleThick);
Plot (C,"Bars",colorBlack,styleCandle);
Plot (TenkanSen,"Tenkan-sen",colorRed);
Plot (KijunSen, "Kijun-sen", colorBlue);
Plot (Cks,"Chinkou Span",colorLime, style = styleLine,0,0,-n2);
Plot (SpA,"SenkouSpanA",colorOrange,styleDashed,0,0,n2);
Plot (SpB,"SenkouSpanB",colorViolet,styleDashed + styleThick,0,0,n2);
PlotOHLC (SpA,SpA,SpB,SpB,"Cloud",IIf (SpA > SpB,colorPink,colorLavender),styleCloud, 10, 10, n2 );

// Горизонтальная цветная индикаторная полоса (пример).

Plot( 1, "Ribbon", ColTenk, styleOwnScale|styleArea|styleNoLabel, -2, 200 ); // индицирует флэт на TenkanSen.
Plot( 4, "Ribbon", ColSenk, styleOwnScale|styleArea|styleNoLabel, -1, 200 ); // индицирует положение цены относительно облака





//////////// Формируем транзакцию.//////////////
////////////////////////////////////////////////
//////// !!!!СЮДА РУКАМИ НЕ ЛАЗИТЬ!!!! /////////
////////////////////////////////////////////////

Classcode = GroupID(1);
if(TickSize == 0)
{
PopupWindow( "Не задан размер тика значение TickSize", "ошибка", timeout = 5, left = -1, top = -1 );
}
else
{
Otstup = round(LastValue(C)*Otstup/100/TickSize)*TickSize;
form = (1 + 0.1 * abs(floor(IIf(log10(TickSize)>0, 0, log10(TickSize)))));
}

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 (NOT found)
{
f = fopen(FileName, "a");
if(f)
{
fputs(sstr+"\n",f);
fclose(f);
}
}
}


function makeandsave(sOper, sprice)
{
CCS="";
if (Client != "") CCS="CLIENT_CODE="+Client+";";

transid = "TRANS_ID=" +FullName()+LastValue(TimeNum())+dir+"; ";

str = transid +
"PRICE=" +NumToStr(sprice, format = form, separator=False)+"; " +
"QUANTITY=" +NumToStr(Lots, format = form)+"; "+
"OPERATION=" +sOper+"; "+
"CLASSCODE=" +Classcode+"; "+
"ACTION=" +"NEW_ORDER; "+
"TYPE=" +"L; "+
"SECCODE=" +Name()+"; "+
"ACCOUNT=" +Account+"; "+
CCS;

savetrifile(transid, str);
}

if (TimeFrame == Interval() & FullName() != "")
{
if(Buy)
{
price = Close[BarCount-1] + Otstup;
dir = "1";
makeandsave("B", price);
}
if(Sell)
{
price = Close[BarCount-1] - Otstup;
dir = "2";
makeandsave("S", price);
}
if(Short)
{
price = Close[BarCount-1] - Otstup;
dir = "3";
makeandsave("S", price);
}
if(Cover)
{
price = Close[BarCount-1] + Otstup;
dir = "4";
makeandsave("B", price);
}

}
else if (TimeFrame != Interval())
PopupWindow( "Не соответствует временной интервал в настройках АА и в коде",
"ошибка", timeout = 5, left = -1, top = -1 );
else
PopupWindow( "Не задан двузначный номер в поле FullName", "ошибка", timeout = 15, left = -1, top = -1 );

//// mehanizator (c) 2004, http://www.russian-trader.ru
//// 000 (c) 2008, http://www.amisite.ru

/// код от roboti (amisite.ru)



п.с. в Системе нету Купли/Продажи, откупа...
как реализовать??
п.с.2 где мне назначить значение для переменной FullName ??
 

Commenced

New member
Вот составляю первый свой Робокоп!

Скелет МТСа:
1) Создать базу за полгода (взять с финама) и добавить в Амиброкер;
2) Составить Робота с помощью Амиброкера, используя индикатор Ишимоку;
3) Протестировать;
4) Запустить Квик и натравить туда Робота.

Вот посмотрите содержимое robocop.afl:

Что можно добавить? Я только начинаю вникать в данный язык программирования...
:)))))))))))

Это типа чуваки, мне в лом как всем читать форумы, разжуйте мне пожалуста и в рот положите. Лично я за тебя работать ненамерен. А сейчас я вижу что ты мозг не включал, форум что меховский, что тот где робота брал не читал, так с какого тебе ктото должен помогать если ты сам ничего не делаеш????
 
:)))))))))))

Это типа чуваки, мне в лом как всем читать форумы, разжуйте мне пожалуста и в рот положите. Лично я за тебя работать ненамерен. А сейчас я вижу что ты мозг не включал, форум что меховский, что тот где робота брал не читал, так с какого тебе ктото должен помогать если ты сам ничего не делаеш????
в форумах нету информации про ишимоку.
была бы книга как "Самообучение" и т.д. было бы куда лучше.
Просто прошу помочь в связке двух кодов (ишимоку и меховская "кидалка" заявок в квик с помощью три-файла).
Хоть какие то первые шаги..
:)
 

Commenced

New member
в форумах нету информации про ишимоку.
была бы книга как "Самообучение" и т.д. было бы куда лучше.
Просто прошу помочь в связке двух кодов (ишимоку и меховская "кидалка" заявок в квик с помощью три-файла).
Хоть какие то первые шаги..
:)
Для получения рабочего робота надо иметь робота для отправка заявок и системукоторая будет генерировать сигналы, ты засунул индикатор, он ничего не генерирует, а просто отображает на графике линии и значки.
 
Для получения рабочего робота надо иметь робота для отправка заявок и системукоторая будет генерировать сигналы, ты засунул индикатор, он ничего не генерирует, а просто отображает на графике линии и значки.
все понял, спасибо..

пока тестирую с меховским первоначальным индикатором.

надо систему замутить )))
 

SV

New member
Re: Trans2Quik + Amibroker

Кто нибудь пытался прицепить АПИ Квика по отправке транзакций к Амиброкеру???
Подскажите как это можно реализовать? или хотяб в каком направлении копать?
Сам себе отвечу :)
могет кому еще пригодится

ответ тут
 

st

New member
Для получения рабочего робота надо иметь робота для отправка заявок ...
а потом еще добавить систему контоля исполнения, полного и частичного, механизм двигания заявок, с учетом возможного частичного исполнения входа, котроля соответвия текущей позы торгуемой стратегии, учет финансового результата. + проверка не отвалился ли инет или лег брокер. так что +1, предстоит еще много чудесных минут роботостроительства. :)
 

Commenced

New member
Код:
а потом еще добавить систему контоля исполнения, полного и частичного, механизм двигания заявок, с учетом возможного частичного исполнения входа
Робот исполняет рыночную заявку, пунк отступ позволяет ухудшить заявку по сравнению с последней сделкой на рынке, так что необходимость контроля отпадает.

Код:
котроля соответвия текущей позы торгуемой стратегии,
Не совсем понял о чем вы, поза не может не соответствовать, только если вы сами не встанете в левую позу. :)

Код:
учет финансового результата.
А результат можно посмотреть в квике в конце рабочего дня, можно написать в экселе простенькуб прогу и заносить результат туда, зачем нагружать робот лишними примочками.

Код:
 + проверка не отвалился ли инет
Если отвалиться интернет, робот вам не поможет, СМС отправить можно только при работающем инете. В случае если вы находитесь рядом, сигнал об обрыве связи подаст квик сообщением, при желании звуковым.

Код:
Предстоит еще много чудесных минут роботостроительства. :)
:)
 

Torino

New member
Добрый день!
Пытаюсь сделать МТС из связки QUIk + Amibroker.
Без Омеги.
За основу взял эту статью russian-trader.ru/articles/automate.php .
Удалось прикрутить QUIK к Ами (правда коряво, экспортируются не все данные, но делаю скидку на то, что сейчас вечер, завтра в рабочую сессию еще раз проверю).

Теперь в соответствии со статьей надо "в Амиброкере нажимаем Indicator Builder, создаем новый индикатор нажав Add, называем его как-нибудь по-человечески нажав Rename. Далее кладем в окно редактора следующий текст:".

Вот тут первая загвоздка: не могу найти кнопку Indicator Builder.

Просьба помочь в этом вопросе.
Версия Ами: 5.20.0 от 26.11.2008
 

Tim

New member
Всем доброй ночи,

Установил Ами 4.50.9,
импортировал часовые котиры Si - контракт на доллар, за 02.08-02.09,
Создал правило на пробитие Price Channel:

Top = Ref(HHV(H, 21), -1);
Bot = Ref(LLV(L, 21), -1);
Mid = (Top+Bot)/2;

Buy = Cross(C, Top);
/* покупка когда цена закрытия пересекает верхнюю линию ценового канала снизу вверх */
Sell = Cross(Mid, C);
/* продажа когда цена закрытия пересекает среднюю линию ценового канала сверху вниз */


Нажимаю Individual BackTest - пустая таблица,
нажимаю Scan - выдает таблицу сделок.

И отчёт создать не получается.
Что я не так делаю? Почему индикатор Equity тоже сплошная линия на одном уровне?
В хелпах ничего путного не нашёл.
 
Your email address will not be publicly visible. We will only use it to contact you to confirm your post.
Сверху