Юрий (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Скрипт не видит значение индикатора с определенной периодичностью.
 
Не так всё печально! Получилось) Результат - 0:28:32
Скрипт не видит значение индикатора с определенной периодичностью.
 
Я бы вообще сложил всё это в общую сумму, например так: hour*10000+minute*100+sec, и поставил условие, если больше 30, то ок.

По поводу вывести сообщение - совет правильный, но для меня это будет сложно, не программист я...
Скрипт не видит значение индикатора с определенной периодичностью.
 
Методом научного тыка определил, что проблема кроется в этом блоке (297 строка кода):
Скрытый текст
Не нашел информации в каком формате предоставляются данные CONNECTIONTIME.
Знающие люди, подскажите пожалуйста!
Скрипт не видит значение индикатора с определенной периодичностью.
 
Здравствуйте! Помогите разобраться с кодом. Проблема в следующем, тф5, в 9:00:10 (иногда значение секунд другое) на 2 минуты значение индикатора = 0... и так каждые 10 минут, т.е. в 9:10:10, 9:20:10, 9:30:10 и тд до 10 часов! потом всё нормально работает! Где причина, не могу понять... Подскажите, если кто знает.
Цитата
func createString(v1,v2,v3)
 string=set_value(string, "ins",v1)
  string=set_value(string, "last",v2)
      string=set_value(string, "cci",v3)
 
        line=line+1
        add_item(line, string)
end func


func get_market(class_code)
market=""


if ((class_code&""=="EQNE") or (class_code&""=="EQBR") or (class_code&""=="EQNL") or (class_code&""=="EQLV") or (class_code&""=="EQLV") or (class_code&""=="EQBS") or (class_code&""=="RTSST"))
market="micex"
end if


if ((class_code&""=="TQNE") or (class_code&""=="TQBR") or (class_code&""=="TQNL") or (class_code&""=="TQLV") or (class_code&""=="TQLV") or (class_code&""=="TQBS") or (class_code&""=="RTSST"))
market="micex"
end if


if ((class_code&""=="SPBFUT"))
market="forts"
end if


result=market
 
end func


func get_class(security_code)
       EQNE =  GET_CLASS_SECURITIES ("EQNE")
       EQBR =  GET_CLASS_SECURITIES ("EQBR")
       EQNL =  GET_CLASS_SECURITIES ("EQNL")
       EQLI =  GET_CLASS_SECURITIES ("EQLI")
       EQLV =  GET_CLASS_SECURITIES ("EQLV")
       EQBS =  GET_CLASS_SECURITIES ("EQBS")

TQNE =  GET_CLASS_SECURITIES ("TQNE")
       TQBR =  GET_CLASS_SECURITIES ("TQBR")
       TQNL =  GET_CLASS_SECURITIES ("TQNL")
       TQLI =  GET_CLASS_SECURITIES ("TQLI")
       TQLV =  GET_CLASS_SECURITIES ("TQLV")
       TQBS =  GET_CLASS_SECURITIES ("TQBS")

GTS =  GET_CLASS_SECURITIES ("GTS")
SPBFUT =  GET_CLASS_SECURITIES ("SPBFUT")
   RTSST =  GET_CLASS_SECURITIES ("RTSST")
class=""

  for sec_code in TQNE
 
        if sec_code==security_code
        class="TQNE"
break
        end if

      end for
 
      for sec_code in TQBR
 
        if sec_code==security_code
        class="TQBR"
break
        end if
 
      end for
 
      for sec_code in  TQNL
 
        if sec_code==security_code
        class="TQNL"
break
        end if
 
      end for
 
      for sec_code in TQLI
        if sec_code==security_code
        class="TQLI"
break
        end if
      end for
 
      for sec_code in TQLV
        if sec_code==security_code
        class="TQLV"
break
        end if
      end for
 
      for sec_code in TQBS
        if sec_code==security_code
        class="TQBS"
break
        end if
      end for
 
      for sec_code in EQNE
 
        if sec_code==security_code
        class="EQNE"
break
        end if

      end for
 
      for sec_code in EQBR
 
        if sec_code==security_code
        class="EQBR"
break
        end if
 
      end for
 
      for sec_code in  EQNL
 
        if sec_code==security_code
        class="EQNL"
break
        end if
 
      end for
 
      for sec_code in EQLI
        if sec_code==security_code
        class="EQLI"
break
        end if
      end for
 
      for sec_code in EQLV
        if sec_code==security_code
        class="EQLV"
break
        end if
      end for
 
      for sec_code in EQBS
        if sec_code==security_code
        class="EQBS"
break
        end if
      end for
 
      for sec_code in GTS
        if sec_code==security_code
        class="GTS"
break
        end if
      end for
 
  for sec_code in SPBFUT
        if sec_code==security_code
        class="SPBFUT"
break
        end if
      end for
 
  'for sec_code in RTSST
        'if sec_code==security_code
        'class="RTSST"
'break
        'end if
      'end for
 
  result=class
 
end func


func get_total_net(market,client,code)
   

if market="micex"  or class&""=="RTSST"

  n=GET_NUMBER_OF("DEPO_LIMITS")
      cur_bal_lim=0
      TOTAL_NET=0


   
      FOR i FR OM 1 to n
       limit = GET_ITEM ("DEPO_LIMITS", i)
       
LIMIT_KIND= GET_VALUE (limit, "LIMIT_KIND")&""
       sch= GET_VALUE (limit, "CLIENT_CODE")
       sec_t=GET_VALUE (limit, "SECCODE")
   
       if sch==client and LIMIT_KIND&""=="2" and sec_t==code
       TOTAL_NET=GET_VALUE (limit, "CURRENT_BALANCE")
       usl=1
       break
       end if
           
      END FOR
   result=TOTAL_NET
end if

if market="forts" and class&""!="RTSST"
      n=GET_NUMBER_OF("FUTURES_CLIENT_HOLDINGS")
      TOTAL_NET=0


        FOR i FR OM 1 to n
          limit = GET_ITEM ("FUTURES_CLIENT_HOLDINGS", i)
          sch= GET_VALUE (limit, "TRDACCID")
          sec_t=GET_VALUE (limit, "SECCODE")
         
            if sch=client
if sec_t=code
TOTAL_NET=GET_VALUE (limit, "TOTAL_NET")+0
end if
end if
 
        END FOR
     
  result=TOTAL_NET
end if
 
end func


func get_CBPLPLANNED(market,client)




   
 if market="micex"
 
   n=GET_NUMBER_OF("MONEY_LIMITS")
   usl=0
   CBPLPLANNED=0

      FOR i FR OM 1 to n
       limit = GET_ITEM ("MONEY_LIMITS", i)
       sch = GET_VALUE (limit, "CLIENT_CODE")
         LIMIT_KIND= GET_VALUE (limit, "LIMIT_KIND")&""
 
       if usl=0 and LIMIT_KIND&""=="2"
       if sch=client
       usl=1
       CBPLPLANNED=GET_VALUE (limit, "CURRENT_BALANCE")+0
       break
       end if
       end if  
     END FOR
 result=CBPLPLANNED
 end if
 
 if market="forts"
     n=GET_NUMBER_OF("FUTURES_CLIENT_LIMITS")
     CBPLPLANNED=0
     usl=0
        FOR i FROM 1 to n
           lim it = GET_ITEM ("FUTURES_CLIENT_LIMITS", i)
           sch = GET_VALUE (lim it, "TRDACCID")
     
if usl=0
           if sch=client
           CBPLPLANNED=GET_VALUE (lim it, "CBPLPLANNED")+0
   usl=1
           end if
           end if
       END FOR

result=CBPLPLANNED
 end if  




 
end func






func time()


time=get_datetime()
year=get_value(time,"YEAR")
month=get_value(time,"MONTH")
day=get_value(time,"DAY")
minute=get_value(time,"MIN")
hour=get_value(time,"HOUR")
sec=get_value(time,"SEC")
curdate=year*10000+month*100+day
curtime=hour*10000+minute*100+sec


res=0
if market="forts"
if (curtime>90005 and  curtime<135940) or (curtime>140505 and  curtime<184900) or (curtime>190505 and  curtime<234500)
res=1
end if
end if


if market="micex"
if (curtime>100010 and  curtime<184450)
res=1
end if
end if


work=0


IF (0 + IS_CONNECTED() = 1)
seconline=SUBSTR(Get_Info_Param("CONNECTIONTIME"),6,2)
minonline=SUBSTR(Get_Info_Param("CONNECTIONTIME"),3,2)
houronline=SUBSTR(Get_Info_Param("CONNECTIONTIME"),0,2)
 if (((houronline+0)>1) or ((minonline+0)>1) or ((seconline+0)>20))
 work=1
 end if
end if






if (work+0)=1
result=res
else
result=0
end if




end func




func get_profit(code_profit)
n=get_number_of("TRADES")
summ=0
start_net_trades=get_open_net(market,client,code)






if market="micex"
price_close=get_value(get_candle(id_base,true_date,184900,0),"close")
end if
if market="forts"
price_close=get_value(get_candle(id_base,true_date,235000,0),"close")
end if
message(price_close,1)


if (start_net_trades+0)>620
summ=summ-(start_net_trades-620)*price_trades
end if


if (start_net_trades+0)<620
summ=summ+(620-start_net_trades)*price_trades
end if


for i from 1 to n
str_trades=get_item("TRADES",i)
seccode_trades=get_value(str_trades,"SECCODE")
operation_trades=get_value(str_trades,"OPERATION")
quantity_trades=get_value(str_trades,"QUANTITY")
price_trades=get_value(str_trades,"PRICE")

  if seccode_trades&""==code_profit
 
     if operation_trades&""="BUY"
     summ=summ-quantity_trades*price_trades
 end if
     if operation_trades&""="SELL"
     summ=summ+quantity_trades*price_trades
 end if
 
  end if
   
end for

if (total_net+0)>620
summ=summ+(total_net-620)*last
end if
if (total_net+0)<620
summ=summ-(620-total_net)*last
end if

'result=summ
end func


FUNC operation(client,depo,operation,price,quantity,seccode,classcode,market)


new_global("trans_params", "")  
new_global("trans_result", "")


trans_params = ""
trans_params = set_value (trans_params, "TRANS_ID", "1")
trans_params = set_value (trans_params, "ACTION", "NEW_ORDER")
trans_params = set_value (trans_params, "CLASSCODE", classcode)
trans_params = set_value (trans_params, "SECCODE",seccode)


if (market&"")=="micex"
trans_params = set_value (trans_params, "ACCOUNT",depo)
trans_params = set_value (trans_params, "CLIENT_CODE", client)
end if


if (market&"")=="forts"
trans_params = set_value (trans_params, "ACCOUNT",client)
trans_params = set_value (trans_params, "CLIENT_CODE","")
end if




trans_params = set_value (trans_params, "OPERATION", operation)
trans_params = set_value (trans_params, "QUANTITY", quantity)
trans_params = set_value (trans_params, "TYPE", "L")
trans_params = set_value (trans_params, "PRICE", price)
trans_result=SEND_TRANSACTION (30, trans_params)




curr_datetime=Get_DateTime()
WRITELN ("qpile_trans.log", get_value (curr_datetime, "DATETIME") & ": " & "Result: " & get_value (trans_result, "RESULT") & ", Result_ex: " & get_value (trans_result, "RESULT_EX") & ", OrderNum: " & get_value (trans_result, "ORDER_NUMBER") & ", Description: " & get_value (trans_result, "DESCRIPTION"))
if (get_value (trans_result, "RESULT_EX")+0)!=3
message(get_value (trans_result, "DESCRIPTION"),1)
end if
END FUNC




FUNC stop_order(client,depo,operation,price,stopprice,quantity,seccode,classcode,market)


trans_params = ""
trans_params = set_value (trans_params, "TRANS_ID", 1)
trans_params = set_value (trans_params, "ACTION", "NEW_STOP_ORDER")
trans_params = set_value (trans_params, "CLASSCODE", classcode)
trans_params = set_value (trans_params, "SECCODE",seccode)


if (market&"")=="micex"
trans_params = set_value (trans_params, "ACCOUNT",depo)
trans_params = set_value (trans_params, "CLIENT_CODE", client)
end if


if (market&"")=="forts"
trans_params = set_value (trans_params, "ACCOUNT",client)
trans_params = set_value (trans_params, "CLIENT_CODE","")
end if






