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



Зарегистрирован: 07.05.2009
Сообщения: 55
Откуда: с Луны

СообщениеДобавлено: Вт Авг 03, 2010 7:21 pm Ответить с цитатой Вернуться к началу

Есть квик с двумя счетами.
Торговля ведется одним эмитентом, по одной стратегии, отличаются только кол-во лотов в сделках.
В tri-файл пишется только одна строка с счетом, идущим первым. Второй либо отсутвутет вовсе, либо кол-во лотов нулевое.
Подскажите пожалуйста, где ошибка.

Код:


TimeFrame   = 300;      // таймфрейм в секундах
Account1 = "SPBFUT0001";   // аккаунт на бирже
Account2 = "SPBFUT0001";
Client1 = "111111";      // код клиента
Client2 = "222222";
Lots1 = 10;
Lots2 = 15;

Otstup = 1;      // в процентах.
FileName = "C:/Quik5/Quikdata/input.tri"; // путь файла с транзакциями для квика
dir = 0;
/////////////////// Система контроля текущей позиции //////////////////////
odbcOpenDatabase("ODBC; DSN=ADMIN; Driver=Firebird]/InterBase(r); Dbname=C:/Quik5/POSFIN3.FDB; CHARSET=ASCII; PWD=z; UID=ADMIN; Client=C:/Program Files/Firebird/Firebird_2_1/bin/fbclient.dll;");
position = Nz(odbcGetValue("TABLE02","","TOTAL"));
position = odbcGetValue("TABLE02","","TOTAL");

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

buy=cross(ma(c,10),ma(c,20));
sell=cross(ma(c,20),ma(c,10));
short=sell;
cover=buy;
Buy=ExRem(Buy,Sell) ;
Sell=ExRem(Sell,Buy);
Short=ExRem(Short,Cover) ;
Cover=ExRem(Cover,Short);
Buy=Ref(Buy,-1);
Sell=Ref(Sell,-1);
Short=Ref(Short,-1);
Cover=Ref(Cover,-1);

Equity(1,0); // расчитываем капитал, стопы, фильтруем сигналы

Buy = LastValue(Buy);
Sell = LastValue(Sell);
Short = 0;
Cover = 0;

/////////// Формируем транзакцию.//////////////
////////////////////////////////////////////////
//////// !!!!СЮДА РУКАМИ НЕ ЛАЗИТЬ!!!! /////////
////////////////////////////////////////////////
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, Lots, Client, Account)
{
 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 = 1.0, separator=False)+"; "+
 "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, Lots1, Client1, Account1);
      makeandsave("B", price, Lots2, Client2, Account2);
   }
   if(Sell)
   {
      price = Close[BarCount-1] - Otstup;
      dir = "2";
      makeandsave("S", price, Lots1, Client1, Account1);
      makeandsave("S", price, Lots2, Client2, Account2);
   }
   if(Short)
   {
      price = Close[BarCount-1] - Otstup;
      dir = "3";
      makeandsave("S", price, Account1, Client1, Lots1);
      makeandsave("S", price, Account2, Client2, Lots2);
   }
   if(Cover)
   {
      price = Close[BarCount-1] + Otstup;
      dir = "4";
      makeandsave("B", price, Lots1, Client1, Account1);
      makeandsave("B", price, Lots2, Client2, Account2);
   }

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

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


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

СообщениеДобавлено: Вт Авг 03, 2010 10:41 pm Ответить с цитатой Вернуться к началу

В файле tri не может быть двух записей с одинаковым transid, а у тебя на разных счетах transid одинаковый. Вот поэтому второй и не пишется.
Надо для разных счетов делать разный transid.

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



Зарегистрирован: 07.05.2009
Сообщения: 55
Откуда: с Луны

СообщениеДобавлено: Вт Авг 03, 2010 10:57 pm Ответить с цитатой Вернуться к началу

точно!
спасибо.
Посмотреть профиль Отправить личное сообщение ICQ Number
Avante



Зарегистрирован: 07.05.2009
Сообщения: 55
Откуда: с Луны

СообщениеДобавлено: Вт Авг 03, 2010 11:18 pm Ответить с цитатой Вернуться к началу

Только теперь другая проблема - кол-во лотов нв сделках одинаковое, и равно Lots1.
Посмотреть профиль Отправить личное сообщение ICQ Number
000
Site Admin


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

СообщениеДобавлено: Вт Авг 03, 2010 11:53 pm Ответить с цитатой Вернуться к началу

Ну ты же понимаешь сам, что такое может быть только если ты накосячил в коде
В том коде который есть четко написано
makeandsave(... Lots1 ...)
makeandsave(... Lots2 ...)

