Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
Мая 28, 2022, 01:21:12 pm
Начало Помощь Поиск Войти Регистрация
Новости:

Transaq  |  СБО "Transaq"  |  Подсистема ATF  |  Topic: Tестировщик стратегий ATF « предыдущая тема следующая тема »
Страниц: [1] Печать
Автор Тема: Tестировщик стратегий ATF  (Прочитано 6652 раз)
nxz
Full Member
***
Сообщений: 241


Просмотр профиля Email
« : Октября 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 лота и все, дальше сделок нет. Так было и задумано.

Если запускаю этот скрипт в тестере стратегий на исторических данных он мне рисует вот такую картину

где видно, что сделка проходит на каждой свече!

Почему?
Как тестировать скрипты?
Умеет ли тестер корректно работать со стоп-заявками?
Записан
nxz
Full Member
***
Сообщений: 241


Просмотр профиля Email
« Ответ #1 : Октября 18, 2013, 10:15:33 am »

Heller или кто-нибудь, дайте ответ.
Записан
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #2 : Октября 18, 2013, 11:09:47 am »

Приведите код целиком - из того фрагмента, что вы привели, совершенно не понятно что делает скрипт.
Записан
nxz
Full Member
***
Сообщений: 241


Просмотр профиля Email
« Ответ #3 : Октября 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 лота и все, дальше сделок нет. Так было и задумано.


Если запускаю этот скрипт в тестере стратегий на исторических данных он мне рисует вот такую картину
Записан
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #4 : Октября 23, 2013, 01:58:25 pm »

Нашли ошибку. Тестировщик вместо onTrade отправляет старый сигнал onATFTrade. Исправсили, в ближайшей сборке будет работать нормально.
Записан
nxz
Full Member
***
Сообщений: 241


Просмотр профиля Email
« Ответ #5 : Октября 23, 2013, 02:07:58 pm »

Спасибо, ждем ближайшую сборку.

Heller, а тестировщик будет как-то развиваться в плане работы со стоп-заявками?
« Последнее редактирование: Октября 23, 2013, 02:49:24 pm от nxz » Записан
mega_traider
Newbie
*
Сообщений: 21


Просмотр профиля Email
« Ответ #6 : Октября 24, 2013, 01:33:21 pm »

Нашли ошибку. Тестировщик вместо onTrade отправляет старый сигнал onATFTrade. Исправсили, в ближайшей сборке будет работать нормально.
Большое спасибо за добавление функционала тестирования, мегаполезно и удобно. Думаю, со временем все недочеты будут устранены и можно будет тестировать в полном объеме.
Пока у меня иногда, например, не правильно показывает период, который гружу из файла, большую часть графиков воспринимает как минутный.
Версия 334.01
« Последнее редактирование: Октября 25, 2013, 11:13:28 am от mega_traider » Записан
White Noise
Full Member
***
Сообщений: 164


White Noise

ICQ Messenger - 411196569
Просмотр профиля Email
« Ответ #7 : Февраля 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 лота и все, дальше сделок нет. Так было и задумано.


Если запускаю этот скрипт в тестере стратегий на исторических данных он мне рисует вот такую картину


Ответ: На протяжении всей работы скрипта 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);
}

Записан
alexejshevchenko
Jr. Member
**
Сообщений: 68



Просмотр профиля WWW Email
« Ответ #8 : Февраля 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 лота и все, дальше сделок нет. Так было и задумано.


Если запускаю этот скрипт в тестере стратегий на исторических данных он мне рисует вот такую картину


Ответ: На протяжении всей работы скрипта 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
Записан
White Noise
Full Member
***
Сообщений: 164


White Noise

ICQ Messenger - 411196569
Просмотр профиля Email
« Ответ #9 : Февраля 13, 2014, 05:47:15 am »

По поводу кавычек, если честно не помню,...надо читать мануал на докувики,...
Но если бы все статические переменные были равные 1 при запуске скрипта - была бы несуразица,.. если вы в скрипте  в функции init() -  сделаете самый первый вывод (алерт)  переменной "с" - то увидите что она равна нулю.
« Последнее редактирование: Февраля 13, 2014, 05:53:45 am от White Noise » Записан
alexejshevchenko
Jr. Member
**
Сообщений: 68



Просмотр профиля WWW Email
« Ответ #10 : Февраля 13, 2014, 09:54:20 am »

Я с Вами согласен что переменная в начале работы будет равно 0 ))
Это пост насчёт тестирования, может кто подскажет как при тестировании получить стоп заявки? функция getActiveStopOrderIDs() не возвращает ничего.
Записан
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #11 : Февраля 13, 2014, 12:52:30 pm »

Да, выяснили, что getActiveStopOrderIDs не был почему-то реализован в тестировщике. В одном из ближайших обновлений сделаем.
Записан
Страниц: [1] Печать 
Transaq  |  СБО "Transaq"  |  Подсистема ATF  |  Topic: Tестировщик стратегий ATF « предыдущая тема следующая тема »
Перейти в:  


Войти

Powered by MySQL Powered by PHP Powered by SMF 2.0.10 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS!