Пример работы с файлами в QLua (Lua)

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 9, среднее: 4,56 из 5)
Загрузка...

Qlua-основы

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
-- Флаг поддержания работы скрипта
IsRun = true;
 
function main()
   -- Пытается открыть файл в режиме "чтения/записи"
   f = io.open(getScriptPath().."\\Test.txt","r+");
   -- Если файл не существует
   if f == nil then 
      -- Создает файл в режиме "записи"
      f = io.open(getScriptPath().."\\Test.txt","w"); 
      -- Закрывает файл
      f:close();
      -- Открывает уже существующий файл в режиме "чтения/записи"
      f = io.open(getScriptPath().."\\Test.txt","r+");
   end;
   -- Записывает в файл 2 строки
   f:write("Line1\nLine2"); -- "\n" признак конца строки
   -- Сохраняет изменения в файле
   f:flush();
   -- Встает в начало файла 
      -- 1-ым параметром задается относительно чего будет смещение: "set" - начало, "cur" - текущая позиция, "end" - конец файла
      -- 2-ым параметром задается смещение
   f:seek("set",0);
   -- Перебирает строки файла, выводит их содержимое в сообщениях
   for line in f:lines() do message(tostring(line));end
   -- Закрывает файл
   f:close();
   -- Цикл будет выполнятся, пока IsRun == true
   while IsRun do
      sleep(100);
   end;   
end;
 
function OnStop()
   IsRun = false;
end;

Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!

Добавить комментарий

Пример работы с файлами в QLua (Lua): 137 комментариев

  1. Дмитрий, приветствую! Столкнулся с таким вот: когда запускается квик, то должен автоматически запускается мой скрипт на lua, но скрипт выдает ошибку "...32: bad argument #1 to 'write' (string expected, got nil)". Далее я запускаю его вручную и всё идет как надо. Путь к файлу прописан как:

    1
    
     f = io.open("C:\\Program Files (x86)\\AmiBroker\\param_quik.ini","w");

    Что может влиять на это или есть мысли то ка поправить?

    1. Поменял на

      1
      
      f = io.open(getScriptPath().."\\paramquik.ini","w");

      думал, что знак подчеркивания или путь смущают LUA, но теперь ошибка с таким вот кодом: "...:28: bad argument #1 to 'write' (string expected, got nil)". Файл не затираю перед включением, хотя делал и так и так - результат один. Вот ссылка на код: http://файлообменник.рф/02k5fslnpopl.html

        1. Спасибо за ответ! Действительно надо сделать там проверку на nil. А цифры - это не код ошибки а номер строки, где ошибка - не зал. Буду исправляться.)))

    2. Здравствуйте, Денис! Ошибка переводится как: в строке 32 неверный аргумент под номером 1 в функции write (ожидалась строка, а вместо нее nil). Смотрите что Вы пытаетесь записать в файл в строке 32 и почему там nil (nil означает, что нет никакого значения)

  2. Благодарю за пояснения в части просмотра работы ввиде лога, может пригодиться при отладке. Вот, что получилось с первого наскока

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
    IsRun = true;
     
    function main()
    while IsRun do
    -- открыть файл в режиме "чтения/записи"
    f = io.open("C:\param.ini","r+");
    -- если файл не существует
    if f == nil then 
    -- ‘создает файл в режиме "записи"
    f = io.open("C:\param.ini","w"); 
    -- закрывает файл
    f:close();
    -- Ћткрывает уже существующий файл в режиме "чтениЯ/записи"
    f = io.open("C:\param.ini","r+");
    end;
    -- перебирает все строки таблицы "Лимиты по бумагам"
    for i = 0,getNumberOf("depo_limits") - 1 do
    -- Получает в локальную переменную лимит из строки с индексом i
    local depo_limit = getItem('depo_limits', i)
    -- если лимит ’0, выводит в сообщении текущий остаток по бумаге
    if depo_limit.limit_kind == 0 then
    f:write(depo_limit.sec_code.."="..depo_limit.currentbal.."\n");
    end			
    end
    f:close();
    sleep(50);
    end;   
    end
     
    function OnStop()
       IsRun = false;
    end;

    Прошу Вас посмотреть, возможно что то плохо усвоил. Есть еще вопросы: - как в начале открывания файла затирать все, что там было записано ранее, т.е. при предыдущем прогоне скрипта? - как правильно записать путь для места записи файла, например в корень диска с:?

    1. Дмитрий! Я правильно понимаю, что куда я скопирую скрипт Qlua, туда и будет писаться файл? По крайней мере не нашел пока иного варианта с указанием пути для записи файла.

    2. Во первых, все слеши нужно экранировать вторым слешем: f = io.open("C:\\param.ini","w");
      Во вторых, чтобы создать файл на диске C, нужно запускать терминал от имени администратора.
      В третьих, чтобы перезаписывать все содержимое файла достаточно открывать его в режиме записи "w", т.е.:

      1
      2
      3
      4
      
      f = io.open("C:\\param.ini","w") -- Создаете/открываете
      f:write('что-то') -- Пишите что-то
      f:flush() -- Сохраняете записанное
      f:close() -- Закрываете

      Каждый новый вызов этого кода будет перезаписывать существующий файл

      1. Гениально!!!!Получилось. Просто чудесно. Завтра попытаюсь дополнить скрипт свободными денежными средствами из таблицы лимитов по ДС и всё, что я хотел готово. Хотя еще останется изучить создание таблиц из этих данных, т.е. сведение нужных данных из разных таблиц в единую. Благодарю, без Вас бы я до сих пор бы мануал пытался бы осилить. Спасибо!

  3. Добрый день, спасибо за помощь и информацию, которой делитесь с нами. Есть скрипт, который сохраняет в файл данные (цену и объем по Ri) из таблицы всех сделок. Файл создается ежедневно, с именем текущего дня. Нужен скрипт(профиль рынка), который бы считывал данные за предыдущий день, суммировал объемы по одной цене и выводил графически либо в таблицу. Т.е. нужно видеть цену максимального горизонтального объема за прошлый день. На данный момент вопрос встал в загрузке файла предыдущего дня, подскажите, как это сделать.
    Скрипт сохранения данных:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    
    IsRun = true;
    datetime = getTradeDate();
     
    function main()
     while IsRun do
     
          sleep(1);
       end;
    end
     
    function OnAllTrade(alltrade)
    -- Если сделка по инструменту RI, то
       if alltrade.sec_code == "RIZ5" then			
          DealStr = tostring(alltrade.price)..";"..tostring(alltrade.qty);
     
    -- Пытается открыть файл в режиме "перезаписи"
       f = io.open(tostring(datetime.date)..".txt","a+");
     
    -- Если файл не существует
       if f == nil then 
    -- Создает файл в режиме "перезаписи"
          f = io.open(tostring(datetime.date)..".txt","a+"); 
       end;
     
    -- Записывает в файл 2 строки
       f:write(DealStr..'\n');
     
    -- Сохраняет изменения в файле
       f:flush();
       end;
    end;
     
    -- Функция вызывается когда пользователь останавливает скрипт
    function OnStop()
       IsRun = false;
    end;

    Заранее благодарю.

    1. Всегда пожалуйста!

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      
      -- Открывает уже существующий файл в режиме "чтения"
      local f = io.open("Test.txt","r");
      -- Встает в начало файла 
         -- 1-ым параметром задается относительно чего будет смещение: "set" - начало, "cur" - текущая позиция, "end" - конец файла
         -- 2-ым параметром задается смещение
      f:seek("set",0);
      -- Перебирает строки файла, выводит их содержимое в сообщениях
      for line in f:lines() do message(tostring(line));end
      -- Закрывает файл
      f:close();
      1. Дмитрий, вопрос больше в том, как из кучи файлов выбрать тот, который нужно. Т.е. в папке лежат файлики за каждый день с именем например 09.10.15.txt. Как мне прочитать файлик 08.10.15.txt

        1. 1
          2
          3
          4
          5
          6
          7
          
          local f = io.open("08.10.15.txt","r");
          --можете из переменных имя собирать
          local day = "08";
          local month = "10";
          local year = "15";
           
          local f = io.open(day.."."..month.."."..year..".txt","r");

          может это пригодится:

          1
          2
          3
          4
          5
          
          local d = 8;
          local day = "";
          if d < 10 then 
             day = "0"..d; -- в day будет "08"
          end;
          1. Дмитрий, спасибо, но еще постараюсь уточниться.
            Как запросить сегодня вчерашнюю дату, что бы потом ее ассоциировать с именем файла и считать его.

                  1. Возможно это старый параметр, который впоследствии перестали использовать, потому что в Текущей таблице параметров нет такой колонки.

                    1. Дмитрий, подскажите, как полученную строку (80549; 30) разделить на два числа, чтобы записать их в дальнейшем в массив.
                      Заранее благодарю.

    1. Юрий, прошу прощения, но нашел ошибку в скрипте! Неправильно рассчитывался профит позиции по фьючерсу (675 строка). В статье исправил, исправьте у себя, пожалуйста.

  4. Честно говоря я надеюсь, что из Вашего примера, как ВСЕГДА, станет понятен принцип работы, и сделать обратную операцию получится самостоятельно. А отвечая на Ваш вопрос, надо чтобы скрипт записал информацию о набранной позиции, далее хотелось, чтобы в скрипт записалась информация о сумме профита и о том что он опять готов к набору позиции. Тяжело рассказать что хочу, не понимая принципа работы, но может для удобства (так в моем скрипте) добавить функцию:
    function zakritie()

  5. дело в том, что я попросил как пример на прошлом примере. Но мне надо именно запись в файл (логирование), так как на одном счете торгуется несколько стратегий и еще ведется торговля руками, да и надо научится работать с логированием.

    1. Юрий, подскажите, пожалуйста, как скрипт должен понять, что профит получен и можно набирать новый стреддл? Т.е. схема такая: Вы запускаете скрипт, он набирает стреддл, записывает в файл, что стреддл набран. При следующем запуске скрипт читает файл, там, соответственно, написано, что стреддл набран и скрипт ничего дальше не делает. Вам нужно, чтоб скрипт по какому-то событию удалял из файла информацию, или будет достаточно того, что при закрытии стреддла, Вы просто удалите этот файл и скрипт начнет все заново?

  6. подскажите пожалуйста: что, как и когда надо записывать в файл (логировать), чтобы наша программа зайдя в позиции, могла через несколько дней (при её запуске) понимать, что позиция набрана и надо дожидаться профита . Наверное сохранение (запись) нынешних "параметров" надо поместить в функцию OnStop(), а считывание информации в Init(). Однако как это сделать не понимаю, да и еще чтобы не повторить еще один вход в позицию. Пожалуйста приведите пример (хорошо бы на Вашем примере от 29.04.2015 В 20:02 (https://quikluacsharp.ru/quik-qlua/poluchenie-obezlichennyh-sdelok-iz-quik-v-qlua-lua/#comment-101) после покупки стрэддла (купили 2 Пута + продали 1 фьючерс). Заранее спасибо.

    1. Юрий, здравствуйте! Изменил Ваш скрипт, решил, что в данном случае нет смысла использовать файлы, проверяйте!

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118
      119
      120
      
      require("QL");
       
      TRADE_ACC         = "SPBFUT00136";     -- Торговый счет
      CLIENT_CODE	  = "SPBFUT00136";     -- Код клиента
      CLASS_CODE_OPT    = "SPBOPT";          -- Класс ОПЦИОНОВ
      CLASS_CODE_FUT    = "SPBFUT";          -- Класс ФЬЮЧЕРСОВ
      SEC_CODE_OPT      = "RI100000BF5";     -- Код ОПЦИОНА
      SEC_CODE_FUT      = "RIM5";            -- Код ФЬЮЧЕРСА
       
      CurrentPosAveragePrice_OPT = 0;        -- Средняя цена позиции по ОПЦИОНАМ
      CurrentPosAveragePrice_FUT = 0;        -- Средняя цена позиции по ФЬЮЧЕРСАМ
       
      -- Флаг для поддержания работы функции main
      IsRun = true;
       
      -- Флаг, что ОПЦИОНЫ еще НЕ КУПЛЕНЫ
      NotBuy_OPT = true;
      -- Флаг, что ФЬЮЧЕРС еще НЕ ПРОДАН
      NotSell_FUT = true;
       
      function OnInit()
         -- БАЛАНС открытой позиции по ОПЦИОНАМ
         local OptCurrentBalance = nil;
         -- БАЛАНС открытой позиции по ФЬЮЧЕРСУ
         local FutCurrentBalance = nil;
       
         -- При запуске скрипта проверяет существующие (открытые) позиции на срочном рынке
         -- перебирая все строки таблицы "Позиции по клиентским счетам (фьючерсы)"
         for i = 0,getNumberOf("FUTURES_CLIENT_HOLDING") - 1 do
            -- ЕСЛИ строка с информацией по ОПЦИОНАМ (SEC_CODE_OPT), ТО
            if getItem("FUTURES_CLIENT_HOLDING",i).SEC_SHORT_NAME == SEC_CODE_OPT then
               -- Запоминает БАЛАНС открытой позиции по ОПЦИОНАМ
               OptCurrentBalance = getItem("FUTURES_CLIENT_HOLDING",i).TOTALNET; 
            -- ИНАЧЕ, ЕСЛИ строка с информацией по ФЬЮЧЕРСАМ (SEC_CODE_FUT), ТО   
            elseif getItem("FUTURES_CLIENT_HOLDING",i).SEC_SHORT_NAME == SEC_CODE_FUT then
               -- Запоминает БАЛАНС открытой позиции по ФЬЮЧЕРСАМ
               FutCurrentBalance = getItem("FUTURES_CLIENT_HOLDING",i).TOTALNET;            
               end;
            end;
         end;
       
         -- ЕСЛИ стреддл ранее был набран, ТО
         if OptCurrentBalance == 2 and FutCurrentBalance == -1 then
            -- Сбрасывает флаги о том, что позиции не открыты в ЛОЖЬ
            NotBuy_OPT = false;
            NotSell_FUT = false;
            -- Выводит сообщение
            message("Стреддл ранее уже был набран, ожидается профит!!!");
         -- ИНАЧЕ, ЕСЛИ позиции по ОПЦИОНАМ и по ФЬЮЧЕРСУ "нулевые", ТО
         elseif OptCurrentBalance == 0 and FutCurrentBalance == 0 then
            -- Выводит сообщение
            message("Набираю стреддл!!!");   
         else -- ИНАЧЕ, баланс позиций не соответствует стреддлу !!!
            -- Сбрасывает флаги о том, что позиции не открыты в ЛОЖЬ, чтобы не открыть новые позиции
               NotBuy_OPT = false;
               NotSell_FUT = false;
            -- Выводит сообщение о том, что количество лотов в открытых позициях не соответствует стреддлу
               message("РАБОТА СКРИПТА ОСТАНОВЛЕНА!!!\n"
                     .."По ОПЦИОНАМ ранее была открыта позиция с балансом: "..tostring(OptCurrentBalance).." (по плану 2)\n"
                     .."По ФЬЮЧЕРСУ ранее была открыта позиция с балансом: "..tostring(FutCurrentBalance).." (по плану -1)\n"
                     .."Исправьте ситуацию и запустите скрипт заново!", 3);
       
            -- Останавливает работу скрипта
            OnStop();
         end;   
       
      end;
       
      function main()
         -- ПОКУПАЕТ 2 КОЛЛ-ОПЦИОНА
         trans_id_OPT = sendMarket(CLASS_CODE_OPT, SEC_CODE_OPT, "B", 2, TRADE_ACC, CLIENT_CODE,"");   
         -- Ждет, пока ОПЦИОНЫ будут куплены
         while NotBuy_OPT do sleep(1); end;
       
         -- ПРОДАЕТ ФЬЮЧЕРС
         trans_id_FUT = sendMarket(CLASS_CODE_FUT, SEC_CODE_FUT, "S", 1, TRADE_ACC, CLIENT_CODE,"");
         -- Ждет, пока ФЬЮЧЕРС будет продан
         while NotSell_FUT do sleep(1); end;
       
         -- Обеспечивает работу скрипта и библиотеки до остановки скрипта пользователем
         while IsRun do
            sleep(100);
         end;   
      end;
       
      -- Функция вызывается терминалом QUIK при изменении позиции по срочному рынку
      function OnFuturesClientHolding(fut_pos)
       
         -- ЕСЛИ изменилась информация по ОПЦИОНАМ (SEC_CODE_OPT), ТО
         if fut_pos.sec_code == SEC_CODE_OPT then
            -- Если баланс текущей позиции по ОПЦИОНАМ равен 2, ТО
            if fut_pos.totalnet == 2 then         
               -- Сбрасывает флаг о том, что позиция по ОПЦИОНАМ не открыта в ЛОЖЬ
               NotBuy_OPT = false;
               -- Запоминает среднюю цену позиции по ОПЦИОНАМ
               CurrentPosAveragePrice_OPT = fut_pos.avrposnprice;
               -- Выводит сообщение
               message("Позиция по ОПЦИОНАМ набрана по цене "..tostring(CurrentPosAveragePrice_OPT), 2);
            end;
         end;
       
         -- ЕСЛИ изменилась информация по ФЬЮЧЕРСУ (SEC_CODE_FUT), ТО
         if fut_pos.sec_code == SEC_CODE_FUT then
            -- Если баланс текущей позиции по ФЬЮЧЕРСУ равен -1, ТО
            if fut_pos.totalnet == -1 then         
               -- Сбрасывает флаг о том, что позиция по ФЬЮЧЕРСУ не открыта в ЛОЖЬ
               NotBuy_FUT = false;
               -- Запоминает среднюю цену позиции по ФЬЮЧЕРСУ (есть смысл только если набирается не >1 стреддла)
               CurrentPosAveragePrice_FUT = fut_pos.avrposnprice;
               -- Выводит сообщение
               message("Позиция по ФЬЮЧЕРСУ набрана по цене "..tostring(CurrentPosAveragePrice_FUT), 2);
            end;
         end;
       
      end;
       
      function OnStop()
         -- Останавливает цикл в функции main
         IsRun = false;
      end;
      1. Добрый день, чудесным образом наткнулся на Ваш ресурс. Очень хороший ресурс, надеюсь будет продолжаться. Недавно я задался целью сделать считывание открытых позиций из Квика из таблицы лимитов по бумагам + свободных денежных средств и записать определенным образом в файл. В итоге сделал на Qpale ( файл тут: https://dropmefiles.com/dd32j . Это нужно для считывания другой программой. Но тесты показали, что это не настолько надежно на сколько это можно сделать в QLua.
        Не могли бы Вы мне помочь переделать указанный код но на Qlua, боюсь у меня это получится не скоро, т.к. Qlua для меня пока "новые ворота"))). Благодарю за понимание.

        1. Здравствуйте! Спасибо за добрые слова, ресурс обязательно будет прдолжаться и развиваться. Я, честно говоря, с QPILE вообще не знаком, т.к. когда я заинтересовался этой конкретной тематикой уже была QLua. Но задача Ваша, как я вижу, не сложная. Если Вы знаете QPILE, то задавайте конкретные вопросы типа, как в QLua получить такие-то данные, или решить такую-то задачу, с радостью Вам отвечу.

          1. Дмитрий, всё понял. Я не знаток QPILE, да и не программист, просто очень велико желание сделать начатое. Я собираю робота, правда не на Qlua, а в дальнейшем есть и такие планы. Пока делаю в связке Amibroker + Quik через библиотеку с известного русскоязычного ресурса по Amibroker. У меня считывание открытых позиций выполняется через файл-посредник, вот именно поэтому я и попал сюда. Тут много полезной информации, надеюсь ей воспользоваться при написании вышеуказанного скриптика на Qlua, но прочитав часть уже каша в голове. Тогда с Вашего разрешения задам пока наводящие вопросы, возможно получится сделать самому, что будет не лишним. Можно ли попросить Вас дать пример считывания из таблицы "Лимитов по бумагам" число приобретенных лотов по всем инструментам из этой таблицы с лимитом T+2. Запись в файл уже здесь Вами хорошо описана, думаю попробую сам да и свободные ДС по аналогии метода считывания лотов тоже сам попробую. В любом случае спасибо.

            1. Это то, что Вам нужно?

              1
              2
              3
              4
              5
              6
              7
              8
              9
              
              function main()
                 -- Перебирает все строки таблицы "Лимиты по бумагам"
                 for i = 0,getNumberOf("depo_limits") - 1 do
                    -- Получает в локальную переменную лимит из строки с индексом i (индексы строк в таблицах начинаются с 0)
                    local depo_limit = getItem('depo_limits', i)
                    -- Если лимит Т2, выводит в сообщении текущий остаток по бумаге
                    if depo_limit.limit_kind == 2 then message('Текущий остаток по бумаге '..depo_limit.sec_code..' равен '..depo_limit.currentbal) end
                 end
              end
              1. Спасибо, оперативно! С наскока пока трудно сказать, надо изучить Ваш пример, а т.к. я полный ноль в Qlua, то буду читать и образовываться по манулу. Еще раз благодарю за оперативность.

                  1. Спасибо, за наводку на статью. Код уже кручу по аналогии с кодом из шапки этой темы. Уже вывел сообщение. Еще вопрос. Этот код будет выводить только последнее значение из таблицы или это ограничения всплывающего окна?
                    Я пробую вот так:

                    1
                    2
                    3
                    4
                    5
                    6
                    7
                    8
                    9
                    10
                    11
                    12
                    13
                    14
                    15
                    16
                    17
                    18
                    19
                    20
                    
                     IsRun = true;
                     
                    function main()
                       -- перебирает все строки таблицы "Ћимиты по бумагам"
                       for i = 0,getNumberOf("depo_limits") - 1 do
                          -- ѕолучает в локальную переменную лимит из строки с индексом i (индексы строк в таблицах начинаютс¤ с 0)
                          local depo_limit = getItem('depo_limits', i)
                          -- если лимит Т2, выводит в сообщении текущий остаток по бумаге
                          if depo_limit.limit_kind == 0 then message('“екущий остаток по бумаге '..depo_limit.sec_code..' равен '..depo_limit.currentbal) end
                       end
                     
                       while IsRun do
                          sleep(400);
                       end;   
                     
                    end
                     
                    function OnStop()
                       IsRun = false;
                    end;

                    Правильно я понимаю, что должно всплывать сообщение каждые 0,4 секунды? Но у меня почему то скрипт запускается на воспроизведение, но окно выводится 1 раз и после закрытия больше не всплывает. Хотя возможно так и должно быть, пока глубже не капал.

                    1. Прошу прощения, кажись понял почему не крутит воспроизведение сообщения по кругу, понял когда прочитал Вашу вступительную статью.

                    2. Рекомендую Вам сделать следующее:
                      Если версия QUIK ниже 7, то
                      для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: "Сообщения"->"Системные сообщения"->"Таблица сообщений..."). А также, снимите флажок "Показывать окно сообщений" в меню: "Настройки"->"Основные..."->"Сообщения".

                      Если у Вас версия QUIK 7, то
                      "Создать окно" -> "Все типы окон" -> "Прочее" -> "Таблица сообщений", это откроет таблицу, где будут выводиться все сообщения. А чтобы они еще не появлялись в виде всплывающих окон, сделайте следующее: "Система" - "Настройки" - "Основные настройки" - "Сообщения", снимите там галочку "Показывать окно сообщений" и нажмите "ОК"

                    3. Еще, на сайте допускается не более 10 вложенных комментариев, так что пишите новый комментарий, как комментарий к статье, а не ответ на мой комментарий, т.е. начните новую ветку. Мне приходит уведомление обо всех комментариях, так что я не пропущу.

                    4. цикл for перебирает все строки таблицы лимитов и для каждой строки, если лимит Т0, выводит сообщение, но так как сообщения приходят очень быстро, Вы видите только последнее сообщение, хотя их там несколько, если у Вас несколько бумаг Т0 в таблице, откройте таблицу сообщений, как я написал в инструкции и Вам станет понятнее как работает скрипт, и Вы сможете пользоваться функцией message для отладки работы скрипта, выводя нужную информацию в нужных местах работы скрипта, а в таблице сообщений Вы будете видеть своеобразный лог работы скрипта.

                    5. Здравствуйте,

                      А вот интересно способен ли QLua на такую вещь: Есть соответственно цикл повторяющийся через равные промежутки времени, который берет значения по RSIх в и записывает их в текстовый файл:

                      local N=getNumCandles("RSI")

                      t,n,i=getCandlesByIndex("RSI", 0, N-10, 10)
                      Znach = t[9].close
                      Znach1 = t[1].close

                      l_file=io.open("C:\\RSI\\rsi_i"..".txt", "w")
                      l_file:write(tostring(Znach).."\n")
                      l_file:close()

                      Но вот вопрос: Начинается новый цикл, берется новое значение RSI записывается в файл закрывается. Данные в файле сохраняются все - ок, но можно ли сделать чтобы было так: Что бы с началом новjго цикла и нового значения RSI -то новое значение RSI не перезаписывало старое, а вставлялась на строку ниже ? И чтобы эти изменения можно было наблюдать в файле без его закрытия и последующего открытия ?

                    6. Здравствуйте! Задавайте, пожалуйста, вопросы новым комментарием к статье, а не в конце существующих обсуждений, на сайте допускается максимум 10 вложенных комментариев.
                      Строку l_file=io.open("C:\\RSI\\rsi_i"..".txt", "w") нужно поместить до цикла, а строку l_file:close() после цикла, чтобы изменения сразу же были видны в файле, нужно после строки l_file:write(tostring(Znach).."\n") добавить строку l_file:flush()