Никак Lots1 во ворую строку попасть не может если ты раньше не приравнял Lots2 к Lots1. Или в самой функции формирования строки не накосячил.
Я так понял, что в именно в tri лоты в строка не правильные? Или в tri все нормально, а квик исполняет не тот сайз?

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



Зарегистрирован: 07.05.2009
Сообщения: 55
Откуда: с Луны

СообщениеДобавлено: Ср Авг 04, 2010 10:41 am Ответить с цитатой Вернуться к началу

[quote="000"]Ну ты же понимаешь сам, что такое может быть только если ты накосячил в коде
В том коде который есть четко написано
makeandsave(... Lots1 ...)
makeandsave(... Lots2 ...)

Ага, понимаю. Но ошибку пока не вижу.
вот чего в три-файл пишет:

Код:

TRANS_ID=501045002; PRICE=151750; QUANTITY=10; OPERATION=S; CLASSCODE=SPBFUT; ACTION=NEW_ORDER; TYPE=L; SECCODE=RIU0; ACCOUNT=SPBFUT0001; CLIENT_CODE=111111;
TRANS_ID=521045002; PRICE=151665; QUANTITY=10; OPERATION=S; CLASSCODE=SPBFUT; ACTION=NEW_ORDER; TYPE=L; SECCODE=RIU0-2; ACCOUNT=SPBFUT0001; CLIENT_CODE=111111;


строки одинаковые, только эмитенты разные.
Посмотреть профиль Отправить личное сообщение ICQ Number
Avante



Зарегистрирован: 07.05.2009
Сообщения: 55
Откуда: с Луны

СообщениеДобавлено: Ср Авг 04, 2010 11:02 am Ответить с цитатой Вернуться к началу

Второй аккаунт и клиент даже не пишутся в три-файл.
За то два раза пишется один и тот же.
Посмотреть профиль Отправить личное сообщение ICQ Number
000
Site Admin


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

СообщениеДобавлено: Ср Авг 04, 2010 1:11 pm Ответить с цитатой Вернуться к началу

Дай код который у тебя получился. Можно без системы. Посмотрю что там не так.

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



Зарегистрирован: 07.05.2009
Сообщения: 55
Откуда: с Луны

СообщениеДобавлено: Ср Авг 04, 2010 1:47 pm Ответить с цитатой Вернуться к началу

ну вот так.
если код с системой нужен, в личку скину чуть позже.

Код:


TimeFrame = 900;      // таймфрейм в секундах
Account1 = "SPBFUT00111";   // аккаунт на бирже
Client1 = "0600111";      // код клиента
Lots1 = 10;
Account2 = "SPBFUT00222";
Client2 = "0600222";
Lots2 = 15;

Otstup      = 0.5;      // в процентах. Заявка будет выставлена хуже текущей цены на столько процентов
FileName = "C:/Quik5/Quikdata/input.tri"; // слэши прямые!!! имя файла с транзакциями для квика
dir = 0;

//// Правила системы и контроль текущей позиции /////
////////////////////// ////////////////////// //////////////////////

Equity(1,0); // расчитываем капитал, стопы, фильтруем сигналы

Buy = LastValue(Buy);
Sell = LastValue(Sell);
Short = 0;
Cover = 0;

/////////// Формируем транзакцию.//////////////
////////////////////////////////////////////////
//////// !!!!СЮДА РУКАМИ НЕ ЛАЗИТЬ!!!! /////////
////////////////////////////////////////////////
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, Account, Client, Lots)
{
 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 = 1.0, separator=False)+"; "+
 "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, Account1, Client1, Lots1);
      makeandsave("B", price, Account2, Client2, Lots2);
   }
   if(Sell)
   {
      price = Close[BarCount-1] - Otstup;
      dir = "2";
      makeandsave("S", price, Account1, Client1, Lots1);
      makeandsave("S", price, Account2, Client2, Lots2);
   }
   if(Short)
   {
      price = Close[BarCount-1] - Otstup;
      dir = "3";
      makeandsave("S", price, Account1, Client1, Lots1);
      makeandsave("S", price, Account2, Client2, Lots2);
   }
   if(Cover)
   {
      price = Close[BarCount-1] + Otstup;
      dir = "4";
      makeandsave("B", price, Account1, Client1, Lots1);
      makeandsave("B", price, Account2, Client2, Lots2);
   }

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



Зарегистрирован: 12.02.2010
Сообщения: 245
Откуда: Дмитров

