Помогите найти ошибку

Страницы: 1
RSS
Помогите найти ошибку, Вам, как экспертам, возможно, не сложно, а я застрял....
 
Всем привет. Начинаю только изучать язык, написал ( как мог) примитивный скрипт, вроде все правильно, но не работает.....перепроверил много раз не могу понять в чем причина....Посмотрите, пожалуйста, если не трудно. Укажите на ошибки.



in_trade = false

local stopped = false
function OnStop()
stopped = true
return 1000
end

local ID_B_Order = 100
local ID_B_Stop = 200
local ID_B_Take = 300
local ID_B_StopKill = 200.1
local ID_B_TakeKill = 300.1
local Status_B_Order
local Status_B_Stop
local Status_B_Take
local Status_B_StopKill
local Status_B_takeKill
local MSG_B_Order
local MSG_B_Stop
local MSG_B_Take
local MSG_B_StopKill
local MSG_B_TakeKill
local Num_B_Order
local Num_B_Stop
local Num_B_Take
local State_B_Order
local Trade_B
local Stop_B_Activ = "NO"
local Stop_Kill = "NO"
local Take_B_Activ = "NO"


function OnTransReply(order)
if order.trans_id == ID_B_Order then
Status_B_Order = order.status
Num_B_Order = order.order_num
MSG_B_Order = order.result.msg
end
if order.trans_id == ID_B_Stop then
Status_B_Stop = order.status
Num_B_Stop = order.oreder_num
MSG_B_Stop = order.result.msg
end
if order.trans_id == ID_B_Take then
Status_B_Take = order.status
Num_B_Take = order.oreder_num
MSG_B_Take = order.result.msg
end
if order.trans_id == ID_B_StopKill then
Status_B_StopKill = order.status
MSG_B_StopKill = order.result.msg
end
if order.trans_id == ID_B_TakeKillKill then
Status_B_takeKill = order.status
MSG_B_TakeKill = order.result.msg
end

end

function OnOrder(order)
if Num_B_Order == order.order_num then
if bit.band(order.flags, 0x1) == 0 and bit.band(order.flags, 0x2) == 0 then
State_B_Order = "Исполнена"
end
end
end

function OnTrade(trade)
if trade.order_num == Num_B_Order then
Trade_B = trade.price
end
end

function OnStopOrder(order)
if Num_B_Stop == order.order_num then
if bit.band(order.flags, 0x1) == 0 and bit.band (order.flags, 0x2) == 0 then
Stop_B_Activ = "YES"
end
end
if Num_B_Take == order.order_num then
if bit.band(order.flags, 0x8000) ~= 0 then
Take_B_Activ = "YES"
end
end
end


function ResTransaction (ID, Num, Status, MSG, Err)
local FileName = "C:\\Lua\\123.txt"
local FileOpen = io.open(FileName, "a")
local TradeDate = getInfoParam("TRADEDATE")
local ServerTime = getInfoParam("SERVERTIME")
if Status == 3 then
message("ID: "..ID.. "\nNum: "..Num.. "\nStatus: "..Status.. "\nMSG: "..MSG, 1)
FileOpen:write("Date: "..TradeDate.. "\tTime: "..ServerTime.. "\tID: "..ID.. "\tNum: "..Num.. "\tStatus "..Status)
elseif Status == nil then
message("Status == nil. ТРАНЗАКЦИЯ "..ID.." НЕ ВЫПОЛНЕНА. "..Err, 1)
FileOpen:write ("Date: "..TradeDate "\tTIME: "..ServerTime.. "\tStatus == nil. ТРАНЗАКЦИЯ "..ID.."НЕ ВЫПОЛНЕНА. "..Err, 1)
elseif Status ~=nil then
message("MSG: "..MSG, 1)
FileOpen:write ("DATE: "..TradeDate.. "\tTIME: "..ServerTime.. "\tMSG: "..MSG.. "\n")
end
FileOpen:close()
end




function main()

local TableData = AllocTable()     -- будущая таблица робота обработчика
AddColumn(TableData, 1, "Параметры", true, QTABLE_STRING_TYPE, 15)
AddColumn(TableData, 2, "Инструмент", true, QTABLE_STRING_TYPE, 15)
AddColumn(TableData, 3, "День", true, QTABLE_STRING_TYPE, 15)
AddColumn(TableData, 4, "Час", true, QTABLE_STRING_TYPE, 15)
AddColumn(TableData, 5, "Минута", true, QTABLE_STRING_TYPE, 15)
AddColumn(TableData, 6, "Открытие", true, QTABLE_STRING_TYPE, 15)
AddColumn(TableData, 7, "Закрытие", true, QTABLE_STRING_TYPE, 15)
AddColumn(TableData, 8, "Максимум", true, QTABLE_STRING_TYPE, 15)
AddColumn(TableData, 9, "Минимум", true, QTABLE_STRING_TYPE, 15)
AddColumn(TableData, 10, "Время", true, QTABLE_STRING_TYPE, 15)
AddColumn(TableData, 11, "Дата", true, QTABLE_STRING_TYPE, 15)
AddColumn(TableData, 12, "Примечание", true, QTABLE_STRING_TYPE, 15)


CreateWindow(TableData)
SetWindowCaption(TableData, "Данные с графика")
SetWindowPos(TableData, 0,10,900,70)
InsertRow(TableData, -1)
InsertRow(TableData, -2)
InsertRow(TableData, -3)

while stopped == false do
local Date = getInfoParam("TRADEDATE")
local Time = getInfoParam("SERVERTIME")

local DataCandles = getNumCandles("sberprice")
local sberprice, sberN, sberName = getCandlesByIndex("sberprice", 0, 0, DataCandles)

local Day = sberprice[sberN-1].datetime.day
local Hour = sberprice[sberN-1].datetime.hour
local Minute = sberprice[sberN-1].datetime.min
local Open = sberprice[sberN-1].open
local Close = sberprice[sberN-1].close
local High = sberprice[sberN-1].high
local Low = sberprice[sberN-1].low

local Open2 = sberprice[sberN-2].open
local Close2 = sberprice[sberN-2].close
local High2 = sberprice[sberN-2].high
local Low2 = sberprice[sberN-2].low

local Open3 = sberprice[sberN-3].open
local Close3 = sberprice[sberN-3].close
local High3 = sberprice[sberN-3].high
local Low3 = sberprice[sberN-3].low


SetCell(TableData, 1,11, tostring(Date))
SetCell(TableData, 1,10, tostring(Time))
SetCell(TableData, 1, 3, tostring(Day))
SetCell(TableData, 1, 4, tostring(Hour))
SetCell(TableData, 1, 5, tostring(Minute))
SetCell(TableData, 1, 6, tostring(Open-Open%1))
SetCell(TableData, 1, 7, tostring(Close-Close%1))
SetCell(TableData, 1, 8, tostring(High-High%1))
SetCell(TableData, 1, 9, tostring(Low-Low%1))

SetCell(TableData, 2, 6, tostring(Open2-Open2%1))
SetCell(TableData, 2, 7, tostring(Close2-Close2%1))
SetCell(TableData, 2, 8, tostring(High2-High2%1))
SetCell(TableData, 2, 9, tostring(Low2-Low2%1))

SetCell(TableData, 3, 6, tostring(Open3-Open3%1))
SetCell(TableData, 3, 7, tostring(Close3-Close3%1))
SetCell(TableData, 3, 8, tostring(High3-High3%1))
SetCell(TableData, 3, 9, tostring(Low3-Low3%1))
end


function Trade()
local Price_Stop
local Price_Take
t = {
["ACTION"]= "NEW_ORDER",
["ACCOUNT"] = "SPBFUT00JUS",
["OPERATION"] = "B",
["CLASSCODE"] = "SPBFUT",
["SECCODE"] ="SRM9",
["CLIENT_CODE"] = "21096",
["TYPE"]="M",
["PRICE"] = tostring(0),
["Quantity"] = tostring(1),
["TRANS_ID"] = tostring(100)}
sleep(5000)
in_trade = true
local Err_Order = sendTransaction(t)
while Status_B_Order == nil and Err_Order == "" do
sleep(100)
end
ResTransaction (ID_B_Order,Num_B_Order, Status_B_Order, MSG_B_Order, Err_Order)

if Status_B_Order == 3 then
while State_B_Order ~= "Исполнена" do
sleep(10)
end
end
if State_B_Order == "Исполнена" then
Price_Stop = Trade_B <= sberprice[sberN-2].close
local Spread = 100
end
local StopLimitSell = {
                      ['ACTION'] = "NEW_STOP_ORDER",
                      ['PRICE'] = tostring(21000),
                      ['EXPIRY_DATE'] = "GTC",
                      ['STOPPRICE'] = tostring(Price_Stop),
                      ['STOP_ORDER_KIND'] = "SIMPLE_STOP_ORDER",
                      ['TRANS_ID'] = tostring(ID_B_Stop),
                      ['CLASSCODE'] = "SPBFUT",
                      ['SECCODE'] = "SRM9",
                      ['ACCOUNT'] = "SPBFUT00JUS",
                      ['CLIENT_CODE'] = "21096",
                      ['TYPE'] = "L",
                      ['OPERATION'] = "S",
  ['CONDITION'] = tostring (4),
                      ['QUANTITY'] = tostring(1)
  }
local Err_Stop = sendTransaction(StopLimitSell)
while Status_B_Stop == nil and Err_Stop == "" do
sleep(100)
end
ResTransaction (ID_B_Order,Num_B_Order, Status_B_Order, MSG_B_Order, Err_Stop)
Price_Take = Trade_B + 50
local TakeLimitSell ={
                      ['ACTION'] = "NEW_STOP_ORDER",
                      ['PRICE'] = tostring(24000),
                      ['EXPIRY_DATE'] = "GTC",
                      ['STOPPRICE'] = tostring(Price_Take),
                      ['STOP_ORDER_KIND'] = "TAKE_PROFIT_STOP_ORDER",
                      ['TRANS_ID'] = tostring(ID_B_Take),
                      ['CLASSCODE'] = "SPBFUT",
                      ['SECCODE'] = "SRM9",
                      ['ACCOUNT'] = "SPBFUT00JUS",
                      ['CLIENT_CODE'] = "21096",
                      ['TYPE'] = "L",
                      ['OPERATION'] = "S",
  ['CONDITION'] = tostring (5),
                      ['QUANTITY'] = tostring(1)}
local Err_Stop = sendTransaction(TakeLimitSell)
while Status_B_Stop == nil and Err_Stop == "" do
sleep(100)
end
ResTransaction (ID_B_Order,Num_B_Order, Status_B_Order, MSG_B_Order, Err_Take)
while stopped == false do
if Stop_B_Activ == "YES" then
local killTake = {
["ACTION"] = "KILL_STOP_ORDER",
["CLASSCODE"] = "SPBFUT",
["SECCODE"] = "SRM9",
["STOP_ORDER_KEY"] = tostring(Num_B_Take),
["TRANS_ID"] = tostring(ID_B_TakeKill),
}
local Err_KillTake = sendTransaction(killTake)
while Status_B_TakeKill == nil and Err_KillTake == "" do
sleep(10)
ResTransaction (ID_B_TakeKill, Num_B_Take, Status_B_TakeKill, MSG_B_TakeKill, Err_KillTake)
Stop_B_Activ = "TakeKill"
end
if Take_B_Activ == "YES" and Stop_Kill == "NO" then
killStop = {
["ACTION"] = "KILL_STOP_ORDER",
["CLASSCODE"] = "SPBFUT",
["SECCODE"] = "SRM9",
["STOP_ORDER_KEY"] = tostring(Num_B_Stop),
["TRANS_ID"] = tostring(ID_B_StopKill),
}
local Err_KillStop= sendTransaction(killStop)
while Status_B_StopKill == nil and Err_KillStop == "" do
sleep(10)
end
ResTransaction (ID_B_StopKill, Num_B_Stop, Status_B_StopKill, MSG_B_StopKill, Err_KillStop)
Stop_Kill = "YES"
end
sleep(500)
end
end

end

if not(in_trade) then
if Close > Close2 and Close2 > Close3 then
Trade()
end
end

end -- Закрытие основной функции
 
Здравствуйте,
Первое что бросается в глаза у цикла while stopped == false do нет завершающего end
 
Цитата
Sergey Gorokhov написал:
Здравствуйте,
Первое что бросается в глаза у цикла while stopped == false do нет завершающего end
А нет, прошу прощения с этим все в порядке.
Уточните подробней, что именно не работает? У нас код не вызывает ошибок.
 
 Условие скрипта думаю понятно...хотя уточню, что именно хотел реализовать.

"Если закрытие свечи больше чем предыдущий, а закрытие предыдущей больше более ранней,  и нет открытых позиций, то отправляется заявка на покупку. Одновременно выставляется стоп-лосс и тейк-профит. После срабатывания тейка снимается стоп и наоборот."


