понедельник, 12 августа 2013 г.

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


Примечание: после публикации роботов, размещу описание данных стратегий.

PORTFOLIO_EX TradeMaker_2;
DESCRIPTION TradeMaker_R2;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST InvestSoft;
PROGRAM

'Start >> ===================================== Настройки >>
NEW_GLOBAL("ClientCode","101902")
NEW_GLOBAL("Account","L01-00000F00")
NEW_GLOBAL("ClassCode","EQNL")
NEW_GLOBAL("StockCode","MTSI")
NEW_GLOBAL("GIntrval",1)
NEW_GLOBAL("GPrice_id","R2Price")
NEW_GLOBAL("GS1_id","R2S1")
NEW_GLOBAL("GS2_id","R2S2")
NEW_GLOBAL("GS3_id","R2S3")
NEW_GLOBAL("SumTrade",1)
NEW_GLOBAL("OpenSession","102959")
NEW_GLOBAL("CloseSession","184459")
NEW_GLOBAL("UseLong",1)
NEW_GLOBAL("UseShort",1)
NEW_GLOBAL("TypeTranz","M")
NEW_GLOBAL("Spred",0)
NEW_GLOBAL("UseLab",1)
NEW_GLOBAL("DeltaS3",0.0)
'End >> ================================================= <<

NEW_GLOBAL("Start_Flag",1)
NEW_GLOBAL("TradeDate","")
NEW_GLOBAL("LastTradeDate","")
NEW_GLOBAL("TradeTime","")
NEW_GLOBAL("NextTimeIntrvl","")
NEW_GLOBAL("IncTimeIntrvl",1)
NEW_GLOBAL("Graphs",CREATE_COLLECTION())

NEW_GLOBAL("FlagPos",0)
NEW_GLOBAL("ZDeltaTime",0)
NEW_GLOBAL("DeltaCandle","")
NEW_GLOBAL("EndDeltaCandle","")
NEW_GLOBAL("EndInt",0)
NEW_GLOBAL("LastCandleTime","")
NEW_GLOBAL("NoOrder", 0)
NEW_GLOBAL("SigFlag", 0)
NEW_GLOBAL("CloseDeltaPos", 0)

NEW_GLOBAL("GCross_1", 0)
NEW_GLOBAL("GCross_2", 0)

NEW_GLOBAL("UpLab",0)
NEW_GLOBAL("DownLab",0)

'==========================

IF (IS_CONNECTED() == 1) and (Start_Flag = 0) then
Start_Flag = 1
END IF

IF (IS_CONNECTED() == 0) and (Start_Flag <> 0)
Start_Flag = 0
END IF

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

ReadGraph()              
RunSignal()
   ViewMain(2)

' G1 = Get_Value(GET_COLLECTION_ITEM(Graphs, 0),"LasTime2")
' G1 = G1&">"&Get_Value(GET_COLLECTION_ITEM(Graphs, 0),"Las2")
' G1 = G1&" "&Get_Value(GET_COLLECTION_ITEM(Graphs, 0),"LasTime1")
' G1 = G1&">"&Get_Value(GET_COLLECTION_ITEM(Graphs, 0),"Las1")
' G1 = G1&" "&Get_Value(GET_COLLECTION_ITEM(Graphs, 0),"CurTime")
' G1 = G1&">"&Get_Value(GET_COLLECTION_ITEM(Graphs, 0),"Cur")
' Message(TradeTime&" "&G1,1)
' Message(DeltaCandle&" "&EndDeltaCandle,1)

end if                                          

ELSE

' Читаем дату 
  TradeDate = GetTD() 
    LastTradeDate = GetNumTTP(ClassCode,StockCode,"PREVDATE")

' Читаем время 
    TradeTime = GET_INFO_PARAM("SERVERTIME")
TradeTime = SUBSTR(TradeTime, 0, 2)&SUBSTR(TradeTime, 3, 2)&SUBSTR(TradeTime, 6, 2)

GInfo = GET_COLLECTION_ITEM(Graphs, 0)
GID = Get_Value(GInfo,"ID")
GGraph = GET_CANDLE_EX(GID, TradeDate, TradeTime)

    ViewMain(1)

IF (Start_Flag == 1) and (GGraph <> "") and (TradeTime+0 <> 0) then 

    ' Инициализируем данные
        Init()
        
GetIncTime()  
        DELETE_ALL_LABELS(GPrice_id)
     
        Start_Flag = 2
        
' Только в рабочем QUIK
pd = GetNumTTP(ClassCode, StockCode, "PREVDATE") 
if pd+0 <> 0 then
GetLastCandle()        
end if
   
    END IF ' Флаг 1
    
END IF ' Флаг 2

'===================== FUNCTIONS =================
' Функция формирования торгового сигнала
FUNC RunSignal()

ActivTranz = GetZTranz(Account,StockCode,"ACTIVE",NoOrder)

if (ActivTranz = 0) and (Get_Value(GET_COLLECTION_ITEM(Graphs, 1),"Count")+0 > 1) and (Get_Value(GET_COLLECTION_ITEM(Graphs, 2),"Count")+0 > 1) and (Get_Value(GET_COLLECTION_ITEM(Graphs, 3),"Count")+0 > 1) then

Ost = GeDepoLimitPrm(Account, StockCode, "CURRENT_BALANCE")+0
if Ost = 0 then 
FlagPos = 0
end if
if Ost > 0 then 
FlagPos = 1
end if
if Ost < 0 then 
FlagPos = 2
end if

' Формируем сигнал
Sig = 0  
Cross = 0

if EndInt = 1 then

' По окончанию интервала свечи
' Первое пересечение
Cross = GCross(1,2,2, 0)
       if (Cross = 2) and ( GZn(1,1) < GZn(3,1) ) and ( GZn(2,1) < GZn(3,1) ) then 
' long 
Sig = 11
       end if
       if (Cross = 3) and ( GZn(1,1) > GZn(3,1) ) and ( GZn(2,1) > GZn(3,1) ) then 
' short 
Sig = 22 
       end if
       
Message("R2 "&TradeTime&" "&Sig,1)

EndInt = 0
end if

' Long & Reverse
        if (Sig = 11) 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)
LabText = " Close Short >> Open Long"
FlagPos = 1
 else
' Close short
Qty = ABS(Ost)
Message("Close Short "&TradeTime,1)
LabText = " Close Short"
FlagPos = 0
 end if
  else
        ' cash position
     if UseLong = 1 then
Qty = SumTrade
Message("Open Long "&TradeTime,1)
LabText = " Open Long"
FlagPos = 1
 else
Qty = 0
 end if
end if

            ' Send tranz
if Qty > 0 then 

ZType = TypeTranz
if UseLab = 1 then
       SetLabel("B", TradeDate, TradeTime, GPrice_id, Get_Value(GET_COLLECTION_ITEM(Graphs, 0),"Cur"), TradeTime&LabText, LabText)
end if
        Send_Trans(ClientCode, Account, ClassCode, StockCode, "B", Get_Value(GET_COLLECTION_ITEM(Graphs, 0),"Cur")+Spred, Qty, ZType)
end if  
end if        

' Short & Reverse
if (Sig = 22) 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)
LabText = " Close Long >> Open Short"
FlagPos = 2
 else
' Close long
Qty = ABS(Ost)
Message("Close Long "&TradeTime,1)
LabText = " Close Long"
FlagPos = 0
 end if
  else
        ' cash position
     if UseShort = 1 then
Qty = SumTrade
Message("Open Short "&TradeTime,1)
LabText = " Open Short"
FlagPos = 2
 else
Qty = 0
 end if
end if

            ' Send tranz
if Qty > 0 then 
ZType = TypeTranz
if UseLab = 1 then
       SetLabel("S", TradeDate, TradeTime, GPrice_id, Get_Value(GET_COLLECTION_ITEM(Graphs, 0),"Cur"), TradeTime&LabText, LabText)
end if
        Send_Trans(ClientCode, Account, ClassCode, StockCode, "S", Get_Value(GET_COLLECTION_ITEM(Graphs, 0),"Cur")-Spred, Qty, ZType)
end if  
end if

    end if

END FUNC

' Функция чтения пропущенной свечи в момент первого запуска
FUNC GetLastCandle()

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)
   GCandleTime = Get_Value(GGraph,"TIME")
   LastCandleTime = GCandleTime
   
GInfo = SET_VALUE(GInfo, "CurTime", TradeTime)
GInfo = SET_VALUE(GInfo, "CurDate", TradeDate)
GInfo = SET_VALUE(GInfo, "Cur", GV)

GInfo = SET_VALUE(GInfo, "LasTime1", GCandleTime)
GInfo = SET_VALUE(GInfo, "LasDate1", TradeDate)
GInfo = SET_VALUE(GInfo, "Las1", GV)
GInfo = SET_VALUE(GInfo, "LasTime2", GCandleTime)
GInfo = SET_VALUE(GInfo, "LasDate2", TradeDate)
GInfo = SET_VALUE(GInfo, "Las2", GV)

            FindFlag = 0
            ' Чтение пропущенных данных за 2 интервала
            LasTime1 = DECTime(GCandleTime,3,IncTimeIntrvl)
GGraph = GET_CANDLE_EX(GID, Get_Value(GInfo,"LasDate1"), LasTime1)
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)
GInfo = SET_VALUE(GInfo, "LasTime1", LasTime1)
GInfo = SET_VALUE(GInfo, "Las1", GV)
GInfo = SET_VALUE(GInfo, "Count", Get_Value(GInfo,"Count")+1)
FindFlag = 1
   end if
            end if

            if FindFlag = 0 then
Ltd = GetNumTTP(ClassCode, StockCode, "PREVDATE")
            LasTime1 = CloseSession
GGraph = GET_CANDLE_EX(GID, Ltd, LasTime1)
if GGraph <> "" then
LT1 = Get_Value(GGraph,"TIME")
   if (LT1+0 <> 0) then
LasTime1 = LT1
GL = Get_Collection_Item(Get_Value(GGraph, "LINES"), GCur)
   GV = Get_Value(GL, gsField)
GInfo = SET_VALUE(GInfo, "LasTime1", LasTime1)
GInfo = SET_VALUE(GInfo, "LasDate1", Ltd)
GInfo = SET_VALUE(GInfo, "Las1", GV)
GInfo = SET_VALUE(GInfo, "Count", Get_Value(GInfo,"Count")+1)
FindFlag = 2
end if
end if              
    end if

if FindFlag <> 0 then 
FindFlag = 0

                GInfo = SET_VALUE(GInfo, "LasDate2", Get_Value(GInfo,"LasDate1"))
           LasTime2 = DECTime(LasTime1,3,IncTimeIntrvl)
GGraph = GET_CANDLE_EX(GID, Get_Value(GInfo,"LasDate2"), LasTime2)
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)
GInfo = SET_VALUE(GInfo, "LasTime2", LasTime2)
GInfo = SET_VALUE(GInfo, "Las2", GV)
GInfo = SET_VALUE(GInfo, "Count", Get_Value(GInfo,"Count")+1)
FindFlag = 1
   end if
           end if

           if FindFlag = 0 then
Ltd = GetNumTTP(ClassCode, StockCode, "PREVDATE")
            LasTime2 = CloseSession
GGraph = GET_CANDLE_EX(GID, Ltd, LasTime2)
if GGraph <> "" then
LT1 = Get_Value(GGraph,"TIME")
   if (LT1+0 <> 0) then
LasTime2 = LT1
GL = Get_Collection_Item(Get_Value(GGraph, "LINES"), GCur)
   GV = Get_Value(GL, gsField)
GInfo = SET_VALUE(GInfo, "LasTime2", LasTime2)
GInfo = SET_VALUE(GInfo, "LasDate2", Ltd)
GInfo = SET_VALUE(GInfo, "Las2", GV)
GInfo = SET_VALUE(GInfo, "Count", Get_Value(GInfo,"Count")+1)
FindFlag = 2
end if
end if              
  end if

end if

' Message(Get_Value(GInfo,"LasDate1")&" "&Get_Value(GInfo,"LasTime1")&" "&Get_Value(GInfo,"Las1"),1)
' Message(Get_Value(GInfo,"LasDate2")&" "&Get_Value(GInfo,"LasTime2")&" "&Get_Value(GInfo,"Las2"),1)

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

END FUNC

' Функция вывода основных параметров
FUNC ViewMain(vmType)

' Первый запуск
if vmType = 1 then  
   DELETE_ALL_ITEMS()
        ViewFlag = 1
else
        ViewFlag = 2
  end if

Ost = GeDepoLimitPrm(Account, StockCode, "CURRENT_BALANCE")+0
string = ""
string = set_value(string, "FStock", GET_VALUE(GET_SECURITY_INFO(ClassCode,StockCode),"SHORT_NAME"))
string = set_value(string, "FCurPrice", GetNumTTP(ClassCode,StockCode,"last"))
if Ost > 0 then 
string = set_value(string, "FPos", "Long")
end if
if Ost < 0 then 
string = set_value(string, "FPos", "Short")
end if
if Ost = 0 then 
string = set_value(string, "FPos", "Cash")
end if
SrvPrice = GeDepoLimitPrm(Account, StockCode, "WA_POSITION_PRICE")+0
string = set_value(string, "FTranzPrice", SrvPrice)
string = set_value(string, "FLots", Ost)
string = set_value(string, "FTrv", SrvPrice*ABS(Ost))

CCash = 0
CPer = 0
if Ost > 0 then
BPrice = GetNumTTP(ClassCode, StockCode, "BID")+0
        Z1 = SrvPrice*Ost
        Z2 = BPrice*Ost
        CCash = Z2-Z1
        CPer = (Z2*100)/Z1-100
end if
if Ost < 0 then
BPrice = GetNumTTP(ClassCode, StockCode, "OFFER")+0
        Z1 = SrvPrice*ABS(Ost)
        Z2 = BPrice*ABS(Ost)
        CCash = Z1-Z2
CPer = (Z1*100)/Z2-100  
end if
string = set_value(string, "FChaCash", CCash)
string = set_value(string, "FChaPer", CPer)
ViewLine(1, ViewFlag, string)
if CCash > 0 then 
SET_ROW_COLOR_EX (1, "RGB(178,246,160)", "RGB(123,239,91)", "RGB(0,0,0)", "RGB(0,0,0)")
else
if CCash < 0 then 
SET_ROW_COLOR_EX (1, "RGB(253,185,185)", "RGB(255,139,139)", "RGB(0,0,0)", "RGB(0,0,0)")
else
if CCash = 0 then 
SET_ROW_COLOR_EX (1, "DEFAULT_COLOR", "DEFAULT_COLOR", "DEFAULT_COLOR", "DEFAULT_COLOR")
end if
end if
end if
    
END FUNC

' Функция вывода строки в таблицу
FUNC ViewLine(vl_Num, vl_Type, vl_Str)
if vl_Type = 1 then
add_item(vl_Num, vl_Str)
else
modify_item(vl_Num, vl_Str)
end if
END FUNC

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

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

sStockScale = GET_VALUE(GET_PARAM_EX(sClass, sCode, "SEC_SCALE"), "param_value")
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)
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)
NoOrder = get_value(trans_result, "ORDER_NUMBER")+0
                
END FUNC

' Функция возвращает параметр тиблицы лимитов по денежным средствам
FUNC GetMoneyLimitPrm(APrm)

Result = ""
gcCount = GET_NUMBER_OF("MONEY_LIMITS")+0
if gcCount > 0 then
for gcI from 1 to gcCount
gcSTR = GET_ITEM("MONEY_LIMITS", gcI)
gcCL = Get_Value(gcSTR, APrm)
if gcCL <> "" then
Result = gcCL
Return
end if
end for
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
end if

END FUNC 

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

if (GIntrval >= 1) and (GIntrval <= 6) then
IncTimeIntrvl = 60*GIntrval
end if
if GIntrval = 7 then
IncTimeIntrvl = 600
end if
if GIntrval = 8 then
IncTimeIntrvl = 900
end if
if GIntrval = 9 then
IncTimeIntrvl = 1200
end if
if GIntrval = 10 then
IncTimeIntrvl = 1800
end if
if GIntrval = 11 then
IncTimeIntrvl = 3600
end if
if GIntrval = 12 then
IncTimeIntrvl = 7200
end if
if GIntrval = 13 then
IncTimeIntrvl = 14400
end if

if (GIntrval > 13) and (GIntrval < 1) then
Message("Неверно указан интервал графиков",2)
Start_Flag = 10
end if

END FUNC

' Инкремент времени
FUNC INCTime(Ti, INC, S)
' INC =>>
' 1 часы 
' 2 минуты
' 3 секунды
    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 INC = 1 
Ti = Ti + S*3600
ELSE
IF INC = 2 
Ti = Ti + S*60
ELSE
Ti = Ti + S
END IF
END IF

IF Ti > 86400
Ti = Ti-86400
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 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 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 SetLabel(Oper, DateLabel, TimeLabel, IDCENA, LabelPrCena, Hint, AText)

LabelPath = "bmp/"
label_params=create_map()

label_params=set_value(label_params,"ALIGNMENT", "TOP")
label_params=set_value(label_params,"IMAGE_PATH", LabelPath&"L.bmp")

IF Oper = "B"
label_params=set_value(label_params,"ALIGNMENT", "BOTTOM")
label_params=set_value(label_params,"IMAGE_PATH", LabelPath&"B.bmp")
ELSE
if Oper = "S"
label_params=set_value(label_params,"ALIGNMENT", "TOP")
label_params=set_value(label_params,"IMAGE_PATH", LabelPath&"S.bmp")
end if
if Oper = "p"
label_params=set_value(label_params,"ALIGNMENT", "BOTTOM")
label_params=set_value(label_params,"IMAGE_PATH", LabelPath&"Lp.bmp")
end if
if Oper = "m"
label_params=set_value(label_params,"ALIGNMENT", "TOP")
label_params=set_value(label_params,"IMAGE_PATH", LabelPath&"Lm.bmp")
end if

END IF
label_params=set_value(label_params,"R", 0)
label_params=set_value(label_params,"G", 176)
label_params=set_value(label_params,"B", 80)
label_params=set_value(label_params,"TEXT", "") 'AText
label_params=set_value(label_params,"YVALUE", LabelPrCena)
label_params=set_value(label_params,"DATE", DateLabel)
label_params=set_value(label_params,"TIME", TimeLabel)

label_params=set_value(label_params,"TRANSPARENCY", 0)
label_params=set_value(label_params,"FONT_FACE_NAME", "Arial")
label_params=set_value(label_params,"FONT_HEIGHT", 14)
label_params=set_value(label_params,"HINT", Hint)
Result=ADD_LABEL(IDCENA, label_params)

END FUNC

' Функция возвращает значение свечи графика   
FUNC GZn(GNo, CNo)
' GNo - номер графика
' CNo - номер свечи
'0 - cur
'1 - las1
'2 - las2 

    Result = 0
    
gcG = GET_COLLECTION_ITEM(Graphs, GNo)
gcCount1 = Get_Value(gcG,"Count")+0 

if (gcCount1 > 0) then
if CNo = 0 then
Result = Get_Value(gcG,"Cur")+0
end if
if CNo = 1 then
Result = Get_Value(gcG,"Las1")+0
end if
if (gcCount1 > 1) and (CNo = 2) then
Result = Get_Value(gcG,"Las2")+0
end if
end if  

END FUNC

' Функция определения движения графика   
FUNC GMove(GNo, CandleNo)
'0 - горизонтальное движение
'1 - График1 движется вверх
'2 - График1 движется вниз

    Result = -1
    
gcG = GET_COLLECTION_ITEM(Graphs, GNo)
gcCount1 = Get_Value(gcG,"Count")+0
if CandleNo = 1 then 
gcLasTime1 = Get_Value(gcG,"CurTime")+0
gcLasTime2 = Get_Value(gcG,"LasTime1")+0
    else
if CandleNo = 2 then 
gcLasTime1 = Get_Value(gcG,"LasTime1")+0
gcLasTime2 = Get_Value(gcG,"LasTime2")+0
end if
end if

if ((gcCount1 > 1) or ((CandleNo = 1) and (gcCount1 > 0))) and (gcLasTime1+0 <> gcLasTime2+0) then

if CandleNo = 1 then 
gcLas1 = Get_Value(gcG,"Cur")+0
gcLas2 = Get_Value(gcG,"Las1")+0
else
if CandleNo = 2 then 
gcLas1 = Get_Value(gcG,"Las1")+0
gcLas2 = Get_Value(gcG,"Las2")+0
end if
end if

if (gcLas1 = gcLas2) then
Result = 0
end if
if (gcLas1 > gcLas2) then
Result = 1
end if
if (gcLas1 < gcLas2) then
Result = 2
end if

end if  

END FUNC

' Функция определения пересечения графиков по концу интервала   
FUNC GCross(G1, G2, CandleNo, DeltaC)
'FN = GCross(График1, График2, CandleNo)
'0 - не пересекаются
'1 - значения совпадают
'2 - График1 пересекает График2 снизу вверх
'3 - График1 пересекает График2 сверху вниз

    Result = 0
    gcFlag = 0
    
gcG1 = GET_COLLECTION_ITEM(Graphs, G1)
gcCount1 = Get_Value(gcG1,"Count")+0 

gcG2 = GET_COLLECTION_ITEM(Graphs, G2)
gcCount2 = Get_Value(gcG2,"Count")+0

if ((gcCount1 > 1) and (gcCount2 > 1)) or ((gcCount1 > 0) and (gcCount2 > 0) and (CandleNo = 1)) then

    if CandleNo = 1 then
gcCur1 = Get_Value(gcG1,"Cur")+0
gcLas1 = Get_Value(gcG1,"Las1")+0
gcCTime1 = Get_Value(gcG1,"CurTime")+0
gcLTime1 = Get_Value(gcG1,"LasTime1")+0

gcCur2 = Get_Value(gcG2,"Cur")+DeltaC
gcLas2 = Get_Value(gcG2,"Las1")+DeltaC
gcCTime2 = Get_Value(gcG2,"CurTime")+0
gcLTime2 = Get_Value(gcG2,"LasTime1")+0
else
    if CandleNo = 2 then
gcCur1 = Get_Value(gcG1,"Las1")+0
gcLas1 = Get_Value(gcG1,"Las2")+0
gcCTime1 = Get_Value(gcG1,"LasTime1")+0
gcLTime1 = Get_Value(gcG1,"LasTime2")+0

gcCur2 = Get_Value(gcG2,"Las1")+DeltaC
gcLas2 = Get_Value(gcG2,"Las2")+DeltaC
gcCTime2 = Get_Value(gcG2,"LasTime1")+0
gcLTime2 = Get_Value(gcG2,"LasTime2")+0
end if
        end if

if ((gcLTime1+0 = gcLTime2+0) and (gcCTime1+0 = gcCTime2+0)) then  
gcFlag = 1
end if

if gcFlag = 1 then
if (gcLas1 = gcLas2) and (gcCur1 = gcCur2) then
Result = 1
else
if (gcLas1 <= gcLas2) and (gcCur1 > gcCur2) then
Result = 2
  else
if (gcLas1 >= gcLas2) and (gcCur1 < gcCur2) then  
Result = 3
end if
end if
end if
end if

end if  

END FUNC

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

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)
   GCandleTime = Get_Value(GGraph,"TIME")
GInfo = SET_VALUE(GInfo, "CurTime", TradeTime)
GInfo = SET_VALUE(GInfo, "CurDate", TradeDate)
GInfo = SET_VALUE(GInfo, "Cur", GV)

if LastCandleTime+0 = 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)

EndInt = 1

  end if

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

if GGraph <> "" then
LastCandleTime = GCandleTime
end if

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 Init()
Graphs = CREATE_COLLECTION()
Graph = CREATE_MAP()
Graph=SET_VALUE(Graph, "Status", 0)
Graph=SET_VALUE(Graph, "ID", GPrice_id)
Graph=SET_VALUE(Graph, "Curve", 0)
Graph=SET_VALUE(Graph, "Field", "Close")
Graph=SET_VALUE(Graph, "Intrvl", GIntrval)
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, "ID", GS1_id)
Graph=SET_VALUE(Graph, "Curve", 0)
Graph=SET_VALUE(Graph, "Field", "Close")
Graph=SET_VALUE(Graph, "Intrvl", GIntrval)
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=SET_VALUE(Graph, "Status", 0)
Graph=SET_VALUE(Graph, "ID", GS2_id)
Graph=SET_VALUE(Graph, "Curve", 0)
Graph=SET_VALUE(Graph, "Field", "Close")
Graph=SET_VALUE(Graph, "Intrvl", GIntrval)
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=SET_VALUE(Graph, "Status", 0)
Graph=SET_VALUE(Graph, "ID", GS3_id)
Graph=SET_VALUE(Graph, "Curve", 0)
Graph=SET_VALUE(Graph, "Field", "Close")
Graph=SET_VALUE(Graph, "Intrvl", GIntrval)
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)

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 GetZTranz(AAcc, ACd, ASt, ANo)
' AAcc - номер счета
' ACd - код бумаги
' ASt - статус заявок (KILLED, FILLED, ACTIVE)

    gaZ = 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 
if (gaAc = AAcc) and (ACd = gaCd) and ((ASt = gaStat) or (ASt = "")) and ((gaNo=ANo+0) or (ANo = 0)) then
gaZ = gaZ + 1
end if
end for
end if
Result = gaZ

END FUNC

END_PROGRAM

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

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

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

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

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

PARAMETER FTrv;
PARAMETER_TITLE Объем;
PARAMETER_DESCRIPTION Объем;
PARAMETER_TYPE NUMERIC(10,2);
END

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

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

END_PORTFOLIO_EX