СообщениеДобавлено: Вт Окт 26, 2010 5:11 pm Ответить с цитатой Вернуться к началу

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

_________________
УСПЕХ — это движение от неудачи к неудаче БЕЗ ПОТЕРИ ЭНТУЗИАЗМА.
- Уинстон Черчилль
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
000
Site Admin


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

СообщениеДобавлено: Вт Окт 26, 2010 9:17 pm Ответить с цитатой Вернуться к началу

Хм. Что то я упустил эту тему..... Не ответил.
Вот так должно работать...
Код:

TimeFrame = 900;      // таймфрейм в секундах
Account1 = "SPBFUT00111";   // аккаунт на бирже
Client1 = "0600111";      // код клиента
Lots1 = 10;
Account2 = "SPBFUT00222";
Client2 = "0600222";
Lots2 = 15;

Otstup      = 0.5;      // в процентах. Заявка будет выставлена хуже текущей цены на столько процентов
File1Name = "C:/input1.tri"; // слэши прямые!!! имя файла с транзакциями для квика
File2Name = "C:/input2.tri"; // слэши прямые!!! имя файла с транзакциями для квика
dir = 0;

//// Правила системы и контроль текущей позиции /////
////////////////////// ////////////////////// //////////////////////



Equity(1,0); // расчитываем капитал, стопы, фильтруем сигналы

Buy = LastValue(Buy);
Sell = LastValue(Sell);
Short = 0;
Cover = 0;

/////////// Формируем транзакцию.//////////////
////////////////////////////////////////////////
//////// !!!!СЮДА РУКАМИ НЕ ЛАЗИТЬ!!!! /////////
////////////////////////////////////////////////
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,FN)
{
 f = fopen(FN, "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(FN, "a");
    if(f)
    {
     fputs(sstr+"\n",f);
     fclose(f);
    }
  }
}

function makeandsave(sOper, sprice, Account, Client, Lots, FlNm)
{
 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 = 1.0, separator=False)+"; "+
 "OPERATION=" +sOper+"; "+
 "CLASSCODE=" +Classcode+"; "+
 "ACTION=" +"NEW_ORDER; "+
 "TYPE=" +"L; "+
 "SECCODE=" +Name()+"; "+
 "ACCOUNT=" +Account+"; "+
 CCS;

 savetrifile(transid, str, FlNm);
}

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

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

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



Зарегистрирован: 12.02.2010
Сообщения: 245
Откуда: Дмитров

СообщениеДобавлено: Ср Окт 27, 2010 12:50 am Ответить с цитатой Вернуться к началу

О! Благодарю!

Кстати, я вот тут подумал, если разделить депозит на 1 счете на 2 части, под разные параметры системы.
То можно же сделать это не трогая механическую часть робота?:
Код:
capital_1 = 100000;
capital_2 = 900000;

risk1 = 0.005 * capital_1;
risk2 = 0.01 * capital_2;

par1 = 5;
par2 = 90;

cond1 = условие с par1;
cond2 = условие с par2;

stop = xxx;

Buy = cond1 or cond2;

Lots = iif(cond1, Risk1/stop, iif( cond2, Risk2/stop,0));


Правильно?

_________________
УСПЕХ — это движение от неудачи к неудаче БЕЗ ПОТЕРИ ЭНТУЗИАЗМА.
- Уинстон Черчилль
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
000
Site Admin


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

СообщениеДобавлено: Ср Окт 27, 2010 12:58 am Ответить с цитатой Вернуться к началу

Брррр. Не понял. Если система одна и та же, то смысл делить?
А если ситемы разные, то не правильно.
После срабатывания одного Buy функция Equity следующий заблокирует пока не будет закрыта позиция....

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



Зарегистрирован: 12.02.2010
Сообщения: 245
Откуда: Дмитров

СообщениеДобавлено: Ср Окт 27, 2010 8:57 am Ответить с цитатой Вернуться к началу

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

_________________
УСПЕХ — это движение от неудачи к неудаче БЕЗ ПОТЕРИ ЭНТУЗИАЗМА.
- Уинстон Черчилль
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
000
Site Admin


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

СообщениеДобавлено: Ср Окт 27, 2010 9:28 am Ответить с цитатой Вернуться к началу

Для того, чтобы подсказать я должен понять что надо, я пока не понял.
Если система одна то и входить выходить будет одновременно. Зачем тогда делить? Ну залили 1/3 объема первой частью и тут же 2/3 второй частью... и вышли так же. По моему проще сразу все лить.... (если конечно ликвидности хватает)
Laughing

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


 Перейти:   



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


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

File Attachment © by Meik Sievertsen