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

Стратегия «Боллинджер и сигнальная скользящая средняя»



Стратегия основана на том, что цена может двигаться настолько активно, что будет выходить за рамки собственного отклонения от среднего значения.

Боллинджер верхний – это верхняя красная линия (30 периодов).
Боллинджер средний – это средняя красная линия (в стратегии не используется).
Боллинджер нижний – это нижняя красная линия (в стратегии не используется).
Скользящая средняя – это синяя линия.

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


Сигнал на покупку возникает, после того, как, синяя линия закроется выше верхней красной линии Боллинджера.

Данная стратегия использует только верхний сигнал при расширении крайних полос Боллинджера.

Спекулятивность или инвестиционность стратегии регулируется тайм-фреймом (интервалом рисования свечи или бара).

Меньший тайм-фрейм цены (1, 3, 5 минут) означает спекулятивность стратегии.
Средний тайм-фрейм цены (15, 30, 60 минут) означает среднесрочность стратегии.
Больший тайм-фрейм цены (4 часа, день) означает инвестиционность стратегии.

Стратегия на использовании верхней линии Боллинджера подразумевает использование коротких стопов, в основном это Тейк профиты, выставляемые по процентной цели. Стратегия на использовании Боллинджера хороша тем, что этот индикатор содержит в себе «Конверт скользящих средних», показывающих коридор цен, и стандартное отклонение, показывающее тренд, который торгуем.


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



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

'Start >> ===================================== Главные настройки >>
NEW_GLOBAL("PathToRob","H:\INFO\WD Passport (G)\КЛИЕНТЫ\TradeMakerTM\TM\TM\Qpile")
'End >>

'Extended Расширенные настройки
NEW_GLOBAL("CStocks", CREATE_COLLECTION())
NEW_GLOBAL("FileNmLog",PathToRob&"\log\TMqpl.log")
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,"Все параметры определены. Режим торговли")

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

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

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

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

    FirstStart = 0
' message(TradeTime,1)   

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) 
if (Ost > 0) and (PStopPrice < LStopPrice) then
                Break
    else
if (Ost < 0) and (PStopPrice > LStopPrice) then
                Break
    end if
    end if
                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, ABS(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, ABS(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, ABS(Ost),"4001")+0
else
Rez = Send_StopTrans(CliCode, Account, ClassCode, SecCode, "B", PStopPrice,Spred, LStopPrice, PriceSLOrder, ABS(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, ABS(Ost),"4002")+0
else
Rez = Send_StopTrans(CliCode, Account, ClassCode, SecCode, "B", PStopPrice,Spred, 0, 0, ABS(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, ABS(Ost),"4003")+0
else
Rez = Send_StopTrans(CliCode, Account, ClassCode, SecCode, "B", 0,0, LStopPrice, PriceSLOrder, ABS(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
UseTakeProfit = GET_VALUE(Stock,"UseTakeProfit")+0 
UseStopLoss = GET_VALUE(Stock,"UseStopLoss")+0
        
' (((AcceptOst = Ost) and (Pl = 0)) or ((Pl = 1) and (AcceptOst = 0)))
                                                
        if (OpenS = 1) and (  (CloseStop = 1) or ( (CloseStop = 0) and  ((Ost = 0) or ((UseTakeProfit = 0) and (UseStopLoss = 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



'Strategy>>
if NoStr = 7 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) = 3 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 
Graph = GET_COLLECTION_ITEM(Graphs,1)
if GET_VALUE(Graph,"Count")+0 > 1 then
BCurS = GET_VALUE(Graph,"Cur")+0 
BLasS1 = GET_VALUE(Graph,"Las1")+0 
BLasS2 = GET_VALUE(Graph,"Las2")+0
Graph = GET_COLLECTION_ITEM(Graphs,2)
if GET_VALUE(Graph,"Count")+0 > 1 then
ECurS = GET_VALUE(Graph,"Cur")+0 
ELasS1 = GET_VALUE(Graph,"Las1")+0 
ELasS2 = GET_VALUE(Graph,"Las2")+0
ContrTrend = GET_VALUE(StrPrms,"ContrTrend")+0
        be = GetCross(BLasS1,ELasS1,BLasS2,ELasS2)+0
        if ContrTrend = 0 then
' Определяем Long signal
if (FlagPos <> 1) then 
if (be = 1) and (BLasS1 > BLasS2) 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 (be = 2) and (BLasS1 < BLasS2) 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 (be = 1) and (BLasS1 > BLasS2) 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 <> 1) then
if (be = 2) and (BLasS1 < BLasS2) 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
   Wait = 2
 else
   Wait = 0
end if
else
if isSig = 2 then
if ((Wait=5) and (FirstStart = 1)) or (Wait = 1) then
   isSig = 0
     Wait = 1
 else
   Wait = 0
end if
else
if FlagPos = 1 then
Wait = 2
else
if FlagPos = 2 then
Wait = 1
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


'<<Strategy

' 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) then 'and (FlagPos <> 1) 
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) then 'and (FlagPos <> 2) 
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")  

fnd = 0
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) and (GCandleTime+0 <> 0) then

GGraph = GET_CANDLE_EX(GID, TradeDate, LastCandleTime)
if GGraph <> "" then
fnd = fnd + 1
end if

end if
end if 

' Сохраняемся
Graphs = SET_COLLECTION_ITEM(Graphs,GIndex,GInfo)
 
end if
    end for
    
    if fnd = GET_COLLECTION_COUNT(Graphs)+0 then

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) and (GCandleTime+0 <> 0) then

GGraph = GET_CANDLE_EX(GID, TradeDate, LastCandleTime)
if GGraph <> "" then
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

end if
end if 

' Сохраняемся
Graphs = SET_COLLECTION_ITEM(Graphs,GIndex,GInfo)
 
end if
   end for


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

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
MaxIzm = 0
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
bid = GET_VALUE(Stock,"Bid")+0 
offer = GET_VALUE(Stock,"Offer")+0 
Pl = GET_VALUE(Stock,"PlatForm")+0 

LotSize = GET_VALUE(Stock,"LotSize")+0

if SrvPrice > 0 then
if Ost > 0 then
string = set_value(string, "FPos", "Long")
bVol = Ost*SrvPrice
sVol = Ost*bid
IzmP = sVol/bVol*100-100
IzmR = sVol-bVol
if Pl = 0 then
                IzmR = IzmR * LotSize
else
                    IzmP = IzmP * LotSize
end if
else
if Ost < 0 then
string = set_value(string, "FPos", "Short")
bVol = ABS(Ost)*SrvPrice
sVol = ABS(Ost)*offer
IzmP = bVol/sVol*100-100
IzmR = bVol-sVol
if Pl = 0 then
                IzmR = IzmR * LotSize
else
                    IzmP = IzmP * LotSize
end if
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, "FBid", bid)
string = set_value(string, "FOffer", offer)
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)
if Pl = 0 then
string = set_value(string, "FTrv", ABS(Ost*CurPrice)*LotSize)
else
string = set_value(string, "FTrv", ABS(Ost*CurPrice))
end if
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

IzmR = ABS(Ost)*SrvPrice
MaxIzm = MaxIzm + IzmR
Stock = SET_VALUE(Stock,"IzmR",izmR) 
CStocks = SET_COLLECTION_ITEM(CStocks,i,Stock)

end for
for i from 0 to GET_COLLECTION_COUNT(CStocks)-1
string = ""
Stock = GET_COLLECTION_ITEM(CStocks,i)
IzmR = GET_VALUE(Stock,"IzmR")+0
if (IzmR = 0) or (MaxIzm = 0) then
string = set_value(string, "FDol", 0)
else
string = set_value(string, "FDol", IzmR/MaxIzm*100)
end if
modify_item(i+1, string)
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
bid = GET_VALUE(Stock,"Bid")+0 
offer = GET_VALUE(Stock,"Offer")+0
LotSize = GET_VALUE(Stock,"LotSize")+0

if SrvPrice > 0 then
if Ost > 0 then
string = set_value(string, "FPos", "Long")
bVol = Ost*SrvPrice
sVol = Ost*bid
IzmP = sVol/bVol*100-100
IzmR = sVol-bVol
if Pl = 0 then
                IzmR = IzmR * LotSize
else
                    IzmP = IzmP * LotSize
end if
else
if Ost < 0 then
string = set_value(string, "FPos", "Short")
bVol = ABS(Ost)*SrvPrice
sVol = ABS(Ost)*offer
IzmP = bVol/sVol*100-100
IzmR = bVol-sVol
if Pl = 0 then
                IzmR = IzmR * LotSize
else
                    IzmP = IzmP * LotSize
end if
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)
if Pl = 0 then
string = set_value(string, "FTrv", ABS(Ost*CurPrice)*LotSize)
else
string = set_value(string, "FTrv", ABS(Ost*CurPrice))
end if
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
LotSize = GET_VALUE(Stock,"LotSize")+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
Price = Get_Value(tSTR, "PRICE")+0
' Vol = Get_Value(tSTR, "VALUE")+0
Vol = Price*Qty

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 (pl = 0) and (SrvPrice <> 0) then
' SrvPrice = SrvPrice/LotSize
' end if
' << new

if (Ost <> 0) and (SrvPrice = 0) and (ClosePrice > 0) then
  SrvPrice = ClosePrice
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 = GetNumTTP(Cs,Sc,"LOTSIZE")+0
if tmp = 0 then
WriteMsgLog(1,24,1,1,"Недоступен параметр: 'Размер лота' по бумаге: "&Sc)
                Stock=SET_VALUE(Stock, "LotSize", 0)
  else
                Stock=SET_VALUE(Stock, "LotSize", tmp+0)
            end if

' 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)
StepP = GET_VALUE(Stock, "StepP")+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)
STStepP = GET_VALUE(Stock, "STStepP")+0

            Stock=SET_VALUE(Stock, "LotSize", StepP/STStepP)
            
  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 = "20110124"
'        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 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
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
   tmpTime = DECTime(tmpTime,3,GInc)
   if tmpTime+0 < GET_VALUE(Stock,"OpenSession")+0 then
    tmpTrade = LastTradeDate
   end if
        FC = 0
end if
end for

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

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","BEPrice")
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,GET_COLLECTION_COUNT(Graphs),Graph)

Graph = CREATE_MAP()
Graph=SET_VALUE(Graph, "Status", 0)
Graph=SET_VALUE(Graph, "NAME", "Bollinger Bands")
Graph=SET_VALUE(Graph, "ID","BEBol")
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,GET_COLLECTION_COUNT(Graphs),Graph)

Graph = CREATE_MAP()
Graph=SET_VALUE(Graph, "Status", 0)
Graph=SET_VALUE(Graph, "NAME", "Envelopes")
Graph=SET_VALUE(Graph, "ID","BEEnv")
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,GET_COLLECTION_COUNT(Graphs),Graph)

StrPrms = CREATE_MAP()
StrPrms=SET_VALUE(StrPrms, "Wait", 0)
StrPrms=SET_VALUE(StrPrms, "CloseStop", 1)
StrPrms=SET_VALUE(StrPrms, "ContrTrend", 0)
Stock = CREATE_MAP()
Stock=SET_VALUE(Stock, "NAME", "")
Stock=SET_VALUE(Stock, "PlatForm",0)
Stock=SET_VALUE(Stock, "Account","L01-00000F00")
Stock=SET_VALUE(Stock, "CliCode","101904")
Stock=SET_VALUE(Stock, "ClassCode", "QJSIM")
Stock=SET_VALUE(Stock, "SecCode", "MSNG")
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.2)
Stock=SET_VALUE(Stock, "TypeSpred",0)
Stock=SET_VALUE(Stock, "GInt", 5)
Stock=SET_VALUE(Stock, "StrNo",7)
Stock=SET_VALUE(Stock, "StrName","Bol&Env")
Stock=SET_VALUE(Stock, "UseTakeProfit", 0)
Stock=SET_VALUE(Stock, "ProfitType", 2)
Stock=SET_VALUE(Stock, "ProfitVol", 0.2)
Stock=SET_VALUE(Stock, "ProfitSpred", 0.5)
Stock=SET_VALUE(Stock, "ProfitTypeSpred", 0)
Stock=SET_VALUE(Stock, "ProfitStep", 0)
Stock=SET_VALUE(Stock, "PDelta",0)
Stock=SET_VALUE(Stock, "UseStopLoss", 1)
Stock=SET_VALUE(Stock, "LossType", 2)
Stock=SET_VALUE(Stock, "LossVol", 0.2)
Stock=SET_VALUE(Stock, "LossSpred", 0.5)
Stock=SET_VALUE(Stock, "LossTypeSpred", 0)
Stock=SET_VALUE(Stock, "LossStep", 0)
Stock=SET_VALUE(Stock, "LDelta",0)
Stock=SET_VALUE(Stock, "LotSize", 0)
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, "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, "StrPrms", StrPrms)
Stock=SET_VALUE(Stock, "Graphs", Graphs)
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", "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)
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

FUNC GetCross(ax1,bx1,ax2,bx2)
' Точки отрезков
' a и b - отрезоки
' -1 - не пересекаются 
' 0 - совпадают
' 1 - снизу вверх 
' 2 - сверху вниз 

Result = -1
if (ax1=bx1) and (ax2=bx2) then
Result = 0
else
if ((ax1>=bx1) and (ax2<bx2)) or ((ax1>bx1) and (ax2<=bx2)) then
Result = 1
else
if ((ax1<=bx1) and (ax2>bx2)) or ((ax1<bx1) and (ax2>=bx2)) then
Result = 2
end if
end if
end if

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 FBid;
PARAMETER_TITLE Спрос;
PARAMETER_DESCRIPTION Спрос;
PARAMETER_TYPE NUMERIC(10,5);
END

PARAMETER FOffer;
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

PARAMETER FDol;
PARAMETER_TITLE Доля в портфеле, %;
PARAMETER_DESCRIPTION Доля в портфеле, %;
PARAMETER_TYPE NUMERIC(10,2);
END

END_PORTFOLIO_EX