компьютерный вопрос

Док, добрый вечер. Вы говорили что можете посмотреть код скрипта терминала. А как Вы в нем разберетесь?
 
Док, добрый вечер. Вы говорили что можете посмотреть код скрипта терминала.
Ну, не я :)
У меня есть кому посмотреть :)
А как Вы в нем разберетесь?
Я никак :)
А сын - возможно и сможет. Если вопрос какой есть - там скорее всего где-то ...как обычно, пропущено что-то, или логика алгоритма нарушена..
В этом смысле - могу попросить его глянуть.
 
Я никак :)
А сын - возможно и сможет. Если вопрос какой есть - там скорее всего где-то ...как обычно, пропущено что-то, или логика алгоритма нарушена..
В этом смысле - могу попросить его глянуть.
Понял. Но спецификация языка же иная. Вряд ли так получится. Но спасибо. Если на днях не решу проблему - напишу.
 
Понял. Но спецификация языка же иная. Вряд ли так получится. Но спасибо. Если на днях не решу проблему - напишу.
Это да. За неимением другого спеца - можно попробовать :))
 
  • Like
Реакции: vito
Любопытно, как можно выйти из положения, не имея оборудования :)
 
Добрый вечер.

Не вышло пока ничего с исправлением скрипта. Приведу код здесь.

Код:
//Переменные ордеров----------------------------------

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(). В зависимости от состояния переменной действует стратегия.
Проблема - через некоторое время (когда как) терминал (API) выдает сообщение о внутренней ошибке компилятора. Без указания строки ошибки.
Скрипт останавливает выполнение и больше не торгует сам. Пока я его не запущу вручную.

Буду отключать все функции по одной, чтобы найти проблему. Может без какой-либо краша не будет.

Всего на робота 2 скрипта, которые общаются через 2 общих переменных.
Скрипт выше принимает sberFM5Allow и посылает globalPos. Второй, соответственно, наоборот.
 

Новые комментарии

LGBT*

В связи с решением Верховного суда Российской Федерации (далее РФ) от 30 ноября 2023 года), движение ЛГБТ* признано экстремистским и запрещена его деятельность на территории РФ. Данное решение суда подлежит немедленному исполнению, исходя из чего на форуме будут приняты следующие меры - аббривеатура ЛГБТ* должна и будет применяться только со звездочкой (она означает иноагента или связанное с экстремизмом движение, которое запрещено в РФ), все ради того чтобы посетители и пользователи этого форума могли ознакомиться с данным запретом. Символика, картинки и атрибутика что связана с ныне запрещенным движением ЛГБТ* запрещены на этом форуме - исходя из решения Верховного суда, о котором было написано ранее - этот пункт внесен как экстренное дополнение к правилам форума части 4 параграфа 12 в настоящее время.

Назад
Сверху