В ранней версии скрипта делал покупку, но упорно не хотел ставить стоп и тейк. Пока разбирался с причиной и правил скрипт в итоге "добился" что и покупать перестал :(  
Смотрю, вроде все логично(ну опять таки в моем делитантском понимании), но причину не пойму.  
 
Sorokin,

У Вас под составлен так что функция Trade() вызывается только после выхода из цикла "while stopped == false do" может быть в этом проблема?
Попробуйте переместить во внутрь цикла
 
Поместил внутрь. Вот так.    Скрипт запускается и работает.  Заявку отправляет, спасибо большое), но стоп и тейк так и не работают...

пишет  "attempt to perform arithmetic on upvalue 'Trade_B' (a nil value)".....

не нравится условие Trade_B+50  

Почему?


while stopped == false do
local Date = getInfoParam("TRADEDATE")
local Time = getInfoParam("SERVERTIME")

local DataCandles = getNumCandles("sberprice")
local sberprice, sberN, sberName = getCandlesByIndex("sberprice", 0, 0, DataCandles)

local Day = sberprice[sberN-1].datetime.day
local Hour = sberprice[sberN-1].datetime.hour
local Minute = sberprice[sberN-1].datetime.min
local Open = sberprice[sberN-1].open
local Close = sberprice[sberN-1].close
local High = sberprice[sberN-1].high
local Low = sberprice[sberN-1].low

local Open2 = sberprice[sberN-2].open
local Close2 = sberprice[sberN-2].close
local High2 = sberprice[sberN-2].high
local Low2 = sberprice[sberN-2].low

local Open3 = sberprice[sberN-3].open
local Close3 = sberprice[sberN-3].close
local High3 = sberprice[sberN-3].high
local Low3 = sberprice[sberN-3].low


SetCell(TableData, 1,11, tostring(Date))
SetCell(TableData, 1,10, tostring(Time))
SetCell(TableData, 1, 3, tostring(Day))
SetCell(TableData, 1, 4, tostring(Hour))
SetCell(TableData, 1, 5, tostring(Minute))
SetCell(TableData, 1, 6, tostring(Open-Open%1))
SetCell(TableData, 1, 7, tostring(Close-Close%1))
SetCell(TableData, 1, 8, tostring(High-High%1))
SetCell(TableData, 1, 9, tostring(Low-Low%1))

SetCell(TableData, 2, 6, tostring(Open2-Open2%1))
SetCell(TableData, 2, 7, tostring(Close2-Close2%1))
SetCell(TableData, 2, 8, tostring(High2-High2%1))
SetCell(TableData, 2, 9, tostring(Low2-Low2%1))

SetCell(TableData, 3, 6, tostring(Open3-Open3%1))
SetCell(TableData, 3, 7, tostring(Close3-Close3%1))
SetCell(TableData, 3, 8, tostring(High3-High3%1))
SetCell(TableData, 3, 9, tostring(Low3-Low3%1))

if not(in_trade) then
if Close > Close2 and Close2 > Close3 then
Trade()
end
end

end
 
Цитата
Sorokin написал:
пишет  "attempt to perform arithmetic on upvalue 'Trade_B' (a nil value)".....не нравится условие Trade_B+50  

ошибка означает что переменная не задана.

простой пример покажет ошибку:

X = Y + 1

чему будет равно X?  никто не знает т.к. Y неизвестно. Вот и ошибка у Вас говорит о том же, что значение Trade_B неизвестно.

Вот если написать например так:
Y = 0
X = Y + 1

то сразу понятно что X будет равен 1 и ошибки не будет.
Вот и Вам надо задать значение для Trade_B
 
Да, я понял что он ругается на отсутствие значения Trade_B

Но есть же параметр выше в коде

function OnTrade(trade)
if trade.order_num == Num_B_Order then
Trade_B = trade.price
end
end
 
Цитата
Sorokin написал:
Но есть же параметр выше в коде function OnTrade(trade)

Значит колбек OnTrade не срабатывает до обращения к Trade_B+50  
Кроме того в колбеке какая-то проверка.

таким образом пока не будет сделки удовлетворяющей условию, колбек не сработает,  а пока он не сработает ,переменная Trade_B не будет существовать
 
Нашел ошибку. Но  теперь attempt to perform arithmetic on upvalue 'Trade_B...
 
Прикольно... разместил какой-то скрипт, и парни из поддержки тебе его отлаживают :)
 
Цитата
Sorokin написал:
Нашел ошибку. Но  теперь attempt to perform arithmetic on upvalue 'Trade_B...
Значит не правильно исправили ошибку.

Рекомендуем еще раз внимательней проверить что и как происходит с переменной Trade_B
Страницы: 1
Читают тему
Наверх