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


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

СообщениеДобавлено: Ср Мар 23, 2011 10:38 pm Ответить с цитатой Вернуться к началу

Угу. Вижу. Там довольно здорово отличается от Квика.
Сделаю. Только не прямо сейчас. До понедельника точно сделаю.

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



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

СообщениеДобавлено: Чт Мар 24, 2011 12:11 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Угу. Вижу. Там довольно здорово отличается от Квика.
Сделаю. Только не прямо сейчас. До понедельника точно сделаю.


Олег, большое спасибо, что согласились помочь.

С недавних пор Айти сделали специальный плагин для Ами, который позволяет выставлять приказы на прямую на биржу, минуя терминал СмартТрейд (так называемый API SmartCom).

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

Олег, не посмотрите в чем может быть дело?
На сколько я понял, дело из-за того, что условие OrderId постоянно срабатывает при каждом обновлении графика.

Я пытался его запихнуть в {}, но Ами ругается постоянно.

Посмотрите, пожалуйста, если вам не трудно, что тут можно предпринять.

Еще раз спасибо


Код:

myobj = CreateObject("SmartAmiTradePlugin.CTradingProxy");

Buy = Cross( MACD(), Signal() );

OrderId = myobj.PlaceOrder( "XXX", // Портфель
"GAZP", // Системный код инструмента (alias)
   1, // Операция (1-Buy, 2-Sell)
   2, // Тип (1-Market, 2-Limit, 3-Stop, 4-StopLimit)
   1, // 1-Day, 2-GTC
   220, // Цена
   1, // Количество
   0.0 // Цена стоп
   );

Sell = Cross( Signal(), MACD() );

OrderId = myobj.PlaceOrder( "XXX", // Портфель
   "GAZP", // Системный код инструмента (alias)
   2, // Операция (1-Buy, 2-Sell)
   2, // Тип (1-Market, 2-Limit, 3-Stop, 4-StopLimit)
   1, // 1-Day, 2-GTC
   230, // Цена
   1, // Количество
   0.0 // Цена стоп
   );

Buy=ExRem(Buy, Sell);
Sell=ExRem(Sell, Buy);


///////////// Рисуем всякое ///////////////
Equity(1);
GraphXSpace = 9;

Plot(C,"price",12,1);
PlotShapes(IIf(Buy,shapeUpArrow,0),5,0,Graph0,-10);
PlotShapes(IIf(Sell,shapeHollowDownArrow,0),4,0,Graph0,-20);

_SECTION_BEGIN("Price");
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
Plot( C, "Close", ParamColor("Color", colorBlack ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() );
_SECTION_END();
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Чт Мар 24, 2011 3:42 pm Ответить с цитатой Вернуться к началу

Угу. Я так понял, что с текстовым файлом помощь не нужна будет если с этим решим....
Тут вот в чем дело. AFL не знает о том, что он уже делал с текущим баром. С прошлыми знает, а с текущим не знает. Поэтому при поступлении сигнала на текущем баре он при каждом прогоне будет этот сигнал исполнять.
Я в таком случае обычно запоминаю действия AFL в отдельный файл. Записываю туда текущую рыночную позицию. Например 1 - лонг, 0 - вне рынка, -1 - шорт.
И в момент выставления заявки на покупку вход в рынок пишем +1.
Этот файл каждый прогон скрипта читаем в начале в переменную например position и в исполнении заявок ставим условие типа
Buy = Buy AND position == 0;
Тогда после первого прогона когда есть сигнал скрипт запишет в файл 1 и при следующих прогоноах уже будет знать, что в лонге и исполнять покупку не будет. Будет ждать закрытия лонга.

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



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

СообщениеДобавлено: Чт Мар 24, 2011 6:14 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Угу. Я так понял, что с текстовым файлом помощь не нужна будет если с этим решим....
Тут вот в чем дело. AFL не знает о том, что он уже делал с текущим баром. С прошлыми знает, а с текущим не знает. Поэтому при поступлении сигнала на текущем баре он при каждом прогоне будет этот сигнал исполнять.
Я в таком случае обычно запоминаю действия AFL в отдельный файл. Записываю туда текущую рыночную позицию. Например 1 - лонг, 0 - вне рынка, -1 - шорт.
И в момент выставления заявки на покупку вход в рынок пишем +1.
Этот файл каждый прогон скрипта читаем в начале в переменную например position и в исполнении заявок ставим условие типа
Buy = Buy AND position == 0;
Тогда после первого прогона когда есть сигнал скрипт запишет в файл 1 и при следующих прогоноах уже будет знать, что в лонге и исполнять покупку не будет. Будет ждать закрытия лонга.



Олег, в идеале было бы лучше реализовать то, как вы говорите. Т.е. избежать записи в файл и чтобы СмартТрейд читал папку на поиск новых файлов.

Лучше все делать напрямую, но здесь у меня будет большая проблема, в частности в том, что делает Смартком.
Например, у меня есть скрипт (нашел на форуме Айти), который пишет в файл текущую позицию, но почему-то дальше файла дело не идет, т.е. то ли Смартком не цепляет файл, то ли в скрипте какая-то ошибка.

В общем без вас точно не разобраться.

Ниже привожу скрипт:


Код:


_SECTION_BEGIN("TD_ROBOT");

SetPositionSize(1, spsShares ); // на всякий случай, т.к. в постановке приказов забит 1 контракт

SendOrder=ParamList("Send orders","NO|YES");

procedure writelog(s) {   // пишем в лог строку s при отдаче каждого приказа
fh = fopen( "d:/Trading/order/robot_log.txt", "a");   
s = s + "\n";   
fputs( s, fh );   
fclose( fh );
}

//записываем имеющуюся позицию
procedure writeposition( q ) {
  fh = fopen( "d:/Trading/order/position.smart", "w");
  fputs( NumToStr( q, 1.0, False ), fh);
  fclose( fh );
}
 
//Читаем позицию :
function readposition() {
  fh = fopen( "d:/Trading/order/position.smart", "r");
  p = fgets( fh );   
  fclose( fh );
  p = StrToNum(p);
  return p;
}

//записыв приказ бай смарту
procedure orderbuy(pr) {
 
  // Получаем ссылку на торговый COM интерфейс
  SmartObj = CreateObject("SmartAmiTradePlugin.CTradingProxy");
  OrderId = SmartObj.PlaceOrder( "XXX", // Портфель
    "GAZP", // Системный код инструмента (alias)
    1, // Операция (1-Buy, 2-Sell)
    2, // Тип (1-Market, 2-Limit, 3-Stop, 4-StopLimit)
    1, // 1-Day, 2-GTC
    220, // Цена
    1, // Количество
    0.0 // Цена стоп
    );
    fh = fopen( "d:/Trading/order/robot_log.txt", "a");   

    if( OrderId > 0 )
    {
      // Успешное завешение, получаем внутренний номер приказа
      S_log="Order send successfully, OrderId: " + NumToStr(OrderId);
    }
    else if( OrderId == -1 )
    {
       // Ошибка отсылки приказа
       S_log="Order send failed..";
    }
    else if ( OrderId == -50 )
    {
       // Внутренняя ошибка плагина, нет связи с серверным интерфейсом
      S_log="SystemLevel error..";
    }
    S_log = S_log + "\n";   
    fputs( S_log, fh );   
    fclose( fh );

}

// приказ sell смарту
procedure ordersell(pr) {
 
  // Получаем ссылку на торговый COM интерфейс
  SmartObj = CreateObject("SmartAmiTradePlugin.CTradingProxy");
  OrderId = SmartObj.PlaceOrder( "XXX", // Портфель
    "GAZP", // Системный код инструмента (alias)
    2, // Операция (1-Buy, 2-Sell)
    2, // Тип (1-Market, 2-Limit, 3-Stop, 4-StopLimit)
    1, // 1-Day, 2-GTC
    230, // Цена
    1, // Количество
    0.0 // Цена стоп
    );
    fh = fopen( "d:/Trading/order/robot_log.txt", "a");   
   
    if( OrderId > 0 )
    {
      // Успешное завешение, получаем внутренний номер приказа
      S_log="Order send successfully, OrderId: " + NumToStr(OrderId);
    }
    else if( OrderId == -1 )
    {
       // Ошибка отсылки приказа
       S_log="Order send failed..";
    }
    else if ( OrderId == -50 )
    {
       // Внутренняя ошибка плагина, нет связи с серверным интерфейсом
      S_log="SystemLevel error..";
    }
    S_log = S_log + "\n";   
    fputs( S_log, fh );   
    fclose( fh );
}


pos = readposition(); // вызываем function readposition() и узнаем рыночную позицию

   //формируем начало строки записываемой в лог. Дата/время и символ 
str = "," + Year()+ Month()+Day()+ "," +TimeNum() + "," + C[BarCount - 1] + "," + Now(0) + " " + FullName();

//СТРАТЕГИЯ :)

Buy = Cross (MACD(), Signal());
Sell = Cross (Signal(), MACD());
//Cover = Cross (MACD(), Signal());
//Short = Cross (MACD(), Signal());

PlotShapes( shapeUpTriangle * Buy, colorBlue, 0, C );
PlotShapes( shapeDownTriangle * Sell, colorRed, 0, C );
//PlotShapes( shapeUpTriangle * Cover, colorViolet, 0, C );
//PlotShapes( shapeDownTriangle * Short, colorOrange, 0, C );

sendBuy = Buy AND pos == 0;   // вход\выход с проверкой имеющейся позиции
sendSell = Sell AND pos == 1;
//sendCover = Cover AND pos == -1; 
//sendShort = Short AND pos == 0;


if(sendBuy[BarCount-1]) { 
  writelog("1" + str+ ", Buy");
  if (SendOrder=="YES") orderbuy(C);   
  writeposition(1); 
}

if(sendSell[BarCount-1]) { 
  writelog("2" + str + ",Sell");
  if (SendOrder=="YES") ordersell(C);   
  writeposition(0);   
}

//if(sendCover[BarCount-2]) { 
//  writelog("1" + str+ ", Cover");
 // if (SendOrder=="YES") orderbuy(C);   
//  writeposition(0); 
//}

//if(sendShort[BarCount-2]) { 
//  writelog("2" + str + ", Short");
//  if (SendOrder=="YES") ordersell(C);   
//  writeposition(-1);   
//}

_SECTION_END();

_SECTION_BEGIN("Price");
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Close %g  {{VALUES}}", C ));
Plot( C, "Close", ParamColor("Color", colorBlack ), styleCandle | ParamStyle("Style") | GetPriceStyle() );
_SECTION_END();

_SECTION_BEGIN("Price1");
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
Plot( C, "Close", ParamColor("Color", colorBlack ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() );
_SECTION_END();
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Чт Мар 24, 2011 7:17 pm Ответить с цитатой Вернуться к началу

Стоп, стоп, стоп. Я уже запутался. Давай по порядку.
Я не могу делать сразу и то и то и то... Говори с чего начать и конкретизируй задачу....

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



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

СообщениеДобавлено: Чт Мар 24, 2011 10:51 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Стоп, стоп, стоп. Я уже запутался. Давай по порядку.
Я не могу делать сразу и то и то и то... Говори с чего начать и конкретизируй задачу....


Олег, извиняюсь.

Самый идеальный вариант - это выставлять все на прямую через API SmartCom. Поэтому лучшим вариантом было бы, если бы вы помогли разобраться с нижевыложенным скриптом.

У меня он пишит заявки в папку, но почему-то дальше эти заявки никуда не идут. Я рискну предположить, что дело возможно в скрипте.

Заранее благодарен

Код:

_SECTION_BEGIN("TD_ROBOT");

SetPositionSize(1, spsShares ); // на всякий случай, т.к. в постановке приказов забит 1 контракт

SendOrder=ParamList("Send orders","NO|YES");

procedure writelog(s) {   // пишем в лог строку s при отдаче каждого приказа
fh = fopen( "d:/Trading/order/robot_log.txt", "a");   
s = s + "\n";   
fputs( s, fh );   
fclose( fh );
}

//записываем имеющуюся позицию
procedure writeposition( q ) {
  fh = fopen( "d:/Trading/order/position.smart", "w");
  fputs( NumToStr( q, 1.0, False ), fh);
  fclose( fh );
}
 
//Читаем позицию :
function readposition() {
  fh = fopen( "d:/Trading/order/position.smart", "r");
  p = fgets( fh );   
  fclose( fh );
  p = StrToNum(p);
  return p;
}

//записыв приказ бай смарту
procedure orderbuy(pr) {
 
  // Получаем ссылку на торговый COM интерфейс
  SmartObj = CreateObject("SmartAmiTradePlugin.CTradingProxy");
  OrderId = SmartObj.PlaceOrder( "XXX", // Портфель
    "GAZP", // Системный код инструмента (alias)
    1, // Операция (1-Buy, 2-Sell)
    2, // Тип (1-Market, 2-Limit, 3-Stop, 4-StopLimit)
    1, // 1-Day, 2-GTC
    220, // Цена
    1, // Количество
    0.0 // Цена стоп
    );
    fh = fopen( "d:/Trading/order/robot_log.txt", "a");   

    if( OrderId > 0 )
    {
      // Успешное завешение, получаем внутренний номер приказа
      S_log="Order send successfully, OrderId: " + NumToStr(OrderId);
    }
    else if( OrderId == -1 )
    {
       // Ошибка отсылки приказа
       S_log="Order send failed..";
    }
    else if ( OrderId == -50 )
    {
       // Внутренняя ошибка плагина, нет связи с серверным интерфейсом
      S_log="SystemLevel error..";
    }
    S_log = S_log + "\n";   
    fputs( S_log, fh );   
    fclose( fh );

}

// приказ sell смарту
procedure ordersell(pr) {
 
  // Получаем ссылку на торговый COM интерфейс
  SmartObj = CreateObject("SmartAmiTradePlugin.CTradingProxy");
  OrderId = SmartObj.PlaceOrder( "XXX", // Портфель
    "GAZP", // Системный код инструмента (alias)
    2, // Операция (1-Buy, 2-Sell)
    2, // Тип (1-Market, 2-Limit, 3-Stop, 4-StopLimit)
    1, // 1-Day, 2-GTC
    230, // Цена
    1, // Количество
    0.0 // Цена стоп
    );
    fh = fopen( "d:/Trading/order/robot_log.txt", "a");   
   
    if( OrderId > 0 )
    {
      // Успешное завешение, получаем внутренний номер приказа
      S_log="Order send successfully, OrderId: " + NumToStr(OrderId);
    }
    else if( OrderId == -1 )
    {
       // Ошибка отсылки приказа
       S_log="Order send failed..";
    }
    else if ( OrderId == -50 )
    {
       // Внутренняя ошибка плагина, нет связи с серверным интерфейсом
      S_log="SystemLevel error..";
    }
    S_log = S_log + "\n";   
    fputs( S_log, fh );   
    fclose( fh );
}


pos = readposition(); // вызываем function readposition() и узнаем рыночную позицию

   //формируем начало строки записываемой в лог. Дата/время и символ 
str = "," + Year()+ Month()+Day()+ "," +TimeNum() + "," + C[BarCount - 1] + "," + Now(0) + " " + FullName();

//СТРАТЕГИЯ :)

Buy = Cross (MACD(), Signal());
Sell = Cross (Signal(), MACD());
//Cover = Cross (MACD(), Signal());
//Short = Cross (MACD(), Signal());

PlotShapes( shapeUpTriangle * Buy, colorBlue, 0, C );
PlotShapes( shapeDownTriangle * Sell, colorRed, 0, C );
//PlotShapes( shapeUpTriangle * Cover, colorViolet, 0, C );
//PlotShapes( shapeDownTriangle * Short, colorOrange, 0, C );

sendBuy = Buy AND pos == 0;   // вход\выход с проверкой имеющейся позиции
sendSell = Sell AND pos == 1;
//sendCover = Cover AND pos == -1; 
//sendShort = Short AND pos == 0;


if(sendBuy[BarCount-1]) { 
  writelog("1" + str+ ", Buy");
  if (SendOrder=="YES") orderbuy(C);   
  writeposition(1); 
}

if(sendSell[BarCount-1]) { 
  writelog("2" + str + ",Sell");
  if (SendOrder=="YES") ordersell(C);   
  writeposition(0);   
}

//if(sendCover[BarCount-2]) { 
//  writelog("1" + str+ ", Cover");
 // if (SendOrder=="YES") orderbuy(C);   
//  writeposition(0); 
//}

//if(sendShort[BarCount-2]) { 
//  writelog("2" + str + ", Short");
//  if (SendOrder=="YES") ordersell(C);   
//  writeposition(-1);   
//}

_SECTION_END();

_SECTION_BEGIN("Price");
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Close %g  {{VALUES}}", C ));
Plot( C, "Close", ParamColor("Color", colorBlack ), styleCandle | ParamStyle("Style") | GetPriceStyle() );
_SECTION_END();

_SECTION_BEGIN("Price1");
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
Plot( C, "Close", ParamColor("Color", colorBlack ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() );
_SECTION_END();
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Чт Мар 24, 2011 11:16 pm Ответить с цитатой Вернуться к началу

Ivan писал(а):

У меня он пишит заявки в папку, но почему-то дальше эти заявки никуда не идут. Я рискну предположить, что дело возможно в скрипте.

Так.
Что значит в папку пишет?
Я смотрю у тебя лог пишется. Это очень правильно. И что там в логе?
В принципе код вроде неплохой, но ошибки в нем есть.
1. procedure orderbuy(pr) ты в процедуру передаешь цену сделки но она там не используется. у тебя там стоит
для покупки
220, // Цена
для продажи
230, // Цена
2. У тебя ставится лимитник. При этом не факт, что он исполнился вообще, а робот пишет себе текущую позицию 1....

Т.е. получается. Вполне возможно, что ордера то в рынок попадают, но не исполняются и висят там. При этом изменения рыночной позиции не происходит.

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



Зарегистрирован: 09.09.2009
Сообщения: 230
Откуда: wealth-lab user

СообщениеДобавлено: Пт Мар 25, 2011 12:17 am Ответить с цитатой Вернуться к началу

000 писал(а):

1. procedure orderbuy(pr) ты в процедуру передаешь цену сделки но она там не используется. у тебя там стоит
для покупки 220, // Цена
для продажи 230, // Цена
2. У тебя ставится лимитник. При этом не факт, что он исполнился вообще, а робот пишет себе текущую позицию 1....

Т.е. получается. Вполне возможно, что ордера то в рынок попадают, но не исполняются и висят там. При этом изменения рыночной позиции не происходит.

Я тоже хочу присоединиться к обсуждению.
по п.1. в procedure orderbuy(pr) передается цена сделки и её там можно использовать для выставления лимитника. Код был упрощен с целью понять почему не выставляются приказы в систему.
по п.2 Очень хочется воспользоваться возможностью выставления лимитников. В перспективе предполагается, что в лог файл пишет сторонняя программа, которая берет из СмартКома информацию о судьбе заявки, состоянии счета и т.д.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Пт Мар 25, 2011 1:17 am Ответить с цитатой Вернуться к началу

Цитата:

Код был упрощен с целью понять почему не выставляются приказы в систему

А всетаки. Что отвечает смарт на попытку отправить заявку (OrderId)? Что пишется в логе?

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



Зарегистрирован: 09.09.2009
Сообщения: 230
Откуда: wealth-lab user

СообщениеДобавлено: Пт Мар 25, 2011 11:34 am Ответить с цитатой Вернуться к началу

000 писал(а):

А всетаки. Что отвечает смарт на попытку отправить заявку (OrderId)? Что пишется в логе?

У меня подобный, но более сложный код работает и приходит OrderId=1,2,3,..., что по ответу техподдержки и должно быть, но это значит, что заявка прошла в СмартКом и он её принял, но совсем не значит, что она прошла на биржу. Мы должны получить номер заявки 6-ти или семи значный, но это просходит не сразу, т.к. модель событийная и ответ с биржи приходит позже, в СмартКоме при простом программировании мы определяем статус заявки по приходу событий типа принята биржей, отклонена, выполнена и т.д., но события эти приходят в разной последовательности, иногда совсем не приходят. Тогда ориентиром служит изменение размера счета, резервирование ГО определяемое из изменения наличия доступных средств и других косвенных факторов.
Посмотреть профиль Отправить личное сообщение
Ivan



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

СообщениеДобавлено: Пт Мар 25, 2011 11:35 am Ответить с цитатой Вернуться к началу

000 писал(а):
Ivan писал(а):

У меня он пишит заявки в папку, но почему-то дальше эти заявки никуда не идут. Я рискну предположить, что дело возможно в скрипте.

Так.
Что значит в папку пишет?
Я смотрю у тебя лог пишется. Это очень правильно. И что там в логе?
В принципе код вроде неплохой, но ошибки в нем есть.
1. procedure orderbuy(pr) ты в процедуру передаешь цену сделки но она там не используется. у тебя там стоит
для покупки
220, // Цена
для продажи
230, // Цена
2. У тебя ставится лимитник. При этом не факт, что он исполнился вообще, а робот пишет себе текущую позицию 1....

Т.е. получается. Вполне возможно, что ордера то в рынок попадают, но не исполняются и висят там. При этом изменения рыночной позиции не происходит.


Извиняюсь за задержку с ответом. Решил сегодня очистить лог Смарткома с утра и провести пару сделок.

Я действительно упростил код и вместо procedure orderbuy(pr) просто беру по лимиту.

Сейчас я сделал по совету Олега и поставил везде Market (1, // Тип (1-Market, 2-Limit, 3-Stop, 4-StopLimit) .
Также для генерации большего количества сделок изменил условия входа/продажи на

Код:

bars=2;
HLine=Ref(HHV(H,bars),-1);
LLine=Ref(LLV(L,bars),-1);
Buy=H>Hline;
Sell=L<LLine;


Во вложенных файлах лог смарткома за утро и лог робота.
Как видно, робот пишет сделки в свой файл, что все ок.
Однако в логе Смарткома я не вижу никаких намеков на выставление заявки.

Кроме этого, меня смутило то, что в логе робота время первой заявки 184400 (время бара на котором был сигнал), хотя она была выставлена в 10:54

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


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

СообщениеДобавлено: Пт Мар 25, 2011 1:46 pm Ответить с цитатой Вернуться к началу

belin писал(а):

У меня подобный, но более сложный код работает и приходит OrderId=1,2,3,..., что по ответу техподдержки и должно быть, но это значит, что заявка прошла в СмартКом и он её принял, но совсем не значит, что она прошла на биржу. Мы должны получить номер заявки 6-ти или семи значный, но это просходит не сразу, т.к. модель событийная и ответ с биржи приходит позже, в СмартКоме при простом программировании мы определяем статус заявки по приходу событий типа принята биржей, отклонена, выполнена и т.д., но события эти приходят в разной последовательности, иногда совсем не приходят.

Блин. Вот это плохо. AFL с событиями работать не умеет или я не знаю как....
Получается, что судьбу заявки узнать нельзя... блин. Не могли написать нормальный плагин для состыковки Ами и Смарта....

Пока даже не знаю что подсказать еще...

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


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

СообщениеДобавлено: Пт Мар 25, 2011 1:49 pm Ответить с цитатой Вернуться к началу

Ivan писал(а):

Извиняюсь за задержку с ответом. Решил сегодня очистить лог Смарткома с утра и провести пару сделок.

Посмотрю на днях. (Только не сегодня, думаю в субботу или воскресенье). Если что надумаю или увижу обязательно отпишусь. Пока в тупике....

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



Зарегистрирован: 09.09.2009
Сообщения: 230
Откуда: wealth-lab user

СообщениеДобавлено: Пт Мар 25, 2011 2:53 pm Ответить с цитатой Вернуться к началу

000 писал(а):

Посмотрю на днях. (Только не сегодня, думаю в субботу или воскресенье). Если что надумаю или увижу обязательно отпишусь. Пока в тупике....

Прикладываю часть переписки на форуме ItInvest http://www.itinvest.ru/forum/index.php?showtopic=63382&st=160 по поводу Амироботов и выставления заявок, тексты двух рабочих роботов с форума, примеры предоставленные вместе с плагином и описание плагина. Может поможет разобраться.
Ещё хотелось бы знать твое мнение по поводу
myobj = CreateObject("SmartAmiTradePlugin.CTradingProxy");
будет ли генерировать новый объект с частотой обновления графика (по умолчанию 1 раз в секунду) и как этого избежать? Моё мнение, что это подписка на прослушку событий по счету и торговле.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Вс Мар 27, 2011 10:35 pm Ответить с цитатой Вернуться к началу

Бляяя...
У меня нет других слов.....
Ну почему....
НУ ПОЧЕМУ БЫЛО НЕ СПРОСИТЬ???
Я ВЕДЬ ДАЖЕ ПРЕДЛАГАЛ СВОИ УСЛУГИ...
А уж проконсультировал бы просто бесплатно....
Ну почему у меня торговый плагин сделанный по COM возвращает в AFL сразу ответ биржи, а не терминала?
..........
Можно наверное накодить в AFL и так как есть, но это не для людей сделано....


С ЭТИМ я разбираться отказываюсь....

Вопрос.
Можно как то получить демо доступ к торгам через смарт с СОМ и доки интерфейса?
Если да, то подумаю, посмотрю и может попробую
сделать плагин по уму....

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


 Перейти:   



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


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

File Attachment © by Meik Sievertsen