trans_params = set_value (trans_params, "OPERATION", operation)
trans_params = set_value (trans_params, "QUANTITY", quantity)
trans_params = set_value (trans_params, "TYPE", "L")
trans_params = set_value (trans_params, "PRICE", price)
trans_params = set_value (trans_params, "STOPPRICE", stopprice)
trans_params = set_value (trans_params, "EXPIRY_DATE","GTC")


trans_result=SEND_TRANSACTION (30, trans_params)


curr_datetime=Get_DateTime()
WRITELN ("qpile_trans.log", get_value (curr_datetime, "DATETIME") & ": " & "Result: " & get_value (trans_result, "RESULT") & ", Result_ex: " & get_value (trans_result, "RESULT_EX") & ", OrderNum: " & get_value (trans_result, "ORDER_NUMBER") & ", Description: " & get_value (trans_result, "DESCRIPTION"))
stop_number=get_value (trans_result, "ORDER_NUMBER")+0




END FUNC


FUNC trailing_stop(client,depo,operation,stop_price,offset,SPREAD,quantity,seccode,classcode,market)


new_global("trans_params", "")  
new_global("trans_result", "")


trans_params = ""
trans_params = set_value (trans_params, "TRANS_ID", "1")
trans_params = set_value (trans_params, "ACTION", "NEW_STOP_ORDER")
trans_params = set_value (trans_params, "STOP_ORDER_KIND", "TAKE_PROFIT_STOP_ORDER")
trans_params = set_value (trans_params, "CLASSCODE", classcode)
trans_params = set_value (trans_params, "SECCODE",seccode)


if (market&"")=="micex"
trans_params = set_value (trans_params, "ACCOUNT",depo)
trans_params = set_value (trans_params, "CLIENT_CODE", client)
end if


if (market&"")=="forts"
trans_params = set_value (trans_params, "ACCOUNT",client)
trans_params = set_value (trans_params, "CLIENT_CODE","")
end if




trans_params = set_value (trans_params, "OPERATION", operation)
trans_params = set_value (trans_params, "QUANTITY", quantity)
trans_params = set_value (trans_params, "TYPE", "L")
trans_params = set_value (trans_params, "STOPPRICE", stop_price)
trans_params = set_value (trans_params, "OFFSET", OFFSET)
trans_params = set_value (trans_params, "OFFSET_UNITS", "PRICE_UNITS")
trans_params = set_value (trans_params, "SPREAD", spread)
trans_params = set_value (trans_params, "SPREAD_UNITS", "PRICE_UNITS")
trans_params = set_value (trans_params, "EXPIRY_DATE","GTC")
trans_result=SEND_TRANSACTION (30, trans_params)


take_order=get_value (trans_result,"ORDER_NUMBER")
curr_datetime=Get_DateTime()
WRITELN ("qpile_trans.log", get_value (curr_datetime, "DATETIME") & ": " & "Result: " & get_value (trans_result, "RESULT") & ", Result_ex: " & get_value (trans_result, "RESULT_EX") & ", OrderNum: " & get_value (trans_result, "ORDER_NUMBER") & ", Description: " & get_value (trans_result, "DESCRIPTION"))


END FUNC






FUNC binded_stop(client,depo,operation,stop_price,price,linked_price,quantity,seccode,classcode,market)




new_global("trans_params", "")  
new_global("trans_result", "")


trans_params = ""
trans_params = set_value (trans_params, "TRANS_ID", "1")
trans_params = set_value (trans_params, "ACTION", "NEW_STOP_ORDER")
trans_params = set_value (trans_params, "STOP_ORDER_KIND", "WITH_LINKED_LIMIT_ORDER")
trans_params = set_value (trans_params, "CLASSCODE", classcode)
trans_params = set_value (trans_params, "SECCODE",seccode)


if (market&"")=="micex"
trans_params = set_value (trans_params, "ACCOUNT",depo)
trans_params = set_value (trans_params, "CLIENT_CODE", client)
end if


if (market&"")=="forts"
trans_params = set_value (trans_params, "ACCOUNT",client)
trans_params = set_value (trans_params, "CLIENT_CODE","")
end if




trans_params = set_value (trans_params, "OPERATION", operation)
trans_params = set_value (trans_params, "QUANTITY", quantity)
trans_params = set_value (trans_params, "TYPE", "L")
trans_params = set_value (trans_params, "STOPPRICE", stop_price)
trans_params = set_value (trans_params, "PRICE", price)
trans_params = set_value (trans_params, "LINKED_ORDER_PRICE", linked_price)
trans_params = set_value (trans_params, "KILL_IF_LINKED_ORDER_PARTLY_FILLED", "NO")
trans_result=SEND_TRANSACTION (30, trans_params)


binded_stop_number=get_value (trans_result,"ORDER_NUMBER")
curr_datetime=Get_DateTime()
WRITELN ("qpile_trans.log", get_value (curr_datetime, "DATETIME") & ": " & "Result: " & get_value (trans_result, "RESULT") & ", Result_ex: " & get_value (trans_result, "RESULT_EX") & ", OrderNum: " & get_value (trans_result, "ORDER_NUMBER") & ", Description: " & get_value (trans_result, "DESCRIPTION"))


END FUNC






FUNC kill_stop_order(orderkey,classcode,seccode)




trans_params = ""
trans_params = SET_VALUE(trans_params,"CLASSCODE",classcode)
trans_params = set_value (trans_params, "SECCODE",seccode)
trans_params = SET_VALUE(trans_params,"TRANS_ID","1")
trans_params = SET_VALUE(trans_params,"ACTION","KILL_STOP_ORDER")
trans_params = set_value (trans_params, "OPERATION", "s")
trans_params = SET_VALUE(trans_params,"STOP_ORDER_KEY",orderkey)
trans_result = SEND_TRANSACTION (30,trans_params)




curr_datetime=Get_DateTime()
WRITELN ("qpile_trans.log", get_value (curr_datetime, "DATETIME") & ": " & "Result: " & get_value (trans_result, "RESULT") & ", Result_ex: " & get_value (trans_result, "RESULT_EX") & ", OrderNum: " & get_value (trans_result, "ORDER_NUMBER") & ", Description: " & get_value (trans_result, "DESCRIPTION"))


END FUNC






FUNC get_candle(id,date,time,line_id)
candle=create_map()
slice = Get_Candle_Ex(id, date,time)
time =Get_Value(slice,"TIME")
lines=Get_Value(slice,"LINES")
line=Get_Collection_Item(lines, line_id)
close=Get_Value(line,"CLOSE")+0
high=Get_Value(line,"HIGH")+0
low=Get_Value(line,"LOW")+0
open=Get_Value(line,"OPEN")+0
candle=set_value(candle,"open",open)
candle=set_value(candle,"high",high)
candle=set_value(candle,"low",low)
candle=set_value(candle,"close",close)
candle=set_value(candle,"time",time)
result=candle
end func




FUNC get_prices(id,market)


if id&""!=""
new_global("cur_time_bar_pred",0)
new_global("close_pred",0)
new_global("open_pred",0)
new_global("high_pred",0)
new_global("low_pred",0)


time=get_datetime()
hour=get_value(time,"HOUR")
min=get_value(time,"MIN")
day=get_value(time,"DAY")
month=get_value(time,"MONTH")
year=get_value(time,"YEAR")
cur_date=year*10000+month*100+day
cur_time=hour*10000+min*100
true_date=0


for i from 0 to 100000


candle=get_candle(id,cur_date,183000,0)


  if (get_value(candle,"open")+0)=0
 
     if (day+0)<2
     month=month-1
     day=32
     if month=0
     month=12
     year=year-1
     end if
     end if
 


     day=day-1
 cur_date=year*10000+month*100+day
   else
true_date=cur_date
break
end if
 
end for


timeframe_collection=create_collection()
hour=18
min=30
time=hour*10000+min*100
pred_time="0"
j=0
timeframe=""


for i from 0 to  1000


  candle=get_candle(id,true_date,time,0)
 
  if (get_value(candle,"time")+0)=0
  timeframe="day"
  break
  end if
 
  if get_value(candle,"time")&""=pred_time&""
  else
  timeframe_collection=insert_collection_item(timeframe_collection,j,get_value(candle,"time"))
  pred_time=get_value(candle,"time")
  j=j+1
  end if
 
 
  if (min+0)=0
  hour=hour-1
  min=59
  else
  min=min-1
  end if
 
  time=hour*10000+min*100
 
  if (get_collection_count(timeframe_collection)+0)>1
  break
  end if
 
end for




dateframe_collection=create_collection()
counter=0
time=get_datetime()
day=get_value(time,"DAY")
month=get_value(time,"MONTH")
year=get_value(time,"YEAR")
cur_date=year*10000+month*100+day
pred_open=0
pred_high=0
pred_close=0
pred_low=0
if (timeframe&"")=="day"
  for i from 0 to  1000
          candle=get_candle(id,cur_date,150000,0)
         
  if ((get_value(candle,"open")+0)!=(pred_open+0) or (get_value(candle,"high")+0)!=(pred_high+0) or (get_value(candle,"close")+0)!=(pred_close+0))
          if ((get_value(candle,"close")+0)!=0)
  dateframe_collection=INSERT_COLLECTION_ITEM(dateframe_collection,counter,cur_date)  
  pred_open=get_value(candle,"open")
  pred_high=get_value(candle,"high")
  pred_close=get_value(candle,"close")
  counter=counter+1
  end if
  end if


   if (day+0)=1
           month=month-1
           day=32
              if (month+0)=0
              month=12
              year=year-1
              end if
end if
           day=day-1  


          if get_collection_count(dateframe_collection)>20
          break  
          end if

       cur_date=year*10000+month*100+day
  end for
end if






hour1=SUBSTR (get_collection_item(timeframe_collection,0), 0, 2)
min1=SUBSTR (get_collection_item(timeframe_collection,0), 2, 2)
hour2=SUBSTR (get_collection_item(timeframe_collection,1), 0, 2)
min2=SUBSTR (get_collection_item(timeframe_collection,1), 2, 2)
chislo=0
if (((timeframe&"")<>"") or ((timeframe&"")<>"day"))


if ((hour1+0)=(hour2+0))
 if (min1-min2)=1
 timeframe=1
 chislo=1
 end if
 if (min1-min2)=2
 timeframe=2
 chislo=1
 end if
 if (min1-min2)=3
 timeframe=3
 chislo=1
 end if
 if (min1-min2)=4
 timeframe=4
 chislo=1
 end if
 if (min1-min2)=5
 timeframe=5
 chislo=1
 end if
 if (min1-min2)=6
 timeframe=6
 chislo=1
 end if
 if (min1-min2)=10
 timeframe=10
 chislo=1
 end if
 if (min1-min2)=15
 timeframe=15
 chislo=1
 end if
 if (min1-min2)=20
 timeframe=20
 chislo=1
 end if
 if (min1-min2)=30
 timeframe=30
 chislo=1
 end if
 
end if


if ((hour1+0)<>(hour2+0))
 
 if (hour1-hour2)=1
    timeframe=60
chislo=1
 end if
 
 if (hour1-hour2)=2
    timeframe=120
chislo=1
 end if
 
 if (hour1-hour2)=4
    timeframe=240
chislo=1
 end if

end if




end if




hour1=SUBSTR (get_collection_item(timeframe_collection,0), 0, 2)
min1=SUBSTR (get_collection_item(timeframe_collection,0), 2, 2)
hour2=SUBSTR (get_collection_item(timeframe_collection,1), 0, 2)
min2=SUBSTR (get_collection_item(timeframe_collection,1), 2, 2)
day_temp=0


'if (timeframe&""=="day")
'timeframe="week"
'  for i from 0 to get_collection_count(dateframe_collection)-1
'   z=get_collection_item(dateframe_collection,i)
'   t=SUBSTR(get_collection_item(dateframe_collection,i), 6, 2)
' if (i+0)>0
' if abs(t-day_temp)==1
' timeframe="day"
' break
' end if
' end if

' day_temp=SUBSTR (get_collection_item(dateframe_collection,i), 6, 2)
' end for


'end if




time=get_datetime()
hour=get_value(time,"HOUR")
min=get_value(time,"MIN")
day=get_value(time,"DAY")
correct_day=day
month=get_value(time,"MONTH")
year=get_value(time,"YEAR")
cur_date=year*10000+month*100+day
cur_time=hour*10000+min*100


LOW_col=CREATE_COLLECTION()
HIGH_col=CREATE_COLLECTION()
open_col=CREATE_COLLECTION()
CLOSE_col=CREATE_COLLECTION()
time_col=CREATE_COLLECTION()
date_col=CREATE_COLLECTION()
cur_time_bar=get_value(get_candle(id,cur_date,cur_time,0),"time")




if ((cur_time_bar&"")!="")
cur_time_bar_pred=cur_time_bar
else
cur_time_bar=cur_time_bar_pred
end if
f=0


 if (cur_time_bar+0)!=0
 low_col=INSERT_COLLECTION_ITEM(low_col,0,get_value(get_candle(id,cur_date,cur_time_bar,0),"low"))
 high_col=INSERT_COLLECTION_ITEM(high_col,0,get_value(get_candle(id,cur_date,cur_time_bar,0),"high"))
 open_col=INSERT_COLLECTION_ITEM(open_col,0,get_value(get_candle(id,cur_date,cur_time_bar,0),"open"))
 close_col=INSERT_COLLECTION_ITEM(close_col,0,get_value(get_candle(id,cur_date,cur_time_bar,0),"close"))
 time_col=INSERT_COLLECTION_ITEM(time_col,0,cur_time_bar)
 date_col=INSERT_COLLECTION_ITEM(date_col,0,cur_date)
 f=1
 end if




find_date=cur_date
point=0




if (chislo+0)==1




for i from 1 to 2000
temp3=ceil(cur_time_bar/10000)
temp4=cur_time_bar/10000


if temp3=temp4


if floor(cur_time_bar/10000)=cur_time_bar/10000


if timeframe=1
cur_time_bar=ceil(cur_time_bar/10000-1)*10000+5900
end if
if timeframe=2
cur_time_bar=ceil(cur_time_bar/10000-1)*10000+5800
end if
if timeframe=3
cur_time_bar=ceil(cur_time_bar/10000-1)*10000+5700
end if
if timeframe=4
cur_time_bar=ceil(cur_time_bar/10000-1)*10000+5600
end if
if timeframe=5
cur_time_bar=ceil(cur_time_bar/10000-1)*10000+5500
end if
if timeframe=6
cur_time_bar=ceil(cur_time_bar/10000-1)*10000+4800
end if
if timeframe=10
cur_time_bar=ceil(cur_time_bar/10000-1)*10000+5000
end if
if timeframe=15
cur_time_bar=ceil(cur_time_bar/10000-1)*10000+4500
end if
if timeframe=20
cur_time_bar=ceil(cur_time_bar/10000-1)*10000+4000
end if
if timeframe=30
cur_time_bar=ceil(cur_time_bar/10000-1)*10000+3000
end if
if timeframe=60
cur_time_bar=ceil(cur_time_bar/10000-1)*10000
end if
if timeframe=120
cur_time_bar=ceil(cur_time_bar/10000-2)*10000
end if
if timeframe=240
cur_time_bar=ceil(cur_time_bar/10000-4)*10000
end if


end if
else
cur_time_bar=cur_time_bar-timeframe*100
end if








if timeframe<60
if  cur_time_bar<90000


if (market&"")="micex"
if timeframe=1
cur_time_bar=184400
end if
if timeframe=2
cur_time_bar=184400
end if
if timeframe=3
cur_time_bar=184200
end if
if timeframe=4
cur_time_bar=184400
end if
if timeframe=5
cur_time_bar=184000
end if
if timeframe=6
cur_time_bar=184200
end if
if timeframe=10
cur_time_bar=184000
end if
if timeframe=15
cur_time_bar=183000
end if
if timeframe=20
cur_time_bar=184000
end if
if timeframe=30
cur_time_bar=183000
end if
end if




if (market&"")="forts"
if timeframe=1
cur_time_bar=234900
end if
if timeframe=2
cur_time_bar=234800
end if
if timeframe=3
cur_time_bar=234800
end if
if timeframe=4
cur_time_bar=234800
end if
if timeframe=5
cur_time_bar=234500
end if
if timeframe=6
cur_time_bar=234800
end if
if timeframe=10
cur_time_bar=234000
end if
if timeframe=15
cur_time_bar=234500
end if
if timeframe=20
cur_time_bar=234000
end if
if timeframe=30
cur_time_bar=233000
end if
end if


if timeframe>50


if cur_time_bar=100000
break
end if




if cur_time_bar<90000


if timeframe=60
cur_time_bar=230000
end if


if timeframe=120
cur_time_bar=220000
end if


if timeframe=240
cur_time_bar=200000
end if


end if


end if




usl=0


 for j from 1 to 15


   if (day+0)<2
   month=month-1
   day=32
   if month=0
   month=12
   year=year-1
   end if
   end if


   day=day-1





   cur_date=year*10000+month*100+day

   slice_day = Get_Candle_Ex(id, cur_date, 103000)
   LineCount_day=Get_Value(slice_day,"COUNT") +0

     if (usl+0)=0
     if LineCount_day>0
     find_date=cur_date
     usl=1
 break
     end if
     end if
 end for

end if
end if






if  timeframe>59
if  cur_time_bar<80000


if (market&"")="forts"


if  timeframe=60
cur_time_bar=230000
end if


if timeframe=120
cur_time_bar=220000
end if


if timeframe=240
cur_time_bar=200000
end if


end if


if (market&"")="micex"


if  timeframe=60
cur_time_bar=180000
end if


if timeframe=120
cur_time_bar=180000
end if


if timeframe=240
cur_time_bar=160000
end if


end if




usl=0


 for j from 1 to 15
 
   if (day+0)<2
   month=month-1
   day=32
   if month=0
   month=12
   year=year-1
   end if
   end if


   day=day-1


   curdate=year*10000+month*100+day
  slice_day = Get_Candle_Ex(id, curdate, 103000)
   LineCount_day=Get_Value(slice_day,"COUNT") +0
     if (usl+0)=0
     if LineCOUNT_day>0
     find_date=curdate
     usl=1
      break
     end if
     end if
 end for

end if
end if


