Автор |
Сообщение |
Avante
Зарегистрирован: 07.05.2009
Сообщения: 55
Откуда: с Луны
|
Есть квик с двумя счетами.
Торговля ведется одним эмитентом, по одной стратегии, отличаются только кол-во лотов в сделках.
В 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
|
В файле tri не может быть двух записей с одинаковым transid, а у тебя на разных счетах transid одинаковый. Вот поэтому второй и не пишется.
Надо для разных счетов делать разный transid. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Avante
Зарегистрирован: 07.05.2009
Сообщения: 55
Откуда: с Луны
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
Avante
Зарегистрирован: 07.05.2009
Сообщения: 55
Откуда: с Луны
|
Только теперь другая проблема - кол-во лотов нв сделках одинаковое, и равно Lots1. |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ну ты же понимаешь сам, что такое может быть только если ты накосячил в коде
В том коде который есть четко написано
makeandsave(... Lots1 ...)
makeandsave(... Lots2 ...)
Никак Lots1 во ворую строку попасть не может если ты раньше не приравнял Lots2 к Lots1. Или в самой функции формирования строки не накосячил.
Я так понял, что в именно в tri лоты в строка не правильные? Или в tri все нормально, а квик исполняет не тот сайз? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Avante
Зарегистрирован: 07.05.2009
Сообщения: 55
Откуда: с Луны
|
[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
Откуда: с Луны
|
Второй аккаунт и клиент даже не пишутся в три-файл.
За то два раза пишется один и тот же. |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Дай код который у тебя получился. Можно без системы. Посмотрю что там не так. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Avante
Зарегистрирован: 07.05.2009
Сообщения: 55
Откуда: с Луны
|
ну вот так.
если код с системой нужен, в личку скину чуть позже.
Код: |
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
Откуда: Дмитров
|
Ну как получилось сделать робота для торговли обоими счетами? Мне тоже необходимо робота модифицировать. Сейчас попробую этот последний выложенный код. |
_________________ УСПЕХ — это движение от неудачи к неудаче БЕЗ ПОТЕРИ ЭНТУЗИАЗМА.
- Уинстон Черчилль |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Хм. Что то я упустил эту тему..... Не ответил.
Вот так должно работать...
Код: |
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
Откуда: Дмитров
|
О! Благодарю!
Кстати, я вот тут подумал, если разделить депозит на 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
|
Брррр. Не понял. Если система одна и та же, то смысл делить?
А если ситемы разные, то не правильно.
После срабатывания одного Buy функция Equity следующий заблокирует пока не будет закрыта позиция.... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Tim
Зарегистрирован: 12.02.2010
Сообщения: 245
Откуда: Дмитров
|
Система одна и та же.
Есть основания разделить депо, т.к. система немного по-разному ведет себя на разных таймфреймах.
Там периодичность волн разная. И старший ТФ менее рискованный. |
_________________ УСПЕХ — это движение от неудачи к неудаче БЕЗ ПОТЕРИ ЭНТУЗИАЗМА.
- Уинстон Черчилль |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Для того, чтобы подсказать я должен понять что надо, я пока не понял.
Если система одна то и входить выходить будет одновременно. Зачем тогда делить? Ну залили 1/3 объема первой частью и тут же 2/3 второй частью... и вышли так же. По моему проще сразу все лить.... (если конечно ликвидности хватает)
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|