Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
ФХЪРСап 14, 2024, 04:24:28 pm
Начало Помощь Поиск Войти Регистрация
Новости:

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


ICQ Messenger - 362808130
Просмотр профиля Email
« : РЯаХЫп 28, 2014, 11:47:40 am »

Вот написал такой код

#line 0 solid red

extern kol_punktov = 15;
extern kol_lotov = 3;
extern step =0.01;

var trend1;
var trend2;
var i = 0;

function init()
{
   setInitCandles(10);
    setBounds(0, 10, 0);
}

function checkAction() //Определяем наличие активных заявок
{
   var NewArray = new_object("array"); //Определяем количество обычных активных заявок
   NewArray = getActiveOrderIDs();
   var NewArray2 = new_object("array"); //Определяем количество активных стоп-заявок
   NewArray2 = getActiveStopOrderIDs();
   var n = NewArray.size()+NewArray2.size();
   return n;
}

function calc()

{
   trend1 = IndRef("macdhistogram", 12, 26, 9, ind_ema, ind_ema, ind_ema, pt_close)[0] - IndRef("macdhistogram", 12, 26, 9, ind_ema, ind_ema, ind_ema, pt_close)[0][-1]; //Определяем направление тренда
   trend2 = IndRef("macdhistogram", 12, 26, 9, ind_ema, ind_ema, ind_ema, pt_close)[0][-1] - IndRef("macdhistogram", 12, 26, 9, ind_ema, ind_ema, ind_ema, pt_close)[0][-2];
   line[0] = trend1; //Для графического представления строим линию
   checkAction();
   var t = checkAction();
   line[1] = 0.01;
   line[2] = -0.01;
   line[3] = trend2;
   //i = 0;
   if (t == 0)    {
   if (trend1>0.01 and trend2>0.01)    {   
                                 //signal::outputMultiple(OP_BUY);
                                 //signal::outputMultiple(OP_SELL);
                                 signal::outputMultiple("i="+i);
                                 i = OP_BUY;
                                 signal::outputMultiple("i="+i);
                                 trade_action::buyMultiple(kol_lotov, ::lots, close);
                                 signal::outputMultiple(getLastErrorMessage());
                              }
   else    {
            signal::output("Тренды меньше 0,01. Событие calc()");
         }
               }
}
   
function onTrade(var id)
{
signal::outputMultiple("Событие onTrade");
signal::outputMultiple("i="+i);
if (i==1)   {
            i = 0;
            var order1 = new_object("hash");
            order1["operation"] = OP_SELL;
            order1["tp_activationprice"] = close+kol_punktov*step;
            order1["tp_quantity"] = kol_lotov;
            order1["tp_correction"] = "0.01";
            order1["tp_guardspread"] = "0.01";
            order1["sl_activationprice"] = close-kol_punktov*step;
            order1["sl_quantity"] = kol_lotov;
            order1["sl_orderprice"] = close-kol_punktov*step;
            trade_action::transactMultiple(order1); //Если тренд восходящий, то встаем в лонг
            }

signal::outputMultiple("i="+i);
}   


Сутью данного кода должно быть следующее. По событию сделки на рынке проверяем есть ли у нас активные сделки, ожидающие исполнения. Если таких сделок нет, то можем смело выставлять ордер на покупку. Выставили ордер, соответственно дальнейшие вызовы calc игнорируются, так как работает условие. Когда наш ордер удовлетворяется, то по событию onTrade выставляем нужный стоп лосс. Выставили. Опять ждем его исполнения. Когда удовлетворяется стоп-лосс, то мы должны запретить выполнение того же события onTrade и разрешить работу calc на выставление ордера. Для этого введен флаг i, который вы можете тут видеть. Я все проверил, по логике вещей все должно работать. Но на деле это работает совсем не так. По первому запуску выставляется ордер на покупку как надо. Когда ордер исполняется, то выставляется стоп лосс как я и хотел. Но дальше, когда стоп лосс исполняется и исполняется выставленная стоп лоссом заявка сново почему-то выставляется еще один стоп-лосс по событию onTrade и все (включая calc) перестает работать. И почему то в ошибке пишется о том, что средств не достаточно. Хотя я все проверял, всего хватает. Может быть как-то иначе можно запретить событие onTrade? Кто знает как это сделать?
Записан
DiveRSS
Jr. Member
**
Сообщений: 68


