Transaq
СБО "Transaq" => Подсистема ATF => Topic started by: Олег on 13.11.2010, 18:08:11
-
Вчера тестировал вот этот скрипт пересечения двух мувингов из документации:
#samewindow
#line 0 solid red
extern fast = 9;
extern slow = 14;
var trend = 0;
function init()
{
setInitCandles(1);
}
function calc()
{
line[0] = MovAvg(ind_ema, fast, pt_close);
line[1] = MovAvg(ind_ema, slow, pt_close);
if (trend == 1 and line[0] < line[1]) {
signal::alert("Продажа: по " + getSecName() +
" быстрая MA пересекла медленную сверху вниз.");
}
if (trend == -1 and line[0] > line[1]) {
signal::alert("Покупка: по " + getSecName() +
" медленная MA пересекла быструю снизу вверх.");
}
if (line[1] < line[0]) {trend = 1;}
else if (line[1] > line[0]) {trend = -1;}
}
Выбрал период для быстрого единицу (т.е. просто значение CLOSE), а для медленного двойку. Тестировал в Транзаке на минутных свечках фьючерсов Сбербанка.
Результат такой: иногда возникают такие ситуации, когда приходят несколько подряд сообщений с "советом" купить или продать. Если я правильно понимаю, так быть не должно, они вроде бы должны чередоваться в шахматном порядке. Правильно я понимаю?
-
Тут идивительного ничего нет. Че написал, то и произходит. Бывают такие ситуации, что линия А просто коснется линии Б
-
Бывают такие ситуации, что линия А просто коснется линии Б
Если просто коснётся, тогда не выполнятся условия:
ine[1] > line[0]
line[1] < line[0]
и, по идее, должен сохраниться текущий статус, т.е. переменная trend должна сохранить своё текущее значение и сигналов никаких подаваться не должно. Пересечения-то не было, если просто коснулось. Неравенства-то у нас везде строгие.
-
Хотелось бы всё-таки услышать мнение разработчиков на сей счёт. Баг это или не баг? Если надо, я могу видеозахват экрана сделать, если на слово не верите :)
Именно потому-то мне и захотелось "капитально" разобраться с поведением переменных в ATF.
Мне кажется, проблема состоит в том, что когда происходит пересечение мувингов на свечке (например, цена шла вверх, мувинги кратковременно пересеклись), но "окончательного" пересечения на этой свечке всё-таки не произошло (цена в конце концов отступила от максимума), а сигнал или торговая операция уже произошли. При этом переменная TREND к моменту "закрытия свечи" осталась в своём прежнем медвежьем состоянии, т.е. равной минус единице. И вот это самое значение она тащит на следующую свечу, где снова цена растёт, пересечение снова происходит и снова мы получаем сигнал на покупку или робот совершает торговую операцию.
Но фактически-то пересечение ОДНО и какой нам смысл покупать два раза? Разумеется, могут быть ситуации, когда такое поведение (двойная-тройная и т.д. покупка) оправдано, но мне кажется, что не такой смысл был первоначально заложен в этот индикатор разработчиками.
А ведь это едва ли не самый простой скриптовый индикатор из всех возможных. Какие же глубоководные мины могут быть спрятаны на дне других более сложных?! :)
-
Если будет совершено пересечение линий, но потом все вернутся обратно, то переменная trends не изменит своего значения, опять же в силу поведения var. Лучше использовать static, насколько я могу судить при беглом просмотре кода.
-
Если будет совершено пересечение линий, но потом все вернутся обратно, то переменная trends не изменит своего значения, опять же в силу поведения var. Лучше использовать static, насколько я могу судить при беглом просмотре кода.
OK, попробую :)
-
Если будет совершено пересечение линий, но потом все вернутся обратно, то переменная trends не изменит своего значения, опять же в силу поведения var. Лучше использовать static, насколько я могу судить при беглом просмотре кода.
Замена var на static ситуацию не меняет, также выдается несколько подряд сигналов, причем часто эти сигналы ложные (в дальнейшем линии расходятся и пересечения не происходит). Я так понимаю проблема в том, что скользящие рассчитываются не по реальной цене закрытия свечи, а по текущей. Т. е. индикатор считает текущую рыночную цену ценой закрытия свечи, коей она не является. Отсюда сигналы приходят внутри свечи.
Как это исправить? Подскажите, пожалуйста.
-
Vasy_Ok, проверяйте пересечение линий и совершайте сделки не в calc(), а в onNewCandle().
-
Vasy_Ok, проверяйте пересечение линий и совершайте сделки не в calc(), а в onNewCandle().
Пытался так сделать. Как ни крутил, не получается. Может неверно "обвязываю" onNewCandle()?
В этом случае обе скользящие имеют вид горизонтальной линии со значением "0".
#samewindow
#line 0 solid green
#line 1 solid red
extern fast = 1;
extern slow = 2;
var trend = 0;
function init()
{
setInitCandles(1);
}
function onNewCandle()
{
line[0] = MovAvg(ind_ema, fast, pt_open);
line[1] = MovAvg(ind_ema, slow, pt_open);
if (trend == 1 and line[0] < line[1]) {
signal::play("111.wav")
signal::alert("Продавай " + getSecName() + " по " + close +
", быстрая MA пересекла медленную сверху вниз.");
}
if (trend == -1 and line[0] > line[1]) {
signal::play("111.wav")
signal::alert("Покупай " + getSecName() + " по " + close +
", быстрая MA пересекла медленную снизу вверх.");
}
if (line[1] < line[0]) {trend = 1;}
else if (line[1] > line[0]) {trend = -1;}
}
А в этом, сигналы вообще не приходят. Правда скользящие перестраиваются только после закрытия свечи.
#samewindow
#line 0 solid green
#line 1 solid red
extern fast = 1;
extern slow = 2;
var trend = 0;
function init()
{
setInitCandles(1);
}
function calc()
{
line[0] = MovAvg(ind_ema, fast, pt_open);
line[1] = MovAvg(ind_ema, slow, pt_open);
if (line[1] < line[0]) {trend = 1;}
else if (line[1] > line[0]) {trend = -1;}
}
function onNewCandle()
{
if (trend == 1 and line[0] < line[1]) {
signal::play("111.wav")
signal::alert("Продавай " + getSecName() + " по " + close +
", быстрая MA пересекла медленную сверху вниз.");
}
if (trend == -1 and line[0] > line[1]) {
signal::play("111.wav")
signal::alert("Покупай " + getSecName() + " по " + close +
", быстрая MA пересекла медленную снизу вверх.");
}}
Вот такая загогулина.
-
Vasy_Ok, проверяйте пересечение линий и совершайте сделки не в calc(), а в onNewCandle().
Пытался так сделать. Как ни крутил, не получается. Может неверно "обвязываю" onNewCandle()?
Ну так что, мне кто-нибудь растолкует, что я неправильно пишу в коде?
Аууууууууууууууу! Очень интересно.
-
Нет-нет, расчеты надо проводить в calc(), а вот проверять пересечелния и проводить сделки - в onNewCandle().
-
Нет-нет, расчеты надо проводить в calc(), а вот проверять пересечелния и проводить сделки - в onNewCandle().
Что-то я никак не допетрю каким макаром это записать. Внутрь calc() функцию onNewCandle() запихнуть нет возможности, как я понял. Сделал раздельно, но так сигналы не приходят:
#samewindow
#line 0 solid green
#line 1 solid red
extern fast = 1;
extern slow = 2;
var trend = 0;
function init()
{
setInitCandles(1);
}
function calc()
{
line[0] = MovAvg(ind_ema, fast, pt_close);
line[1] = MovAvg(ind_ema, slow, pt_close);
}
function onNewCandle()
{
if (trend == 1 and line[0] < line[1]) {
signal::alert("Продавай " + getSecName() + " по " + close +
", быстрая MA пересекла медленную сверху вниз.");}
if (trend == -1 and line[0] > line[1]) {
signal::alert("Покупай " + getSecName() + " по " + close +
", быстрая MA пересекла медленную снизу вверх.");}
if (line[1] < line[0]) {trend = 1;}
else if (line[1] > line[0]) {trend = -1;}
}
-
Сделайте trend типа static.
-
Доброе время суток товарищи раз рабы столкнулся с такой же ситуацией что собственно хотелось бы увидеть чётки развернутый ответ по данному вопросу с правильным примером кода и последующим изменением его в справочном материале, и большая просьба не писать больше трехфразные отписки из серии смотри туда почитай там или ваш топовый ответ мы не вкурсе спросите у когонить другого
заранее спасибо за понимание
-
Сделайте trend типа static.
#samewindow
#line 0 solid green
#line 1 solid red
extern fast = 1;
extern slow = 2;
static trend = 0;
function init()
{
setInitCandles(1);
}
function calc()
{
line[0] = MovAvg(ind_ema, fast, pt_close);
line[1] = MovAvg(ind_ema, slow, pt_close);
}
function onNewCandle()
{
if (trend == 1 and line[0] < line[1]) {
signal::alert("Продавай " + getSecName() + " по " + close +
", быстрая MA пересекла медленную сверху вниз.");}
if (trend == -1 and line[0] > line[1]) {
signal::alert("Покупай " + getSecName() + " по " + close +
", быстрая MA пересекла медленную снизу вверх.");}
if (line[1] < line[0]) {trend = 1;}
else if (line[1] > line[0]) {trend = -1;}
}
В таком виде сигнал на покупку приходит через свечу после пересечения. Т. е. пересечение произошло и свеча закрылась - сигнала нет. Только после закрытия следующей свечи приходит сигнал на покупку. Сигнал на продажу приходит как положено. Цена закрытия в сообщении сигнала является ценой открытия следующей после пересечения свечи.
Далее немного не по теме. Хоть eurusd_05 и выразился немного грубо, но в общем я присоединяюсь к его пожеланиям. С брокерских форумов Вы отсылаете сюда. Тут активность очень низкая. Толковый ответ думаю можно успеть сварганить для человека, который не в зуб ногой в программировании. Сюда же не чудаки приходят высказать свои дурацкие прихоти и повеселиться. Подозреваю, что Ваш труд нелегок и команда маленькая. Терминал Вы написали хороший. В него еще можно добавить полезных функций. Для этого мы сюда и приходим, чтобы высказать свои вопросы и чаяния. И это значит, что программа нам интересна. Но главное достоинство Вашей разработки - это возможность добавлять необходимые конкретно мне функции с помощью программирования на ATF не прикладывая при этом титанических усилий. В этом помогает составленная Вами документация по языку. Спасибо за нее. Я не маркетолог и не разбираюсь во всех тонкостях программистского бизнеса, но мне кажется, что помимо еще большого количества качественного функционала это основное и очень ценное отличие вашего продукта от продуктов конкурентов.
-
Сейчас заменил сигнал на сделку и прогонял тест. Я в упор не вижу в чем ошибка этого кода. После закрытия свечки, если было пересечение, происходит сделка, насколько я понимаю. Или вы хотите, чтобы сделка происходила сразу как произойдет пересечение? В этом случае просто не понятно что делать, если пересечение произошло, а по следующей сделке скользящая средняя пересчиталась и это пересечение исчезло. Вам надо строго формализовать как именно должен вести себя робот, и тогда уже будет понятно как это писать.
-
Сейчас заменил сигнал на сделку и прогонял тест. Я в упор не вижу в чем ошибка этого кода. После закрытия свечки, если было пересечение, происходит сделка, насколько я понимаю. Или вы хотите, чтобы сделка происходила сразу как произойдет пересечение? В этом случае просто не понятно что делать, если пересечение произошло, а по следующей сделке скользящая средняя пересчиталась и это пересечение исчезло. Вам надо строго формализовать как именно должен вести себя робот, и тогда уже будет понятно как это писать.
Прошу простить меня за назойливость. Heller, я еще первым своим постом в этой теме строго формализовал требуемое поведение скрипта. Да, ошибки в коде нет, неверен сам принцип работы. Функция calc() воспринимает в качестве цены закрытия текущие рыночные цены (индикатор перерисовывается в моменте по цене каждой совершенной сделки). onNewCandle() работает примерно по тому же принципу, но только не по каждой сделке, а по открытию новой свечи. Поэтому при выполнении этой функции и выдается в качестве цены закрытия open новой свечи (писал об этом в предыдущем посте). В предыдущем посте я правда привел только некоторые наблюдаемые факты, в сути проблемы не разобрался. Если мы добиваемся абсолютной точности выполнения скрипта по правилам, то при его проверке на минутном графике с параметрами fast = 1; slow = 2, увидим много интересных явлений. В случае пересечения скользящих и закрытии свечи, а открытие следующей свечи приведет к обратному пересечению - сигнала не будет. Аналогичная ситуация с ложным сигналом. А это уже серьезнее, такая ситуация может произойти на любых таймфреймах и периодах скользящих. Если открытие новой свечи привело к пересечению скользяшек, то поступит сигнал, хотя в дальнейшем пересечение не произойдет и свеча закроется без него. Heller, прогоняйте тест в таком виде. Результаты Вас удивят. Меня, кстати, очень поразило то, что замена сигнала на заявку привела к изменениям в проверке условий и принципе работы скрипта. Если Вы так уверены в правильности выполнения кода, сварганьте на нем робота и поработайте с реальным счетом на свои деньги. Желаю удачи! ;D