dok34.ru
Moderator

Red Hat сделала свой знаменитый Linux-дистрибутив бесплатным - CNews
Red Hat утвердила правила полностью бесплатного использования своего корпоративного дистрибутива RHEL, который первоначально...
Follow along with the video below to see how to install our site as a web app on your home screen.
Примечание: This feature may not be available in some browsers.
Ну, не я 🙂Док, добрый вечер. Вы говорили что можете посмотреть код скрипта терминала.
Я никак 🙂А как Вы в нем разберетесь?
Понял. Но спецификация языка же иная. Вряд ли так получится. Но спасибо. Если на днях не решу проблему - напишу.Я никак 🙂
А сын - возможно и сможет. Если вопрос какой есть - там скорее всего где-то ...как обычно, пропущено что-то, или логика алгоритма нарушена..
В этом смысле - могу попросить его глянуть.
Это да. За неимением другого спеца - можно попробоватьПонял. Но спецификация языка же иная. Вряд ли так получится. Но спасибо. Если на днях не решу проблему - напишу.
//Переменные ордеров----------------------------------
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);
}
Код вижу, а проблема? Что работает, что не работает или неверно делает?Добрый вечер.
Не вышло пока ничего с исправлением скрипта. Приведу код здесь.
Код://Переменные ордеров---------------------------------- 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); }
Есть второй скрипт, который посылает общую переменную. Эта переменная обрабатывается здесь в updateData(). В зависимости от состояния переменной действует стратегия.Код вижу, а проблема? Что работает, что не работает или неверно делает?
В связи с решением Верховного суда Российской Федерации (далее РФ) от 30 ноября 2023 года), движение ЛГБТ* признано экстремистским и запрещена его деятельность на территории РФ. Данное решение суда подлежит немедленному исполнению, исходя из чего на форуме будут приняты следующие меры - аббривеатура ЛГБТ* должна и будет применяться только со звездочкой (она означает иноагента или связанное с экстремизмом движение, которое запрещено в РФ), все ради того чтобы посетители и пользователи этого форума могли ознакомиться с данным запретом. Символика, картинки и атрибутика что связана с ныне запрещенным движением ЛГБТ* запрещены на этом форуме - исходя из решения Верховного суда, о котором было написано ранее - этот пункт внесен как экстренное дополнение к правилам форума части 4 параграфа 12 в настоящее время.