Transaq

СБО "Transaq" => Подсистема ATF => Topic started by: nxz on Октября 03, 2013, 09:10:04 pm

Title: Tестировщик стратегий ATF
Post by: nxz on Октября 03, 2013, 09:10:04 pm
Пробую в встроенном тестере ATF простейщий код
Code: [Select]
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)
где видно, что сделка проходит на каждой свече!

Почему?
Как тестировать скрипты?
Умеет ли тестер корректно работать со стоп-заявками?
Title: Re: Tестировщик стратегий ATF
Post by: nxz on Октября 18, 2013, 10:15:33 am
Heller или кто-нибудь, дайте ответ.
Title: Re: Tестировщик стратегий ATF
Post by: Heller on Октября 18, 2013, 11:09:47 am
Приведите код целиком - из того фрагмента, что вы привели, совершенно не понятно что делает скрипт.
Title: Re: Tестировщик стратегий ATF
Post by: nxz on Октября 18, 2013, 12:14:27 pm
Code: [Select]
#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)
Title: Re: Tестировщик стратегий ATF
Post by: Heller on Октября 23, 2013, 01:58:25 pm
Нашли ошибку. Тестировщик вместо onTrade отправляет старый сигнал onATFTrade. Исправсили, в ближайшей сборке будет работать нормально.
Title: Re: Tестировщик стратегий ATF
Post by: nxz on Октября 23, 2013, 02:07:58 pm
Спасибо, ждем ближайшую сборку.

Heller, а тестировщик будет как-то развиваться в плане работы со стоп-заявками?
Title: Re: Tестировщик стратегий ATF
Post by: mega_traider on Октября 24, 2013, 01:33:21 pm
Нашли ошибку. Тестировщик вместо onTrade отправляет старый сигнал onATFTrade. Исправсили, в ближайшей сборке будет работать нормально.
Большое спасибо за добавление функционала тестирования, мегаполезно и удобно. Думаю, со временем все недочеты будут устранены и можно будет тестировать в полном объеме.
Пока у меня иногда, например, не правильно показывает период, который гружу из файла, большую часть графиков воспринимает как минутный.
Версия 334.01
Title: Re: Tестировщик стратегий ATF
Post by: White Noise on Февраля 11, 2014, 12:57:12 pm
Code: [Select]
#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);
}

Title: Re: Tестировщик стратегий ATF
Post by: alexejshevchenko on Февраля 12, 2014, 02:46:37 pm
Code: [Select]
#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
Title: Re: Tестировщик стратегий ATF
Post by: White Noise on Февраля 13, 2014, 05:47:15 am
По поводу кавычек, если честно не помню,...надо читать мануал на докувики,...
Но если бы все статические переменные были равные 1 при запуске скрипта - была бы несуразица,.. если вы в скрипте  в функции init() -  сделаете самый первый вывод (алерт)  переменной "с" - то увидите что она равна нулю.
Title: Re: Tестировщик стратегий ATF
Post by: alexejshevchenko on Февраля 13, 2014, 09:54:20 am
Я с Вами согласен что переменная в начале работы будет равно 0 ))
Это пост насчёт тестирования, может кто подскажет как при тестировании получить стоп заявки? функция getActiveStopOrderIDs() не возвращает ничего.
Title: Re: Tестировщик стратегий ATF
Post by: Heller on Февраля 13, 2014, 12:52:30 pm
Да, выяснили, что getActiveStopOrderIDs не был почему-то реализован в тестировщике. В одном из ближайших обновлений сделаем.