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



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

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

Боюсь что могу некорректно удалить Very Happy Можешь мне тупо выделить что надо удалить.

Сам код:

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

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 = 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);
}
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

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



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

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

Тебе в начале кода надо обязательно правильно инициализировать переменную TickSize.
Далее, удали то что я пометил жирным:
Цитата:
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 );
Посмотреть профиль Отправить личное сообщение ICQ Number
Яхфар



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

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

TickSize у меня бывает равен 1.... а при ртс равен 5.....т.е. он разный бывает или здесь это не важно....
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Зачем ломаете? Оно же нормально работает (если все правильно сделано). Почему думаете, что я туда что то лишнее запихал?

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



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

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

Пишет ошибки: не задан двузначный номер в поле Fullname. Не задан размера TickSize. При этом коректно работает, все сделки проходят как надо
Посмотреть профиль Отправить личное сообщение
spitfire



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

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

000 писал(а):
Зачем ломаете? Оно же нормально работает (если все правильно сделано). Почему думаете, что я туда что то лишнее запихал?

Ну я предложил 2 варианта - или настроить символы, или удалить эти мессаги и забить, если все работает как надо. Выбрали 2й вариант Smile
Посмотреть профиль Отправить личное сообщение ICQ Number
000
Site Admin


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

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

В инструкции написано
Цитата:

В Information, в поле FullName пишем 01, 02, 03, и т.д. Для каждой бумаги свой номер.
Обязательно заносите в Information значение минимального шага цены (в поле Tick Size)

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



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

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

Это всё указано, да и сделки бы не проходили, если бы этого не было. Дело в следующем: я решил протестить робота на две системы:

////////// Правила системы ///////////////
Buy = 0; Sell = 0; Cover = 0; Short = 0;
if(Name() == "SRZ1")
{
Period1 = Optimize("PeriodA", 5, 1, 50, 1);
Period2 = Optimize("PeriodB", 5, 1, 50, 1);
Top = Ref(HHV(C, Period1), -1);
Bot = Ref(LLV(C, Period2), -1);
Buy = Cover= Cross(C, Top);
Sell = Short= Cross(Bot, C);
Lots=2;

}
else if(Name() == "VBZ1")
{
Period3 = Optimize("PeriodAA", 5, 1, 50, 1);
Period4 = Optimize("PeriodBB", 5, 1, 50, 1);
Top = Ref(HHV(C, Period3), -1);
Bot = Ref(LLV(C, Period4), -1);
Buy = Cover= Cross(C, Top);
Sell = Short= Cross(Bot, C);
Lots=1;
}


Он стал после этого выдать сообщения об ошибках. Когда одна система никаких сообщениях об ошибках нету.
Посмотреть профиль Отправить личное сообщение
Яхфар



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

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

Я вроде понял почему так происходило. В настройках у меня указано - все символы!!!! И поскольку в символах оказались не только указанные две бумаги в коде, но и ещё Equity. То он выдает сообщения об ошибках. И эти сообщения направленны были видимо той бумаге которой не было в коде. Получается, что если в базе данных много бумажек, а в роботе указаны не все, то сообщения об ошибках непременно буду вылезать.
Видимо чтобы избежать этого надо пользоваться фильтром. Буду пробовать
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Ну вот. Видишь как все просто Smile

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



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

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

Возникла следующая простая мысль.!!! У меня есть определенный набор систем и соответственно бумаг к ним. Мне их надо периодически включать и выключать, регулировать количество. Можно это делать напрямую через изменение количество систем в теле робота, при этом одновременно то удаляя, то добавляя символы. Но в этом случае, придется делать много телодвижений и риск человеческой ошибки может повысится. Так вот подумалось, что если сразу забахать, туда куча систем. И по не работающим системам просто ставить нули в лоты. И подчищать соответственно три файлы в квике почаще. Кто нить так работал?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

По моему можно просто коментировать ненужные системы или удалять ненужные символы из фильтра АА

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



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

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

Доброго времени суток!
Цель создать робота для закрытия позиции, у меня связка Квик + Амиброкер + TraderExplorer (Привод) позиция открывается ручками а закрываться должна по сигналу Амиброкера в TraderExplorer (Приводом) сама связка программ работает нормально Но для корректной работы системы закрытия Амиброкер должен знать какая позиция открыта и где стоит стоп(который поставил привод) во общем привод с квиком работает через *.trr, *.tro, *.tri файлы и мне нужно tri файл перевести в текстовый массив и проверять новые строки и считывать направление позиции и где стоит стоп(он трейлится приводом).
У вас в роботе есть функция

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);
}
}
}

Подскажите пожалуйста
как мне tri файл перевести в массив по сути мне нужно обратное функции savetrifile. Каждая стока tri файла имеет свой TRANS_ID по нему и можно сортировать Ами не давно изучаю пока не все понимаю помогите пожалуйста...

