Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 Робот для Квика через API Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
BFG



Зарегистрирован: 17.03.2014
Сообщения: 17

СообщениеДобавлено: Вт Апр 15, 2014 9:30 am Ответить с цитатой Вернуться к началу

Спасибо! Smile

Я сам не прогреммер, но по аналогии внес изменения в твой код доливки, в целях экономии твоего времени выделил жирным то, что я поменял, посмотри плиз при возможности:

Код:
Filter = 1;
TimeFrame      = 60*15;            // таймфрейм в секундах.
Account      = "NL0011100043";      // Номер счета
Client_Code   = "38000";            // Код Клиента
Quik         = "C:\\QUIK";         // путь к Квику
Tickers = "LKOH,SBER";             // торгуемые символы через запятую без пробелов. Для контроля ошибок. Так, как они называются в Ами
/////////////

///////////////
// задаем размер лотов, коды и отступ для разных символов
/////////////

if(Name() == "LKOH") {            //Символ как он называется в Ами
   SecCode      = "LKOH";            
   Class         = "EQBR";
   Lots         = 12;
   TickS         = 0.1;         // Минимальный шаг цены торгуемой бумаги
   Otstup      = 20;         // Заявка будет выставлена хуже текущей цены на Otstup рублей
   [b]LimS      = 6;            // число лотов для фикса по покупке
   LimC         = 6;            // число лотов для фикса по шорту[/b]
}
else if(Name() == "SBER") {         //Символ как он называется в Ами
   SecCode      = "SBER03";            
   Class         = "EQBR";
   Lots         = 12;
   TickS         = 0.01;         // Минимальный шаг цены торгуемой бумаги
   Otstup      = 1;            // Заявка будет выставлена хуже текущей цены на Otstup рублей
   [b]LimS      = 6;            // число лотов для фикса по покупке
   LimC         = 6;            // число лотов для фикса по шорту[/b]
}
//////////////Система///////////////

Buy1 = Cross(C, MA(C, 40)) AND C > MA(C, 20);
Sell1 = Cross(MA(C, 20), C);
Short1 = Cross(MA(C, 40), C) AND C < MA(C, 20);
Cover1 = Cross(C, MA(C, 20));

[b]  for(i=BarCount-1;i>1;i--)
{
if(Buy[i] == 1)
{
entry = C[i];
sig = "BUY";
targetS = entry + (entry * .0092);

bars = i;
i = 0;
}
if(Sell[i] == 1)
{
sig = "SELL";
entry = C[i];
targetC = entry - (entry * .0112);

bars = i;
i = 0;
}
}

Sell2 = Close>=targetS;
Cover2 = Close<=targetC;   [/b]


///////////Конец Системы////////////

Buy1 = Ref(Buy1, -1);
Sell1 = Ref(Sell1, -1);
Short1 = Ref(Short1, -1);
Cover1 = Ref(Cover1, -1);
[b] 
Sell2 = Ref(Buy2, -1);
Cover2 = Ref(Short2, -1); [/b]

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

text = iz = sd = order = "";
color = coloriz = colorDefault;
price = 0;
str = Now(0) + "  " + Name();
pos = AS_READ_PARAM("Quik_Robot", Name(), "pos");
SdID = AS_READ_PARAM("Quik_Robot", Name(), "BarID");
BarID = LastValue(Ref(DayOfWeek()*1000000 + TimeNum(), -1));

///////////// проверка наличия символа в списке для торговли ////////////////

k = 0;
Permit_Ticker = False;
do {
  Tick = StrExtract(Tickers, k);
  k++;
  if(Name() == Tick)
    Permit_Ticker = True;
} while(Tick != "");

///////////    Функции  ////////////

procedure orders(bs, pr, Lot)
{
   connection = 0;

   QC = AS_QUIK_CONNECT(Quik);

   if (QC == 1)
   {
      connection = 1;
      text = "Есть соединение с сервером";
      Color = colorGreen;
   }
   else if (QC == -1)
   {
      text = "нет соединения с квиком";
      Color = colorRed;   
   }
   else if (QC == -2)
   {
      text = "нет соединения с сервером";
      Color = colorRed;
   }
   else
   {
      text = "фигня какая то";
      Color = colorRed;
   }
 
   if(connection == 1)
   {
      order = AS_QUIK_SEND_SYNC_NEWORDER(   "123",   // OrderID - Любые цифры
                     Account,
                     Client_Code,
                     "L",   // Тип заявки M-рыночная, L-лимитированная
                     Class,
                     SecCode,
                     bs,
                     pr,
                     Lot);
   }

   if(StrToNum(order) > 100)
{
   iz = "исполнена";
   coloriz = colorGreen;
   str = str + "  заяка исполнена" + " ответ сервера=" + order;
   if(pos == 0 AND bs == "S")         // шорт
   {
      AS_WRITE_PARAM("Quik_Robot", Name(), "pos", -1*Lot);
      AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", 0);      
   }         
   else if(pos < 0 AND bs == "B")          // закрытие шорта
   {
      AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0);
      AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", 0);
   }         
   else if(pos == 0 AND bs == "B")       // лонг
   {
      AS_WRITE_PARAM("Quik_Robot", Name(), "pos", Lot);
      AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", 0);
   }
   else if(pos > 0 AND bs == "S")          // закрытие лонга
   {
      AS_WRITE_PARAM("Quik_Robot", Name(), "pos", 0);
      AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", 0);         
   }   
   else if[b](pos = Lots AND bs == "S")      // отливка от покупки (частичный фикс позы ) [/b] -- здесь не знаю как условие правильно написать
   {
      AS_WRITE_PARAM("Quik_Robot", Name(), "pos", [b]pos -LimS); [/b]
      AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", BarID);
   }
   else if[b](abs(pos) = Lots AND bs == "B")      // отливка от шорта (частичный фикс позы )[/b] -- здесь не знаю как условие правильно написать
   {

      AS_WRITE_PARAM("Quik_Robot", Name(), "pos",[b] pos   + LimC); [/b]
      AS_WRITE_PARAM("Quik_Robot", Name(), "BarID", BarID);
   }
   str = str + "  позиция на момент исполнения " + pos;
}
else {
   iz = "не исполнена";
   coloriz = colorRed;
   str = str + "  заяка НЕ исполнена" + " ответ сервера=" + order;
}
////////// конец Функций //////////