Просмотр профиля Email
« Ответ #1 : РЯаХЫп 28, 2014, 12:15:32 pm »

Вот тебе подсказка как я делал я .. Я анализировал наличие бумаг в портфеле. Если нужно проверить выставленный стоп ордер то посмотри "status".

попробуй конструкция типа if (getSecBalance() == 0)
status == SS_WATCHING  getSecBalance() != 0

http://www.transaq.ru/dokuwiki/atf:функции_по_назначению?s[]=getsecbalance
Записан
Termvsrobo
Newbie
*
Сообщений: 18


ICQ Messenger - 362808130
Просмотр профиля Email
« Ответ #2 : РЯаХЫп 28, 2014, 12:19:37 pm »

Тоже вариант. Но хочется понять как вызывается функция onTrade. Если мою проблему решить выше изложенным способом, то тогда зачем нужен обработчик события onTrade?
Записан
DiveRSS
Jr. Member
**
Сообщений: 68


Просмотр профиля Email
« Ответ #3 : РЯаХЫп 28, 2014, 12:27:12 pm »

function onTrade() событие совершение сделки то есть м ы можем выставить Ордел и он выполнится но в нем будет происходить несколько сделать предположим 100 лотов один тред 70 второй 30.


function onOrder() Событие исполнения ордера То есть изменение его статуса

Тред как и ордер может выставлять пользователь ( человек) или выставлять робот .

Я лично событе он трейд использую для определения последней цены по которой был выполнен ордер и от неё выставляю стопик. Но только когда статус Ордера Исполнен.
Записан
Termvsrobo
Newbie
*
Сообщений: 18


ICQ Messenger - 362808130
Просмотр профиля Email
« Ответ #4 : РЯаХЫп 28, 2014, 12:38:16 pm »

Т.е. событие onTrade вызывается несколько раз для одного и того же id? Даже если и так. Почему не запрещается по условию запрета. Ведь еще перед самым выполнением кода выставления заявки стоит обнуление флага, а значит в след раз не должен выполниться код. А он у меня почему то выполняется, когда выставленный стоп-лосс исполняется.
Записан
DiveRSS
Jr. Member
**
Сообщений: 68


Просмотр профиля Email
« Ответ #5 : РЯаХЫп 28, 2014, 12:47:45 pm »

function calc() - событе сделки на рынке.

и если не ошибаюсь то есть отличие в переменных вар и статик..
Зачем приходит к логическим цифрам если можно сравнивать параметры (if (i==OP_BUY) )

к тому же я  i = OP_BUY; это команда запишет значение OP_BUY а не логическую 1.

onTrade- Да может вызываться для одного и того же id несколько раз ( но я точно не уверен)
Записан
Termvsrobo
Newbie
*
Сообщений: 18


ICQ Messenger - 362808130
Просмотр профиля Email
« Ответ #6 : РЯаХЫп 28, 2014, 12:54:40 pm »

OP_BUY - это константа, равная 1.
Записан
DiveRSS
Jr. Member
**
Сообщений: 68


Просмотр профиля Email
« Ответ #7 : РЯаХЫп 28, 2014, 03:19:40 pm »

В одном ордере может быть несколько трейдов что обозначает что по одним id ордера может быть несколько id трейдов. ( Извиняюсь что так описывался был в сделках.)

Да согласен OP_BUY Константа но тогда хоть убей не понимаю зачем путать самого себя где ставить 1 а где OP_BUY ?? я лично за однатипнасть и у меня в коде для меня само го же написаны коменты поскольку через недельку когда я хочу что то поправить разобраться становится уже проблематично.
Записан
Termvsrobo
Newbie
*
Сообщений: 18


ICQ Messenger - 362808130
Просмотр профиля Email
« Ответ #8 : РЯаХЫп 29, 2014, 09:06:13 am »

Ну я честно говоря не путаю. Согласен, это плохой тон программирования, но просто в голове держу OP_BUY = 1.
Записан
DiveRSS
Jr. Member
**
Сообщений: 68


Просмотр профиля Email
« Ответ #9 : РЯаХЫп 29, 2014, 09:35:53 am »

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


Войти

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