Termvsrobo
Newbie
Сообщений: 18
|
|
« : РЯаХЫп 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? Кто знает как это сделать?
|