if (TimeFrame == Interval() AND Permit_Ticker)
{
   if(Buy1[BarCount-1] AND pos == 0) {
      str = str + "  Buy";
      sd = "Buy";
      orders("B", round(C[BarCount-1]) + Otstup, Lots);
      AS_WRITE_FILE("log.quik", str);
   }
   else if(Sell1[BarCount-1] AND pos > 0) {
      str = str + "  Sell";
      sd = "Sell";
      orders("S", round(C[BarCount-1]) - Otstup, abs(pos));
      AS_WRITE_FILE("log.quik", str);
   }
   else if(Short1[BarCount-1] AND pos == 0) {
      str = str + "  Short";
      sd = "Short";
      orders("S", round(C[BarCount-1]) - Otstup, Lots);
      AS_WRITE_FILE("log.quik", str);
   }
   else if(Cover1[BarCount-1] AND pos < 0) {
      str = str + "  Cover";
      sd = "Cover";
      orders("B", round(C[BarCount-1]) + Otstup, abs(pos));
      AS_WRITE_FILE("log.quik", str);
   }
   else if([b]Sell2[BarCount-1] AND pos =Lots AND BarID != SdID)[/b] -- здесь не знаю как условие правильно написать
{
      str = str +[b]   " Sell (отливка)"; [/b]
      sd = [b] "SellOut";[/b]
      orders[b]("S", round(C[BarCount-1]) - Otstup,  LimS); [/b]
      AS_WRITE_FILE("log.quik", str);
   }
   else if([b]Cover2[BarCount-1] AND abs(pos) =Lots AND BarID != SdID)[/b] -- здесь не знаю как условие правильно написать
{
      str = str + [b]  " Cover (отливка)"; [/b]
      sd = [b]  "CoverOut";[/b]
      orders [b]("B", round(C[BarCount-1]) + Otstup,LimC); [/b]
      AS_WRITE_FILE("log.quik", str);
   }

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


Последний раз редактировалось: BFG (Вт Апр 15, 2014 3:18 pm), всего редактировалось 7 раз(а)
Посмотреть профиль Отправить личное сообщение
mtrader



Зарегистрирован: 23.02.2014
Сообщения: 23

СообщениеДобавлено: Вт Апр 15, 2014 9:55 am Ответить с цитатой Вернуться к началу

000 писал(а):
Залезь в настройки и сделай так

Привет!
Сделал как на картинке, все равно заявки посреди бара отправляются(
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вт Апр 15, 2014 4:45 pm Ответить с цитатой Вернуться к началу

Время заявок дай.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
mtrader



Зарегистрирован: 23.02.2014
Сообщения: 23

СообщениеДобавлено: Вт Апр 15, 2014 6:26 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Время заявок дай.

Исполнение получается каждые 15 минут, но с момента запуска робота. Если запустить в 10:04, то заявки будут идти в 10:19,10:34 и т. Д.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вт Апр 15, 2014 6:56 pm Ответить с цитатой Вернуться к началу

У тебя Ами не правильно собирает свечи.
Посмотри на графике 15 минутки. Какое время у свечек?

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
mtrader



Зарегистрирован: 23.02.2014
Сообщения: 23

СообщениеДобавлено: Вт Апр 15, 2014 9:40 pm Ответить с цитатой Вернуться к началу

000 писал(а):
У тебя Ами не правильно собирает свечи.
Посмотри на графике 15 минутки. Какое время у свечек?

Да правильные, как положено 10:00; 10:15....
по любому какую то галочку гдето нужно поставить)
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вт Апр 15, 2014 10:29 pm Ответить с цитатой Вернуться к началу

Странно все это.
Пока даже мыслей никаких нет....
А у тебя в базе тут

Image
какие настройки и какой фрейм у базы установлен?
Думаю может

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
mtrader



Зарегистрирован: 23.02.2014
Сообщения: 23

СообщениеДобавлено: Ср Апр 16, 2014 9:07 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Странно все это.
Пока даже мыслей никаких нет....
А у тебя в базе тут

Image
какие настройки и какой фрейм у базы установлен?
Думаю может


Мои настройки:
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Ср Апр 16, 2014 9:58 pm Ответить с цитатой Вернуться к началу

а если смотреть на 15 минутный график в реалтайме, то новые свечки появляются в нужное время (10:00, 10:15, 10:30...)?

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
mtrader



Зарегистрирован: 23.02.2014
Сообщения: 23

СообщениеДобавлено: Чт Апр 17, 2014 1:52 pm Ответить с цитатой Вернуться к началу

000 писал(а):
а если смотреть на 15 минутный график в реалтайме, то новые свечки появляются в нужное время (10:00, 10:15, 10:30...)?

С этим все ок.
Проблема в том, что когда есть сигнал, то он отправляется в квик сразу же, а не в конце свечи.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Чт Апр 17, 2014 4:59 pm Ответить с цитатой Вернуться к началу

Сигнал не может отправляться в Квик в конце свечи. Сигнал отправляется в самом начале следующей свечки.
За это в роботе отвечает вот этот блок.
Код:

Buy1 = Ref(Buy1, -1);
Sell1 = Ref(Sell1, -1);
Short1 = Ref(Short1, -1);
Cover1 = Ref(Cover1, -1);

В товоем коде этот блок присутствует. Я не могу понять почему сигналы исполняются сразу.
Этого не может быть. Потому, что этого не может быть никогда. Или на самом деле у тебя другой код.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Skornet



Зарегистрирован: 22.02.2014
Сообщения: 31
Откуда: как и все

СообщениеДобавлено: Пт Апр 18, 2014 1:49 am Ответить с цитатой Вернуться к началу

Есть такой вот индикатор
Но при попытке встроить его в систему сделок в анализаторе нет, а стрелки рисует. В чём может быть причина?
Код:
 _SECTION_BEGIN( "Flower" );

    // "Line Detail"
    OverBought = Param( "OverBought Above", 200, 0, 400, 1 );
    OverSold = Param( "OverSold Bellow", -200, -400, 0, 1 );
    // "Trend Bought/Sold Detail"
    Smoother = Param( "Trend Smoother", 4, 2, 20 );
    upcolor = ParamColor( "UpTrend Color", colorGreen );
    Downcolor = ParamColor( "DownTrend Color", colorRed );
    // "Circle Detail"
    Warningcolor = ParamColor( "Warning/Watch Signal", colorBlue );
    WatchColor = ParamColor( "Accumulation Zone", colorWhite );
    EntryColor = ParamColor( "Entry Signal", colorAqua );
    ProfitTakeColor = ParamColor( "Distribution Zone", colorYellow );
    ExitColor = ParamColor( "Exit Signal", colorRed );
    //  "Overbought/Oversold/Warning Detail"

    koef = Param( "koefsmoof", 4, 2, 7, 1 );
    n = Smoother;
    ys1 = ( High + Low + Close * 2 ) / 4;
    rk3 = EMA( ys1, n );
    rk4 = StDev( ys1, n );
    rk5 = ( ys1 - rk3 ) * 200 / rk4;
    rk6 = EMA( rk5, n );
    UP = EMA( rk6, n );
    DOWN = EMA( up, n );
    Oo = IIf( up < down, up, down );
    Hh = Oo;
    Ll = IIf( up < down, down, up );
    Cc = Ll;
    barcolor2 = IIf( Ref( oo, -1 ) < Oo AND Cc < Ref( Cc, -1 ), colorGreen, IIf( up > down, colorGreen, colorRed ) );
    PlotOHLC( Oo, hh, ll, Cc, "", barcolor2, styleCandle );
    UP = EMA( rk6, n );
    UPshape = IIf( UP >= OverBought OR UP <= OverSold, shapeSmallCircle, shapeNone );
    UPColor = IIf( UP >= 210, ProfitTakeColor, IIf( UP <= -210, WatchColor, Warningcolor ) );
    Plot( UP, "UP", colorGrey50, styleThick );
    Plot( DOWN, "D", colorBlue, styleThick );

    PlotShapes ( IIf(  Ref( oo, -1 ) < Oo AND Cc > Ref( Cc, -1 ), shapeUpArrow, shapeNone ) , EntryColor, layer = 0, yposition = UP, offset = 1 );// Ref( oo, -1 ) < Oo AND
    PlotShapes ( IIf(  Ref( oo, -1 ) > Oo AND Cc < Ref( Cc, -1 ), shapeDownArrow, shapeNone ) , ExitColor, layer = 0, yposition = UP, offset = 1 );// Ref( oo, -1 ) > Oo AND

    //Buuy1 = Hold(Ref(Cross (up, down),-1), 4);
    //Shoort1 = Hold(Ref(Cross (down, up),-1), 4);


    PlotShapes( UPShape, UPColor, 0, UP, 0 );
   
    //  "Plot Lines"
    Plot( OverBought, "OB", colorDarkRed, styleLine | styleNoLabel );
    Plot( 0, "0", colorDarkGrey, styleDashed | styleNoLabel );
    Plot( OverSold, "OS", colorDarkRed, styleLine | styleNoLabel );

    _SECTION_END();

Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пт Апр 18, 2014 7:38 am Ответить с цитатой Вернуться к началу

Вероятно не так вставил в систему.
Должно быть все нормально.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
mtrader



Зарегистрирован: 23.02.2014
Сообщения: 23

СообщениеДобавлено: Пт Апр 18, 2014 12:08 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Сигнал не может отправляться в Квик в конце свечи. Сигнал отправляется в самом начале следующей свечки.
За это в роботе отвечает вот этот блок.
Код:

Buy1 = Ref(Buy1, -1);
Sell1 = Ref(Sell1, -1);
Short1 = Ref(Short1, -1);
Cover1 = Ref(Cover1, -1);

В товоем коде этот блок присутствует. Я не могу понять почему сигналы исполняются сразу.
Этого не может быть. Потому, что этого не может быть никогда. Или на самом деле у тебя другой код.

По идее если бы не этот код, то сигналы бы выполнялись в момент выполнения скрипта, правильно?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пт Апр 18, 2014 12:10 pm Ответить с цитатой Вернуться к началу

Да.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen