Френк френков
Френк френков личный блог
28 декабря 2020, 02:23

квик сменил кодировку роботов на луа языке

MARKET               = «SPBFUT»
TICKER               = «SiH7»
ACCOUNT              = "----"
CLIENT_CODE          = "----"

TRANS_ID             = 0
STOP_FACTOR          = 30
SPREAD_FACTOR        = 30
LAST_ORDER           = 0
TRANS_REPLY          = nil
BALANCE = 0

BEZUBYTOK=STOP_FACTOR*5--0.0014--малый шаг

TP=STOP_FACTOR*30--STOP_FACTOR*1--0.015--в % внутри дня (тейк-профит).большой шаг

SREDNSHAG=STOP_FACTOR*10---0.007--средн.шаг(0.08* STOP_FACTOR /1000)

n=3-- кол-во кругов малого BEZUBYTOK>STOP_FACTOR*(n+1)--минимально

k=4--кол-во кругов  безубытка --SREDNSHAG>STOP_FACTOR*(k+1)--минимально

run = true
function main()
   while run do
      if LAST_ORDER == 0 then     
      
         BALANCE = GetTotalnet()
         if BALANCE ~= 0 then
            LAST_ORDER = NewStopOrder(BALANCE)
         end        
         
      else      
      
         BALANCE = GetTotalnet()
         for i = getNumberOf(«STOP_ORDERS») — 1, 0, -1  do
            local stop_order = getItem(«STOP_ORDERS», i)
            if stop_order.order_num == LAST_ORDER then
               if CheckBit(stop_order.flags, 0) then --«ACTIVE»
                  local HAVE_CHANGE = 0
                  local QUANTITY = stop_order.qty
                  if QUANTITY ~= math.abs(BALANCE) then
                      HAVE_CHANGE = 1
                  else
                     local PRICES = {}
                     PRICES = SetStopprice(PRICES, QUANTITY)
                     local SPRICE = PRICES[«STOPPRICE»]:gsub(',','.') + 0
                     local OPRICE = stop_order.condition_price
                     if not CheckBit(stop_order.flags, 2) then --«BUY»   


                        if SPRICE < OPRICE-SREDNSHAG then  — первый цикл средний круг
                           if SPRICE < OPRICE-TP   then            — тейк профит большой круг
                              HAVE_CHANGE =1                               
                           end             

                        else


                        if SPRICE < OPRICE-STOP_FACTOR then  — первый цикл малый круг
                           for i =  0, n  do
                              if i< n then
          --  message(«отодвигается!!! »..tostring(n)..")
                                  message(«отодвигается!!!», 3)--
                                HAVE_CHANGE =1                                
                              end

                           end

                          if SPRICE < OPRICE-BEZUBYTOK then  — первый цикл безубыток круг
                            for i =  0, k  do
                              if i<k   then
                                  message(«безубыток!!!», 3)--;
                                HAVE_CHANGE =1                                
                              end

                            end
                          end
                        end
                        end



                                   


                     else  — «SELL»    



                        if SPRICE > OPRICE+SREDNSHAG then  — первый цикл средний круг
                           if SPRICE > OPRICE+TP*OPRICE   then            — тейк профит большой круг
                              HAVE_CHANGE =1                               
                           end             

                        else


                        if SPRICE > OPRICE+STOP_FACTOR then  — первый цикл малый круг
                           for i =  0, n  do
                              if i> n  then
                                  message(«отодвигается!!!», 3)--;
                                HAVE_CHANGE =1                                
                              end

                           end

                          if SPRICE > OPRICE+BEZUBYTOK then  — первый цикл безубыток круг
                            for i =  0, k  do
                              if  i>k then
                                  message(«безубыток!!!», 3)--;
                                HAVE_CHANGE =1                               
                              end
 
                            end
                          end
                        end

                 
                     end
                  end
                  end
                  if HAVE_CHANGE == 1 then
                     KillStopOrder()
                     LAST_ORDER = 0
                     break
                  end
               else
                  LAST_ORDER = 0
               end
            end
         end
         
      end
      
      sleep(200)
   end
end

function OnStop()
   run = false
end

— Получает текущую чистую позицию по инструменту
GetTotalnet = function()
   for i = 0,getNumberOf('futures_client_holding') — 1 do
      local futures_client_holding = getItem('futures_client_holding',i)
      if futures_client_holding.sec_code == TICKER then
         return futures_client_holding.totalnet
      end
   end
   — Если позиция по инструменту в таблице не найдена, возвращает 0
   return 0
end

function NewStopOrder(size)
   T = {}
   TRANS_ID = TRANS_ID + 1
   T[«TRANS_ID»]    = tostring(TRANS_ID)
   T[«ACTION»]      = «NEW_STOP_ORDER»   
   T[«CLASSCODE»]   = MARKET
   T[«SECCODE»]     = TICKER
   T[«ACCOUNT»]     = ACCOUNT
   T[«CLIENT_CODE»] = CLIENT_CODE
   T = SetStopprice(T)
   if BALANCE > 0 then
      T[«OPERATION»] = «S»
   else
      T[«OPERATION»] = «B»
   end    
   T[«QUANTITY»] = tostring(math.abs(size))
   local trans_reply = SEND_TRANSACTION(30, T)
   if trans_reply ~= nil then
      if trans_reply.order_num ~= nil then
         return trans_reply.order_num
      else
         message(trans_reply.result_msg)
         return 0
      end
   else
      return 0
   end
end

function KillStopOrder()
   KILLING_STOP_ORDER = true
   T = {}
   TRANS_ID = TRANS_ID + 1
   T[«TRANS_ID»] = tostring(TRANS_ID)
   T[«ACTION»] = «KILL_STOP_ORDER»
   T[«STOP_ORDER_KEY»] = tostring(LAST_ORDER)    
   T[«CLASSCODE»] = MARKET
   T[«SECCODE»] = TICKER
   T[«ACCOUNT»] = ACCOUNT
   T[«CLIENT_CODE»] = CLIENT_CODE
   
   local trans_reply = SEND_TRANSACTION(30, T)
   if trans_reply ~= nil then
      — Ждет результата снятия стоп-заявки (3 — снята, 4 — не удалось снять)
      while TRANS_REPLY.status ~= 3 and TRANS_REPLY.status ~= 4 do
         sleep(10)
      end    
   end
end

function SetStopprice(T)
   local last = getParamEx(MARKET, TICKER, «LAST»).param_value + 0
   local price_step = getParamEx(MARKET, TICKER, «SEC_PRICE_STEP»).param_value + 0   
   local price = 0
   local stop_price = 0
   if BALANCE > 0 then
      stop_price = last — STOP_FACTOR
      price = stop_price — SPREAD_FACTOR
   else
      stop_price = last + STOP_FACTOR
      price = stop_price + SPREAD_FACTOR
   end
   T[«PRICE»] = tostring(price):gsub('[\.]', ',')   
   T[«STOPPRICE»] = tostring(stop_price):gsub('[\.]', ',')
   return T
end

function SEND_TRANSACTION(Timeout, T)
   TRANS_REPLY = nil
   local res = sendTransaction(T)
   if res ~= "" then
      message(res)
      return nil
   end
   
   local time_sec = os.time()
   while os.time() — time_sec < Timeout do
      if TRANS_REPLY ~= nil and TRANS_REPLY.trans_id == TRANS_ID then
         break
      end
   end
   return TRANS_REPLY
end
function OnTransReply(trans_reply)
   if trans_reply.trans_id == TRANS_ID then
      TRANS_REPLY = trans_reply
   end
end

— Функция проверяет установлен бит, или нет (возвращает true, или false)
CheckBit = function(flags, _bit)
   — Проверяет, что переданные аргументы являются числами
   if type(flags) ~= «number» then error(«Ошибка!!! Checkbit: 1-й аргумент не число!») end
   if type(_bit) ~= «number» then error(«Ошибка!!! Checkbit: 2-й аргумент не число!») end
 
   if _bit == 0 then _bit = 0x1
   elseif _bit == 1 then _bit = 0x2
   elseif _bit == 2 then _bit = 0x4
   elseif _bit == 3 then _bit  = 0x8
   elseif _bit == 4 then _bit = 0x10
   elseif _bit == 5 then _bit = 0x20
   elseif _bit == 6 then _bit = 0x40
   elseif _bit == 7 then _bit  = 0x80
   elseif _bit == 8 then _bit = 0x100
   elseif _bit == 9 then _bit = 0x200
   elseif _bit == 10 then _bit = 0x400
   elseif _bit == 11 then _bit = 0x800
   elseif _bit == 12 then _bit  = 0x1000
   elseif _bit == 13 then _bit = 0x2000
   elseif _bit == 14 then _bit  = 0x4000
   elseif _bit == 15 then _bit  = 0x8000
   elseif _bit == 16 then _bit = 0x10000
   elseif _bit == 17 then _bit = 0x20000
   elseif _bit == 18 then _bit = 0x40000
   elseif _bit == 19 then _bit = 0x80000
   elseif _bit == 20 then _bit = 0x100000
   end
 
   if bit.band(flags,_bit ) == _bit then return true
   else return false end
end

эта программа теперь не работает и разбираться не хочется.
это трейлинг стоп на 3 уровня.проходит первый уровень безубытка и второй уровень с третьим добавляет уровни.



MARKET               = «TQBR»--«TQDE»
TICKER               = «FEES»--«GMKN»--«TAER» --«GMKN»
ACCOUNT              = «L01-00000F00»
CLIENT_CODE          = "---"

LIMIT_KIND           = 2
TRANS_ID             = 0
STOP_FACTOR          = 0.0006
STOP_FACTOR1          =  STOP_FACTOR*2 — 0.0003
SPREAD_FACTOR        = 0.001
LAST_ORDER           = 0
TRANS_REPLY          = nil
BALANCE = 0  --автостоп
BALANCE1=30  — постоянное кол-во
lot=1 — лот тикера

n=3-- кол-во кругов малого --BEZUBYTOK>STOP_FACTOR*(n+1)--минимально

k=4--кол-во кругов  безубытка --SREDNSHAG>BEZUBYTOK*(k+1)---STOP_FACTOR*(k+1)--минимально

BEZUBYTOK=STOP_FACTOR*3--0.0014--малый шаг

TP=STOP_FACTOR*10--STOP_FACTOR*1--0.015--в % внутри дня (тейк-профит).большой шаг

SREDNSHAG=STOP_FACTOR*5---0.007--средн.шаг(0.08* STOP_FACTOR /1000)

i=0
c=0





run = true
function main()
   while run do
      if LAST_ORDER == 0 then     
      
         BALANCE = GetBalance()
         if BALANCE ~= 0 then
            LAST_ORDER = NewStopOrder(BALANCE)
         end        
         
      else      
      
         BALANCE = GetBalance()
         for i = getNumberOf(«STOP_ORDERS») — 1, 0, -1  do
            local stop_order = getItem(«STOP_ORDERS», i)
            if stop_order.order_num == LAST_ORDER then
               if CheckBit(stop_order.flags, 0) then --«ACTIVE»
                  local HAVE_CHANGE = 0
                  local QUANTITY = stop_order.qty
                  if QUANTITY ~= math.abs(BALANCE/lot) then --обязательно делить на лот.иначе снимает
                      HAVE_CHANGE = 1
                  else
                     local PRICES = {}
                     PRICES = SetStopprice(PRICES, QUANTITY)
                     local SPRICE = PRICES[«STOPPRICE»]:gsub(',','.') + 0
                     local OPRICE = stop_order.condition_price
                     if not CheckBit(stop_order.flags, 2) then --«BUY»   






                        if SPRICE < OPRICE-SREDNSHAG then  — первый цикл средний круг
                           if SPRICE < OPRICE-TP   then            — тейк профит большой круг
                              HAVE_CHANGE =1                               
                           end             

                        else
------------------------------------------------------------------------------------------------------------------------

                        if SPRICE < OPRICE-BEZUBYTOK then  — первый цикл малый круг
                           --for i =  0, k  do
                              if i <k then
                                  message(«безубыток!!!», 3)--;
                                  message(«i = »..i)  --message('i = '..i)
                                 STOP_FACTOR=STOP_FACTOR1 --отдаление шага
                               HAVE_CHANGE =1
                                 i =i+1
                              end
                        else
                          if SPRICE < OPRICE-STOP_FACTOR then  — первый цикл безубыток круг
                            --for c =  0, n  do
                              if c <n then
                                  message(«отодвигается!!!», 3)--;
                                  message(«c = »..c)  --message('c = '..c)                   
                               HAVE_CHANGE =1
                                 c=c+1
                              end

                          end
                        end --
                        end
—  


                     else  — «SELL»    



                        if SPRICE > OPRICE+SREDNSHAG then  — первый цикл средний круг
                           if SPRICE > OPRICE+TP   then            — тейк профит большой круг
                              HAVE_CHANGE =1                               
                           end             

                        else
------------------------------------------------------------------------------------------------------------------------

                        if SPRICE > OPRICE+BEZUBYTOK then  — первый цикл малый круг
                           --for i =  0, k  do
                              if i <k then
                                  message(«безубыток!!!», 3)--;
                                  message(«i = »..i)  --message('i = '..i)
                                 STOP_FACTOR=STOP_FACTOR1 --отдаление шага
                               HAVE_CHANGE =1
                                 i =i+1
                              end
                        else
                          if SPRICE > OPRICE+STOP_FACTOR then  — первый цикл безубыток круг
                            --for c =  0, n  do
                              if c <n then
                                  message(«отодвигается!!!», 3)--;
                                  message(«c = »..c)  --message('c = '..c)                    
                               HAVE_CHANGE =1
                                 c=c+1
                              end

                        end
                           end --
--------------------------------------------------------------------------------------------------------------------------                 
                     end
                  end
                  end





                  if HAVE_CHANGE == 1 then
                     KillStopOrder()
                     LAST_ORDER = 0
                     break
                  end
               else
                  LAST_ORDER = 0
               end
            end
         end
         
      end
      
      sleep(10)
   end
end

function OnStop()
   run = false
end

function GetBalance()
   for i = 0, getNumberOf(«DEPO_LIMITS») — 1 do
      local depo_limit = getItem(«DEPO_LIMITS», i)
      if depo_limit.sec_code == TICKER
      and depo_limit.trdaccid == ACCOUNT
      and depo_limit.limit_kind == LIMIT_KIND then
          — return BALANCE1--depo_limit.currentbal   — прыгает баланс--прозвон баланса--BALANCE1--перекос продажи и если условие if то докупщик и продажник
         return depo_limit.currentbal
      end
   end
   return 0
end

function NewStopOrder(size)
   T = {}
   TRANS_ID = TRANS_ID + 1
   T[«TRANS_ID»]    = tostring(TRANS_ID)
   T[«ACTION»]      = «NEW_STOP_ORDER»   
   T[«CLASSCODE»]   = MARKET
   T[«SECCODE»]     = TICKER
   T[«ACCOUNT»]     = ACCOUNT
   T[«CLIENT_CODE»] = CLIENT_CODE
   T = SetStopprice(T)
   if BALANCE > 0 then
      T[«OPERATION»] = «S»
   else
      T[«OPERATION»] = «B»
   end    
   T[«QUANTITY»] = tostring(math.abs(size/lot))
   local trans_reply = SEND_TRANSACTION(30, T)
   if trans_reply ~= nil then
      if trans_reply.order_num ~= nil then
         return trans_reply.order_num
      else
         message(trans_reply.result_msg)
         return 0
      end
   else
      return 0
   end
end

function KillStopOrder()
   KILLING_STOP_ORDER = true
   T = {}
   TRANS_ID = TRANS_ID + 1
   T[«TRANS_ID»] = tostring(TRANS_ID)
   T[«ACTION»] = «KILL_STOP_ORDER»
   T[«STOP_ORDER_KEY»] = tostring(LAST_ORDER)    
   T[«CLASSCODE»] = MARKET
   T[«SECCODE»] = TICKER
   T[«ACCOUNT»] = ACCOUNT
   T[«CLIENT_CODE»] = CLIENT_CODE
   
   local trans_reply = SEND_TRANSACTION(30, T)
   if trans_reply ~= nil then
      — Ждет результата снятия стоп-заявки (3 — снята, 4 — не удалось снять)
      while TRANS_REPLY.status ~= 3 and TRANS_REPLY.status ~= 4 do
         sleep(10)
      end    
   end
end

function SetStopprice(T)
   local last = getParamEx(MARKET, TICKER, «LAST»).param_value + 0
   local price_step = getParamEx(MARKET, TICKER, «SEC_PRICE_STEP»).param_value + 0   
   local price = 0
   local stop_price = 0
   if BALANCE > 0 then
      stop_price = last — STOP_FACTOR
      price = stop_price — SPREAD_FACTOR
   else
      stop_price = last + STOP_FACTOR
      price = stop_price + SPREAD_FACTOR
   end
   T[«PRICE»] = tostring(price):gsub('[\.]', ',')   
   T[«STOPPRICE»] = tostring(stop_price):gsub('[\.]', ',')
   return T
end

function SEND_TRANSACTION(Timeout, T)
   TRANS_REPLY = nil
   local res = sendTransaction(T)
   if res ~= "" then
      message(res)
      return nil
   end
   
   local time_sec = os.time()
   while os.time() — time_sec < Timeout do
      if TRANS_REPLY ~= nil and TRANS_REPLY.trans_id == TRANS_ID then
         break
      end
   end
   return TRANS_REPLY
end
function OnTransReply(trans_reply)
   if trans_reply.trans_id == TRANS_ID then
      TRANS_REPLY = trans_reply
   end
end

— Функция проверяет установлен бит, или нет (возвращает true, или false)
CheckBit = function(flags, _bit)
   — Проверяет, что переданные аргументы являются числами
   if type(flags) ~= «number» then error(«Ошибка!!! Checkbit: 1-й аргумент не число!») end
   if type(_bit) ~= «number» then error(«Ошибка!!! Checkbit: 2-й аргумент не число!») end
 
   if _bit == 0 then _bit = 0x1
   elseif _bit == 1 then _bit = 0x2
   elseif _bit == 2 then _bit = 0x4
   elseif _bit == 3 then _bit  = 0x8
   elseif _bit == 4 then _bit = 0x10
   elseif _bit == 5 then _bit = 0x20
   elseif _bit == 6 then _bit = 0x40
   elseif _bit == 7 then _bit  = 0x80
   elseif _bit == 8 then _bit = 0x100
   elseif _bit == 9 then _bit = 0x200
   elseif _bit == 10 then _bit = 0x400
   elseif _bit == 11 then _bit = 0x800
   elseif _bit == 12 then _bit  = 0x1000
   elseif _bit == 13 then _bit = 0x2000
   elseif _bit == 14 then _bit  = 0x4000
   elseif _bit == 15 then _bit  = 0x8000
   elseif _bit == 16 then _bit = 0x10000
   elseif _bit == 17 then _bit = 0x20000
   elseif _bit == 18 then _bit = 0x40000
   elseif _bit == 19 then _bit = 0x80000
   elseif _bit == 20 then _bit = 0x100000
   end
 
   if bit.band(flags,_bit ) == _bit then return true
   else return false end
end


--Параметры:
p_classcode=«SPBFUT» --Код класса
p_seccode=«RIZ5» --Код инструмента
p_account="---" --Код счета
p_clientcode="---" --Клиенткий код
p_count=1 --Размер позиции
p_spread=200 --Проскальзывание
p_sell_level_zigzag=500 --уровень RSI, при котором продаем
p_buy_level_zigzag=500 --уровень RSI, при котором покупаем

is_run = true
count = 0


function main()
    while is_run do
        sleep(100)
        robot()
    end
end

function robot()
    local N1=getNumCandles(«RIZ5-zig-zag»)
    --local N2=getNumCandles(«RSI-15-BRJ5»)
    local N=getNumCandles(«RIZ5-zig-zag-price»)

— message(«RIZ5-zig-zag-price: »..RIZ5-zig-zag-price),1)

    t1,n1,i1=getCandlesByIndex(«RIZ5-zig-zag», 0, N1-2, 2)--(«RSI-1», 0, N1-3, 2)

 message(«RIZ5-zig-zag: »..t1[1].close,1)-- message(«MA1-RIH5: »..t1[0].close,1)

    --t2,n2,i2=getCandlesByIndex(«RSI-15-BRJ5», 0, N2-3, 3)--(«RSI-2», 0, N2-3, 2)
    t,n,i=getCandlesByIndex(«RIZ5-zig-zag-price», 0, N-1, 1)

 message(«RIZ5-zig-zag-price: »..t[0].close,1)

        --сигнал на продажу (первый мувинг пересекает втрой RSI-15-BRJ5 сверху вниз
    if t[0].close<t1[1].close and t1[1].close>t[0].close+p_sell_level_zigzag  then--фильтр уровня
    --if t1[0].close>t2[0].close and t1[1].close<t2[1].close then
        --if t1[0].close>t2[0].close and t1[1].close<t2[1].close then
            --if t1[1].close>p_sell_level_RSI --фильтр уровня
        Trade(«S»,count+p_count,t[0].close-p_spread)
    --end
    end
    
    --сигнал на покупку (первый мувинг RSI-5-BRJ5 пересекает второй снизу вверх
    if t[0].close>t1[1].close and t1[1].close<t[0].close-p_buy_level_zigzag  then--фильтр уровня
        --if t1[0].close>t2[0].close and t1[1].close<t2[1].close then
            --if t1[1].close<p_buy_level_RSI --фильтр уровня
        Trade(«B»,p_count-count,t[0].close+p_spread)
    --end
    end
end

function Trade(a_oper,a_count,a_price)
    if a_count>0 then
        t = {
                [«CLASSCODE»]=p_classcode,
                [«SECCODE»]=p_seccode,
                [«ACTION»]=«NEW_ORDER»,
                [«ACCOUNT»]=p_account,
                [«CLIENT_CODE»]=p_clientcode,
                [«TYPE»]=«L»,
                [«OPERATION»]=a_oper,
                [«QUANTITY»]=tostring(a_count),
                [«PRICE»]=tostring(a_price),
                [«EXPIRY_DATE»]=«TODAY»,
                [«TRANS_ID»]=«1»
            }
        res=sendTransaction(t)
        message(«Количество до »..tostring(count).."  количество сделки "..tostring(a_count).."  тип операции"..a_oper,1)
        if a_oper==«B» then
            count=count+a_count
        else
            count=count-a_count
        end
        message(«Количество после »..tostring(count),1)
    end
end

function OnStop(stop_flag)
    is_run=false
    stop_flag=1
end

это все сейчас не работает на 16 битовой

сканер гэпов не работает
--Параметры:
p_classcode=«TQBR»--«SPBFUT» --Код класса
MARKET               = «TQBR»
TICKER               = «SBER»
ACCOUNT              = "---"
CLIENT_CODE          = "---"
p_seccode=«SBER» --Код инструмента
p_account=«L01-00----»--"---" --Код счета
p_clientcode="----" --Клиенткий код
--p_count=2 --Размер позиции
--p_spread=170 --Проскальзывание
p_day=3000-- дней

n_day=1000-- не мнеьше 2х.последние свечи

is_run = true
count = 0


function main()
    while is_run do
        sleep(100)
        robot()
    end
end

— два варианта -перебор от последней минус заданное или до заданного.

function robot()
    local N1=getNumCandles(«SBER_low»)
    local N2=getNumCandles(«SBER_high»)
        local N=getNumCandles(«SBER»)
    --t,n,i=getCandlesByIndex(«SBER», 0, N-2, 2)


        if n_day <p_day then

        t1,n1,i1=getCandlesByIndex(«SBER_low», 0, N1-n_day, 2)--

    t2,n2,i2=getCandlesByIndex(«SBER_high», 0, N2-(n_day-1), 2) --
 

          if t1[0].low>t2[0].high  then



         message(«t2[0].high = »..t2[0].high)
         message(«t1[0].low  = »..t1[0].low )
         message(«n_day = »..n_day)

         message(«гэп нижний!», 3)--;
          end
         
         — end


        n_day =n_day+1

        end
    
end


function OnStop(stop_flag)
    is_run=false
    stop_flag=1
end








15 Комментариев
  • 3Qu
    28 декабря 2020, 04:02
    Квик сменил версию Луа с 5.1 на 5.3, и старые проги могут не работать, и.к. версии частично несовместимы.
    • Алексей Никитин
      28 декабря 2020, 06:36
      3Qu, https://arqatech.com/ru/support/files/quik-workstation/

      Ставьте самый новый 8.11 и потом переделывайте скрипты
  • Виталий
    28 декабря 2020, 09:08
    не ну какого хера они меняют фундаменты
    можно только добавлять
    помню чудаки даже формат времени сменили идиоты с например «7» часов на «07» часов, или наоборот.
    нахрена это делать то, кому это свербило, так и тут тоже
    • iddqd3n
      28 декабря 2020, 10:29
      Виталий, биржа увеличила «длину» номеров заявок-сделок, из-за этого пришлось поменять и луа. Там изменений минимум, я с++ библиотеку за полчаса поправил (причём весной ещё), скрипты должно быть ещё проще.
        • iddqd3n
          28 декабря 2020, 16:56
          френк, если вы не можете нагуглить решение этой простой проблемы (фикс неоднократно был и тут, и на форуме квика, арка сама выкладывала вроде что и где сломается), то проще всего нанять программиста.
  • Мямля
    28 декабря 2020, 09:54
    О какие прекрасные примеры, спасибочки
      • Мямля
        31 декабря 2020, 11:30
        френк, а там же проблема с компилирование, если открытый код то все должно так и работать как раньше,? У вас открытый же тут. Копируй да запускай раз работало нормально
          • Мямля
            01 января 2021, 21:36
            френк, да я вот программировал программировал, стою перед фактом как пользу то извлечь, итак хаос, а со скриптом он разве что нагляднее. Даже и не знаю что собственно программировать(
  • iddqd3n
    28 декабря 2020, 10:25
    Я уж понадеялся, что они с ср1251 на юникод перешли :)

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн