//Переменные ордеров----------------------------------
static order;
static pos;
static stop;
static operInfo;
static onStopOrderInfo;
static book;
static bid;
static ask;
static sberFM5Allow;
//Переменные времени клиринга-------------------------
static difference;
static clearingDifference;
static clearingCancel;
static time;
static hour;
static minute;
static second;
static clearingCancelAmount;
//Переменные записи состояния в файл------------------
extern "string" SberFutTradeData = "C:\\Users\\nomer\\Desktop\\Торговые скрипты\\Скрипты ATF\\Документы\\SberTestOrder.txt";
static SberFutDataFile;
//Функции стратегии------------------------------------
function updateData() {
sberFM5Allow = getEnvVariable("sberFM5Allow");
}
function init() {
updateData();
book = new_object("book");
book.subscribe();
var xml = new_object("xmlarchive");
xml.loadfile("C:\\Users\\nomer\\Desktop\\Торговые скрипты\\Скрипты ATF\\Документы\\xml\\SberTestOrder.xml");
clearingCancel = xml.loadvar("clearingCancel");
difference = xml.loadvar("difference");
pos = xml.loadvar("pos");
SberFutDataFile = new_object("file");
SberFutDataFile.waopen(SberFutTradeData);
}
function getPrices() {
book.load();
bid = book.getBidPrice(0);
ask = book.getAskPrice(0);
}
//Функции исполнения ордеров--------------------------
function writeXML() {
var onStopXml = new_object("xmlarchive");
onStopXml.newdocument("C:\\Users\\nomer\\Desktop\\Торговые скрипты\\Скрипты ATF\\Документы\\xml\\SberTestOrder.xml");
onStopXml.savevar("clearingCancel", clearingCancel);
onStopXml.savevar("difference", difference);
onStopXml.savevar("pos", pos);
onStopXml.savefile();
}
function onStopIndicator(var reason) {
writeXML();
}
function makeOrder() {
order = new_object("hash");
if (pos == 0) {
if (sberFM5Allow) {
order["operation"] = OP_BUY;
order["quantity"] = 1;
trade_action::transact(order);
}
}
}
function onOrder(var ordId) {
var onOrderInfo = getOrder(ordId);
//если ошибка
if (onOrderInfo["message"]) {
signal::outputMultiple("Ошибка выставления ордера! " +
"\nВермя: " + getFormattedDateTime(getCandleTime() ) +
"\n" + onOrderInfo["message"] + "\n---");
signal::outputMultiple(getLastErrorMessage() );
SberFutDataFile.writeLn("Ошибка ордера!!! " + onOrderInfo["message"] +
"\nИнструмент: " + getSecName() +
"\nВремя: " + getFormattedDateTime(getCandleTime()) +
"\nПоследняя ошибка: " + getLastErrorMessage() +
"\n--------------------------------------------\n\n");
}
}
function onStopOrder(var stopId) {
onStopOrderInfo = getStopOrder(stopId);
if (not onStopOrderInfo["message"]) {
writeXML();
signal::output("\n\nВыставлен стоп: " + onStopOrderInfo["trnid"] +
"\nВремя: " + getFormattedDateTime(getCandleTime() ) +
"\nOperation: " + onStopOrderInfo["operation"] +
"\nSL_quantity: " + onStopOrderInfo["sl_quantity"] +
"\nSL_price: " + onStopOrderInfo["sl_activationprice"] +
"\nTP_price: " + onStopOrderInfo["tp_activationprice"] +
"\n---\n\n");
SberFutDataFile.writeLn("\n\nВыставлен стоп!!! " +
"\nИнструмент: " + getSecName() +
"\nВремя: " + getFormattedDateTime(getCandleTime()) +
"\nId: " + onStopOrderInfo["trnid"] +
"\nOrderno: " + onStopOrderInfo["orderno"] +
"\nStatus: " + onStopOrderInfo["status"] +
"\nOperation: " + onStopOrderInfo["operation"] +
"\nInductedBy: " + onStopOrderInfo["trdno"] +
"\nSL_price: " + onStopOrderInfo["sl_activationprice"] +
"\nSL_quantity: " + onStopOrderInfo["sl_quantity"] +
"\nTP_price: " + onStopOrderInfo["tp_activationprice"] +
"\nTP_quantity: " + onStopOrderInfo["tp_quantity"] +
"\n--------------------------------------------\n\n");
} else {
signal::output("\n\nStop Error!!! " + onStopOrderInfo["error"] +
"\nВремя: " + getFormattedDateTime(getCandleTime() ) +
"\nMessage: " + onStopOrderInfo["message"] +
"\n---\n\n");
SberFutDataFile.writeLn("\n\nОшибка выставления стопа: " +
onStopOrderInfo["message"] +
"\nВермя: " + getFormattedDateTime(getCandleTime() ) +
"\nОшибка: " + getLastErrorMessage() +
"\n--------------------------------------------\n\n");
//тестирую закрытие сделки при ошибке стопа
if (pos != 0) {
if (operInfo["operation"] == OP_SELL) {
trade_action::buy(operInfo["quantity"], ::lots);
} else if (operInfo["operation"] == OP_BUY) {
trade_action::sell(operInfo["quantity"], ::lots);
}
}
}
}
function writeTrade() {
SberFutDataFile.writeLn("\n\nВыполнена сделка!!!" +
"\nИнструмент: " + getSecName() +
"\nВремя: " + getFormattedDateTime(getCandleTime()) +
"\nОперация: " + operInfo["operation"] +
"\nЦена: " + operInfo["price"] +
"\nКоличество: " + operInfo["quantity"] +
"\nПозиция (брокер): " + operInfo["currentpos"] +
"\nПозиция (atf): " + pos +
"\n\nИндикаторы: " +
"\nsberFM5Allow: " + sberFM5Allow +
"\nClearingCancel: " + clearingCancel +
"\n================================================\n\n");
}
function onTrade(var tradeId) {
operInfo = getTrade(tradeId);
if (operInfo["operation"] == OP_BUY) {
pos += operInfo["quantity"];
if (pos != 0 && pos < 1000000) {
//Стоп
stop = new_object("hash");
stop["operation"] = OP_SELL;
stop["sl_quantity"] = operInfo["quantity"];
stop["validbefore"] = TILL_CANCELED;
stop["sl_activationprice"] = operInfo["price"] - 100;
difference = operInfo["price"] - stop["sl_activationprice"];
//Тейк
stop["tp_activationprice"] = operInfo["price"] + 150;
stop["tp_quantity"] = operInfo["quantity"];
//выставление стопа
trade_action::transactMultiple(stop);
writeTrade();
writeXML();
}
} else if (operInfo["operation"] == OP_SELL) {
pos -= operInfo["quantity"];
writeTrade();
writeXML();
//снять все заявки
trade_action::cancelAllOrders();
trade_action::cancelStopOrder(stop);
}
}
function clearingClose() {
if (clearingCancel == false && pos < 1000000) {
if (pos > 0) {
clearingDifference = ask - stop["sl_activationprice"];
if (clearingDifference < difference * 3) {
clearingCancelAmount = abs(pos);
trade_action::sell(clearingCancelAmount, ::lots);
clearingCancel = true;
}
}
pos += 10000000;
//снять все заявки
trade_action::cancelAllOrders();
trade_action::cancelStopOrder(stop);
writeXML();
signal::output("\n\nclearingCancel: " + clearingCancel +
"\npos: " + pos +
"\n=================================================\n\n");
SberFutDataFile.writeLn("\n\nclearingCancel: " + clearingCancel +
"\nВремя: " + getFormattedDateTime(getCandleTime()) +
"\npos: " + pos +
"\n\n\n ==============================================");
}
}
function clearingOpen() {
pos = 0;
if (clearingCancel == true) {
clearingCancel = false;
if (operInfo["operation"] == OP_SELL) {
order["operation"] = OP_BUY;
order["quantity"] = clearingCancelAmount;
trade_action::transact(order);
}
signal::output("\n\nclearingCancel: " + clearingCancel +
"\npos: " + pos +
"\n=================================================\n\n");
SberFutDataFile.writeLn("\n\nclearingCancel: " + clearingCancel +
"\nВремя: " + getFormattedDateTime(getCandleTime()) +
"\npos: " + pos +
"\n\n\n ==============================================");
}
}
function checkCurrentTime() {
time = getServerTime();
hour = getHour(time);
minute = getMinute(time);
second = getSecond(time);
getPrices();
if (hour == 18 && minute >= 40 && minute < 45) {
clearingClose();
} else if ( (hour == 19 && minute >= 0 && second > 30) && pos > 1000000 ) {
clearingOpen();
}
}
function onNewCandle() {
makeOrder();
writeXML();
}
function calc() {
updateData();
checkCurrentTime();
setEnvVariable("globalPos", pos);
}