Transaq
СБО "Transaq" => Подсистема ATF => Topic started by: nxz on Октября 03, 2013, 09:10:04 pm
-
Пробую в встроенном тестере ATF простейщий код
function calc() {
if (m == 0) {trade_action::sell(1, ::lots); }
if (op == -1) {m = 1;} // где op = y["operation"]; переменная из хэша, что сделка на продажу прошла
line[0] = MovAvg(ind_ema, 5, pt_close);
}
Когда скрипт запускаю в окне графика, происходит продажа 1 лота и все, дальше сделок нет. Так было и задумано.
Если запускаю этот скрипт в тестере стратегий на исторических данных он мне рисует вот такую картину
(http://upload.akusherstvo.ru/thumbs/559004.jpg) (http://upload.akusherstvo.ru/image559004.jpg)
где видно, что сделка проходит на каждой свече!
Почему?
Как тестировать скрипты?
Умеет ли тестер корректно работать со стоп-заявками?
-
Heller или кто-нибудь, дайте ответ.
-
Приведите код целиком - из того фрагмента, что вы привели, совершенно не понятно что делает скрипт.
-
#samewindow
#line 0 solid blue
//------------------------------------------------------------------------------------
static m;
static stz;
static pr;
static op;
var x;
var y;
//------------------------------------------------------------------------------------
function init() {
x = new_object("hash");
y = new_object("hash");
}
//------------------------------------------------------------------------------------
function onOrder(var id) {
x = getOrder(id);
stz = x["status"]; // Запоминаем статус заявки
}
function onTrade(var id) {
y = getTrade(id);
op = y["operation"]; // Запоминаем направление сделки
pr = y["price"]; // Запоминаем цену сделки
}
//------------------------------------------------------------------------------------
function calc() {
if (m == 0) {trade_action::sell(1, ::lots); }
if (op == -1) {m = 1;} // где op = y["operation"]; переменная из хэша, что сделка на продажу прошла
line[0] = MovAvg(ind_ema, 5, pt_close);
}
Когда скрипт запускаю в окне графика, происходит продажа 1 лота и все, дальше сделок нет. Так было и задумано.
(http://s41.radikal.ru/i092/1310/32/8cad12b48ec3t.jpg) (http://radikal.ru/fp/ba207b460eab43789c51da13ad04cd3c)
Если запускаю этот скрипт в тестере стратегий на исторических данных он мне рисует вот такую картину
(http://s61.radikal.ru/i171/1310/a4/ccde6b3a48b4t.jpg) (http://radikal.ru/fp/ec56871882424e82bc41b75f0d660608)
-
Нашли ошибку. Тестировщик вместо onTrade отправляет старый сигнал onATFTrade. Исправсили, в ближайшей сборке будет работать нормально.
-
Спасибо, ждем ближайшую сборку.
Heller, а тестировщик будет как-то развиваться в плане работы со стоп-заявками?
-
Нашли ошибку. Тестировщик вместо onTrade отправляет старый сигнал onATFTrade. Исправсили, в ближайшей сборке будет работать нормально.
Большое спасибо за добавление функционала тестирования, мегаполезно и удобно. Думаю, со временем все недочеты будут устранены и можно будет тестировать в полном объеме.
Пока у меня иногда, например, не правильно показывает период, который гружу из файла, большую часть графиков воспринимает как минутный.
Версия 334.01
-
#samewindow
#line 0 solid blue
//------------------------------------------------------------------------------------
static m;
static stz;
static pr;
static op;
var x;
var y;
//------------------------------------------------------------------------------------
function init() {
x = new_object("hash");
y = new_object("hash");
}
//------------------------------------------------------------------------------------
function onOrder(var id) {
x = getOrder(id);
stz = x["status"]; // Запоминаем статус заявки
}
function onTrade(var id) {
y = getTrade(id);
op = y["operation"]; // Запоминаем направление сделки
pr = y["price"]; // Запоминаем цену сделки
}
//------------------------------------------------------------------------------------
function calc() {
if (m == 0) {trade_action::sell(1, ::lots); }
if (op == -1) {m = 1;} // где op = y["operation"]; переменная из хэша, что сделка на продажу прошла
line[0] = MovAvg(ind_ema, 5, pt_close);
}
Когда скрипт запускаю в окне графика, происходит продажа 1 лота и все, дальше сделок нет. Так было и задумано.
(http://s41.radikal.ru/i092/1310/32/8cad12b48ec3t.jpg) (http://radikal.ru/fp/ba207b460eab43789c51da13ad04cd3c)
Если запускаю этот скрипт в тестере стратегий на исторических данных он мне рисует вот такую картину
(http://s61.radikal.ru/i171/1310/a4/ccde6b3a48b4t.jpg) (http://radikal.ru/fp/ec56871882424e82bc41b75f0d660608)
Ответ: На протяжении всей работы скрипта m=0; соответственно до второй скобки компилятор даже не добирается (чтобы сделать m = 1), если бы в первых скобках стояла мультиплай версия продажи - то он бы шмалял продажи по каждому тику.
Так как там не мультиплай - делает продажу на каждую свечку по одному разу.
В целом условие которое вы ждете if (op == -1) где op = y["operation"]; может и наступать,...но не сработает во-первых из вышеизложенного, и во-вторых - в переменную же сохраняется стринг в виде константы "OP_SELL" - а не число, равное -1
Поэтому самое целесообразное, для такого минутного торга, сделать так :
function calc() {
if (op == "OP_SELL") {m = 1;}
if (m == 0) {trade_action::sell(1, ::lots); }
line[0] = MovAvg(ind_ema, 5, pt_close);
}
-
#samewindow
#line 0 solid blue
//------------------------------------------------------------------------------------
static m;
static stz;
static pr;
static op;
var x;
var y;
//------------------------------------------------------------------------------------
function init() {
x = new_object("hash");
y = new_object("hash");
}
//------------------------------------------------------------------------------------
function onOrder(var id) {
x = getOrder(id);
stz = x["status"]; // Запоминаем статус заявки
}
function onTrade(var id) {
y = getTrade(id);
op = y["operation"]; // Запоминаем направление сделки
pr = y["price"]; // Запоминаем цену сделки
}
//------------------------------------------------------------------------------------
function calc() {
if (m == 0) {trade_action::sell(1, ::lots); }
if (op == -1) {m = 1;} // где op = y["operation"]; переменная из хэша, что сделка на продажу прошла
line[0] = MovAvg(ind_ema, 5, pt_close);
}
Когда скрипт запускаю в окне графика, происходит продажа 1 лота и все, дальше сделок нет. Так было и задумано.
(http://s41.radikal.ru/i092/1310/32/8cad12b48ec3t.jpg) (http://radikal.ru/fp/ba207b460eab43789c51da13ad04cd3c)
Если запускаю этот скрипт в тестере стратегий на исторических данных он мне рисует вот такую картину
(http://s61.radikal.ru/i171/1310/a4/ccde6b3a48b4t.jpg) (http://radikal.ru/fp/ec56871882424e82bc41b75f0d660608)
Ответ: На протяжении всей работы скрипта m=0; соответственно до второй скобки компилятор даже не добирается (чтобы сделать m = 1), если бы в первых скобках стояла мультиплай версия продажи - то он бы шмалял продажи по каждому тику.
Так как там не мультиплай - делает продажу на каждую свечку по одному разу.
В целом условие которое вы ждете if (op == -1) где op = y["operation"]; может и наступать,...но не сработает во-первых из вышеизложенного, и во-вторых - в переменную же сохраняется стринг в виде константы "OP_SELL" - а не число, равное -1
Поэтому самое целесообразное, для такого минутного торга, сделать так :
function calc() {
if (op == "OP_SELL") {m = 1;}
if (m == 0) {trade_action::sell(1, ::lots); }
line[0] = MovAvg(ind_ema, 5, pt_close);
}
Не соглашусь.
Константу не надо заключать в кавычки. И если сравнить значение с -1, то тоже будет работать.
Переменная m статическая глобальная. Так что при первой сделке m будет равно 1.
Всё дело в том, что надо использовать onATFOrder и onATFTrade
-
По поводу кавычек, если честно не помню,...надо читать мануал на докувики,...
Но если бы все статические переменные были равные 1 при запуске скрипта - была бы несуразица,.. если вы в скрипте в функции init() - сделаете самый первый вывод (алерт) переменной "с" - то увидите что она равна нулю.
-
Я с Вами согласен что переменная в начале работы будет равно 0 ))
Это пост насчёт тестирования, может кто подскажет как при тестировании получить стоп заявки? функция getActiveStopOrderIDs() не возвращает ничего.
-
Да, выяснили, что getActiveStopOrderIDs не был почему-то реализован в тестировщике. В одном из ближайших обновлений сделаем.