slice = Get_Candle_Ex(id, find_date,cur_time_bar)
LineCount=Get_Value(slice,"COUNT") +0
time=Get_Value(slice,"TIME")
lines=Get_Value(slice,"LINES")






if f<5
if LineCount>0
if ((cur_time_bar+0)<>0)
 LineCount=Get_Value(slice,"COUNT")
 time=Get_Value(slice,"TIME")
 lines=Get_Value(slice,"LINES")
 line=Get_Collection_Item(lines, 0)


 low=Get_Value(line,"LOW")
 high=Get_Value(line,"HIGH")
 open=Get_Value(line,"OPEN")
 close=Get_Value(line,"CLOSE")
 line_name =Get_Value(line,"NAME")
 volume=Get_Value(line,"VOLUME")
 

 low_col=INSERT_COLLECTION_ITEM(low_col,f,low)
 high_col=INSERT_COLLECTION_ITEM(high_col,f,high)
 open_col=INSERT_COLLECTION_ITEM(open_col,f,open)
 close_col=INSERT_COLLECTION_ITEM(close_col,f,close)
 time_col=INSERT_COLLECTION_ITEM(time_col,f,cur_time_bar)
 date_col=INSERT_COLLECTION_ITEM(date_col,f,find_date)


 
f=f+1
end if
end if
else
break
end if


end for
end if


prices=create_map()
prices=SET_VALUE(prices,"days",dateframe_collection)
prices=SET_VALUE(prices,"timeframe",timeframe)
prices=SET_VALUE(prices,"high",high_col)
prices=SET_VALUE(prices,"low",low_col)
prices=SET_VALUE(prices,"close",close_col)
prices=SET_VALUE(prices,"open",open_col)
prices=SET_VALUE(prices,"time",time_col)
prices=SET_VALUE(prices,"date",date_col)
result=prices
else
result=0
end if
end func
Помогите с кодом индикатора Spred
 
Проблему решил. И деление работает. Всё гениальное - просто) if "знаменатель" = nil then return nil else "счастье". Закон математики! Не поспоришь)

Благодарю всех за помощь. Особенно nikolz и Nikolay! Спасибо!
Помогите с кодом индикатора Spred
 
Цитата
Юрий написал:
nikolz,
..........

Ваш индикатор тоже потестил, Спасибо!!! Но он не считает деление... Сложение, вычитание, умножение... Деление - нет... И более сложную формулу, которую я использую, тоже нет....
А так для меня очень полезный код, для изучения Lua!
Я понял что это в частности для меня) ещё раз Спасибо!
Помогите с кодом индикатора Spred
 
Код
Settings=
{
   Name = "DayMax/Med/Min/X",
   a = 1000, -- свободный член
   line =
   {
      {
         Name = "Median",
         Color = RGB(0, 0, 255),
         Type = TYPE_LINE,
         Width = 1
      },
      {
         Name = "Maximum",
         Color = RGB(0, 128, 0),
         Type = TYPE_LINE,
         Width = 1
      },
      {
         Name = "Minimum",
         Color = RGB(255, 0, 0),
         Type = TYPE_LINE,
         Width = 1
      }
   }
}
ma = nill
me = nill
mi = nill


function Init()
   return 3
end


function OnCalculate(index)
   
   if index == 1 then
      ma = nill
      me = nill
      mi = nill
   end 

   if ma == nill then
      ma = H(index)
      
   elseif H(index) > ma then
      ma = H(index)
      if (ma-mi)>Settings.a then
        mi = ma - Settings.a
      end
   end

   if mi == nill then
      mi = L(index)
      
   elseif L(index) < mi then
      mi = L(index)
      if (ma-mi)>Settings.a then
        ma = mi + Settings.a
      end
   end
   if me == nill then
      me =  (H(index) + L(index))/2
   elseif L(index) < mi then
       me =  (H(index) + L(index))/2
   elseif H(index) > ma then
       me =  (H(index) + L(index))/2
   end
   
   

   return me, ma, mi
end
Я хочу использовать для других расчетов предыдущие me, ma, mi. Подскажите, как это сделать! me(index-1) не работает....
Помогите с кодом индикатора Spred
 
nikolz, Спасибо огромное за реальные действия, за код!
Что я могу проверить, если я не программист?!... Похоже это сообщение на код или нет? Проверил - похоже!
Исходник взят отсюда - создание индикаторов — форум QUIK.

Проблема толком так и не решена... Я не знаю как взять значение max(index-1)....... функцию надо или переменную, как, откуда?....
Я взял getCandleByTimeCode(index-1), считает правильно, но на истории отображается со сдвигом....

Ваш индикатор тоже потестил, Спасибо!!! Но он не считает деление... Сложение, вычитание, умножение... Деление - нет... И более сложную формулу, которую я использую, тоже нет....
А так для меня очень полезный код, для изучения Lua!
Помогите с кодом индикатора Spred
 
Цитата
nikolz написал:
Вот вам вариант.
проверьте, если что не так, то покажите картинки и напишите что не так.
Код
   function   OnCalculate (index)
  -- Получение свечей дополнительных инструментов 
   c1 = getCandleByTimeCode(Settings.tag1, timeCode).close
   c2 = getCandleByTimeCode(Settings.tag2, timeCode).close
    if  c1  and  c2   then 
      p1  =  c1;   p2  =  c2   -- Получение цен дополнительных инструментов 
      spr  = p1 - p2    -- Вычисление спреда 
    if  index =  =  1   then   max = spr; min = spr  -  Settings.a;
     -- Вычисление максимума минимума среднего для спреда 
    elseif  spr > max_p  then   max  =  spr; min  =  spr  -  Settings.a;
    elseif  spr < min_p  then     min  =  spr;  max  =  spr  +  Settings.a;  end 
   med  =   (max + min)/ 2 ;
    end 
 return  spr,med,max,min
 end 
  
С горем пополам, и порвав два бубна, прикрутил я этот код в тело индикатора! Но радость была не долгой... "spr  = p1 - p2    -- Вычисление спреда" -  при использовании в вычислении деления (р1/р2), пропадают линии - med,max,min, их просто нет на графике!... А если поставить мою формулу расчета spr, то и основная линия не рисуется.... Как то так)
Помогите с кодом индикатора Spred
 
Чёрная линия - это основная линия. Зелёная - макс, красная - минимум (считаются по значениям предыдущей свечи).
Помогите с кодом индикатора Spred
 
Подскажите, что не так!... Почему на истории линии отрисовываются не корректно? После перезагрузки всё норм, на новых свечах рисует как надо. На скрине обозначил место перезагрузки графика (до/после), красными линиями подчеркнул места кривой отрисовки, зелеными - правильной отрисовки.

nikolz, Ваш код вставить не получается... ошибки выдаёт. Пробовал сократить, но всё тщетно... Вот рабочий вариант, но отрисовка кривая...
Код
local function getSpread(index)
   local timeCode = getTimeCode(T(index))
   local timeCode2 = getTimeCode(T(index-1))
   local securityPrice = C(index)
   if securityPrice then
   -- Получение свечей дополнительных инструментов
   local candle1 = getCandleByTimeCode(Settings.tag1, timeCode)
   local candle2 = getCandleByTimeCode(Settings.tag2, timeCode)
   local candle3 = getCandleByTimeCode(Settings.tag1, timeCode2)
   local candle4 = getCandleByTimeCode(Settings.tag2, timeCode2)
   if candle1 and candle2 and candle3 and candle4  then
   -- Получение цен дополнительных инструментов
   local price1 = candle1.close
   local price2 = candle2.close
   local price3 = candle3.close
   local price4 = candle4.close
   if ((price1 + price2)== price1) or ((price1 + price2)== price2) then
   -- Вычисление спреда
   local spread = (50 - (100 / (1 + price3 /  price4)))*Settings.k else
   local spread = (50 - (100 / (1 + price1 /  price2)))*Settings.k
   local spread2 = (50 - (100 / (1 + price3 /  price4)))*Settings.k
    -- Вычисление максимума минимума среднего для спреда
   if index == 1 or (T(index).hour < T(index-1).hour) then
        max_price = nil
        med_price = nil
        low_price = nil
      
    end
   
    if max_price == nil then  max_price = spread2 
    elseif spread2 > max_price then
        max_price = spread2
      if (max_price-low_price)>Settings.a then
        low_price = spread2 - Settings.a
      end
      med_price =  (max_price+low_price)/2
      
    end
    if low_price == nil then    low_price = spread2  
    elseif spread2 < low_price then
      low_price = spread2
      if (max_price-low_price)>Settings.a then
        max_price = spread2 + Settings.a
      end
      med_price =  (max_price+low_price)/2
      
    end
    if med_price == nil then    med_price =  (max_price+low_price)/2
    elseif spread2 < low_price then   med_price =  (max_price+low_price)/2
    elseif spread2 > max_price then   med_price =  (max_price+low_price)/2
    end
      return spread, (max_price+low_price)/2 , max_price, low_price
   end
   end
   end
end

function OnCalculate(index)
   if index > 1 then
       local spread = getSpread(index - 1)
       if spread then
           SetValue(index - 1, 1, spread)
         SetValue(index-1, 2, med_price)
         SetValue(index-1, 3, max_price)
         SetValue(index-1, 4, low_price)
       end
   end
   return getSpread(index), med_price , max_price, low_price
end
Помогите с кодом индикатора Spred
 
nikolz, Вы всё правильно пишите! Вас ввело в заблуждение название spread... В моем случае это просто название линии. Можно назвать ее monika) И тогда monika =с1*0+ 50-(100/(1+c2/c3)). Т.е. с1 в моём случае не участвует. Графики с2 и с3 открыты в другом окне, и это не влияет на работу индикатора. Я пользуюсь им не один год. Но не так давно мне попался код индикатора который рисует макс и мин дня. Я решил прикрутить его к "monike"... И тут то я и столкнулся с необходимостью решения проблемы выносов, которая всегда была. Проблему решил только условием: if ((price2 + price3)== price2) or ((price2 + price3)== price3) then. По другому не получилось... Правильно это или не правильно, не знаю... Но работает!
Теперь ищу решение, чтобы макс был равен закрытию! А не достигнутого макс (high) на этой свече... Конечно же при условии, что monika пробила предыдущий макс!   elseif spr>max_p then  max = spr - это условие его повышает, но оно не равно закрытию. Мне нужно: if monika > max(i-1) then max = monika, но я не знаю как правильно обозначить это - max(i-1).... Я не программист... Логику понимаю, а как оформить не знаю! Тыкаюсь как слепой котенок... Получилось - хорошо! Не получилось - продолжаю тыкаться, пока не надоест)
Помогите с кодом индикатора Spred
 
Цитата
Юрий написал:
Если график перезагрузить, то max/low рассчитываются как надо - по закрытию.
Я имел ввиду на истории! А новые свечи, после перезагрузки, опять идут по high/low...
У Вас л/с есть полный код, можете потестить. Он рабочий.  
Помогите с кодом индикатора Spred
 
Пожалуйста! Картинка та же, только обрезана по-другому...
Решение проблемы кроется в коде! Подбираюсь, но еще не решил)

Вот в этом участке:

elseif spread > max_price then
max_price = spread
low_price = spread - Settings.a
med_price =  (max_price+low_price)/2

Получается если  spread > max_price, то max_price сразу же становится равен spread, а надо: если spread > max_price(i-1), то max_price = spread, тогда будет красиво! Но я пока не сообразил как max_price(i-1) обозначить правильно...


Код
if index == 1 then
      max_price = nill
      med_price = nill
      low_price = nill
   elseif T(index).hour < T(index-1).hour then
      max_price = nill
      med_price = nill
      low_price = nill
   end
   if max_price == nill then
      max_price = spread
      
   elseif spread > max_price then
      max_price = spread
      low_price = spread - Settings.a
      med_price =  (max_price+low_price)/2
   end

   if low_price == nill then
      low_price = spread
      
   elseif spread < low_price then
      low_price = spread
      max_price = spread + Settings.a
      med_price =  (max_price+low_price)/2
   end
   if med_price == nill then
      med_price =  (max_price+low_price)/2
   elseif spread < low_price then
       med_price =  (max_price+low_price)/2
   elseif spread > max_price then
       med_price =  (max_price+low_price)/2
   end
   return spread, (max_price+low_price)/2 , max_price, low_price
Помогите с кодом индикатора Spred
 
Если график перезагрузить, то max/low рассчитываются как надо - по закрытию.
Помогите с кодом индикатора Spred
 
Первоначальная проблема решена! Код доработан, но не полностью... Сейчас линии max/low принимают значения hidh/low (хотя используется значения только close!), а хотелось бы чтобы они принимали значение close... Т.е. если "spread" закрывается выше "max", то max = spread.close, а не "spread.high". На второй свече дня именно так и было, а начиная с третьей применяются значения "high/low"... Загадка где-то в коде, логике...
Помогите с кодом индикатора Spred
 
Вот из-за того что первая сделка на разных инструментах приходит не всегда в одно и тоже время, у меня и получается вынос... Потому что один из инструментов в этот момент получается равен 0. Просто для spred это не критично, а для max/low - получается изкажение...
Помогите с кодом индикатора Spred
 
Хм. Попробую, но мне кажется было логично что их три. Ведь те по которым расчитывается spred вообще на другом графике... Я даже практиковал там другой таймфрейм, и всё работало (если не перезагружать основной график).
Помогите с кодом индикатора Spred
 
Я Вас понял. У меня получается три инструмента! Первый - по нему определяется нумерация свеч, и два других - по которым я считаю "spred ",  в новом окне графика первого инструмента. В первом инструменте есть C(index). Там, получается, "искать" предыдущую свечу?
Помогите с кодом индикатора Spred
 
Спасибо! Обязательно попробую!
Подскажите, а как мне max/low предыдущей свечи обозначить? Типа (i-1)...
Помогите с кодом индикатора Spred
 
Код проверил, всё работает! Визуально отличий не заметил, возможно в аппаратной части стал полегче.
Основной параметр в этом индикаторе это - spred. max и low это своего рода канал по значениям spred, но с фиксированным расстоянием (Settings.a).  Т.к. spred вычисляется по двум индикаторам (tag1 и tag2), то при открытии новой свечи иногда возникают ситуации, что на каком то из индикаторов еще нет значений, видимо это принимается за ноль, и значение spred уходит либо в максимально возможное, либо в минимально возможное значения. Это происходит только на открытии новой свечи, не всегда на каждой и очень быстро. Когда поступают данные с обоих индикаторов - spred возвращается в нормальный вид... Но значения max/low после этого не корректны!... Исправляется это перезагрузкой графика ( редактировать => ок).
Решение проблемы с max/low вижу так:
Вариант 1. Условия: если spred(i) > (spred(i-1) +10 или spred(i) < spred(i-1) -10, то max(i) = max(i-1) и low(i) = low(i-1)
Вариант 2. Если spred(i) > max(i-1), то max(i) = spred(i) иначе max(i) = max (i-1), и аналогично для low...

Я не знаю как правильно написать эти "(i)" и "(i-1)"....
Как та собака: всё понимаю, но сказать не могу...

Подскажите пожалуйста!
Помогите с кодом индикатора Spred
 
В идеале нужны четыре значения - spred, max, low и med.
Помогите с кодом индикатора Spred
 
Я не программист.... этот код я собрал из двух индикаторов. Функция onCalculate была в исходнике основного индикатора, я добавил max, low, med... без добавления данные не обновлялись... на истории всё норм, а на новой свече ничего не менялось...
Помогите с кодом индикатора Spred
 
Здравствуйте! Проблема в том, что spred иногда выносит в макс или в мин (не все данные приходят одновременно) на доли секунды, и max_price и low_price тоже соответственно искажаются, потом spred принимает нормальное значение а max и low - нет... Индикатор рассчитывается от +50 до -50, Settings.a ставлю 10 ("max_price = spread + Settings.a" ), т.к. spred считается по двум значениям, которые иногда приходят не одновременно, то получается spred уходит либо в +50 либо в -50, потом возвращается, но из-за Settings.a = 10 max и low получаются не корректны.
Например: предыдущий spred был +10, на следующей свече из-за корявых данных происходит скачек в +50 и сразу возврат в например +11, но max остается на показании +11 + Settings.a = 21, а должен быть на +11...
Проще наверное считать max/low по предыдущей свече, ну т.е. не в реальном времени а по закрытой свече.
Помогите с кодом пожалуйста!
Код
--- Вычислить спред.
-- @param index номер свечи на графике
-- @return значение спреда или nil, если оно неопределено
local function getSpread(index)
   local timeCode = getTimeCode(T(index))
   local securityPrice = C(index)
   if securityPrice == nil then
       return nil
   end
   -- Получение свечей дополнительных инструментов
   local candle1 = getCandleByTimeCode(Settings.tag1, timeCode)
   local candle2 = getCandleByTimeCode(Settings.tag2, timeCode)
   if candle1 == nil or candle2 == nil then
       return nil
   end
   -- Получение цен дополнительных инструментов
   local price1 = candle1.close
   local price2 = candle2.close
   if price1 == nil or price2 == nil then
       return nil
   end
   -- Вычисление спреда
   local spread = (50 - (100 / (1 + price1 /  price2)))*Settings.k
   
    -- Вычисление максимума минимума среднего для спреда
   if index == 1 then
        max_price = nill
        med_price = nill
        low_price = nill
    elseif T(index).hour < T(index-1).hour then
        max_price = nill
        med_price = nill
        low_price = nill
    end
    if max_price == nill then
        max_price = spread
        
    elseif spread > max_price then
        max_price = spread
        low_price = spread - Settings.a
        med_price =  (max_price+low_price)/2
    end

    if low_price == nill then
        low_price = spread
        
    elseif spread < low_price then
        low_price = spread
        max_price = spread + Settings.a
        med_price =  (max_price+low_price)/2
    end
    if med_price == nill then
        med_price =  (max_price+low_price)/2
    elseif spread < low_price then
        med_price =  (max_price+low_price)/2
    elseif spread > max_price then
        med_price =  (max_price+low_price)/2
    end
   return spread, (max_price+low_price)/2 , max_price, low_price
end

function OnCalculate(index)
   if index > 1 then
       local spread = getSpread(index - 1)
       if spread then
           SetValue(index - 1, 1, spread)
           SetValue(index , 2, med_price)
           SetValue(index , 3, max_price)
           SetValue(index , 4, low_price)
       end
   end
   return getSpread(index), med_price , max_price, low_price
end
Страницы: 1
Наверх