Пример tri файла созданным TraderExplorer (Приводом):
ACCOUNT=XXXXXXXXXX; CLIENT_CODE=XXXXXXXXXX; TYPE=L; TRANS_ID=19; CLASSCODE=SPBFUT; SECCODE=RIZ1; ACTION=NEW_ORDER; OPERATION=B; PRICE=140000; QUANTITY=1;
ACCOUNT=XXXXXXXXXX; CLIENT_CODE=XXXXXXXXXX; TYPE=L; TRANS_ID=20; CLASSCODE=SPBFUT; SECCODE=RIZ1; ACTION=NEW_STOP_ORDER; STOP_ORDER_KIND=SIMPLE_STOP_ORDER ;OPERATION=S; QUANTITY=1; STOPPRICE=139205; PRICE=138205; EXPIRY_DATE=GTC;
ACCOUNT=XXXXXXXXXX; CLIENT_CODE=XXXXXXXXXX; TYPE=L; TRANS_ID=21; CLASSCODE=SPBFUT; ACTION=KILL_STOP_ORDER; STOP_ORDER_KEY=11476955; SECCODE=RIZ1;
ACCOUNT=XXXXXXXXXX; CLIENT_CODE=XXXXXXXXXX; TYPE=L; TRANS_ID=22; CLASSCODE=SPBFUT; SECCODE=RIZ1; ACTION=NEW_STOP_ORDER; STOP_ORDER_KIND=SIMPLE_STOP_ORDER ;OPERATION=S; QUANTITY=1; STOPPRICE=139420; PRICE=138420; EXPIRY_DATE=GTC;
ACCOUNT=XXXXXXXXXX; CLIENT_CODE=XXXXXXXXXX; TYPE=L; TRANS_ID=23; CLASSCODE=SPBFUT; ACTION=KILL_STOP_ORDER; STOP_ORDER_KEY=11476980; SECCODE=RIZ1;
ACCOUNT=XXXXXXXXXX; CLIENT_CODE=XXXXXXXXXX; TYPE=L; TRANS_ID=24; CLASSCODE=SPBFUT; SECCODE=RIZ1; ACTION=NEW_STOP_ORDER; STOP_ORDER_KIND=SIMPLE_STOP_ORDER ;OPERATION=S; QUANTITY=1; STOPPRICE=139490; PRICE=138490; EXPIRY_DATE=GTC;
ACCOUNT=XXXXXXXXXX; CLIENT_CODE=XXXXXXXXXX; TYPE=L; TRANS_ID=25; CLASSCODE=SPBFUT; ACTION=KILL_STOP_ORDER; STOP_ORDER_KEY=11476985; SECCODE=RIZ1;
ACCOUNT=XXXXXXXXXX; CLIENT_CODE=XXXXXXXXXX; TRANS_ID=26; CLASSCODE=SPBFUT; SECCODE=RIZ1; ACTION=KILL_ALL_STOP_ORDERS;
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Вт Ноя 22, 2011 8:47 am Ответить с цитатой Вернуться к началу

В общем ты затеял не легкое дело...
Подскажу в двух словах.
Читать последовательно все строки в текстовом файле можно так.
Код:
fh = fopen( "...quik.tri ", "r");
if( fh )
{
   while( ! feof( fh ) )
   {
      str = fgets( fh ) ; // строка из файла   
   }
}

Когда прочитал строку её надо бы разбить на элементы для анализа. Ами может разбивать на элементы строку разделенную запятыми, а у нас ";".
Поэтому заменим "; " на ","
Код:
StrReplace(str, "; ", ",");

Все вместе
Код:
fh = fopen( "...quik.tri ", "r");
if( fh )
{
   while( ! feof( fh ) )
   {
      str = fgets( fh ) ; // строка из файла
      StrReplace(str, "; ", ",");   
   }
}

Далее можно брать элементы этой строки для анализа.
Код:
str1 = StrExtract( str, 1 ); // первый элемент
str2 = StrExtract( str, 2 ); // второй элемент

Потом ищешь в этих элементах например подстроку PRICE (StrFind( str1, "PRICE" ) ), потом узнаешь позицию знака "=" (pos = StrFind( str1, "=" )) потом берешь оттуда все , что стоит после = (pr = StrRight( str1, pos) ) и превращаешь в число (pr = StrToNum(pr))
.... вот как то так....

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



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

СообщениеДобавлено: Вт Ноя 22, 2011 10:55 am Ответить с цитатой Вернуться к началу

[quote="000"]В общем ты затеял не легкое дело...
Подскажу в двух словах.

Олег Спасибо! доступно расписал буду пробовать хотя понимаю что не легко, а нет ли где подробного описания параметров tri файла смотрел на форуме квика что то не нашел?
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen