вторник, 6 августа 2013 г.

Код биржевого робота по стратегии двух скользящих средних и стандартного отклонения медленной скользящей средней

Робот написан на встроенном языке Квика (QPILE) и сделан с помощью конфигуратора роботов.




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

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

'Extended
NEW_GLOBAL("Start_Flag",1)
NEW_GLOBAL("LastTradeDate","")
NEW_GLOBAL("TradeTime","")
NEW_GLOBAL("TradeDate","")
NEW_GLOBAL("FindCaldleCount",50)
NEW_GLOBAL("LastTradeCount",-1)
NEW_GLOBAL("LastCountStopOrders",-1)

' Параметры сообщений и протоколирования
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)

' New 27.11.2010
'NEW_GLOBAL("Graphs",CREATE_COLLECTION())
' << new

' ========================== Контроль соединения
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() == 10 then 
Status = 1
WriteMsgLog(1,1,1,1,"Отсутствует соединение с сервером")
else

' Проверка параметров по бумагам
if CheckStocks() < 0 then
Status = 2
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 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

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

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

NewView()

' 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
if CheckGraphs() < 0 then
   Status = 6
else
' Проверка интервала графиков
if CheckGraphsInt() < 0 then
   Status = 7
else
    ' Read Prms last,bid,offer
if ReadPrms() < 0 then
   Status = 9
else

    CalcSrvPrice()
    ReadGraphs()
RunSignal()

' if (SignFlag = 0) and (SendFlag = 0) then 
'        CheckStopTranz()
' else

' end if

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

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

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


    end if
END IF

'===================== FUNCTIONS =================
' Функция контроля стопов
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)
        Ost = GET_VALUE(Stock,"Ost")+0
SrvPrice = GET_VALUE(Stock,"SrvPrice")+0 
CliCode = GET_VALUE(Stock,"CliCode") 
Account = GET_VALUE(Stock,"Account")
ClassCode = GET_VALUE(Stock,"ClassCode")  
SecCode = GET_VALUE(Stock,"SecCode")  

IF (Ost = 0) and (SrvPrice = 0) and (LastCountStopOrders <> gaCount) then
KillAllStopTranz(Account,SecCode,0)
END IF

        Pl = GET_VALUE(Stock,"PlatForm")+0
        AcceptOst = GET_VALUE(Stock,"AcceptOst")+0
        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 

Bid = GET_VALUE(Stock,"Bid")+0 
Offer = GET_VALUE(Stock,"Offer")+0       
      
      
end for  
end if
LastCountStopOrders = gaCount

Return    '>>>>>>>>>>>

    IF ((UseTakeProfit = 1) or (UseStopLoss = 1)) and (AccOst <> 0) and (SrvPrice > 0) and (CalcPos = 0) then 

ActivTranz = 0

' Читаем таблицу заявок
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")
gaNo = Get_Value(gaSTR, "NUMBER")+0
gaOper = Get_Value(gaSTR, "OPERATION")
gaSPrice = Get_Value(gaSTR, "PRICE")+0  
gaQty = Get_Value(gaSTR, "QUANTITY")+0  

if (gaAc = Account) and (gaCd = StockCode) then
' Сбрасываем номер заявки                           
        if (gaNo = NoOrder) then
        if (gaStat <> "ACTIVE") then 
        NoOrder = 0
        end if
else
' Сбрасываем номера стоп заявок                           
if (gaNo = NoPOrder) and ((gaStat <> "ACTIVE") or ((gaStat = "ACTIVE") and ((gaSPrice <> PriceSPOrder) or (gaQty <> ABS(AccOst))) )  then
NoPOrder = 0 
else
if (gaNo = NoLOrder) and ((gaStat <> "ACTIVE") or ((gaStat = "ACTIVE") and ((gaSPrice <> PriceSLOrder) or (gaQty <> ABS(AccOst))) )  then
NoLOrder = 0
else
                   if (gaStat = "ACTIVE") then
                    ActivTranz = ActivTranz + 1
                   end if
                    end if
                    end if
           end if
end if
end for
end if

    RSP = 0
        if (UseTakeProfit = 1) and (RSP = 0) and (NoOrder = 0) then
        if (ProfitType < 2) then 
if (AccOst > 0) and (LastPrice >= PStopPrice) then
if (NoPOrder = 0) then
if (AcceptOst = AccOst) then
if ProfitType = 0 then 
ZType = "M"
else
ZType = "L"
end if    
        Rez = Send_Trans(ClientCode, Account, ClassCode, StockCode, "S", PriceSPOrder, AccOst, ZType)+0
        if Rez = 1 then
        NoPOrder = get_value(trans_result, "ORDER_NUMBER")+0
        end if
    else
if ActivTranz > 0 then
   KillAllTranz(Account,StockCode,"")
end if        
   KillAllStopTranz(Account,StockCode,0)    
    end if
        end if
        RSP = 1
        end if
if (AccOst < 0) and (LastPrice <= PStopPrice) then        
if (NoPOrder = 0) then
if (AcceptOst = AccOst) then
if ProfitType = 0 then 
ZType = "M"
else
ZType = "L"
end if    
        Rez = Send_Trans(ClientCode, Account, ClassCode, StockCode, "B", PriceSPOrder, -AccOst, ZType)+0
        if Rez = 1 then
        NoPOrder = get_value(trans_result, "ORDER_NUMBER")+0
        end if
    else
if ActivTranz > 0 then
   KillAllTranz(Account,StockCode,"")
end if        
   KillAllStopTranz(Account,StockCode,0)    
    end if
    end if
        RSP = 1
        end if        
        end if
        end if
        
        if (UseStopLoss = 1) and (RSP = 0) and (NoOrder = 0) then
        if (LossType < 2) then 
if (AccOst > 0) and (LastPrice <= LStopPrice) then        
if (NoLOrder = 0) then
if (AcceptOst = AccOst) then
if LossType = 0 then 
ZType = "M"
else
ZType = "L"
end if   
        Rez = Send_Trans(ClientCode, Account, ClassCode, StockCode, "S", PriceSLOrder, AccOst, ZType)+0
        if Rez = 1 then
        NoLOrder = get_value(trans_result, "ORDER_NUMBER")+0
        end if
    else
if ActivTranz > 0 then
   KillAllTranz(Account,StockCode,"")
end if        
   KillAllStopTranz(Account,StockCode,0)    
    end if
    end if
        RSP = 1
        end if
if (AccOst < 0) and (LastPrice >= LStopPrice) then        
if (NoLOrder = 0) then
if (AcceptOst = AccOst) then
if LossType = 0 then 
ZType = "M"
else
ZType = "L"
end if    
        Rez = Send_Trans(ClientCode, Account, ClassCode, StockCode, "B", PriceSLOrder, -AccOst, ZType)+0
        if Rez = 1 then
        NoLOrder = get_value(trans_result, "ORDER_NUMBER")+0
        end if
    else
if ActivTranz > 0 then
   KillAllTranz(Account,StockCode,"")
end if  
   KillAllStopTranz(Account,StockCode,0)    
    end if
    end if
        RSP = 1
        end if        
        end if
        end if          

        ' ========== Stop Orders
        IF (RSP = 0) and (NoOrder = 0) and (StopOrdersError = 0) 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  

           ' gaType = 9
if (gaAc = Account) and (gaCd = StockCode) 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 = ProfitSpred) and (gaConPrice2 = LStopPrice+0) and (gaSPrice = PriceSLOrder) then 
if (gaStat = "ACTIVE") and (gaQty = ABS(AccOst)) then
NoSPOrder = gaNo
NoSLOrder = gaNo
            FindStopProf = 1
            FindStopLoss = 1
      else
if (gaStat = "FILLED") and (gaQty = ABS(AccOst)) then
NoSPOrder = gaNo
NoSLOrder = gaNo
            FindStopProf = 1
            FindStopLoss = 1
    end if
end if
  
ELSE                

                if (gaAct = ABS(AccOst)) and (UseTakeProfit = 1) and (ProfitType = 2) and (LossType < 2) and (gaConPrice2 = 0) and (gaConPrice = PStopPrice+0) and (gaSred = ProfitSpred) then 
if (gaStat = "ACTIVE") and (gaQty = ABS(AccOst)) then
NoSPOrder = gaNo          
            FindStopProf = 1
else
if (gaStat = "FILLED") and (gaQty = ABS(AccOst)) then
NoSPOrder = gaNo
NoLinkSPOrder = gaLNo
            FindStopProf = 1
end if
end if   

ELSE

                    if (gaAct = ABS(AccOst)) and (UseStopLoss = 1) and (LossType = 2) and (ProfitType < 2) and (gaConPrice = 0) and (gaConPrice2 = LStopPrice+0) and (gaSPrice = PriceSLOrder) then 
if (gaStat = "ACTIVE") and (gaQty = ABS(AccOst)) then
NoSLOrder = gaNo
            FindStopLoss = 1
else
if (gaStat = "FILLED") and (gaQty = ABS(AccOst)) 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, StockCode)
end if
if (gaStat = "FILLED") then
if (gaLNo <> 0) and (gaAct > 0) then
Send_Kill_Trans(gaLNo, Account, ClassCode, StockCode)
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 (AcceptOst = AccOst) then 

FileName = PathToRob&"\tmp\stoptranz.txt"
WRITELN(FileName, TradeDate&" "&TradeTime&" "&Account&" "&ClassCode&" "&StockCode&" "&PStopPrice&" "&ProfitSpred&" "&LStopPrice&" "&PriceSLOrder&" "&AccOst&" "&SrvPrice)

        if AccOst > 0 then 
Rez = Send_StopStopTrans(ClientCode, Account, ClassCode, StockCode, "S", PStopPrice,ProfitSpred, LStopPrice, PriceSLOrder, AccOst)+0
else
Rez = Send_StopStopTrans(ClientCode, Account, ClassCode, StockCode, "B", PStopPrice,ProfitSpred, LStopPrice, PriceSLOrder, -AccOst)+0
end if
if Rez = 0 then
WriteMsgLog(1,16,1,1)
StopOrdersError = 1
end if
        end if

        ELSE

        if (UseTakeProfit = 1) and (ProfitType = 2) and (LossType < 2) then
        if (FindStopProf = 0) and (AcceptOst = ABS(AccOst)) then 
FileName = PathToRob&"\tmp\stoptranz.txt"
WRITELN(FileName, TradeDate&" "&TradeTime&" "&Account&" "&ClassCode&" "&StockCode&" "&PStopPrice&" "&ProfitSpred&" "&LStopPrice&" "&PriceSLOrder&" "&AccOst&" "&SrvPrice)

        if AccOst > 0 then 
Rez = Send_StopStopTrans(ClientCode, Account, ClassCode, StockCode, "S", PStopPrice,ProfitSpred, 0, 0, AccOst)+0
else
Rez = Send_StopStopTrans(ClientCode, Account, ClassCode, StockCode, "B", PStopPrice,ProfitSpred, 0, 0, -AccOst)+0
end if
if Rez = 0 then
WriteMsgLog(1,16,1,1)
StopOrdersError = 1
end if
        end if

        ELSE

        if (UseStopLoss = 1) and (LossType = 2) and (ProfitType < 2) then
        if (FindStopLoss = 0) and (AcceptOst = ABS(AccOst)) then 
FileName = PathToRob&"\tmp\stoptranz.txt"
WRITELN(FileName, TradeDate&" "&TradeTime&" "&Account&" "&ClassCode&" "&StockCode&" "&PStopPrice&" "&ProfitSpred&" "&LStopPrice&" "&PriceSLOrder&" "&AccOst&" "&SrvPrice)

        if AccOst > 0 then 
Rez = Send_StopStopTrans(ClientCode, Account, ClassCode, StockCode, "S", 0,0, LStopPrice, PriceSLOrder, AccOst)+0
else
Rez = Send_StopStopTrans(ClientCode, Account, ClassCode, StockCode, "B", 0,0, LStopPrice, PriceSLOrder, -AccOst)+0
end if
if Rez = 0 then
WriteMsgLog(1,16,1,1)
StopOrdersError = 1
end if
        end if
        end if        
        end if        
        end if

        END IF
        
' Message(PStopPrice&" "&LStopPrice&" "&NoPOrder&" "&NoLOrder,1)

END IF

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
      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          

        if OpenS = 1 then

        Ost = GET_VALUE(Stock,"Ost")+0
        AcceptOst = GET_VALUE(Stock,"AcceptOst")+0
        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

isSig = 0

        EndInt = GET_VALUE(Stock,"EndInt")+0
if EndInt = 0 then

' MACD&ADX
       if NoStr = 0 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 
Wait = GET_VALUE(StrPrms,"Wait")+0

if (UseLong = 1) and (UseShort = 1) then
Message("В стратегии MACD&ADX можно использовать только одно направление трейдинга!",2)
Break
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

' Определяем 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

' Определяем ClosePos
if (FlagPos <> 0) and (LasADX1 < LasADX2) and (LasADX1 < LevADX) then
   isSig = 3
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

' Srv&Div
       if NoStr = 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")
' LevADX = GET_VALUE(StrPrms,"uADX")+0
' BarCount = GET_VALUE(StrPrms,"BarCount")+0 
' Wait = GET_VALUE(StrPrms,"Wait")+0

' Определяем 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
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
end if
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

' SAR
       if NoStr = 2 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")
' LevADX = GET_VALUE(StrPrms,"uADX")+0
' BarCount = GET_VALUE(StrPrms,"BarCount")+0 
Wait = GET_VALUE(StrPrms,"Wait")+0

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

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

                    StrPrms = SET_VALUE(StrPrms,"Wait",Wait)
'                    Stock = SET_VALUE(Stock,"StrPrms",StrPrms)
                    
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

   if ((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)+0
        if Rez = 1 then
NoOrder = get_value(trans_result, "ORDER_NUMBER")+0
        end if
'         SendFlag = 1
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

   if ((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)+0
        if Rez = 1 then
NoOrder = get_value(trans_result, "ORDER_NUMBER")+0
        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

   if ((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)+0
        if Rez = 1 then
NoOrder = get_value(trans_result, "ORDER_NUMBER")+0
        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)  
' SignFlag = Sig    
    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

   if ((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)+0
        if Rez = 1 then
NoOrder = get_value(trans_result, "ORDER_NUMBER")+0
        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


Stock = SET_VALUE(Stock,"EndInt",0)
CStocks = SET_COLLECTION_ITEM(CStocks,i,Stock)
end if ' in Session

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
                                          
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")  
        inOst = GET_VALUE(Stock,"InOst")+0 
Pl = GET_VALUE(Stock,"PlatForm")+0
ClosePrice = GET_VALUE(Stock,"ClosePrice")+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 = inOst
' DEL
' if i = 0 then
' sPos =1
' end if
' if i = 1 then
' sPos =2
' end if

   if (sPos <> 0) and (ClosePrice > 0) then
       SrvPrice = ClosePrice
       bVol = ClosePrice*ABS(sPos)
       if Pl = 1 then
        bVol = bVol*(STStep/StepPrice)
       end if
   else
      SrvPrice = 0
       bVol = 0
        end if;

   sVol = 0
   izmR = 0
   izmP = 0
   kProf = 1
   cTranz = 0

TradesCount = GET_NUMBER_OF("TRADES")+0
  LastTradeCount = TradesCount

if TradesCount > 0 then
for t from 1 to TradesCount

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

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

if (tAcc = Ac) and (tClass = Cs) and (tSec = Sc) and (tTime+0 > OpenS+0) then
if tOper = "BUY" then
sOper = 1
else
sOper = 2
end if

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

if sPos = 0 then
if sOper = 1 then
 sPos = Qty
else
 sPos = -Qty
end if;
SrvPrice = vol/Qty
bVol = vol
sVol = 0
cTranz = cTranz + 1
else

           if sPos > 0 then
           if sOper = 1 then
             if SrvPrice > 0 then 
  SrvPrice = ((SrvPrice*sPos)+vol)/(sPos+Qty)
 end if
             sPos = sPos + Qty
             bVol = bVol + Vol
 cTranz = cTranz + 1
            else
           
               if (sPos - Qty) >= 0 then
               sVol = sVol + vol
                sPos = sPos - Qty
     cTranz = cTranz + 1
                if sPos = 0 then
                 if SrvPrice > 0 then
                   Kom = GetKomiss(sVol+bVol,SelKB,KB,cTranz)+GetKomiss(sVol+bVol,SelKTS,KTS,cTranz)
                   izmR = izmR + (sVol-bVol)-Kom
                   izmP = izmP + ((sVol-Kom)/bVol*100-100)*kProf
                 end if
                 SrvPrice = 0
                 bVol = 0
                 sVol = 0
                 cTranz = 0
               end if
              else
     cTranz = cTranz + 1
               if SrvPrice > 0 then
                 sVol = sVol + sPos*(vol/Qty)
                 Kom = GetKomiss(sVol+bVol,SelKB,KB,cTranz)+GetKomiss(sVol+bVol,SelKTS,KTS,cTranz)
                 izmR = izmR+(sVol-bVol)-kom
                 izmP = izmP+((sVol-kom)/bVol*100-100)*kProf
               end if
               cTranz = 0
               sPos = sPos - Qty
               SrvPrice = Vol/Qty
               sVol = 0
               bVol = ABS(sPos)*(Vol/Qty)
              end if
           
end if
         
  else

if sPos < 0 then
if sOper = 2 then
      if SrvPrice > 0 then 
  SrvPrice = ((SrvPrice*ABS(sPos))+vol)/(ABS(sPos)+Qty)
  end if
          sPos = sPos - Qty
          bVol = bVol + Vol
          cTranz = cTranz + 1
       else

if (sPos + Qty) <= 0 then
               sVol = sVol + vol
               sPos = sPos + Qty
               cTranz = cTranz + 1
               if sPos = 0 then
                 if SrvPrice > 0 then
                   Kom = GetKomiss(sVol+bVol,SelKB,KB,cTranz)+GetKomiss(sVol+bVol,SelKTS,KTS,cTranz)
                   izmR = izmR + (bVol-sVol)-kom
                   izmP = izmP + ((bVol-kom)/sVol*100-100)*kProf
                 end if
                 SrvPrice = 0
                 bVol = 0
                 sVol = 0
                 cTranz = 0
               end if              
  else
 
               cTranz = cTranz + 1
               if SrvPrice > 0 then
                 sVol = sVol + ABS(sPos)*(vol/Qty)
                 Kom = GetKomiss(sVol+bVol,SelKB,KB,cTranz)+GetKomiss(sVol+bVol,SelKTS,KTS,cTranz)
                 izmR = izmR + (bVol-sVol)-kom
                 izmP = izmP + ((bVol-kom)/sVol*100-100)*kProf
               end if
               sPos = sPos + Qty
               SrvPrice = Vol/Qty
               bVol = ABS(sPos)*(Vol/Qty)
               sVol = 0
               cTranz = 0          
       
        end if
       end if
          
                end if
                end if
end if  

end if
end for
end if

if (sPos <> 0) and (Pl = 0) and (SrvPrice = 0) then
  SrvPrice = GeDepoLimitPrm(Ac, Sc, "WA_POSITION_PRICE")+0
end if 

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", 0)
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 = "20101126"
        LastTradeDate = "20101126" 
'        LastTradeDate = tmp 
if tmp+0 <= 0 then
WriteMsgLog(1,6,1,1,"Недоступен параметр: 'Дата предыдущего торгового дня' по бумаге: "&Sc)
Result = -3
Return
end if
Stock=SET_VALUE(Stock, "LastTradeDate", tmp)

        tmp = GetNumTTP(Cs,Sc,"TIME")
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)

' message(tmp,1)
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 (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 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

            ' Внутридневной интервал
            if GInt < 14 then
tmpTime1 = Get_Value(GGraph,"time")
tmpTime2 = DECTime(tmpTime1,3,GInc)
if (tmpTime1+0 >= GET_VALUE(Stock,"OpenSession")+0) and (tmpTime2+0 >= GET_VALUE(Stock,"OpenSession")+0) then 
GGraph = GET_CANDLE_EX(GID, tmpTrade, tmpTime2)
if GGraph <> "" then
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
end if
end if
end if
           end if
else
tmpTime1 = GET_VALUE(Stock,"CloseSession")
tmpTrade = LastTradeDate
Break
end if
else
            ' Дневной интервал
            tmpTime1 = Get_Value(GGraph,"time")
            tmpTrade = LastTradeDate
            GGraph2 = GET_CANDLE_EX(GID, tmpTrade, tmpTime1)
            tmpTime2 = Get_Value(GGraph,"time")
            if (GGraph <> GGraph2) and (GGraph2 <> "") then
              FC = FC + 1
              end if
end if

end if
end for ' for j

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

end for ' for C

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

end for

end if

Result = 0

END FUNC


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

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")
        tmp = GET_VALUE(Stock,"LastTime")
        FC = 0
        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, TradeDate, tmp)
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)
'    LastCandleTime = GCandleTime

Graph = SET_VALUE(Graph, "CurTime", tmp)
Graph = SET_VALUE(Graph, "CurDate", TradeDate)
Graph = SET_VALUE(Graph, "Cur", GV)

Graph = SET_VALUE(Graph, "LasTime1", GCandleTime)
Graph = SET_VALUE(Graph, "LasDate1", TradeDate)
Graph = SET_VALUE(Graph, "Las1", GV)
Graph = SET_VALUE(Graph, "LasTime2", GCandleTime)
Graph = SET_VALUE(Graph, "LasDate2", TradeDate)
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
else
FindFlag = 0
' 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

FC = 0
GInt = GET_VALUE(Stock,"GInt")+0 
GInc = GET_VALUE(Stock,"GInc")+0 
        for j from 0 to GET_COLLECTION_COUNT(Graphs)-1  
       Graph = GET_COLLECTION_ITEM(Graphs,j)
       GID = Get_Value(Graph,"ID")
            if GInt < 14 then 
       GCandleTime = Get_Value(Graph,"LasTime1") 
       tmp = DECTime(GCandleTime,3,GInc)
if tmp+0 < OpenSession+0 then
tmp = CloseSession
Graph = SET_VALUE(Graph, "LasDate1", LastTradeDate)
Graph = SET_VALUE(Graph, "LasDate2", LastTradeDate)
end if
else
' Днейвной 
Graph = SET_VALUE(Graph, "LasDate1", LastTradeDate)
Graph = SET_VALUE(Graph, "LasDate2", LastTradeDate)
end if        
        
GGraph = GET_CANDLE_EX(GID, Get_Value(Graph,"LasDate1"), tmp)
if GInt = 14 then
' Днейвной 
GGraph2 = GET_CANDLE_EX(GID, Get_Value(Graph,"CurDate"), tmp)
if (GGraph <> GGraph2) and (GGraph <> "") and (GGraph2 <> "") then
   LT1 = Get_Value(GGraph,"TIME")
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
else
' внутри дня 
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 if

end for
if FC = GET_COLLECTION_COUNT(Graphs)+0 then
FindFlag = 1
else
FindFlag = 0
' 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

FC = 0
GInt = GET_VALUE(Stock,"GInt")+0 
GInc = GET_VALUE(Stock,"GInc")+0 
        for j from 0 to GET_COLLECTION_COUNT(Graphs)-1  
       Graph = GET_COLLECTION_ITEM(Graphs,j)
       GID = Get_Value(Graph,"ID")
            if GInt < 14 then 
       GCandleTime = Get_Value(Graph,"LasTime1")
       tmp = DECTime(GCandleTime,3,GInc)
if tmp+0 < OpenSession+0 then
tmp = CloseSession
Graph = SET_VALUE(Graph, "LasDate2", LastTradeDate)
end if
else
' Днейвной 
LTD = Get_Value(Graph,"LasDate2")
LTD = DECData(LTD,3,1) 
Graph = SET_VALUE(Graph, "LasDate2", LTD)
end if        
        
GGraph = GET_CANDLE_EX(GID, Get_Value(Graph,"LasDate2"), tmp)
if GInt = 14 then
' Днейвной 
FindFlag = 0
GGraph2 = GET_CANDLE_EX(GID, Get_Value(Graph,"LasDate1"), tmp)
for k from 1 to 10
if (GGraph <> GGraph2) and (GGraph <> "") and (GGraph2 <> "") then
   LT1 = Get_Value(GGraph,"TIME")
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
   FindFlag = 1 
    else
LTD = Get_Value(Graph,"LasDate2")
LTD = DECData(LTD,3,1) 
Graph = SET_VALUE(Graph, "LasDate2", LTD)    
GGraph = GET_CANDLE_EX(GID, Get_Value(Graph,"LasDate2"), tmp)
end if
if FindFlag = 1 then
Break
end if
end for
else
' внутри дня 
if GGraph <> "" then
   LT1 = Get_Value(GGraph,"TIME")
   if ((LT1+0 <> 0) and (LT1+0 <> GCandleTime+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 if

end for
if FC = GET_COLLECTION_COUNT(Graphs)+0 then
FindFlag = 1
else
FindFlag = 0
' WriteMsgLog(1,13,1,1,"Период графиков по бумаге с кодом '"&GET_VALUE(Stock,"SecCode")&"' не соответствует заданному")
        Result = -3
        Return
end if
Stock = SET_VALUE(Stock,"Graphs",Graphs)
CStocks = SET_COLLECTION_ITEM(CStocks,i,Stock)
end for

' Message(Graph,1)

end if
Result = 0

END FUNC


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

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

tmpTime = GET_VALUE(Stock,"LastTime")
tmpTrade = TradeDate 
        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
' Graphs = GET_COLLECTION_ITEM(Graphs,"NAME",Get_Value(GGraph,"NAME"))
'        Message(Get_Value(GGraph,"name"),1)
else
WriteMsgLog(1,12,1,1,"Не найден график: '"&GID&"' по бумаге: "&GET_VALUE(Stock,"SecCode"))
        Result = -2
        Return
end if
end for

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)

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

trans_params = ""
trans_params = set_value (trans_params, "TRANS_ID", 7&TradeTime)
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 GetZTranz(AAcc, ACd, ASt, ANo, AOper)
' AAcc - номер счета
' ACd - код бумаги
' ASt - статус заявок (KILLED, FILLED, ACTIVE)
NEW_GLOBAL("OrderKillTime","")
NEW_GLOBAL("OrderPrice",0)
NEW_GLOBAL("OrderQty",0)
NEW_GLOBAL("OrderOper","")

    zgaZ = 0
zgaCount = GET_NUMBER_OF("ORDERS")+0
if zgaCount > 0 then
for zgaI from 1 to zgaCount
zgaSTR = GET_ITEM("ORDERS", zgaI)
zgaAc = Get_Value(zgaSTR, "ACCOUNT")
        zgaCd = Get_Value(zgaSTR, "SECCODE")
zgaStat = Get_Value(zgaSTR, "STATUS")
zgaNo = Get_Value(zgaSTR, "NUMBER")+0
zgaOper = Get_Value(zgaSTR, "OPERATION")
if zgaOper = "BUY" then
OrderOper = "B"
else
   OrderOper = "S"
end if
if (zgaAc = AAcc) and (ACd = zgaCd) and ((ASt = zgaStat) or (ASt = "")) and ((zgaNo=ANo+0) or (ANo = 0)) then
if (zgaOper = AOper) or (AOper = "") then 
zgaZ = zgaZ + 1
end if
OrderPrice = Get_Value(zgaSTR, "PRICE")+0
OrderQty = Get_Value(zgaSTR, "QUANTITY")+0
OrderKillTime = Get_Value(zgaSTR, "WITHDRAW_TIME")  
end if
end for
end if
Result = zgaZ

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","DPrice")
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", "Fast MA")
Graph=SET_VALUE(Graph, "ID","FMA")
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)
Graph = CREATE_MAP()
Graph=SET_VALUE(Graph, "Status", 0)
Graph=SET_VALUE(Graph, "NAME", "Slow MA")
Graph=SET_VALUE(Graph, "ID","SMA")
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,2,Graph)
Graph = CREATE_MAP()
Graph=SET_VALUE(Graph, "Status", 0)
Graph=SET_VALUE(Graph, "NAME", "Dev")
Graph=SET_VALUE(Graph, "ID","Dev")
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,3,Graph)
StrPrms = CREATE_MAP()
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", "LKOH")
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",1)
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",1)
Stock=SET_VALUE(Stock, "StrName","MA&Dev")
Stock=SET_VALUE(Stock, "StrPrms", StrPrms)
Stock=SET_VALUE(Stock, "Graphs", Graphs)
Stock=SET_VALUE(Stock, "GInt", 1)
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", "000000")
Stock=SET_VALUE(Stock, "CloseSession", "235959")
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, "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, "ProfitStep", 0.2)
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, "LossStep", 0.2)
CStocks = INSERT_COLLECTION_ITEM(CStocks,GET_COLLECTION_COUNT(CStocks),Stock)
END FUNC

'<< Init

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