среда, 7 августа 2013 г.

Код биржевого робота по стратегии выскакивания цены вверх или вниз за значение Parabolic SAR

Данный биржевой робот написан на языке Квика, называемым QPILE, и может:
  • открывать, как длинные, так и короткие позиции
  • когда на момент запуска робота был сигнал, можно установить настройку, чтобы торговый сигнал был исполнен
  • торговать в контртренде собственного сигнала, а именно, если робот выдает сигнал на открытие длинной позиции, то он открывает короткую позицию и наоборот (полезно, когда рынок идет в боковике и дает много ложных сигналов)
  • снимать стопы по сигналам, а именно, если ранее была совершена длинная позиция и одновременно выставлен стоп-лосс и тейк-профит (когда перед и зад прикрыт), робот может снимать стопы, закрывать позицию и открывать новую позицию в направлении сигнала (полезно, когда ситуация изменилась в неблагоприятную сторону)
  • ставить кумулятивные стоп-заявки, именно, касающиеся тейк-профита, когда прибыль накапливается

Обратите внимание, что код робота по данной стратегии содержит в себе код двух предыдущих биржевых роботов, но они не используются.

В планах было, сделать установку входа в рынок по одной стратегии, а выход осуществлять по другой, но потом передумали, так как, во-первых, слишком много вариантов проверок на ошибки, во-вторых, стратегию выхода нужно гармонично подбирать под стратегию входа. Хочу вам сказать - что за этим будущее больших ПРИБЫЛЕЙ!


PORTFOLIO_EX TradeMakerStrategys;
DESCRIPTION TradeMakerStrategys;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST TradeMakerTM;
USE_CASE_SENSITIVE_CONSTANTS
PROGRAM

'Start >> ===================================== Главные настройки >>
NEW_GLOBAL("CStocks", CREATE_COLLECTION())
NEW_GLOBAL("PathToRob","H:\TradeMakerTM\TradeMaker_Fullv5.7\TradeMaker_Fullv5.7\Qpile")
NEW_GLOBAL("FileNmLog",PathToRob&"\log\TMqpl.log")
'End >> ================================================= <<

'Extended
NEW_GLOBAL("Start_Flag",1)
NEW_GLOBAL("FirstStart",1)
NEW_GLOBAL("LastTradeDate","")
NEW_GLOBAL("TradeTime","")
NEW_GLOBAL("TradeDate","")
NEW_GLOBAL("FindCaldleCount",150)
NEW_GLOBAL("LastTradeCount",-1)
NEW_GLOBAL("LastCountStopOrders",-1)
NEW_GLOBAL("errorCount",0)

' Параметры сообщений и протоколирования
NEW_GLOBAL("Status",-1)
NEW_GLOBAL("LastStatus",-1)
NEW_GLOBAL("LastError",-1)
NEW_GLOBAL("MsgStatus",CREATE_COLLECTION())
NEW_GLOBAL("ErrorStatus",CREATE_COLLECTION())
NEW_GLOBAL("UseLog",0)

' ========================== Контроль соединения
IF (IS_CONNECTED() == 1) and (Start_Flag = 0) then
Start_Flag = 1
Status = 0
LastCountStopOrders = -1
LastTradeCount = -1
Status = -1
LastStatus = -1
LastError = -1
WriteMsgLog(1,Status,1,1,"Соединение с сервером установлено")
' Init()
END IF

IF (IS_CONNECTED() == 0) and (Start_Flag = 2)
Start_Flag = 0
Status = 1
WriteMsgLog(1,Status,1,1,"Отсутствует соединение с сервером")
END IF

' Первый запуск
IF Start_Flag = 1 then
WriteMsgLog(1,2,0,1,"Starting")
WriteMsgLog(1,3,0,1,"Init")
Init()

' Проверка соединения
' DEL
if IS_CONNECTED() == 0 then 
Status = 1
WriteMsgLog(1,1,1,1,"Отсутствует соединение с сервером")
else

' Проверка доступа к времени сервера
TradeTime = GET_INFO_PARAM("SERVERTIME")
TradeTime = SUBSTR(TradeTime, 0, 2)&SUBSTR(TradeTime, 3, 2)&SUBSTR(TradeTime, 6, 2)
if TradeTime+0 = 0 then
  Status = 3
  WriteMsgLog(1,8,0,1,"Недоступен параметр: 'Время сервера'")
else
' Проверка доступа к торговой дате
TradeDate = GetTD()
if TradeDate+0 = 0 then
Status = 4
  WriteMsgLog(1,9,1,1,"Недоступен параметр: 'Торговая дата'")
else

' Установка приращения графиков
if GetIncTime() < 0 then        
   Status = 5
else

' Проверка параметров по бумагам
if CheckStocks() < 0 then
Status = 2
else

    ' Read Prms last,bid,offer
if ReadPrms() < 0 then
   Status = 9
else

if CheckGraphs() < 0 then
   Status = 6
else

' Проверка интервала графиков
if CheckGraphsInt() < 0 then
   Status = 7
else

    if GetLastCandle() < 0 then
  WriteMsgLog(1,14,1,1,"Не определены значения последних 3-х интервалов с графиков")
   Status = 8
else

    CalcSrvPrice()
' Good >>
' WriteMsgLog(1,40,1,0,"Все параметры определены. Режим торговли")

NewView()

    Start_Flag = 2

' Stock = GET_COLLECTION_ITEM(CStocks,0)
' Graphs = GET_VALUE(Stock,"Graphs")  
'    Graph = GET_COLLECTION_ITEM(Graphs,0)
' S = GET_VALUE(Graph,"CurTime")&" "&GET_VALUE(Graph,"Cur")
' S = S&" "&GET_VALUE(Graph,"LasTime1")&" "&GET_VALUE(Graph,"Las1")
' S = S&" "&GET_VALUE(Graph,"LasTime2")&" "&GET_VALUE(Graph,"Las2")
' s =  GET_VALUE(Stock,"Bid")&" "&GET_VALUE(Stock,"Offer")
' Message(S,1)
    ' << Good
    
    end if
    end if
    end if
    end if
    end if
    end if
    end if
    end if
    end if
    
    '==== Собираем ошибки при первом запуске
    Start_Flag = 2    
    '====

ELSE
' Рабочий режим
if Start_Flag = 2 then

' Проверка доступа к времени сервера
TradeTime = GET_INFO_PARAM("SERVERTIME")
TradeTime = SUBSTR(TradeTime, 0, 2)&SUBSTR(TradeTime, 3, 2)&SUBSTR(TradeTime, 6, 2)
if TradeTime+0 = 0 then
  Status = 3
'   WriteMsgLog(1,8,1,1,"Недоступен параметр: 'Время сервера'")
else
' Проверка доступа к торговой дате
TradeDate = GetTD()
if TradeDate+0 = 0 then
Status = 4
  WriteMsgLog(1,9,1,1,"Недоступен параметр: 'Торговая дата'")
else
' Проверка параметров по бумагам
if CheckStocks() < 0 then
Status = 2
else
    ' Read Prms last,bid,offer
if ReadPrms() < 0 then
   Status = 9
else
if CheckGraphs() < 0 then
   Status = 6
else

' Проверка интервала графиков
if CheckGraphsInt() < 0 then
   Status = 7
else

    CalcSrvPrice()
    ReadGraphs()
RunSignal()

    CheckStopTranz()

' message(GET_VALUE(Stock,"SrvPrice"),1)   
  WriteMsgLog(1,40,1,0,"Все параметры определены. Режим торговли")

' Если таблица робота пуста, то формируем ее
if GET_NUMBER_OF("OWN") < 1 then
NewView()
else
RepView()
end if

    FirstStart = 0

end if
end if
end if
end if
end if
end if

    end if
END IF

'===================== FUNCTIONS =================
FUNC Send_StopTrans(sCli, sAcc, sClass, sCode, sOper, sStopProfPrice, sProfSpred, sStopLossPrice, sPrice, sLot, sID)

NEW_GLOBAL("TRANS_PARAMS", "")
NEW_GLOBAL("TRANS_RESULT", "")

trans_params = ""
trans_params = set_value (trans_params, "TRANS_ID", sID)
trans_params = set_value (trans_params, "ACTION", "NEW_STOP_ORDER")
if sStopProfPrice > 0 then
trans_params = set_value (trans_params, "STOPPRICE", sStopProfPrice)
trans_params = set_value (trans_params, "OFFSET", 0)
trans_params = set_value (trans_params, "OFFSET_UNITS", "PRICE_UNITS")
trans_params = set_value (trans_params, "SPREAD", sProfSpred)
trans_params = set_value (trans_params, "SPREAD_UNITS", "PRICE_UNITS")
end if
trans_params = set_value (trans_params, "STOPPRICE2", sStopLossPrice)
trans_params = set_value (trans_params, "CLASSCODE", sClass)
trans_params = set_value (trans_params, "SECCODE", sCode)
trans_params = set_value (trans_params, "ACCOUNT", sAcc)
trans_params = set_value (trans_params, "OPERATION", sOper)
trans_params = set_value (trans_params, "PRICE", sPrice)
trans_params = set_value (trans_params, "CLIENT_CODE", sCli)
trans_params = set_value (trans_params, "QUANTITY", sLot)
trans_params = set_value (trans_params, "EXPIRY _DATE", "GTC")
trans_params = set_value (trans_params, "STOP_ORDER_KIND", "TAKE_PROFIT_AND_STOP_LIMIT_ORDER")
trans_result = SEND_TRANSACTION (30, trans_params)
Result = get_value(trans_result, "RESULT")+0
Message(get_value(trans_result, "DESCRIPTION"), 1)

FileName = PathToRob&"\tmp\"&sCode&"_TranzLog.txt" 
S = TradeDate&"|"&TradeTime&"|"&sPrice&"|"&sLot&"|"&sPrice*sLot&"|"&sOper&"|StopTranz"
WRITELN(FileName, S)

END FUNC

' Функция контроля стопов
FUNC CheckStopTranz()

gaCount = GET_NUMBER_OF("STOP_ORDERS")+0

if GET_COLLECTION_COUNT(CStocks) > 0 then
for i from 0 to GET_COLLECTION_COUNT(CStocks)-1  
Stock = GET_COLLECTION_ITEM(CStocks,i)
SendFlag = GET_VALUE(Stock,"SendFlag")+0  
SignFlag = GET_VALUE(Stock,"SignFlag")+0  
if (SendFlag = 0) and (SignFlag = 0) then

CliCode = GET_VALUE(Stock,"CliCode") 
Account = GET_VALUE(Stock,"Account")
ClassCode = GET_VALUE(Stock,"ClassCode")  
SecCode = GET_VALUE(Stock,"SecCode")  
       Ost = GET_VALUE(Stock,"Ost")+0
SrvPrice = GET_VALUE(Stock,"SrvPrice")+0 
       Pl = GET_VALUE(Stock,"PlatForm")+0
       AcceptOst = GET_VALUE(Stock,"AcceptOst")+0
NoOrder = GET_VALUE(Stock,"NoOrder")+0

IF (Ost = 0) and (SrvPrice = 0) then
if (LastCountStopOrders <> gaCount) then 
KillAllStopTranz(Account,SecCode,0)
end if
Stock = SET_VALUE(Stock,"PDelta",0)  
Stock = SET_VALUE(Stock,"LDelta",0)  
CStocks = SET_COLLECTION_ITEM(CStocks,i,Stock)
END IF

UseTakeProfit = GET_VALUE(Stock,"UseTakeProfit")+0 
ProfitType = GET_VALUE(Stock,"ProfitType")+0
ProfitVol = GET_VALUE(Stock,"ProfitVol")+0
ProfitSpred = GET_VALUE(Stock,"ProfitSpred")+0 
ProfitStep = GET_VALUE(Stock,"ProfitStep")+0
ProfitTypeSpred = GET_VALUE(Stock,"ProfitTypeSpred")+0 

UseStopLoss = GET_VALUE(Stock,"UseStopLoss")+0
LossType = GET_VALUE(Stock,"LossType")+0 
LossVol = GET_VALUE(Stock,"LossVol")+0      
LossSpred = GET_VALUE(Stock,"LossSpred")+0   
            LossStep = GET_VALUE(Stock,"LossStep")+0
            LossTypeSpred = GET_VALUE(Stock,"LossTypeSpred")+0

PDelta = GET_VALUE(Stock,"PDelta")+0 
LDelta = GET_VALUE(Stock,"LDelta")+0 

            PStopPrice = 0
            PriceSPOrder = 0
            LStopPrice = 0
            PriceSLOrder = 0

Scale = GET_VALUE(Stock,"Scale")+0
LastPrice = GetNumTTP(ClassCode,SecCode,"last")+0

' message(SrvPrice,1)
' RETURN '<<DEL

if ((UseTakeProfit = 1) or (UseStopLoss = 1)) and (Ost <> 0) and (SrvPrice <> 0) then

if Ost > 0 then
CurPer = LastPrice/SrvPrice*100-100
else
if Ost < 0 then
CurPer = SrvPrice/LastPrice*100-100
end if
end if

            if UseTakeProfit = 1 then
if (ProfitStep <> 0) then
Delta = FLOOR(CurPer/ProfitStep)*ProfitStep
if PDelta < Delta then
PDelta = Delta 
Stock = SET_VALUE(Stock,"PDelta",PDelta)  
CStocks = SET_COLLECTION_ITEM(CStocks,i,Stock)
end if 
end if 

   if Ost > 0 then
PStopPrice = APPLY_SCALE(SrvPrice+((SrvPrice*ProfitVol)/100)+PDelta,Scale)+0
    if ProfitTypeSpred = 0 then
      PriceSPOrder = APPLY_SCALE(PStopPrice-((PStopPrice*ProfitSpred)/100) ,Scale)+0
      else
      PriceSPOrder = APPLY_SCALE(PStopPrice-ProfitSpred,Scale)+0
      end if
else
   if Ost < 0 then
PStopPrice = APPLY_SCALE(SrvPrice-((SrvPrice*ProfitVol)/100)-PDelta,Scale)+0
    if ProfitTypeSpred = 0 then
      PriceSPOrder = APPLY_SCALE(PStopPrice+((PStopPrice*ProfitSpred)/100) ,Scale)+0
      else
      PriceSPOrder = APPLY_SCALE(PStopPrice+ProfitSpred,Scale)+0
      end if
end if
end if
                end if

            if UseStopLoss = 1 then
if (LossStep <> 0) then
Delta = FLOOR(CurPer/LossStep)*LossStep
if LDelta < Delta then
LDelta = Delta 
Stock = SET_VALUE(Stock,"LDelta",LDelta)  
CStocks = SET_COLLECTION_ITEM(CStocks,i,Stock)
end if 
end if  
   if Ost > 0 then
LStopPrice = APPLY_SCALE(SrvPrice-((SrvPrice*LossVol)/100)+LDelta,Scale)+0
if LossTypeSpred = 0 then
      PriceSLOrder = APPLY_SCALE(LStopPrice-((LStopPrice*LossSpred)/100) ,Scale)+0
      else
      PriceSLOrder = APPLY_SCALE(LStopPrice-LossSpred,Scale)+0
      end if
else
   if Ost < 0 then
LStopPrice = APPLY_SCALE(SrvPrice+((SrvPrice*LossVol)/100)-LDelta,Scale)+0
    if LossTypeSpred = 0 then
      PriceSLOrder = APPLY_SCALE(LStopPrice+((LStopPrice*LossSpred)/100) ,Scale)+0
      else
      PriceSLOrder = APPLY_SCALE(LStopPrice+LossSpred,Scale)+0
      end if
end if
end if
                end if
                
                if (UseTakeProfit = 1) and (UseStopLoss = 1) and (PStopPrice < LStopPrice) then
                Break
                end if
                
ActivTranz = 0
StrActiv = 0
PLimActiv = 0
LLimActiv = 0
PStopActiv = 0
LStopActiv = 0
' Читаем таблицу заявок
gaCount = GET_NUMBER_OF("ORDERS")+0
if (gaCount > 0) and ( ((Pl = 0) and (AcceptOst <> Ost)) or ((Pl = 1) and (AcceptOst <> 0)) ) then
for gaI from 1 to gaCount
gaSTR = GET_ITEM("ORDERS", gaI)
gaAc = Get_Value(gaSTR, "ACCOUNT")
       gaCd = Get_Value(gaSTR, "SECCODE")
gaStat = Get_Value(gaSTR, "STATUS")
gaNo = Get_Value(gaSTR, "NUMBER")+0
gaOper = Get_Value(gaSTR, "OPERATION")
gaSPrice = Get_Value(gaSTR, "PRICE")+0  
gaQty = Get_Value(gaSTR, "QUANTITY")+0
gaID = Get_Value(gaSTR, "TRANS_ID")+0   

if (gaAc = Account) and (gaCd = SecCode) then

                   if (gaStat = "ACTIVE") then
                   if ((gaID = 2001) or (gaID = 2002)) and (PriceSPOrder = gaSPrice) then 
                    PLimActiv = PLimActiv + 1
                    else
                   if ((gaID = 3001) or (gaID = 3002)) and (PriceSLOrder = gaSPrice) then 
                    LLimActiv = LLimActiv + 1
                    else
                   if ((gaID = 1001) or (gaID = 1002)) then 
                    StrActiv = StrActiv + 1
                    else

                   if (gaID = 4001) and (PriceSPOrder = gaSPrice) then 
                    PStopActiv = PStopActiv + 1
                    else
                   if (gaID = 4002) and (PriceSLOrder = gaSPrice) then 
                    LStopActiv = LStopActiv + 1
                    end if
                    end if
                    end if
                    end if
                    end if
                    ActivTranz = ActivTranz + 1
                   end if

end if
end for
end if                
                
RSP = 0
                ' Take profit market & limit
                if (UseTakeProfit = 1) and (ProfitType < 2) and (StrActiv = 0) then
                    if (LastPrice > 0) and ( ((Ost > 0) and (LastPrice >= PStopPrice)) or ((Ost < 0) and (LastPrice <= PStopPrice)) ) then
       if ((Pl = 0) and (AcceptOst = Ost)) or ((Pl = 1) and (AcceptOst = 0)) then
if ProfitType = 0 then 
ZType = "M"
else
ZType = "L"
end if
if Ost > 0 then     
ZOper = "S"
ZID = "2002"
else
ZOper = "B"
ZID = "2001"
end if
        Rez = Send_Trans(CliCode, Account, ClassCode, SecCode, ZOper, PriceSPOrder, Ost, ZType, ZID)+0
                else
                if (ActivTranz <> 0) and (PLimActiv = 0) then
   KillAllTranz(Account,SecCode,"")
end if
   KillAllStopTranz(Account,SecCode,0)    
end if
RSP = 1          
                end if
                end if
                
                ' Stop loss market & limit
                if (UseStopLoss = 1) and (LossType < 2) and (StrActiv = 0) then
                    if (LastPrice > 0) and ( ((Ost > 0) and (LastPrice <= LStopPrice)) or ((Ost < 0) and (LastPrice >= LStopPrice)) ) then
       if ((Pl = 0) and (AcceptOst = Ost)) or ((Pl = 1) and (AcceptOst = 0)) then
if LossType = 0 then 
ZType = "M"
else
ZType = "L"
end if
if Ost > 0 then     
ZOper = "S"
ZID = "3002"
else
ZOper = "B"
ZID = "3001"
end if
        Rez = Send_Trans(CliCode, Account, ClassCode, SecCode, ZOper, PriceSLOrder, Ost, ZType, ZID)+0
                else
                if (ActivTranz <> 0) and (LLimActiv = 0) then
   KillAllTranz(Account,SecCode,"")
   end if
   KillAllStopTranz(Account,SecCode,0)    
end if     
RSP = 1          
                end if
                end if                

Spred = APPLY_SCALE(ABS(PStopPrice-PriceSPOrder),Scale)+0

                ' Stops
       if (RSP = 0) and (StrActiv = 0) and (((UseTakeProfit = 1) and (ProfitType = 2)) or ((UseStopLoss = 1) and (LossType = 2))) then

FindStopProf = 0 
FindStopLoss = 0 
NoSPOrder = 0
NoSLOrder = 0
NoLinkSPOrder = 0
NoLinkSLOrder = 0

' Читаем данные о стоп-заявках
gaCount = GET_NUMBER_OF("STOP_ORDERS")+0
if (gaCount > 0) then

for gaI from 1 to gaCount
gaSTR = GET_ITEM("STOP_ORDERS", gaI)
gaAc = Get_Value(gaSTR, "ACCOUNT")
       gaCd = Get_Value(gaSTR, "SECCODE")
gaStat = Get_Value(gaSTR, "STATUS")
gaNo = Get_Value(gaSTR, "NUMBER")+0
gaOper = Get_Value(gaSTR, "OPERATION")
gaLNo = Get_Value(gaSTR, "LINKED_ORDER")+0
gaType = Get_Value(gaSTR, "STOP_ORDER_TYPE")+0
gaConPrice = Get_Value(gaSTR, "CONDITION_PRICE")+0
gaConPrice2 = Get_Value(gaSTR, "CONDITION_PRICE2")+0
gaSred = Get_Value(gaSTR, "SPREAD")+0  
gaSPrice = Get_Value(gaSTR, "PRICE")+0  
gaQty = Get_Value(gaSTR, "QUANTITY")+0  
gaAct = Get_Value(gaSTR, "BALANCE")+0  
gsTime = Get_Value(gaSTR, "TIME") 


           ' gaType = 9
if (gaAc = Account) and (gaCd = SecCode) then 'and (gaType = 9)  
      StopOrderDate = Get_Value(gaSTR, "DATE")+0
StopOrderTime = Get_Value(gaSTR, "TIME")+0

                if (UseTakeProfit = 1) and (ProfitType = 2) and (UseStopLoss = 1) and (LossType = 2) and (gaConPrice = PStopPrice+0) and (gaSred&"" = Spred&"") and (gaConPrice2 = LStopPrice+0) and (gaSPrice = PriceSLOrder) then 
if (gaStat = "ACTIVE") and (gaQty = ABS(Ost)) then
NoSPOrder = gaNo
NoSLOrder = gaNo
            FindStopProf = 1
            FindStopLoss = 1
    else
if (gaStat = "FILLED") and (gaQty = ABS(Ost)) then
NoSPOrder = gaNo
NoSLOrder = gaNo
            FindStopProf = 1
            FindStopLoss = 1
    end if
end if
  
ELSE                

                if (UseTakeProfit = 1) and (ProfitType = 2) and ((LossType < 2) or  (UseStopLoss = 0)) and (gaConPrice2 = 0) and (gaConPrice = PStopPrice+0) and (gaSred&"" = Spred&"") then 
if (gaStat = "ACTIVE") and (gaQty = ABS(Ost)) then
NoSPOrder = gaNo          
            FindStopProf = 1
else
if (gaStat = "FILLED") and (gaQty = ABS(Ost)) then
NoSPOrder = gaNo
NoLinkSPOrder = gaLNo
            FindStopProf = 1
end if
end if   

ELSE

                  if (UseStopLoss = 1) and (LossType = 2) and ((ProfitType < 2) or (UseTakeProfit = 0)) and (gaConPrice = 0) and (gaConPrice2 = LStopPrice+0) and (gaSPrice = PriceSLOrder) then 
if (gaStat = "ACTIVE") and (gaQty = ABS(Ost)) then
NoSLOrder = gaNo
            FindStopLoss = 1
else
if (gaStat = "FILLED") and (gaQty = ABS(Ost)) then
NoSLOrder = gaNo
NoLinkSLOrder = gaLNo
            FindStopLoss = 1
end if
end if

              end if
                end if
                end if
   
if (FindStopProf <> 1) and (FindStopLoss <> 1) then
if (gaStat = "ACTIVE") then
Send_Kill_StopTrans(gaNo, Account, ClassCode, SecCode)
end if
if (gaStat = "FILLED") then
if (gaLNo <> 0) and (gaAct > 0) then
Send_Kill_Trans(gaLNo, Account, ClassCode, SecCode)
end if
end if
                   end if

end if

end for
end if       

' Собственно выставление стоп-ордеров
       if (UseTakeProfit = 1) and (ProfitType = 2) and (UseStopLoss = 1) and (LossType = 2) then
       if (FindStopProf = 0) and (FindStopLoss = 0) and (((Pl = 0) and (AcceptOst = Ost)) or ((Pl = 1) and (AcceptOst = 0))) then 
        if Ost > 0 then 
Rez = Send_StopTrans(CliCode, Account, ClassCode, SecCode, "S", PStopPrice,Spred, LStopPrice, PriceSLOrder, Ost,"4001")+0
else
Rez = Send_StopTrans(CliCode, Account, ClassCode, SecCode, "B", PStopPrice,Spred, LStopPrice, PriceSLOrder, -Ost,"4001")+0
end if
       end if

       ELSE

       if (UseTakeProfit = 1) and (ProfitType = 2) and ((LossType < 2) or (UseStopLoss = 0)) then
       if (FindStopProf = 0) and ( ((Pl = 0) and (AcceptOst = Ost)) or ((Pl = 1) and (AcceptOst = 0)) ) then 
        if Ost > 0 then 
Rez = Send_StopTrans(CliCode, Account, ClassCode, SecCode, "S", PStopPrice,Spred, 0, 0, Ost,"4002")+0
else
Rez = Send_StopTrans(CliCode, Account, ClassCode, SecCode, "B", PStopPrice,Spred, 0, 0, -Ost,"4002")+0
end if
       end if

       ELSE

       if (UseStopLoss = 1) and (LossType = 2) and ((ProfitType < 2) or (UseTakeProfit = 0)) then
       if (FindStopLoss = 0) and ( ((Pl = 0) and (AcceptOst = Ost)) or ((Pl = 1) and (AcceptOst = 0)) ) then 
        if Ost > 0 then 
Rez = Send_StopTrans(CliCode, Account, ClassCode, SecCode, "S", 0,0, LStopPrice, PriceSLOrder, Ost,"4003")+0
else
Rez = Send_StopTrans(CliCode, Account, ClassCode, SecCode, "B", 0,0, LStopPrice, PriceSLOrder, -Ost,"4003")+0
end if
       end if
       end if        
       end if

       END IF

                end if

end if  

else
Stock = SET_VALUE(Stock,"SendFlag",0)  
CStocks = SET_COLLECTION_ITEM(CStocks,i,Stock)
end if
end for  
end if
LastCountStopOrders = gaCount

END FUNC

' Формирование сигнала
FUNC RunSignal()

if GET_COLLECTION_COUNT(CStocks) > 0 then
for i from 0 to GET_COLLECTION_COUNT(CStocks)-1  
Stock = GET_COLLECTION_ITEM(CStocks,i)
        Pl = GET_VALUE(Stock,"PlatForm")+0

        OpenS = 0
if Pl = 1 then
' FORTS
      if (TradeTime+0 > GET_VALUE(Stock,"OpenSession")+0) and (TradeTime+0 < GET_VALUE(Stock,"CloseSession")+0) then
        OpenS = 1
  else
      if (TradeTime+0 > GET_VALUE(Stock,"OpenMon")+0) and (TradeTime+0 < GET_VALUE(Stock,"CloseMon")+0) then
          OpenS = 1
        else
      if (TradeTime+0 > GET_VALUE(Stock,"OpenEve")+0) and (TradeTime+0 < GET_VALUE(Stock,"CloseEve")+0) then
          OpenS = 1
end if
end if
end if
else
' MMVB
tmp = GET_PARAM_EX(Cs, Sc, "TRADINGSTATUS")
OpenS = GET_VALUE(tmp, "PARAM_VALUE")+0
'       if (TradeTime+0 > GET_VALUE(Stock,"OpenSession")+0) and (TradeTime+0 < GET_VALUE(Stock,"CloseSession")+0) then
'         OpenS = 1
'   end if
end if          

        Ost = GET_VALUE(Stock,"Ost")+0
        AcceptOst = GET_VALUE(Stock,"AcceptOst")+0
isSig = 0

StrPrms = GET_VALUE(Stock,"StrPrms")
CloseStop = GET_VALUE(StrPrms,"CloseStop")+0
        
' (((AcceptOst = Ost) and (Pl = 0)) or ((Pl = 1) and (AcceptOst = 0)))
                                                   '                                                                                                     '
        if (OpenS = 1) and (  (CloseStop = 1) or ( (CloseStop = 0) and  (Ost = 0) and (((AcceptOst = Ost) and (Pl = 0)) or ((Pl = 1) and (AcceptOst = 0))) )  ) then  

        NoStr = GET_VALUE(Stock,"StrNo")+0 
UseLong = GET_VALUE(Stock,"UseLong")+0  
UseShort = GET_VALUE(Stock,"UseShort")+0
GInc = GET_VALUE(Stock,"GInc")+0 
SumTrade = GET_VALUE(Stock,"Lot")+0 

CliCode = GET_VALUE(Stock,"CliCode") 
Account = GET_VALUE(Stock,"Account")
ClassCode = GET_VALUE(Stock,"ClassCode")  
SecCode = GET_VALUE(Stock,"SecCode")  
Bid = GET_VALUE(Stock,"Bid")+0 
Offer = GET_VALUE(Stock,"Offer")+0 

        if Ost > 0 then
        FlagPos = 1
        else
        if Ost < 0 then
        FlagPos = 2
else
FlagPos = 0
end if
end if

Stock = SET_VALUE(Stock,"SendFlag",0)  
        EndInt = GET_VALUE(Stock,"EndInt")+0

' MACD&ADX
       if NoStr = 0 then
       
Wait = GET_VALUE(StrPrms,"Wait")+0
if (FirstStart=1) and (Wait = 0) then
EndInt = 1
end if 
       
       if EndInt = 1 then
Graphs = GET_VALUE(Stock,"Graphs")
if GET_COLLECTION_COUNT(Graphs) = 4 then

Graph = GET_COLLECTION_ITEM(Graphs,0)
if GET_VALUE(Graph,"Count")+0 > 1 then
CurPrice = GET_VALUE(Graph,"Cur")+0 
LasPrice1 = GET_VALUE(Graph,"Las1")+0 
LasPrice2 = GET_VALUE(Graph,"Las2")+0

Graph = GET_COLLECTION_ITEM(Graphs,1)
if GET_VALUE(Graph,"Count")+0 > 1 then
CurMACD = GET_VALUE(Graph,"Cur")+0 
LasMACD1 = GET_VALUE(Graph,"Las1")+0 
LasMACD2 = GET_VALUE(Graph,"Las2")+0

Graph = GET_COLLECTION_ITEM(Graphs,2)
if GET_VALUE(Graph,"Count")+0 > 1 then
CurHMACD = GET_VALUE(Graph,"Cur")+0 
LasHMACD1 = GET_VALUE(Graph,"Las1")+0 
LasHMACD2 = GET_VALUE(Graph,"Las2")+0

Graph = GET_COLLECTION_ITEM(Graphs,3)
if GET_VALUE(Graph,"Count")+0 > 1 then
CurADX = GET_VALUE(Graph,"Cur")+0 
LasADX1 = GET_VALUE(Graph,"Las1")+0 
LasADX2 = GET_VALUE(Graph,"Las2")+0

StrPrms = GET_VALUE(Stock,"StrPrms")
LevADX = GET_VALUE(StrPrms,"uADX")+0
BarCount = GET_VALUE(StrPrms,"BarCount")+0 
ContrTrend = GET_VALUE(StrPrms,"ContrTrend")+0 

' WPos = GET_VALUE(StrPrms,"WPos")+0
' Wait = GET_VALUE(StrPrms,"Wait")+0
' Mode = GET_VALUE(StrPrms,"Mode")+0

if (UseLong = 1) and (UseShort = 1) then
Message("Ошибка ввода! В стратегии MACD&ADX можно использовать только одно направление трейдинга!",2)
Break
end if

if ContrTrend = 0 then
' Определяем Long signal
if (FlagPos <> 1) and (UseLong = 1) then 
if BarCount = 2 then
if (LasMACD1 < 0) and (LasMACD2 < 0) and (LasHMACD1 < 0) and (LasHMACD2 < 0) then
Wait = 0
end if
else
if (LasMACD1 < 0) and (LasHMACD1 < 0) then
Wait = 0
end if
                       end if
if (Wait = 0) then
if (LasMACD1 > 0) and (LasMACD2 > 0) and (LasHMACD1 > 0) and (LasHMACD2 > 0) and (LasADX1 > LasADX2) then
                    isSig = 1
                    Wait = 1
end if
end if
end if

' Определяем Short signal
if (FlagPos <> 2) and (UseShort = 1) then
if BarCount = 2 then
if (LasMACD1 > 0) and (LasMACD2 > 0) and (LasHMACD1 > 0) and (LasHMACD2 > 0) then
Wait = 0
end if
else
if (LasMACD1 > 0) and (LasHMACD1 > 0) then
Wait = 0
end if
                       end if
if (Wait = 0) then
if (LasMACD1 < 0) and (LasMACD2 < 0) and (LasHMACD1 < 0) and (LasHMACD2 < 0) and (LasADX1 > LasADX2) then
                    isSig = 2
                    Wait = 1
end if
end if
end if
else
' Определяем Short signal
if (FlagPos <> 2) and (UseShort = 1) then 
if BarCount = 2 then
if (LasMACD1 < 0) and (LasMACD2 < 0) and (LasHMACD1 < 0) and (LasHMACD2 < 0) then
Wait = 0
end if
else
if (LasMACD1 < 0) and (LasHMACD1 < 0) then
Wait = 0
end if
                       end if
if (Wait = 0) then
if (LasMACD1 > 0) and (LasMACD2 > 0) and (LasHMACD1 > 0) and (LasHMACD2 > 0) and (LasADX1 > LasADX2) then
                    isSig = 2
                    Wait = 1
end if
end if
end if

' Определяем Long signal
if (FlagPos <> 1) and (UseLong = 1) then
if BarCount = 2 then
if (LasMACD1 > 0) and (LasMACD2 > 0) and (LasHMACD1 > 0) and (LasHMACD2 > 0) then
Wait = 0
end if
else
if (LasMACD1 > 0) and (LasHMACD1 > 0) then
Wait = 0
end if
                       end if
if (Wait = 0) then
if (LasMACD1 < 0) and (LasMACD2 < 0) and (LasHMACD1 < 0) and (LasHMACD2 < 0) and (LasADX1 > LasADX2) then
                    isSig = 1
                    Wait = 1
end if
end if
end if
end if

' message(Wait,1)
' Определяем ClosePos
if (FlagPos <> 0) then 
if (FirstStart=1) then
   Wait = 1
end if
if (LasADX1 < LasADX2) and (LasADX1 <= LevADX) then
   isSig = 3
   Wait = 1
end if
end if 

                    StrPrms = SET_VALUE(StrPrms,"Wait",Wait)
                    Stock = SET_VALUE(Stock,"StrPrms",StrPrms)
                    
end if
end if
end if
end if
end if
end if
end if

' Srv&Dev
       if NoStr = 1 then
       
StrPrms = GET_VALUE(Stock,"StrPrms")
Wait = GET_VALUE(StrPrms,"Wait")+0
if (FirstStart=1) and (Wait = 0) then
EndInt = 1
end if        
       
       if EndInt = 1 then
       
Graphs = GET_VALUE(Stock,"Graphs")
if GET_COLLECTION_COUNT(Graphs) = 4 then

Graph = GET_COLLECTION_ITEM(Graphs,0)
if GET_VALUE(Graph,"Count")+0 > 1 then
CurPrice = GET_VALUE(Graph,"Cur")+0 
LasPrice1 = GET_VALUE(Graph,"Las1")+0 
LasPrice2 = GET_VALUE(Graph,"Las2")+0

Graph = GET_COLLECTION_ITEM(Graphs,1)
if GET_VALUE(Graph,"Count")+0 > 1 then
FCurS = GET_VALUE(Graph,"Cur")+0 
FLasS1 = GET_VALUE(Graph,"Las1")+0 
FLasS2 = GET_VALUE(Graph,"Las2")+0

Graph = GET_COLLECTION_ITEM(Graphs,2)
if GET_VALUE(Graph,"Count")+0 > 1 then
SCurS = GET_VALUE(Graph,"Cur")+0 
SLasS1 = GET_VALUE(Graph,"Las1")+0 
SLasS2 = GET_VALUE(Graph,"Las2")+0

Graph = GET_COLLECTION_ITEM(Graphs,3)
if GET_VALUE(Graph,"Count")+0 > 1 then
CurDiv = GET_VALUE(Graph,"Cur")+0 
LasDiv1 = GET_VALUE(Graph,"Las1")+0 
LasDiv2 = GET_VALUE(Graph,"Las2")+0

StrPrms = GET_VALUE(Stock,"StrPrms")
' Wait = GET_VALUE(StrPrms,"Wait")+0
ContrTrend = GET_VALUE(StrPrms,"ContrTrend")+0 

                    if ContrTrend = 0 then
' Определяем Long signal
if (FlagPos <> 1) then 
if (FLasS2 < SLasS2) and (FLasS1 > SLasS1) and (LasDiv2 < LasDiv1) then
if (UseLong = 1) then
isSig = 1
else 
if FlagPos = 2 then
   isSig = 3
end if
Wait = 0
end if
end if
end if

' Определяем Short signal
if (FlagPos <> 2) then
if (FLasS2 > SLasS2) and (FLasS1 < SLasS1) and (LasDiv2 < LasDiv1) then
if UseShort = 1 then
isSig = 2
else 
if FlagPos = 1 then
   isSig = 3      
end if
Wait = 0
end if
end if
end if
else
' Определяем Short signal
if (FlagPos <> 2) then 
if (FLasS2 < SLasS2) and (FLasS1 > SLasS1) and (LasDiv2 < LasDiv1) then
if (UseShort = 1) then
isSig = 2
else 
if FlagPos = 1 then
   isSig = 3
end if
Wait = 0
end if
end if
end if

' Определяем Long signal
if (FlagPos <> 2) then
if (FLasS2 > SLasS2) and (FLasS1 < SLasS1) and (LasDiv2 < LasDiv1) then
if UseLong = 1 then
isSig = 1
else 
if FlagPos = 2 then
   isSig = 3      
end if
Wait = 0
end if
end if
end if
end if

if isSig = 1 then
if ((Wait=5) and (FirstStart = 1)) or (Wait = 2) then
   isSig = 0
end if
Wait = 2
else
if isSig = 2 then
if ((Wait=5) and (FirstStart = 1)) or (Wait = 1) then
   isSig = 0
end if
Wait = 1
  else
end if
end if

if FlagPos = 1 then
Wait = 2
else
if FlagPos = 2 then
Wait = 1
end if
end if

                    StrPrms = SET_VALUE(StrPrms,"Wait",Wait)
                    Stock = SET_VALUE(Stock,"StrPrms",StrPrms)
                    
end if
end if
end if
end if
end if
end if
end if

' SAR
       if NoStr = 2 then

StrPrms = GET_VALUE(Stock,"StrPrms")
Wait = GET_VALUE(StrPrms,"Wait")+0
Mode = GET_VALUE(StrPrms,"Mode")+0

if ((FirstStart=1) and (Wait = 0)) or (Mode = 0) then    
EndInt = 1
end if 
       
       if EndInt = 1 then

Graphs = GET_VALUE(Stock,"Graphs")
if GET_COLLECTION_COUNT(Graphs) = 2 then

Graph = GET_COLLECTION_ITEM(Graphs,0)
if GET_VALUE(Graph,"Count")+0 > 1 then
CurPrice = GET_VALUE(Graph,"Cur")+0 
LasPrice1 = GET_VALUE(Graph,"Las1")+0 
LasPrice2 = GET_VALUE(Graph,"Las2")+0

Graph = GET_COLLECTION_ITEM(Graphs,1)
if GET_VALUE(Graph,"Count")+0 > 1 then
CurS = GET_VALUE(Graph,"Cur")+0 
LasS1 = GET_VALUE(Graph,"Las1")+0 
LasS2 = GET_VALUE(Graph,"Las2")+0

StrPrms = GET_VALUE(Stock,"StrPrms")
LastUp = GET_VALUE(StrPrms,"LastUp")+0
LastDown = GET_VALUE(StrPrms,"LastDown")+0
FCount = GET_VALUE(StrPrms,"FCount")+0  
ContrTrend = GET_VALUE(StrPrms,"ContrTrend")+0 

                    ' Модификация 1
                    if Mode = 0 then
                    if ContrTrend = 0 then
' Определяем Long signal
if (FlagPos <> 1) and (CurPrice > CurS) then
if UseLong = 1 then
isSig = 1
else
if FlagPos = 2 then
   isSig = 3
end if
Wait = 0
end if
end if

' Определяем Short signal
if (FlagPos <> 2) and (CurPrice < CurS) then
if UseShort = 1 then
isSig = 2
else 
if FlagPos = 1 then
   isSig = 3
end if
   Wait = 0
end if
end if
else
' Определяем Short signal
if (FlagPos <> 2) and (CurPrice > CurS) then
if UseShort = 1 then
isSig = 2
else
if FlagPos = 1 then
   isSig = 3
end if
Wait = 0
end if
end if

' Определяем Long signal
if (FlagPos <> 1) and (CurPrice < CurS) then
if UseLong = 1 then
isSig = 1
else 
if FlagPos = 2 then
   isSig = 3
end if
   Wait = 0
end if
end if  
end if

if isSig = 1 then
if ((Wait=5) and (FirstStart = 1)) or (Wait=2) then
   isSig = 0
end if
Wait = 2
else
if isSig = 2 then
if ((Wait=5) and (FirstStart = 1)) or (Wait=1) then
   isSig = 0
end if
Wait = 1
end if
end if
      
if FlagPos = 1 then
Wait = 2
else
if FlagPos = 2 then
Wait = 1
end if
end if

' message(isSig&" "&Wait&" "&CurPrice&" "&CurS,1)
      
  else

                    ' Модификация 2
                    if Mode = 1 then

                   ' Определяем значения посл. LastUp и LastDown 
if FirstStart = 1 then
if LasPrice1 > LasS1 then
LastDown = LasS1
else
   LastUp = LasS1
end if
if LasPrice2 > LasS2 then
if LastDown = 0 then
LastDown = LasS2 
end if
else
if LastUp = 0 then
       LastUp = LasS2
end if
end if

if (LastDown = 0) or (LastUp = 0) then
       PGraph = GET_COLLECTION_ITEM(Graphs,0)
       PGID = Get_Value(PGraph,"ID")
   PGCur = Get_Value(PGraph,"Curve")+0
PField = Get_Value(PGraph,"Field")     
       GCandleTime = Get_Value(PGraph,"LasTime2")
GCandleDate = Get_Value(PGraph,"LasDate2")                              
       SGraph = GET_COLLECTION_ITEM(Graphs,1)
       SGID = Get_Value(SGraph,"ID")
   SGCur = Get_Value(SGraph,"Curve")+0
SField = Get_Value(SGraph,"Field")     
       for j from 1 to FCount  
       GCandleTime = DECTime(GCandleTime,3,GInc)
if GCandleTime+0 < OpenSession+0 then
GCandleTime = CloseSession
GCandleDate = DECData(GCandleDate,3,1)
end if
       PG = GET_CANDLE_EX(PGID, GCandleDate, GCandleTime)
       SG = GET_CANDLE_EX(SGID, GCandleDate, GCandleTime) 
       
if (PG <> "") and (SG <> "") then
GL = Get_Collection_Item(Get_Value(PG, "LINES"), PGCur)
   P = Get_Value(GL, PField)+0
GL = Get_Collection_Item(Get_Value(SG, "LINES"), SGCur)
   S = Get_Value(GL, SField)+0
if P > S then
if LastDown = 0 then
LastDown = S 
end if
else
if LastUp = 0 then
       LastUp = S
end if
end if

       end if        

if (LastDown > 0) and (LastUp > 0) then
Break
end if
end for
end if
' message(LastUp&" "&LastDown,1)

else
if LasPrice1 > LasS1 then
LastDown = LasS1
else
   LastUp = LasS1
end if
end if

' Сама стратегия
if (LastUp > 0) and (LastDown > 0) then

                    if ContrTrend = 0 then
' Определяем Long signal
if (FlagPos <> 1) and (LasPrice1 > LastUp) and (CurPrice > CurS) then 
if UseLong = 1 then
isSig = 1
else
if FlagPos = 2 then
   isSig = 3
end if
Wait = 0
end if
end if

' Определяем Short signal
if (FlagPos <> 2) and (LasPrice1 < LastDown) and (CurPrice < CurS) then
if UseShort = 1 then
isSig = 2
else 
if FlagPos = 1 then
   isSig = 3
end if
   Wait = 0
end if
end if  
else
' Определяем Short signal
if (FlagPos <> 2) and (LasPrice1 > LastUp) and (CurPrice > CurS) then 
if UseShort = 1 then
isSig = 2
else
if FlagPos = 1 then
   isSig = 3
end if
Wait = 0
end if
end if

' Определяем Long signal
if (FlagPos <> 1) and (LasPrice1 < LastDown) and (CurPrice < CurS) then
if UseLong = 1 then
isSig = 1
else 
if FlagPos = 2 then
   isSig = 3
end if
   Wait = 0
end if
end if  
                            end if

if isSig = 1 then
if ((Wait=5) and (FirstStart = 1)) or (Wait=2) then
   isSig = 0
end if
Wait = 2
else
if isSig = 2 then
if ((Wait=5) and (FirstStart = 1)) or (Wait=1) then
   isSig = 0
end if
Wait = 1
end if
end if

if FlagPos = 1 then
Wait = 2
else
if FlagPos = 2 then
Wait = 1
end if
end if

end if

             
                    end if
                    end if

                    StrPrms = SET_VALUE(StrPrms,"LastUp",LastUp)
                    StrPrms = SET_VALUE(StrPrms,"LastDown",LastDown)
                    StrPrms = SET_VALUE(StrPrms,"Wait",Wait)
                    Stock = SET_VALUE(Stock,"StrPrms",StrPrms)
                    
end if
end if
end if
end if
end if

' Message(isLong&" "&isShort,1)
'        Stock = GET_COLLECTION_ITEM(CStocks,0)
' Graphs = GET_VALUE(Stock,"Graphs")  
'    Graph = GET_COLLECTION_ITEM(Graphs,0)
' S = GET_VALUE(Graph,"CurTime")&" "&GET_VALUE(Graph,"Cur")
' S = S&" "&GET_VALUE(Graph,"LasTime1")&" "&GET_VALUE(Graph,"Las1")
' S = S&" "&GET_VALUE(Graph,"LasTime2")&" "&GET_VALUE(Graph,"Las2")

end if

        ' Исполнение сигналов
        SignFlag  = GET_VALUE(Stock,"SignFlag")+0 
        if SignFlag <> 0 then
          isSig = SignFlag 
        end if

        if isSig <> 0 then
'        message(isSig,1)
        
' Long & Reverse
       if (isSig = 1) and (FlagPos <> 1) then
if (FlagPos = 2) then
             ' short position
 if UseLong = 1 then 
' Reverse short
Qty = SumTrade+ABS(Ost)
Message("Close Short >> Open Long "&TradeTime,1)
FlagPos = 1
 end if
  else
         ' cash position
     if UseLong = 1 then
Qty = SumTrade
Message("Open Long "&TradeTime,1)
FlagPos = 1
 else
Qty = 0
 end if
end if

           ' Send tranz
if Qty > 0 then 
       TypeTrans = GET_VALUE(Stock,"TypeTrans")
       Spred = GET_VALUE(Stock,"Spred")+0
       TypeSpred = GET_VALUE(Stock,"TypeSpred")+0
       if TypeSpred = 0 then
BPrice = Offer+Spred 
else
BPrice = Offer+(Spred*Offer/100) 
       end if
BPrice = Apply_Scale(BPrice,GET_VALUE(Stock,"Scale")+0)+0

ZStop = GetZTranz(Account,ClassCode,SecCode)+0

   if (ZStop = 0) and ( ((AcceptOst = Ost) and (Pl = 0)) or ((Pl = 1) and (AcceptOst = 0)) ) then
' if UseLab = 1 then
'        SetLabel("B", TradeDate, TradeTime, GPrice_id, Price_OFFER, TradeTime&LabText, LabText)
' end if                                                                +st
        Rez = Send_Trans(CliCode, Account, ClassCode, SecCode, "B", BPrice, Qty, TypeTrans, "1001")+0
        if Rez = 1 then
NoOrder = get_value(trans_result, "ORDER_NUMBER")+0
Stock = SET_VALUE(Stock,"NoOrder",NoOrder)  
        end if
Stock = SET_VALUE(Stock,"SendFlag",1)  
Stock = SET_VALUE(Stock,"SignFlag",0)  
  else
   KillAllStopTranz(Account,SecCode,0)    
   KillAllTranz(Account,SecCode,"")
Stock = SET_VALUE(Stock,"SignFlag",isSig)  
        end if
end if  
end if                 
        
' Short & Reverse
if (isSig = 2) and (FlagPos <> 2) then
if (FlagPos = 1) then
      ' long position
 if UseShort = 1 then 
' Reverse long
Qty = SumTrade+ABS(Ost)
Message("Close Long >> Open Short "&TradeTime,1)
FlagPos = 2
 end if
  else
        ' cash position
     if UseShort = 1 then
Qty = SumTrade
Message("Open Short "&TradeTime,1)
FlagPos = 2
 else
Qty = 0
 end if
end if

           ' Send tranz
if Qty > 0 then 
       TypeTrans = GET_VALUE(Stock,"TypeTrans")
       Spred = GET_VALUE(Stock,"Spred")+0
       TypeSpred = GET_VALUE(Stock,"TypeSpred")+0
       if TypeSpred = 0 then
BPrice = Bid-Spred 
else
BPrice = Bid-(Spred*Bid/100) 
       end if
BPrice = Apply_Scale(BPrice,GET_VALUE(Stock,"Scale")+0)+0

ZStop = GetZTranz(Account,ClassCode,SecCode)+0

   if (ZStop = 0) and ( ((AcceptOst = Ost) and (Pl = 0)) or ((AcceptOst = 0) and (Pl =1)) ) then
' if UseLab = 1 then
'        SetLabel("S", TradeDate, TradeTime, GPrice_id, Price_BID, TradeTime&LabText, LabText)
' end if
        Rez = Send_Trans(CliCode, Account, ClassCode, SecCode, "S", BPrice, Qty, TypeTrans, "1002")+0
        if Rez = 1 then
NoOrder = get_value(trans_result, "ORDER_NUMBER")+0
Stock = SET_VALUE(Stock,"NoOrder",NoOrder)  
        end if
Stock = SET_VALUE(Stock,"SendFlag",1)  
Stock = SET_VALUE(Stock,"SignFlag",0)  
    else
   KillAllStopTranz(Account,SecCode,0)    
   KillAllTranz(Account,SecCode,"")    
Stock = SET_VALUE(Stock,"SignFlag",isSig)  
    end if
end if  
end if            
        
        if isSig = 3 then
        if FlagPos = 1 then
Qty = ABS(Ost)
Message("Close Long "&TradeTime,1)
FlagPos = 0
           ' Send tranz
if Qty > 0 then 
       TypeTrans = GET_VALUE(Stock,"TypeTrans")
       Spred = GET_VALUE(Stock,"Spred")+0
       TypeSpred = GET_VALUE(Stock,"TypeSpred")+0
       if TypeSpred = 0 then
BPrice = Bid-Spred 
else
BPrice = Bid-(Spred*Bid/100) 
       end if
BPrice = Apply_Scale(BPrice,GET_VALUE(Stock,"Scale")+0)+0

ZStop = GetZTranz(Account,ClassCode,SecCode)+0

   if (ZStop = 0) and ( ((AcceptOst = Ost) and (Pl = 0)) or ((AcceptOst = 0) and (Pl =1)) ) then
' if UseLab = 1 then
'        SetLabel("S", TradeDate, TradeTime, GPrice_id, Price_BID, TradeTime&LabText, LabText)
' end if
        Rez = Send_Trans(CliCode, Account, ClassCode, SecCode, "S", BPrice, Qty, TypeTrans, "1002")+0
        if Rez = 1 then
NoOrder = get_value(trans_result, "ORDER_NUMBER")+0
Stock = SET_VALUE(Stock,"NoOrder",NoOrder)  
        end if
Stock = SET_VALUE(Stock,"SendFlag",1)  
Stock = SET_VALUE(Stock,"SignFlag",0)  

    else
   KillAllStopTranz(Account,SecCode,0)    
   KillAllTranz(Account,SecCode,"")    
Stock = SET_VALUE(Stock,"SignFlag",isSig)  
    end if
end if
        end if
        if FlagPos = 2 then
Qty = ABS(Ost)
Message("Close Short "&TradeTime,1)
FlagPos = 0            
           ' Send tranz
if Qty > 0 then 
       TypeTrans = GET_VALUE(Stock,"TypeTrans")
       Spred = GET_VALUE(Stock,"Spred")+0
       TypeSpred = GET_VALUE(Stock,"TypeSpred")+0
       if TypeSpred = 0 then
BPrice = Offer-Spred 
else
BPrice = Offer-(Spred*Offer/100) 
       end if
BPrice = Apply_Scale(BPrice,GET_VALUE(Stock,"Scale")+0)+0

ZStop = GetZTranz(Account,ClassCode,SecCode)+0

   if (ZStop = 0) and ( ((AcceptOst = Ost) and (Pl = 0)) or ((Pl = 1) and (AcceptOst = 0)) ) then
' if UseLab = 1 then
'        SetLabel("B", TradeDate, TradeTime, GPrice_id, Price_OFFER, TradeTime&LabText, LabText)
' end if                                                                +st
        Rez = Send_Trans(CliCode, Account, ClassCode, SecCode, "B", BPrice, Qty, TypeTrans, "1001")+0
        if Rez = 1 then
NoOrder = get_value(trans_result, "ORDER_NUMBER")+0
Stock = SET_VALUE(Stock,"NoOrder",NoOrder)  
        end if
Stock = SET_VALUE(Stock,"SendFlag",1)  
Stock = SET_VALUE(Stock,"SignFlag",0)  
  else
   KillAllStopTranz(Account,SecCode,0)    
   KillAllTranz(Account,SecCode,"")
Stock = SET_VALUE(Stock,"SignFlag",isSig)  
        end if
end if              
        end if
        end if
        
end if ' in Session

Stock = SET_VALUE(Stock,"EndInt",0)
CStocks = SET_COLLECTION_ITEM(CStocks,i,Stock)

end for
end if

END FUNC

' Функция чтения значений графиков
FUNC ReadGraphs()

if GET_COLLECTION_COUNT(CStocks) > 0 then
for i from 0 to GET_COLLECTION_COUNT(CStocks)-1  
Stock = GET_COLLECTION_ITEM(CStocks,i)
GInc = Get_Value(Stock,"GInc")+0
GInt = Get_Value(Stock,"GInt")+0
Graphs = GET_VALUE(Stock,"Graphs")  

for GIndex from 0 to GET_COLLECTION_COUNT(Graphs)-1
GInfo = GET_COLLECTION_ITEM(Graphs, GIndex)
GID = Get_Value(GInfo,"ID")
GGraph = GET_CANDLE_EX(GID, TradeDate, TradeTime)
if GGraph <> "" then
   GCur = Get_Value(GInfo,"Curve")+0
GL = Get_Collection_Item(Get_Value(GGraph, "LINES"), GCur)
gsField = Get_Value(GInfo,"Field")     
   GV = Get_Value(GL, gsField)
GInfo = SET_VALUE(GInfo, "CurTime", TradeTime)
GInfo = SET_VALUE(GInfo, "CurDate", TradeDate)
GInfo = SET_VALUE(GInfo, "Cur", GV)

if GInt < 14 then
   GCandleTime = Get_Value(GGraph,"TIME")
   LastCandleTime = Get_Value(Stock,"LastCandleTime")+0 
if LastCandleTime = 0 then
LastCandleTime = GCandleTime
end if
           ' Обработка
if (LastCandleTime+0 <> GCandleTime+0) then

GGraph = GET_CANDLE_EX(GID, TradeDate, LastCandleTime)
GL = Get_Collection_Item(Get_Value(GGraph, "LINES"), GCur)
   GV = Get_Value(GL, gsField)       
GInfo = SET_VALUE(GInfo, "Las2", Get_Value(GInfo,"Las1"))
GInfo = SET_VALUE(GInfo, "LasDate2", Get_Value(GInfo,"LasDate1"))
GInfo = SET_VALUE(GInfo, "LasTime2", Get_Value(GInfo,"LasTime1"))
GInfo = SET_VALUE(GInfo, "Las1", GV)
GInfo = SET_VALUE(GInfo, "LasDate1", TradeDate)
GInfo = SET_VALUE(GInfo, "LasTime1", LastCandleTime)
GInfo = SET_VALUE(GInfo, "Count", Get_Value(GInfo,"Count")+1)
Stock = Set_Value(Stock,"EndInt",1)

end if
    else
    ' days
'        GCandleTime = TradeDate

end if 

' Сохраняемся

Graphs = SET_COLLECTION_ITEM(Graphs,GIndex,GInfo)
 
end if
    end for

if GGraph <> "" then
Stock = Set_Value(Stock,"LastCandleTime",GCandleTime)
end if

Stock = SET_VALUE(Stock,"Graphs",Graphs)
CStocks = SET_COLLECTION_ITEM(CStocks,i,Stock)

    end for
end if
END FUNC

FUNC RepView()
if GET_COLLECTION_COUNT(CStocks) > 0 then
for i from 0 to GET_COLLECTION_COUNT(CStocks)-1  
string = ""
Stock = GET_COLLECTION_ITEM(CStocks,i)
Cs = GET_VALUE(Stock,"ClassCode") 
Sc = GET_VALUE(Stock,"SecCode")
Nm = GET_VALUE(Stock,"NAME")&" ("&GET_VALUE(Stock,"StrName")&")"
Scale = GET_VALUE(Stock,"Scale")+0
Ost = GET_VALUE(Stock,"Ost")+0  
CurPrice = APPLY_SCALE(GET_VALUE(Stock,"CurPrice")+0,Scale)+0
SrvPrice = APPLY_SCALE(GET_VALUE(Stock,"SrvPrice")+0,Scale)+0

if SrvPrice > 0 then
if Ost > 0 then
string = set_value(string, "FPos", "Long")
bid = GET_VALUE(Stock,"Bid")+0 
IzmP = (Ost*bid)/(Ost*SrvPrice)*100-100
IzmR = (Ost*bid)-(Ost*SrvPrice)
else
if Ost < 0 then
offer = GET_VALUE(Stock,"Offer")+0 
IzmP = (Ost*offer)/(Ost*SrvPrice)*100-100
IzmR = (Ost*offer)-(Ost*SrvPrice)
string = set_value(string, "FPos", "Short")
end if
end if
else
string = set_value(string, "FPos", "Cash")
   IzmP = 0
   IzmR = 0
end if
  string = set_value(string, "FStock", Nm)
string = set_value(string, "FCurPrice", CurPrice)
if Ost > 0 then
string = set_value(string, "FPos", "Long")
else
if Ost < 0 then
string = set_value(string, "FPos", "Short")
else
string = set_value(string, "FPos", "Cash")
end if
end if
string = set_value(string, "FTranzPrice", SrvPrice)
string = set_value(string, "FLots", Ost)
string = set_value(string, "FTrv", Ost*CurPrice)
string = set_value(string, "FChaCash", IzmR)
string = set_value(string, "FChaPer", IzmP)
modify_item(i+1, string)
if IzmR > 0 then
SET_ROW_COLOR_EX (i+1, "RGB(178,246,160)", "RGB(123,239,91)", "RGB(0,0,0)", "RGB(0,0,0)")
else
if IzmR < 0 then
SET_ROW_COLOR_EX (i+1, "RGB(253,185,185)", "RGB(255,139,139)", "RGB(0,0,0)", "RGB(0,0,0)")
else
SET_ROW_COLOR_EX (i+1, "DEFAULT_COLOR", "DEFAULT_COLOR", "DEFAULT_COLOR", "DEFAULT_COLOR")
end if
end if

end for
end if

END FUNC

FUNC NewView()
DELETE_ALL_ITEMS()
if GET_COLLECTION_COUNT(CStocks) > 0 then
for i from 0 to GET_COLLECTION_COUNT(CStocks)-1  
string = ""
Stock = GET_COLLECTION_ITEM(CStocks,i)
Cs = GET_VALUE(Stock,"ClassCode") 
Sc = GET_VALUE(Stock,"SecCode")
Nm = GET_VALUE(Stock,"NAME")
Scale = GET_VALUE(Stock,"Scale")+0
Ost = GET_VALUE(Stock,"Ost")+0  
CurPrice = APPLY_SCALE(GET_VALUE(Stock,"CurPrice")+0,Scale)+0
SrvPrice = APPLY_SCALE(GET_VALUE(Stock,"SrvPrice")+0,Scale)+0

if SrvPrice > 0 then
if Ost > 0 then
string = set_value(string, "FPos", "Long")
bid = GET_VALUE(Stock,"Bid")+0 
IzmP = (Ost*bid)/(Ost*SrvPrice)*100-100
IzmR = (Ost*bid)-(Ost*SrvPrice)
else
if Ost < 0 then
offer = GET_VALUE(Stock,"Offer")+0 
IzmP = (Ost*offer)/(Ost*SrvPrice)*100-100
IzmR = (Ost*offer)-(Ost*SrvPrice)
string = set_value(string, "FPos", "Short")
end if
end if
else
string = set_value(string, "FPos", "Cash")
   IzmP = 0
   IzmR = 0
end if
  string = set_value(string, "FStock", Nm)
string = set_value(string, "FCurPrice", CurPrice)
string = set_value(string, "FTranzPrice", SrvPrice)
string = set_value(string, "FLots", Ost)
string = set_value(string, "FTrv", Ost*CurPrice)
string = set_value(string, "FChaCash", IzmR)
string = set_value(string, "FChaPer", IzmP)
add_item(i+1, string)
if IzmR > 0 then
SET_ROW_COLOR_EX (i+1, "RGB(178,246,160)", "RGB(123,239,91)", "RGB(0,0,0)", "RGB(0,0,0)")
else
if IzmR < 0 then
SET_ROW_COLOR_EX (i+1, "RGB(253,185,185)", "RGB(255,139,139)", "RGB(0,0,0)", "RGB(0,0,0)")
else
SET_ROW_COLOR_EX (i+1, "DEFAULT_COLOR", "DEFAULT_COLOR", "DEFAULT_COLOR", "DEFAULT_COLOR")
end if
end if
end for
end if

END FUNC

FUNC GetKomiss(aVol, aType, aK, ct)
    Result = 0
    if (aVol = 0) or (aK = 0) then 
Return
end if
    if aType = 0 then 
Result = aK*100/aVol
else
if aType = 1 then 
Result = aK*ct
end if
end if
END FUNC

FUNC CalcSrvPrice()

'if LastTradeCount = GET_NUMBER_OF("TRADES")+0
' Result = 0
' Return
'end if

TradesCount = GET_NUMBER_OF("TRADES")+0
LastTradeCount = TradesCount
                                          
if GET_COLLECTION_COUNT(CStocks) > 0 then
for i from 0 to GET_COLLECTION_COUNT(CStocks)-1   
Stock = GET_COLLECTION_ITEM(CStocks,i)
Cs = GET_VALUE(Stock,"ClassCode") 
Sc = GET_VALUE(Stock,"SecCode")
Ac = GET_VALUE(Stock,"Account")  
        Ost = GET_VALUE(Stock,"Ost")+0 
Pl = GET_VALUE(Stock,"PlatForm")+0
ClosePrice = GET_VALUE(Stock,"ClosePrice")+0 
'        inOst = GET_VALUE(Stock,"InOst")+0 
' STStep = GET_VALUE(Stock,"STStepP")+0 
' StepPrice = GET_VALUE(Stock,"StepP")+0
' KB = GET_VALUE(Stock,"KB")+0 
' SelKB = GET_VALUE(Stock,"SelKB")+0 
' KTS = GET_VALUE(Stock,"KTS")+0 
' SelKTS = GET_VALUE(Stock,"SelKTS")+0 

sPos = ABS(Ost)
bVol = 0
bQty = 0
   izmR = 0
   izmP = 0
   SrvPrice = 0

' new >>

ind = TradesCount
if (TradesCount > 0) and (Ost <> 0) then
for t from 1 to TradesCount

tSTR = GET_ITEM("TRADES", ind)
tAcc = Get_Value(tSTR, "ACCOUNT")  
tClass = Get_Value(tSTR, "CLASSCODE")
tSec = Get_Value(tSTR, "SECCODE")  
tOper = Get_Value(tSTR, "OPERATION")  

if (tAcc = Ac) and (tClass = Cs) and (tSec = Sc) then

Qty = Get_Value(tSTR, "QUANTITY")+0
Vol = Get_Value(tSTR, "VALUE")+0
Price = Get_Value(tSTR, "PRICE")+0                          

if Ost > 0 then
if tOper = "BUY" then
if Qty <= sPos then
bVol = bVol + Vol
bQty = bQty + Qty
sPos = sPos - Qty
else
bVol = bVol + (sPos*Price)
bQty = bQty + sPos
sPos = 0 
end if 
end if
else
if tOper <> "BUY" then
if Qty <= sPos then
bVol = bVol + Vol
bQty = bQty + Qty
sPos = sPos - Qty
else
bVol = bVol + (sPos*Price)
bQty = bQty + sPos
sPos = 0 
end if 
end if
                end if

if sPos = 0 then
SrvPrice = bVol/bQty
Break
end if

end if

ind = ind - 1
end for
end if

' << new

if (Ost <> 0) and (SrvPrice = 0) and (ClosePrice > 0) then
  SrvPrice = ClosePrice
end if 

' message(SrvPrice,1)

Stock = SET_VALUE(Stock,"SrvPrice",SrvPrice) 
Stock = SET_VALUE(Stock,"AllIzmR",izmR) 
Stock = SET_VALUE(Stock,"AllIzmP",izmP) 
CStocks = SET_COLLECTION_ITEM(CStocks,i,Stock)

end for
end if
Result = 0
END FUNC

FUNC ReadPrms()
if GET_COLLECTION_COUNT(CStocks) > 0 then
for i from 0 to GET_COLLECTION_COUNT(CStocks)-1   
Stock = GET_COLLECTION_ITEM(CStocks,i)
Cs = GET_VALUE(Stock,"ClassCode") 
Sc = GET_VALUE(Stock,"SecCode") 
        tmp = GetNumTTP(Cs,Sc,"last")
if tmp+0 = 0 then
WriteMsgLog(1,15,1,1,"Недоступен параметр: 'Цена посл. сделки' по бумаге: "&Sc)
Result = -1
Return
end if
Stock=SET_VALUE(Stock, "CurPrice", tmp)

        tmp = GetNumTTP(Cs,Sc,"BID")
if tmp+0 = 0 then
WriteMsgLog(1,16,1,1,"Недоступен параметр: 'Лучшая цена спроса' по бумаге: "&Sc)
Result = -2
Return
end if
Stock=SET_VALUE(Stock, "Bid", tmp)

        tmp = GetNumTTP(Cs,Sc,"OFFER")
if tmp+0 = 0 then
WriteMsgLog(1,17,1,1,"Недоступен параметр: 'Лучшая цена предложения' по бумаге: "&Sc)
Result = -3
Return
end if
Stock=SET_VALUE(Stock, "Offer", tmp)

tmp = GET_PARAM_EX(Cs, Sc, "SEC_SCALE")
if GET_VALUE(tmp, "RESULT")+0 = 0 then
WriteMsgLog(1,18,1,1,"Недоступен параметр: 'Точность' по бумаге: "&Sc)
Result = -4
Return
end if 
FStockScale = GET_VALUE(tmp, "PARAM_VALUE")+0
Stock=SET_VALUE(Stock, "Scale", FStockScale)

Pl = GET_VALUE(Stock,"PlatForm")+0
Ac = GET_VALUE(Stock,"Account")
if Pl = 0 then 
tmp = GeDepoLimitPrm(Ac, Sc, "CURRENT_BALANCE")+0
Stock=SET_VALUE(Stock, "Ost", tmp+0)

tmp = GeDepoLimitPrm(Ac, Sc, "AVAILABLE")+0
Stock=SET_VALUE(Stock, "AcceptOst", tmp+0)

tmp = GeDepoLimitPrm(Ac, Sc, "OPEN_BALANCE")+0
Stock=SET_VALUE(Stock, "InOst", tmp+0)


tmp = GetNumTTP(Cs,Sc,"PREVPRICE")+0
if tmp = 0 then
' WriteMsgLog(1,23,0,1,"Недоступен параметр: 'Цена закрытия' по бумаге: "&Sc&". Позиция будет оцениваться по цене открытия")
Result = -10
tmp = GetNumTTP(Cs,Sc,"OPEN")+0
if tmp = 0 then
WriteMsgLog(1,24,1,1,"Недоступен параметр: 'Цена открытия' по бумаге: "&Sc)
Result = -11
Return
end if
' WriteMsgLog(1,25,1,1,"Отсутствует параметр 'Цена закрытия' по бумаге: "&Sc&". Позиция будет оцениваться по цене открытия")
end if
Stock=SET_VALUE(Stock, "ClosePrice", tmp)

' tmp = GET_PARAM_EX(Cs, Sc, "STARTTIME")
' Stock=SET_VALUE(Stock, "OpenSession", GET_VALUE(tmp, "PARAM_VALUE")+0)
' tmp = GET_PARAM_EX(Cs, Sc, "ENDTIME")
' Stock=SET_VALUE(Stock, "CloseSession", GET_VALUE(tmp, "PARAM_VALUE")+0)

else
tmp = GeDepoPosPrm(Ac, Sc, "TOTAL_NET")
Stock=SET_VALUE(Stock, "Ost", tmp+0)

tmp = GeDepoPosPrm(Ac, Sc, "START_NET")
Stock=SET_VALUE(Stock, "InOst", tmp+0)

tmp = GetNumTTP(Cs,Sc,"PREVPRICE")+0
if tmp = 0 then
' WriteMsgLog(1,23,0,1,"Недоступен параметр: 'Цена закрытия' по бумаге: "&Sc)
Result = -10
tmp = GetNumTTP(Cs,Sc,"OPEN")+0
if tmp = 0 then
WriteMsgLog(1,24,1,1,"Недоступен параметр: 'Цена открытия' по бумаге: "&Sc)
Result = -11
Return
end if
' WriteMsgLog(1,25,1,1,"Отсутствует параметр 'Цена закрытия' по бумаге: "&Sc&". Позиция будет оцениваться по цене открытия")
end if
Stock=SET_VALUE(Stock, "ClosePrice", tmp)

  tmp = GET_PARAM_EX(Cs, Sc, "SEC_PRICE_STEP")
if GET_VALUE(tmp, "RESULT")+0 = 0 then
WriteMsgLog(1,25,1,1,"Недоступен параметр: 'Шаг цены' по бумаге: "&Sc)
Result = -12
Return
end if 
Stock=SET_VALUE(Stock, "StepP", GET_VALUE(tmp, "PARAM_VALUE")+0)

  tmp = GET_PARAM_EX(Cs, Sc, "STEPPRICET")
if GET_VALUE(tmp, "RESULT")+0 = 0 then
WriteMsgLog(1,26,1,1,"Недоступен параметр: 'Стоимость шага цены' по бумаге: "&Sc)
Result = -13
Return
end if 
Stock=SET_VALUE(Stock, "STStepP", GET_VALUE(tmp, "PARAM_VALUE")+0)

  tmp = GET_PARAM_EX(Cs, Sc, "STARTTIME")
Stock=SET_VALUE(Stock, "OpenSession", GET_VALUE(tmp, "PARAM_VALUE")+0)
  tmp = GET_PARAM_EX(Cs, Sc, "ENDTIME")
Stock=SET_VALUE(Stock, "CloseSession", GET_VALUE(tmp, "PARAM_VALUE")+0)
  tmp = GET_PARAM_EX(Cs, Sc, "MONSTARTTIME")
Stock=SET_VALUE(Stock, "OpenMon", GET_VALUE(tmp, "PARAM_VALUE")+0)
  tmp = GET_PARAM_EX(Cs, Sc, "MONENDTIME")
Stock=SET_VALUE(Stock, "CloseMon", GET_VALUE(tmp, "PARAM_VALUE")+0)
  tmp = GET_PARAM_EX(Cs, Sc, "EVNSTARTTIME")
Stock=SET_VALUE(Stock, "OpenEve", GET_VALUE(tmp, "PARAM_VALUE")+0)
  tmp = GET_PARAM_EX(Cs, Sc, "EVNENDTIME")
Stock=SET_VALUE(Stock, "CloseEve", GET_VALUE(tmp, "PARAM_VALUE")+0)

' W!
tmp = GeDepoPosPrm(Ac, Sc, "OPEN_BUYS")+GeDepoPosPrm(Ac, Sc, "OPEN_SELLS")+0
Stock=SET_VALUE(Stock, "AcceptOst", tmp)
end if
' message(tmp,1)
 
CStocks = SET_COLLECTION_ITEM(CStocks,i,Stock)
end for

end if 

Result = 0
END FUNC

' Функция возвращает параметр тиблицы позиций по клиентским счетам  
FUNC GeDepoPosPrm(AAcc, ACd, APrm)

Result = ""
gcCount = GET_NUMBER_OF("FUTURES_CLIENT_HOLDINGS")+0
if gcCount > 0 then
for gcI from 1 to gcCount
gcSTR = GET_ITEM("FUTURES_CLIENT_HOLDINGS", gcI)
gcAcc = Get_Value(gcSTR, "TRDACCID")
gcCd = Get_Value(gcSTR, "SECCODE")
gcCL = Get_Value(gcSTR, APrm)
if (gcCL <> "") and (AAcc = gcAcc) and (ACd = gcCd) then
Result = gcCL
Return
end if
end for
else
Result = "Nil"
end if

END FUNC

' Функция возвращает параметр тиблицы лимитов по бумагам  
FUNC GeDepoLimitPrm(AAcc, ACd, APrm)

Result = ""
gcCount = GET_NUMBER_OF("DEPO_LIMITS")+0
if gcCount > 0 then
for gcI from 1 to gcCount
gcSTR = GET_ITEM("DEPO_LIMITS", gcI)
gcAcc = Get_Value(gcSTR, "TRDACCID")
gcCd = Get_Value(gcSTR, "SECCODE")
gcCL = Get_Value(gcSTR, APrm)
if (gcCL <> "") and (AAcc = gcAcc) and (ACd = gcCd) then
Result = gcCL
Return
end if
end for
else
Result = "Nil"
end if

END FUNC 

FUNC CheckStocks()
if GET_COLLECTION_COUNT(CStocks) > 0 then
for i from 0 to GET_COLLECTION_COUNT(CStocks)-1   
Stock = GET_COLLECTION_ITEM(CStocks,i)
Cs = GET_VALUE(Stock,"ClassCode") 
tmp = GET_CLASS_SECURITIES(Cs)
if tmp = "" then
WriteMsgLog(1,4,1,1,"Не найден код класса: "&Cs)
Result = -1
Return
end if
Sc = GET_VALUE(Stock,"SecCode") 
tmp = GET_SECURITY_INFO(Cs,Sc)
if tmp = "" then
WriteMsgLog(1,5,1,1,"Не найден код бумаги: "&Sc)
Result = -2
Return
end if
Stock=SET_VALUE(Stock, "NAME", GET_VALUE(tmp,"SHORT_NAME"))

        tmp = GetNumTTP(Cs,Sc,"prevdate")

        ' >>DEL
'        tmp = "20101207"
'        LastTradeDate = "20101207" 
        LastTradeDate = tmp 
if tmp+0 <= 0 then
       tmp = GetNumTTP("EQBR","SBER03","prevdate")
       LastTradeDate = tmp 
if tmp+0 <= 0 then
WriteMsgLog(1,6,1,1,"Недоступен параметр: 'Дата предыдущего торгового дня' по бумаге: "&Sc)
Result = -3
Return
end if
end if
Stock=SET_VALUE(Stock, "LastTradeDate", tmp)

        Pl = GET_VALUE(Stock,"PlatForm")+0

        if Pl = 0 then
       tmp = GetNumTTP(Cs,Sc,"TIME")
else
tmp = GetNumTTP(Cs,Sc,"CHANGETIME")                   
end if
if tmp+0 <= 0 then
WriteMsgLog(1,7,1,1,"Недоступен параметр: 'Время посл. сделки' по бумаге: "&Sc)
Result = -4
Return
end if
Stock=SET_VALUE(Stock, "LastTime", tmp)
CStocks = SET_COLLECTION_ITEM(CStocks,i,Stock)

end for

end if 

Result = 0
END FUNC

' Функция инициализации строковых сообщений
'>> InitMsg
FUNC InitMsg()
MsgStatus = CREATE_COLLECTION()
MsgStatus = INSERT_COLLECTION_ITEM(MsgStatus,0,"TM: Соединение с сервером установлено")
MsgStatus = INSERT_COLLECTION_ITEM(MsgStatus,1,"TM: Отсутствует соединение с сервером")
MsgStatus = INSERT_COLLECTION_ITEM(MsgStatus,2,"TM: Все параметры определены. Режим торговли")
END FUNC

' Функция вывода информации в диалоговое окно и в лог файл   
FUNC WriteMsgLog(MsgType, MsgNo, MsgView, WLog, Msg)

if (MsgNo = 12) then
errorCount = errorCount + 1
end if

if (MsgNo = 12) and (errorCount < 5) then
Return
end if
if (MsgNo = 40) and (errorCount < 5) and (errorCount > 0) then
  errorCount = 0
Return
end if

' message(MsgNo&" "&LastStatus&" "&errorCount,1)

    errorCount = 0
                   
          
' Вывод сообщений   
  if (LastStatus <> MsgNo) then
   S = MsgType&"|"&MsgNo&"|"&GET_VALUE(GET_DATETIME(),"DATETIME")&"|TM: "&Msg
if MsgView = 1 then
   Message(Msg,1)
end if
   if (UseLog = 1) and (WLog = 1) then
   WRITELN(FileNmLog,S)
   end if
LastStatus = MsgNo 
    end if   
 
END FUNC

'===========================
'Функция возвращает значение параметра из таблицы текущих параметров по заданному инструменту 
FUNC GetNumTTP(AClass, ACode, Prm)
'FN = GetNumTTP(Код класса, Код бумаги, Параметр)

PrmZ = GET_PARAM_EX(AClass, ACode, Prm)
PrmEr = Get_Value(PrmZ, "RESULT")+0
if PrmEr = 1 then
Result = Get_Value(PrmZ, "PARAM_VALUE")+0
else
   Result = -1
end if

END FUNC

' Получение торговой даты  
FUNC GetTD()
gtd = GET_INFO_PARAM("TRADEDATE")
if Len(gtd) = 10 then
Result = SUBSTR(gtd,6,4)&SUBSTR(gtd,3,2)&SUBSTR(gtd,0,2)  
else
   Result = ""
end if
END FUNC


' Проверка наличия необходимых графиков
FUNC CheckGraphsInt()

if GET_COLLECTION_COUNT(CStocks) > 0 then

for i from 0 to GET_COLLECTION_COUNT(CStocks)-1
Stock = GET_COLLECTION_ITEM(CStocks,i)
Graphs = GET_VALUE(Stock,"Graphs")  
        if GET_COLLECTION_COUNT(Graphs)+0 = 0 then
WriteMsgLog(1,10,1,1,"Не найдена коллекция графиков по бумаге: "&GET_VALUE(Stock,"SecCode"))
        Result = -1
        Return
        end if

        GInc = Get_Value(Stock,"GInc")+0
        GInt = Get_Value(Stock,"GInt")+0
tmpTime1 = GET_VALUE(Stock,"LastTime")
tmpTrade = TradeDate 

FC = 0
        for j from 0 to GET_COLLECTION_COUNT(Graphs)-1  
       Graph = GET_COLLECTION_ITEM(Graphs,j)
Graph = Set_Value(Graph,"Status",0)
Graphs = SET_COLLECTION_ITEM(Graphs,j,Graph)
end for
for C from 1 to FindCaldleCount
        for j from 0 to GET_COLLECTION_COUNT(Graphs)-1  
       Graph = GET_COLLECTION_ITEM(Graphs,j)
       GID = Get_Value(Graph,"ID")
GGraph = GET_CANDLE_EX(GID, tmpTrade, tmpTime1)

if GGraph <> "" then

' Читаем время первой свечки
tmpTime1 = Get_Value(GGraph,"TIME")
FD = 0
' Ищем значение второй свечи
for k from 1 to FindCaldleCount

tmpTime2 = DECTime(tmpTime1,3,GInc)
if (tmpTime2+0 < GET_VALUE(Stock,"OpenSession")+0) then 
tmpTime2 = GET_VALUE(Stock,"CloseSession")
tmpTrade = LastTradeDate
end if
GGraph = GET_CANDLE_EX(GID, tmpTrade, tmpTime2)
if GGraph <> "" then
FD = 1
tmpTime2 = Get_Value(GGraph,"TIME")
tmpTime3 = DECTime(tmpTime1,3,CEIL(GInc/2))
GGraph = GET_CANDLE_EX(GID, tmpTrade, tmpTime3)
if GGraph <> "" then
tmpTime3 = Get_Value(GGraph,"TIME")
if ((tmpTime3+0 = tmpTime1+0) or (tmpTime3+0 = tmpTime2+0)) and (tmpTime1+0 <> tmpTime2+0) then
RazTime = GetRazTimeSec(tmpTime1,tmpTime2)
if RazTime+0 = GInc+0 then  
FC = FC + 1
Graph = Set_Value(Graph,"Status",1)
Graphs = SET_COLLECTION_ITEM(Graphs,j,Graph)
end if
end if
end if
           end if
           if FD = 1 then
            Break
            end if 
           end for

end if

end for ' for j

if FC = GET_COLLECTION_COUNT(Graphs)+0 then
' Период найден
Break
else
FC = 0
' Не найден
tmpTime1 = DECTime(tmpTime1,3,GInc)
if (tmpTime1+0 < GET_VALUE(Stock,"OpenSession")+0) then
tmpTime1 = GET_VALUE(Stock,"CloseSession")
tmpTrade = LastTradeDate
end if
end if

end for ' for C

if FC = 0 then
for k from 0 to GET_COLLECTION_COUNT(Graphs)-1
Graph = GET_COLLECTION_ITEM(Graphs,k)
Status = Get_Value(Graph,"Status")+0
if Status = 0 then  
WriteMsgLog(1,13,1,1,"Период графиков по бумаге с кодом '"&GET_VALUE(Stock,"SecCode")&"' не соответствует заданному")
        Result = -2
        end if
end for
        Result = -2
        Return
end if


end for

end if

Result = 0

END FUNC

' Функция чтения пропущенных свечей
FUNC GetLastCandle()
result = 0

if GET_COLLECTION_COUNT(CStocks) > 0 then
' Ищем значение первой свечи
for i from 0 to GET_COLLECTION_COUNT(CStocks)-1
Stock = GET_COLLECTION_ITEM(CStocks,i)
Graphs = GET_VALUE(Stock,"Graphs")  
        if GET_COLLECTION_COUNT(Graphs) = 0 then
WriteMsgLog(1,10,1,1,"Не найдена коллекция графиков по бумаге: "&GET_VALUE(Stock,"SecCode"))
        Result = -1
        Return
        end if
        OpenSession = GET_VALUE(Stock,"OpenSession") 
        CloseSession = GET_VALUE(Stock,"CloseSession")
   GInc = Get_Value(Stock,"GInc")+0
        tmpTime = GET_VALUE(Stock,"LastTime")
        tmpTrade = TradeDate
        FC = 0
for C from 1 to FindCaldleCount        
        for j from 0 to GET_COLLECTION_COUNT(Graphs)-1  
       Graph = GET_COLLECTION_ITEM(Graphs,j)
       GID = Get_Value(Graph,"ID")
GGraph = GET_CANDLE_EX(GID, tmpTrade, tmpTime)
if GGraph <> "" then
   GCur = Get_Value(Graph,"Curve")+0
GL = Get_Collection_Item(Get_Value(GGraph, "LINES"), GCur)
gsField = Get_Value(Graph,"Field")     
   GV = Get_Value(GL, gsField)
   GCandleTime = Get_Value(GGraph,"TIME")
   Stock = SET_VALUE(Stock,"LastCandleTime",GCandleTime)

Graph = SET_VALUE(Graph, "CurTime", tmpTime)
Graph = SET_VALUE(Graph, "CurDate", tmpTrade)
Graph = SET_VALUE(Graph, "Cur", GV)

Graph = SET_VALUE(Graph, "LasTime1", GCandleTime)
Graph = SET_VALUE(Graph, "LasDate1", tmpTrade)
Graph = SET_VALUE(Graph, "Las1", GV)
Graph = SET_VALUE(Graph, "LasTime2", GCandleTime)
Graph = SET_VALUE(Graph, "LasDate2", tmpTrade)
Graph = SET_VALUE(Graph, "Las2", GV)
   
Graphs = SET_COLLECTION_ITEM(Graphs,j,Graph)
FC = FC + 1
end if
end for
if FC = GET_COLLECTION_COUNT(Graphs)+0 then
FindFlag = 1
break
else
FindFlag = 0
FC = 0
   tmpTime = DECTime(tmpTime,3,GInc)
   if tmpTime+0 < OpenSession+0 then
   tmpTime = OpenSession
    tmpTrade = LastTradeDate
   end if
end if
end for

if FindFlag = 0 then
' WriteMsgLog(1,13,1,1,"Период графиков по бумаге с кодом '"&GET_VALUE(Stock,"SecCode")&"' не соответствует заданному")
        Result = -1
        Return
end if

Stock = SET_VALUE(Stock,"Graphs",Graphs)
CStocks = SET_COLLECTION_ITEM(CStocks,i,Stock)
end for

' Ищем значение второй свечи
for i from 0 to GET_COLLECTION_COUNT(CStocks)-1
Stock = GET_COLLECTION_ITEM(CStocks,i)
Graphs = GET_VALUE(Stock,"Graphs")  
        if GET_COLLECTION_COUNT(Graphs) = 0 then
WriteMsgLog(1,10,1,1,"Не найдена коллекция графиков по бумаге: "&GET_VALUE(Stock,"SecCode"))
        Result = -1
        Return
        end if

        OpenSession = GET_VALUE(Stock,"OpenSession") 
        CloseSession = GET_VALUE(Stock,"CloseSession")
        
GInt = GET_VALUE(Stock,"GInt")+0 
GInc = GET_VALUE(Stock,"GInc")+0 

        tmpTime = DECTime(GCandleTime,3,GInc)
FC = 0
for C from 1 to FindCaldleCount    
        for j from 0 to GET_COLLECTION_COUNT(Graphs)-1  
       Graph = GET_COLLECTION_ITEM(Graphs,j)
       GID = Get_Value(Graph,"ID")
if tmpTime+0 < OpenSession+0 then
tmpTime = CloseSession
Graph = SET_VALUE(Graph, "LasDate1", LastTradeDate)
Graph = SET_VALUE(Graph, "LasDate2", LastTradeDate)
tmpTrade = LastTradeDate
end if    
    
GGraph = GET_CANDLE_EX(GID, tmpTrade, tmpTime)
' внутри дня 
if GGraph <> "" then
   LT1 = Get_Value(GGraph,"TIME")
   if ((LT1+0 <> 0) and (LT1+0 <> GCandleTime+0)) then
LasTime1 = LT1
GL = Get_Collection_Item(Get_Value(GGraph, "LINES"), GCur)
   GV = Get_Value(GL, gsField)
Graph = SET_VALUE(Graph, "LasTime1", LasTime1)
Graph = SET_VALUE(Graph, "Las1", GV)
Graph = SET_VALUE(Graph, "Count", Get_Value(Graph,"Count")+1)
Graphs = SET_COLLECTION_ITEM(Graphs,j,Graph)
   FC = FC + 1
   end if
       end if                      

end for
if FC = GET_COLLECTION_COUNT(Graphs)+0 then
FindFlag = 1
break
else
FindFlag = 0
FC = 0
   tmpTime = DECTime(tmpTime,3,GInc)
if tmpTime+0 < OpenSession+0 then
tmpTime = CloseSession
tmpTrade = LastTradeDate
end if        
end if
end for

if FindFlag = 0 then
' WriteMsgLog(1,13,1,1,"Период графиков по бумаге с кодом '"&GET_VALUE(Stock,"SecCode")&"' не соответствует заданному")
        Result = -2
        Return
end if

Stock = SET_VALUE(Stock,"Graphs",Graphs)
CStocks = SET_COLLECTION_ITEM(CStocks,i,Stock)
end for

'==========
' Ищем значение третьей свечи
for i from 0 to GET_COLLECTION_COUNT(CStocks)-1
Stock = GET_COLLECTION_ITEM(CStocks,i)
Graphs = GET_VALUE(Stock,"Graphs")  
        if GET_COLLECTION_COUNT(Graphs) = 0 then
WriteMsgLog(1,10,1,1,"Не найдена коллекция графиков по бумаге: "&GET_VALUE(Stock,"SecCode"))
        Result = -1
        Return
        end if

        OpenSession = GET_VALUE(Stock,"OpenSession") 
        CloseSession = GET_VALUE(Stock,"CloseSession")

FC = 0
GInt = GET_VALUE(Stock,"GInt")+0 
GInc = GET_VALUE(Stock,"GInc")+0 
        tmpTime = DECTime(LasTime1,3,GInc)
for C from 1 to FindCaldleCount    
        for j from 0 to GET_COLLECTION_COUNT(Graphs)-1  
       Graph = GET_COLLECTION_ITEM(Graphs,j)
       GID = Get_Value(Graph,"ID")
if tmpTime+0 < OpenSession+0 then
Graph = SET_VALUE(Graph, "LasDate2", LastTradeDate)
tmpTime = CloseSession
tmpTrade = LastTradeDate
end if
        
GGraph = GET_CANDLE_EX(GID, tmpTrade, tmpTime)
' внутри дня 
if GGraph <> "" then
   LT1 = Get_Value(GGraph,"TIME")
   if ((LT1+0 <> 0) and (LT1+0 <> LasTime1+0))then
LasTime2 = LT1
GL = Get_Collection_Item(Get_Value(GGraph, "LINES"), GCur)
   GV = Get_Value(GL, gsField)
Graph = SET_VALUE(Graph, "LasTime2", LasTime2)
Graph = SET_VALUE(Graph, "Las2", GV)
Graph = SET_VALUE(Graph, "Count", Get_Value(Graph,"Count")+1)
Graphs = SET_COLLECTION_ITEM(Graphs,j,Graph)
   FC = FC + 1
   end if
       end if        

end for
if FC = GET_COLLECTION_COUNT(Graphs)+0 then
FindFlag = 1
Break
else
FindFlag = 0
FC = 0
   tmpTime = DECTime(tmpTime,3,GInc)
if tmpTime+0 < OpenSession+0 then
tmpTime = CloseSession
tmpTrade = LastTradeDate
end if    
end if
end for 
if FindFlag = 0 then
' WriteMsgLog(1,13,1,1,"Период графиков по бумаге с кодом '"&GET_VALUE(Stock,"SecCode")&"' не соответствует заданному")
        Result = -2
        Return
end if

Stock = SET_VALUE(Stock,"Graphs",Graphs)
CStocks = SET_COLLECTION_ITEM(CStocks,i,Stock)
end for

end if
Result = 0

END FUNC


' Проверка наличия необходимых графиков
FUNC CheckGraphs()
Result = 0
if GET_COLLECTION_COUNT(CStocks) > 0 then
for i from 0 to GET_COLLECTION_COUNT(CStocks)-1
Stock = GET_COLLECTION_ITEM(CStocks,i)
Graphs = GET_VALUE(Stock,"Graphs")  
        if GET_COLLECTION_COUNT(Graphs) = 0 then
WriteMsgLog(1,10,1,1,"Не найдена коллекция графиков по бумаге: "&GET_VALUE(Stock,"SecCode"))
        Result = -1
        Return
        end if

   GInc = Get_Value(Stock,"GInc")+0
        Pl = GET_VALUE(Stock,"PlatForm")+0
tmpTime=GET_VALUE(Stock, "LastTime")
tmpTrade = TradeDate
FC = 0
        for j from 0 to GET_COLLECTION_COUNT(Graphs)-1  
       Graph = GET_COLLECTION_ITEM(Graphs,j)
Graph = Set_Value(Graph,"Status",0)
Graphs = SET_COLLECTION_ITEM(Graphs,j,Graph)
end for
for C from 1 to 420 
        for j from 0 to GET_COLLECTION_COUNT(Graphs)-1  
       Graph = GET_COLLECTION_ITEM(Graphs,j)
       GID = Get_Value(Graph,"ID")             
GGraph = GET_CANDLE_EX(GID, tmpTrade, tmpTime)
if GGraph <> "" then
FC = FC + 1
Graph = Set_Value(Graph,"Status",1)
Graphs = SET_COLLECTION_ITEM(Graphs,j,Graph)
end if
end for
if FC = GET_COLLECTION_COUNT(Graphs)+0 then
tmpTime = Get_Value(GGraph,"TIME")
break
else
if Pl = 0 then
for k from 0 to GET_COLLECTION_COUNT(Graphs)-1
Graph = GET_COLLECTION_ITEM(Graphs,k)
Status = Get_Value(Graph,"Status")+0
if Status = 0 then  
WriteMsgLog(1,12,1,1,"Не найден график: '"&Get_Value(Graph,"ID")&"' по бумаге: "&GET_VALUE(Stock,"SecCode"))
        Result = -2
        Return
        end if
end for
else
   tmpTime = DECTime(tmpTime,3,GInc)
   if tmpTime+0 < GET_VALUE(Stock,"OpenSession")+0 then
    tmpTrade = LastTradeDate
   end if
        end if
        FC = 0
end if
end for

if FC <> GET_COLLECTION_COUNT(Graphs)+0 then
WriteMsgLog(1,12,1,1,"Не найден график: '"&Get_Value(Graph,"ID")&"' по бумаге: "&GET_VALUE(Stock,"SecCode"))
      Result = -2
      Return
  end if

Stock=SET_VALUE(Stock, "LastTime", tmpTime)
CStocks = SET_COLLECTION_ITEM(CStocks,i,Stock)

end for

end if

Result = 0

END FUNC

' Установка приращения интервала в сек.
FUNC GetIncTime()

if GET_COLLECTION_COUNT(CStocks) > 0 then
for i from 0 to GET_COLLECTION_COUNT(CStocks)-1
Stock = GET_COLLECTION_ITEM(CStocks,i)
Graphs = GET_VALUE(Stock,"Graphs")  
        if GET_COLLECTION_COUNT(Graphs) = 0 then
WriteMsgLog(1,10,1,1,"Не найдена коллекция графиков по бумаге: "&GET_VALUE(Stock,"SecCode"))
        Result = -1
        Return
        end if

        GInt = GET_VALUE(Stock,"GInt")+0
        GInc = 0
if (GInt >= 1) and (GInt <= 6) then
GInc = 60*GInt
end if
if GInt = 7 then
GInc = 600
end if
if GInt = 8 then
GInc = 900
end if
if GInt = 9 then
GInc = 1200
end if
if GInt = 10 then
GInc = 1800
end if
if GInt = 11 then
GInc = 3600
end if
if GInt = 12 then
GInc = 7200
end if
if GInt = 13 then
GInc = 14400
end if

if (GInt > 14) or (GInt < 1) then
WriteMsgLog(1,11,1,1,"Ошибка №684. Неверно указан интервал графиков "&GInt)
    Result = -2
    Return
else
Stock = SET_VALUE(Stock,"GInc",GInc)
CStocks = SET_COLLECTION_ITEM(CStocks,i,Stock)
end if

end for ' stocks

end if
Result = 0

END FUNC


' Декремент времени
FUNC DECTime(Ti, DEC, S)
' 1 часы 
' 2 минуты
' 3 секунды
Result = 0

        IF LEN(Ti) = 5
Ti = "0" & Ti 
        END IF
 
R1 = SUBSTR(Ti,0,2)*3600
R2 = SUBSTR(Ti,2,2)*60
R3 = SUBSTR(Ti,4,2)+0
Ti = (R1+R2+R3)
IF DEC = 1 
Ti = Ti - S*3600
ELSE
IF DEC = 2 
Ti = Ti - S*60
ELSE
Ti = Ti - S
END IF
END IF
IF Ti < 0
Ti = 86400+Ti 
END IF
R1 = FLOOR(Ti/3600)
RT = R1*3600 
R2 = FLOOR((Ti-RT)/60)
R3 = Ti-(RT+(R2*60))
                               
     IF R1 < 10
R1 = "0" & R1
END IF
IF R1+0 = 24
R1 = "00"
END IF
IF R2 < 10
R2 = "0" & R2
END IF
IF R3 < 10
R3 = "0" & R3
END IF
Result = R1 & R2 & R3  
END FUNC

FUNC DECData(Data, DEC, RDec)
' 1 Год 
' 2 Месяц
' 3 День
Result = 0

        R1 = SUBSTR(Data,0,4)+0
R2 = SUBSTR(Data,4,2)+0
R3 = SUBSTR(Data,6,2)+0

for ddI from 1 to RDec
IF DEC = 2 

        R2 = R2 - 1
   IF R2 = 0  
R2 = 12
DEC = 1
   END IF
   
IF ((R2 == 4) OR (R2 == 6) OR (R2 == 9) OR (R2 == 11)) AND (R3 == 31)   
      R3 = 30
       ELSE

            IF R2 == 2
            IF R3 >= 29
   
                Flag = (R1/4) - FLOOR(R1/4)
IF Flag = 0 
      R3 = 29
  ELSE
  R3 = 28
END IF

            END IF
 
END IF

END IF    
   
END IF

IF DEC = 3 

R3 = R3 - 1
IF (R3 = 0)
   R2 = R2 - 1
   IF R2 = 0  
R2 = 12
DEC = 1
   END IF
IF (R2 == 3) OR (R2 == 5) OR (R2 == 7) OR (R2 == 8) OR (R2 == 10) OR (R2 == 12)   
        R3 = 31
ELSE
IF (R2 == 4) OR (R2 == 6) OR (R2 == 9) OR (R2 == 11)   
      R3 = 30
       ELSE
                IF R2 == 1 
R3 = 31
ELSE
                IF R2 == 2 
                        Flag = (R1/4) - FLOOR(R1/4)
IF Flag = 0 
      R3 = 29
ELSE
        R3 = 28
END IF  

END IF
END IF
END IF
END IF
END IF

END IF 

IF DEC = 1 
R1 = R1 - 1
IF (R2 = 2) AND (R3 = 29)
                Flag = (R1/4) - FLOOR(R1/4)
IF Flag <> 0 
      R3 = 28
END IF  
END IF
END IF 
       
        end for
       
IF R2 < 10
R2 = "0" & R2
END IF
IF R3 < 10
R3 = "0" & R3
END IF

Result = R1 & R2 & R3 
 
END FUNC

' Разница времени в секундах
FUNC GetRazTimeSec(T1, T2)
        IF LEN(T1) = 5
T1 = "0" & T1 
        END IF
        IF LEN(T2) = 5
T2 = "0" & T2 
        END IF
 
R1 = SUBSTR(T1,0,2)*3600
R2 = SUBSTR(T1,2,2)*60
R3 = SUBSTR(T1,4,2)+0
T1 = (R1+R2+R3)
R1 = SUBSTR(T2,0,2)*3600
R2 = SUBSTR(T2,2,2)*60
R3 = SUBSTR(T2,4,2)+0
T2 = (R1+R2+R3)

Result = ABS(T1-T2)  
END FUNC


' Функция отправки транзакции на сервер
FUNC Send_Trans(sCli, sAcc, sClass, sCode, sOper, sPrice, sLot, sType, aID)

NEW_GLOBAL("TRANS_PARAMS", "")
NEW_GLOBAL("TRANS_RESULT", "")

trans_params = ""
trans_params = set_value (trans_params, "TRANS_ID", aID)
trans_params = set_value (trans_params, "ACTION", "NEW_ORDER")
trans_params = set_value (trans_params, "CLASSCODE", sClass)
trans_params = set_value (trans_params, "SECCODE", sCode)
trans_params = set_value (trans_params, "ACCOUNT", sAcc)
trans_params = set_value (trans_params, "CLIENT_CODE", sCli)
trans_params = set_value (trans_params, "OPERATION", sOper)
if sType = "M" then
trans_params = set_value (trans_params, "PRICE", 0)
else
trans_params = set_value (trans_params, "PRICE", sPrice+0)
end if
trans_params = set_value (trans_params, "QUANTITY", sLot) 
trans_params = set_value (trans_params, "Type", sType) 
trans_result = SEND_TRANSACTION (30, trans_params)
Result = get_value(trans_result, "RESULT")+0
Message(get_value(trans_result, "DESCRIPTION"), 1)

FileName = PathToRob&"\tmp\"&sCode&"_TranzLog.txt" 
S = TradeDate&"|"&TradeTime&"|"&sPrice&"|"&sLot&"|"&sPrice*sLot&"|"&sOper&"|Tranz"
WRITELN(FileName, S)
                
END FUNC

FUNC Send_Kill_StopTrans(sNoTz, sAcc, sClass, sCode)

NEW_GLOBAL("TRANS_PARAMS", "")
NEW_GLOBAL("TRANS_RESULT", "")

trans_params = set_value (trans_params, "STOP_ORDER_KEY", sNoTz&"")
trans_params = set_value (trans_params, "ACCOUNT", sAcc)
trans_params = set_value (trans_params, "CLASSCODE", sClass)
trans_params = set_value (trans_params, "SECCODE", sCode)
trans_params = set_value (trans_params, "TRANS_ID", sNoTz)     
trans_params = set_value (trans_params, "ACTION", "KILL_STOP_ORDER")
trans_result = SEND_TRANSACTION (5, trans_params)
Result = get_value(trans_result, "RESULT")+0
MESSAGE(GET_VALUE(TRANS_RESULT, "DESCRIPTION"),1)

END FUNC

' Функция снятия всех стоп-заявок из системы по счету и ук. бумаге
FUNC KillAllStopTranz(AKAcc, AKCd, AK)
' AAcc - номер счета
' ACd - код бумаги

aCount = GET_NUMBER_OF("STOP_ORDERS")+0
if aCount > 0 then
for aI from 1 to aCount
aSTR = GET_ITEM("STOP_ORDERS", aI)
aAc = Get_Value(aSTR, "ACCOUNT")
        aCd = Get_Value(aSTR, "SECCODE")
aStat = Get_Value(aSTR, "STATUS")  
aLNo = Get_Value(aSTR, "LINKED_ORDER")+0
aAct = Get_Value(aSTR, "BALANCE")+0
   
if (aAc = AKAcc) and (ACd = AKCd) and ( (aStat = "ACTIVE") or (aLNo <> 0) ) then
aCls = Get_Value(aSTR, "CLASSCODE")
aNZ = Get_Value(aSTR, "NUMBER")
if aLNo = 0 then
Send_Kill_StopTrans(aNZ, aAc, aCls, aCd)
else
if AK = 1 then
if aAct > 0 then
Send_Kill_Trans(aLNo,aAc,aCls,aCd)
end if
end if
end if  
end if
end for
end if

END FUNC

' Функция снятия всех заявок из системы по счету и ук. бумаге
FUNC KillAllTranz(AAcc, ACd, AOper)
' AAcc - номер счета
' ACd - код бумаги

gaCount = GET_NUMBER_OF("ORDERS")+0
if gaCount > 0 then
for gaI from 1 to gaCount
gaSTR = GET_ITEM("ORDERS", gaI)
gaAc = Get_Value(gaSTR, "ACCOUNT")
        gaCd = Get_Value(gaSTR, "SECCODE")
gaStat = Get_Value(gaSTR, "STATUS")
gaOper = Get_Value(gaSTR, "OPERATION")  
if (gaAc = AAcc) and (ACd = gaCd) and (gaStat = "ACTIVE") then
gaCls = Get_Value(gaSTR, "CLASSCODE")
gaNZ = Get_Value(gaSTR, "NUMBER")
if (AOper = gaOper) or (AOper = "") then 
Send_Kill_Trans(gaNZ, gaAc, gaCls, gaCd)
end if  
end if
end for
end if

END FUNC

FUNC Send_Kill_Trans(sNoTz, sAcc, sClass, sCode)

NEW_GLOBAL("TRANS_PARAMS", "")
NEW_GLOBAL("TRANS_RESULT", "")

trans_params = set_value (trans_params, "ORDER_KEY", sNoTz&"")
trans_params = set_value (trans_params, "ACCOUNT", sAcc)
trans_params = set_value (trans_params, "CLASSCODE", sClass)
trans_params = set_value (trans_params, "SECCODE", sCode)
trans_params = set_value (trans_params, "TRANS_ID", sNoTz)
trans_params = set_value (trans_params, "ACTION", "KILL_ORDER")
trans_result = SEND_TRANSACTION (5, trans_params)

Result = get_value(trans_result, "RESULT")+0
MESSAGE(GET_VALUE(TRANS_RESULT, "DESCRIPTION"),1)

END FUNC

' Функция инициализации данных
'>> Init
FUNC Init()
CStocks = CREATE_COLLECTION()
Graphs = CREATE_COLLECTION()
Graph = CREATE_MAP()
Graph=SET_VALUE(Graph, "Status", 0)
Graph=SET_VALUE(Graph, "NAME", "Цена")
Graph=SET_VALUE(Graph, "ID","MPrice")
Graph=SET_VALUE(Graph, "Curve", 0)
Graph=SET_VALUE(Graph, "Field", "CLOSE")
Graph=SET_VALUE(Graph, "Cur", 0)
Graph=SET_VALUE(Graph, "Las1", 0)
Graph=SET_VALUE(Graph, "Las2", 0)
Graph=SET_VALUE(Graph, "Count", 0)
Graph=SET_VALUE(Graph, "CurTime", "0")
Graph=SET_VALUE(Graph, "CurDate", "0")
Graph=SET_VALUE(Graph, "LasTime1", "0")
Graph=SET_VALUE(Graph, "LasDate1", "0")
Graph=SET_VALUE(Graph, "LasTime2", "0")
Graph=SET_VALUE(Graph, "LasDate2", "0")
Graphs = INSERT_COLLECTION_ITEM(Graphs,0,Graph)
Graph = CREATE_MAP()
Graph=SET_VALUE(Graph, "Status", 0)
Graph=SET_VALUE(Graph, "NAME", "SAR")
Graph=SET_VALUE(Graph, "ID","MACD")
Graph=SET_VALUE(Graph, "Curve", 0)
Graph=SET_VALUE(Graph, "Field", "CLOSE")
Graph=SET_VALUE(Graph, "Cur", 0)
Graph=SET_VALUE(Graph, "Las1", 0)
Graph=SET_VALUE(Graph, "Las2", 0)
Graph=SET_VALUE(Graph, "Count", 0)
Graph=SET_VALUE(Graph, "CurTime", "0")
Graph=SET_VALUE(Graph, "CurDate", "0")
Graph=SET_VALUE(Graph, "LasTime1", "0")
Graph=SET_VALUE(Graph, "LasDate1", "0")
Graph=SET_VALUE(Graph, "LasTime2", "0")
Graph=SET_VALUE(Graph, "LasDate2", "0")
Graphs = INSERT_COLLECTION_ITEM(Graphs,1,Graph)
StrPrms = CREATE_MAP()
StrPrms=SET_VALUE(StrPrms, "Wait", 0)
StrPrms=SET_VALUE(StrPrms, "CloseStop",1)
StrPrms=SET_VALUE(StrPrms, "ContrTrend",1)
StrPrms=SET_VALUE(StrPrms, "WPos", 0)
StrPrms=SET_VALUE(StrPrms, "LastUp", 0)
StrPrms=SET_VALUE(StrPrms, "LastDown", 0)
StrPrms=SET_VALUE(StrPrms, "FCount", 100)
StrPrms=SET_VALUE(StrPrms, "Mode", 0)
Stock = CREATE_MAP()
Stock=SET_VALUE(Stock, "NAME", "")
Stock=SET_VALUE(Stock, "PlatForm",0)
Stock=SET_VALUE(Stock, "Account","NL0011100043")
Stock=SET_VALUE(Stock, "CliCode","22850")
Stock=SET_VALUE(Stock, "ClassCode", "QJSIM")
Stock=SET_VALUE(Stock, "SecCode", "SBERP03")
Stock=SET_VALUE(Stock, "CurPrice", 0)
Stock=SET_VALUE(Stock, "Bid", 0)
Stock=SET_VALUE(Stock, "Offer", 0)
Stock=SET_VALUE(Stock, "Ost", 0)
Stock=SET_VALUE(Stock, "InOst", 0)
Stock=SET_VALUE(Stock, "AcceptOst", 0)
Stock=SET_VALUE(Stock, "STStep", 0)
Stock=SET_VALUE(Stock, "StepP", 0)
Stock=SET_VALUE(Stock, "SendFlag", 0)
Stock=SET_VALUE(Stock, "SignFlag", 0)
Stock=SET_VALUE(Stock, "UseLong", 1)
Stock=SET_VALUE(Stock, "UseShort", 1)
Stock=SET_VALUE(Stock, "Lot", 1)
Stock=SET_VALUE(Stock, "TypeTrans", "L")
Stock=SET_VALUE(Stock, "Spred", 0)
Stock=SET_VALUE(Stock, "TypeSpred",0)
Stock=SET_VALUE(Stock, "NoTranz", 0)
Stock=SET_VALUE(Stock, "AllIzmR", 0)
Stock=SET_VALUE(Stock, "AllIzmP", 0)
Stock=SET_VALUE(Stock, "IzmR", 0)
Stock=SET_VALUE(Stock, "IzmP", 0)
Stock=SET_VALUE(Stock, "SrvPrice", 0)
Stock=SET_VALUE(Stock, "ClosePrice", 0)
Stock=SET_VALUE(Stock, "LastTradeDate", "")
Stock=SET_VALUE(Stock, "LastCandleTime", "")
Stock=SET_VALUE(Stock, "LastTime", "")
Stock=SET_VALUE(Stock, "Scale", 0)
Stock=SET_VALUE(Stock, "StrNo",2)
Stock=SET_VALUE(Stock, "StrName","Price&SAR")
Stock=SET_VALUE(Stock, "StrPrms", StrPrms)
Stock=SET_VALUE(Stock, "Graphs", Graphs)
Stock=SET_VALUE(Stock, "GInt", )
Stock=SET_VALUE(Stock, "GInc", 1)
Stock=SET_VALUE(Stock, "KB", 0)
Stock=SET_VALUE(Stock, "SelKB", 0)
Stock=SET_VALUE(Stock, "KTS", 0)
Stock=SET_VALUE(Stock, "SelKTS", 0)
Stock=SET_VALUE(Stock, "OpenSession", "102959")
Stock=SET_VALUE(Stock, "CloseSession", "184459")
Stock=SET_VALUE(Stock, "OpenMon", "000000")
Stock=SET_VALUE(Stock, "CloseMon", "235959")
Stock=SET_VALUE(Stock, "OpenEve", "000000")
Stock=SET_VALUE(Stock, "CloseEve", "235959")
Stock=SET_VALUE(Stock, "EndInt", 0)
Stock=SET_VALUE(Stock, "FlagPos", 0)
Stock=SET_VALUE(Stock, "Error", 0)
Stock=SET_VALUE(Stock, "LastError", 0)
Stock=SET_VALUE(Stock, "NoOrder", 0)
Stock=SET_VALUE(Stock, "NoPOrder", 0)
Stock=SET_VALUE(Stock, "NoLOrder", 0)
Stock=SET_VALUE(Stock, "UseTakeProfit", 1)
Stock=SET_VALUE(Stock, "ProfitType", 0)
Stock=SET_VALUE(Stock, "ProfitVol", 0.2)
Stock=SET_VALUE(Stock, "ProfitSpred", 0.5)
Stock=SET_VALUE(Stock, "ProfitTypeSpred", 1)
Stock=SET_VALUE(Stock, "ProfitStep", 0.2)
Stock=SET_VALUE(Stock, "PDelta",0)
Stock=SET_VALUE(Stock, "UseStopLoss", 1)
Stock=SET_VALUE(Stock, "LossType", 0)
Stock=SET_VALUE(Stock, "LossVol", 0.2)
Stock=SET_VALUE(Stock, "LossSpred", 0.5)
Stock=SET_VALUE(Stock, "LossTypeSpred", 1)
Stock=SET_VALUE(Stock, "LossStep", 0.2)
Stock=SET_VALUE(Stock, "LDelta",0)
CStocks = INSERT_COLLECTION_ITEM(CStocks,GET_COLLECTION_COUNT(CStocks),Stock)
END FUNC

'<< Init

FUNC GetZTranz(AAcc, ACd, ASt)

    zgaZ = 0
zgaCount = GET_NUMBER_OF("STOP_ORDERS")+0
if zgaCount > 0 then
for zgaI from 1 to zgaCount
zgaSTR = GET_ITEM("STOP_ORDERS", zgaI)
zgaAc = Get_Value(zgaSTR, "ACCOUNT")
        zgaSc = Get_Value(zgaSTR, "SECCODE")
        zgaCd = Get_Value(zgaSTR, "CLASSCODE")
zgaStat = Get_Value(zgaSTR, "STATUS")
if (zgaAc = AAcc) and (ACd = zgaCd) and (ASt = zgaSc) and (zgaStat = "ACTIVE") then
zgaZ = zgaZ + 1
end if
end for
end if
Result = zgaZ

END FUNC


END_PROGRAM

PARAMETER FStock;
PARAMETER_TITLE Бумага;
PARAMETER_DESCRIPTION Бумага;
PARAMETER_TYPE STRING(100);
END

PARAMETER FCurPrice;
PARAMETER_TITLE Текущая цена;
PARAMETER_DESCRIPTION Текущая цена;
PARAMETER_TYPE NUMERIC(10,5);
END

PARAMETER FPos;
PARAMETER_TITLE Позиция;
PARAMETER_DESCRIPTION Позиция;
PARAMETER_TYPE STRING(20);
END

PARAMETER FTranzPrice;
PARAMETER_TITLE СрвзвЦена;
PARAMETER_DESCRIPTION Средневзвешенная цена;
PARAMETER_TYPE NUMERIC(10,5);
END

PARAMETER FLots;
PARAMETER_TITLE Кол-во (лот);
PARAMETER_DESCRIPTION Кол-во;
PARAMETER_TYPE NUMERIC(10,0);
END

PARAMETER FTrv;
PARAMETER_TITLE Оценка;
PARAMETER_DESCRIPTION Оценка;
PARAMETER_TYPE NUMERIC(10,2);
END

PARAMETER FChaCash;
PARAMETER_TITLE Изм. руб.;
PARAMETER_DESCRIPTION Изменение в руб.;
PARAMETER_TYPE NUMERIC(10,2);
END

PARAMETER FChaPer;
PARAMETER_TITLE Изм. %;
PARAMETER_DESCRIPTION Измениение в %;
PARAMETER_TYPE NUMERIC(10,3);
END

END_PORTFOLIO_EX

Комментариев нет:

Отправить комментарий

Комментируйте и откомментированы будете...!