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

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

Страницы: 1
На чем основана Ваша торговая стратегия?
 
Цитата
swerg написал:
Айдар,
А зачем Excel и vba?
Почему не все на lua?
c VBA я знаком уже давно, некоторые вещи для меня проще делать там, лень переучиваться
На чем основана Ваша торговая стратегия?
 
Цитата
BlaZed написал:
Цитата
Спустя год мозго***бства хотелось бы понять, может у кого-то все по-проще и не нужно еб***т себе мозг?
Смотри как можно...
Точки входа и выхода офигеть как далеки от идеала, однако, стабильно результат в плюсе, причем хорошем.
Тренды наше все.
   

И никакого "мозго***бства" ;)
Даааа, и не по 100 микро сделок в день)
На чем основана Ваша торговая стратегия?
 
У меня значит так.
1. "Напридумывал" кучу формул и переменных, данные берутся:
    - из стакана (getQuoteLevel2()),
    - из ф-ции getParamEx() - количество общих заявок на покупки и продажи,
    - из таблицы сделок (OnAllTrade()).
   Все это считается и обновляется каждый тик. И затем идет вычисление разницы этих значений:
    - за крайние 30 сек,
    - за крайнюю минуту,
    - за крайнюю 01:30 мин,
    -...
    - за крайнюю 03:30 минуты.

2. Все данные на каждый тик сохраняются в txt файл. И чтобы дальше решить, какие значения этих переменных
должны быть идеальными для long или short - все определяется уже при помощи VBA макросов в EXCEL.
Там тоже напридумывано куча всего. Если коротко объяснить - там на каждый тик (по истории) расчитано какова будет цена через
10 секунд, минуту и т.д. и на основе этого уже подбираются нужные значения переменных.
Для статистики берется крайние 3-4 дня. Готовый скрипт создается по нажатию кнопки (в EXCEL).
Даже если данные из QUICK передаются с тормозами - то статистика же будет на основе этих данных, а значит мини запоздания уже
не играет важную роль (то есть статистика уже предусматривает эти тормоза)

В общем, осталось добить пару макросов в EXCEL и уже смотреть как будет работать (пока проверяю даже не на демо счете
- а просто при помощи меток, результат норм).

Спустя год мозго***бства хотелось бы понять, может у кого-то все по-проще и не нужно еб***т себе мозг?
Сдвиг массива без цикла for или while, Возможно ли сдвинуть массив без цикла for или while, если количество строк массива может изменяться?
 
Цитата
Айдар написал:
if max_rows_arr_Price <= 2 then
if  n_rows<=max_rows_arr_Price then
поправочка
Сдвиг массива без цикла for или while, Возможно ли сдвинуть массив без цикла for или while, если количество строк массива может изменяться?
 
Цитата
Айдар написал:
if max_rows_arr_Price <= 2 then
if max_rows_arr_Price <= max_rows_arr_Price then
Сдвиг массива без цикла for или while, Возможно ли сдвинуть массив без цикла for или while, если количество строк массива может изменяться?
 
Подскажите, пожалуйста, для понимания вот полный код:
time_0=0
time_now=0
Price={}--массив сумм цен инструмента
--всего в массиве пусть для примера будет 5 строк:
max_rows_arr_Price=5
--в каждой строке массива сохраняется сумма сделок за 30 секунд
n_sec=30
--счетчик строк
n_rows=0
--============================================================­====================================
function OnAllTrade(alltrade)
    if alltrade.sec_code==instr1 then
         time_now=os.date("%X")
         local t1=os.time(Vremya_v_tablicu(time_now))
         local t2=os.time(Vremya_v_tablicu(time_0))
         if os.difftime(t1,t2)>=n_sec or t1.min~=t2.min or time_0==0 then
         n_rows=n_rows+1
         time_0=os.date("%X")
         if max_rows_arr_Price <= 2 then
              Price[n_rows]=alltrade.price
         else
              --!И ВОТ ЗДЕСЬ НУЖНО ПРОПИСАТЬ КОД КАК СДВИНУТЬ МАССИВ НА 1 СТРОКУ ЖЕЛАТЕЛЬНО БЕЗ ЦИКЛА FOR???

         end
    else
         Price[n_rows]=Price[n_rows]+alltrade.price
    end
    end
end
--============================================================­====================================
--c этой пользовательской функцией мне легче выполнять операции со временем
function Vremya_v_tablicu(priem)
    priem=tostring(priem)
    local otpravka=os.date("!*t",os.time())
    local len=string.len(priem)
    if len>6 then
         otpravka.hour,otpravka.min,otpravka.sec=string.match(priem,"(%d%d)%p(%d%d)%p(%d%d)")
    elseif len==6 then
         otpravka.hour,otpravka.min,otpravka.sec=string.match(priem,"(%d%d)(%d%d)(%d%d)")
    elseif len==5 then
         otpravka.hour,otpravka.min,otpravka.sec=string.match(priem,"(%d)(%d%d)(%d%d)")
    end
    return otpravka
end
--============================================================­====================================
Замена стандартной таблицы QUICK на пользавательскую
 
Цитата
Владимир написал:
Айдар, Функции обратного вызова не имеют ни малейшего отношения к способу хранения данных - это просто прерывания. И немного найдётся способов затормозить терминал, чем использование OnAllTrade. ::  
Не совсем правильно вопрос задал) А как сделать так, чтобы в моей пользовательской таблице были следующие данные, которые будут обновлятся на каждом тике:
1) сделки;
2) таблица данных из стакана котировок.
И при этом чтобы в рабочем окне не было открыто ни графика, ни стакана, ни таблицы сделок?
Замена стандартной таблицы QUICK на пользавательскую
 
Добрый день. Иногда на форуме встречается рекомендация не использовать стандартные таблицы QUICK потому, что они тормозят терминал, и вместо этого использовать пользовательские. Но как реализовать потом функцию обратного вызова, к примеру, как в OnAllTrade()?
Объясните, пожалуйста, один момент в коде.
 
Цитата
Anton написал:
Для простоты посмотрим на четырехбитные числа. Пусть есть сборник флагов flags = 0b0010 и нам надо проверить, установлен ли бит с индексом 1 (второй бит то есть). Мы берем единицу 0b0001, сдвигаем влево до позиции интересующего бита (в примере на 1 бит, получаем 0b0010) и выполняем побитовую операцию AND с флагами: 0b0010 AND 0b0010 = 0b0010, результат не равен нулю, то есть TRUE. А если бит 1 не установлен, а установлен другой какой-то, пусть нулевой, т.е. flags = 0b0001, наша операция даст 0b0001 AND 0b0010 = 0b0000, результат равен нулю, то есть FALSE. А при проверке нулевого бита код тот же, просто сдвиг на 0 позиций делает  ничего .
Вот теперь понял, спасибо  
Объясните, пожалуйста, один момент в коде.
 
Из функции OnTrade() я хочу узнать, активна ли заявка, для этого использую эту пользовательскую функцию:
if bit_set(TABLE_trade.flags, 0)==true then
--то есть, если в бите 0 флаг установлен, значит заявка активна
end

Теперь вопрос к этой функции.
function bit_set(flags,index)
local n=1
--Вопрос 1. Не могу догнать, зачем тут сдвигают бит влево (что это дает)?
n=bit.lshift(1,index)
if bit.band(flags,n)~=0 then
return true
else
return false
end
end
Функция Sleep(), Эффективно ли применять фунцкию Sleep() для понижения нагрузки процессора
 
Цитата
Артем написал:
Sleep передаёт управление процессором обратно операционной системе, с указанием вернуть управление программе не менее чем через указанный период. Операционная система ставит процессор в режим простоя когда он ничем не используется.
Теперь приблизительно понятно, вопрос был конечно же в контексте функции Main(), думал, что в самой функцииSleep() тоже выполняются какие-нибудь специальные расчеты для "торможения" времени.  Значит толк от нее есть
Функция Sleep(), Эффективно ли применять фунцкию Sleep() для понижения нагрузки процессора
 
Эффективно ли применять фунцкию Sleep() для понижения нагрузки процессора? Или, к примеру, если написать код, время которого будет равно времени Sleep()  - ресурс процессора будет затрачен одинаково?
Пример получения данных из истории
 
CLASS_CODE  = "SPBFUT"
SEC_CODE    = "GZM1"
INTERVAL    = INTERVAL_TICK
DS          = nil

function OnInit()
   local Error = '';
   DS, Error = CreateDataSource(CLASS_CODE, SEC_CODE, INTERVAL, "bid")

   if Error and Error ~= "" then
       message("Ошибка подключения к графику: " .. tostring(Error), 2)
       DS = nil
   else    
       DS:SetEmptyCallback()
   end    
end

function main()
    какой код здесь нужен для определения значения "bid" к примеру крайнего торгового дня в 17:00:00?
end

function OnStop()
   script_terminated = true
end
Пример получения данных из истории
 
Погомогите с примером,  
Добавить/удалить индикатор на график при помощи скрипта
 
Цитата
Айдар написал:
Возможно при помощи скрипта добавить/удалить индикатор на график? Вообще сама цель - перерисовать линии которые уже были изначально нанесены на график. Функция SetValue в данном случае не помогает - то что было нанесено ранее до выполнения этой функции - не перерисовывается. Нужны такие же действия, как добавить индикатор, изменить параметры индикатора, изменить время графика и т.д. Можете как-нибудь помочь?
то есть меня интересует, как при помощи скрипта обновить индикатор, к примеру каждый час
Добавить/удалить индикатор на график при помощи скрипта
 
Возможно при помощи скрипта добавить/удалить индикатор на график? Вообще сама цель - перерисовать линии которые уже были изначально нанесены на график. Функция SetValue в данном случае не помогает - то что было нанесено ранее до выполнения этой функции - не перерисовывается. Нужны такие же действия, как добавить индикатор, изменить параметры индикатора, изменить время графика и т.д. Можете как-нибудь помочь?
Индикатор уровней совпадения цен
 
Добрый день. Создаю индикатор, он рисует линию только тогда, когда в заданном периоде (Period) есть определенное число совпадений (Sovpadeniya) Hi или Low свеч. Вопрос. Как чертить линии не от начала периода и до конца графика, а только в промежутке, от первого совпадения до Sovpadeniya. Думаю вопрос понятен. Прилагаю код и скриншот. Подозреваю, что нужно как то создать массив в массиве, но не могу до этого додуматься.
Settings =
{
Name = "*Sovpadeniya_cen_po_Hi_i_Low",
Sovpadeniya = 3,
Period = 150
}

function Init()
--объявляем нужные переменные
    arr1={}
    schetchik_1=0
    skolko_lin=0 --эта переменная нужна для: 1) подсчета линий (передачи их в функцию Init); 2) определения        количества элементов в массиве

--вызываем функцию - один раз перед загрузкой
    OSN_1()
    if skolko_lin>0 then --если совпадений не будет, то вернуть 1 линию, а то вернет 0 и выскочит ошибка
         return skolko_lin
    else
         return 1
    end
end

function OSN_1()
    n_bars = getNumCandles('SBER_5_MINUT')
    moy_grafik, NUMBER, STRING  = getCandlesByIndex ('SBER_5_MINUT', 0, 0, n_bars)
--[[все, нужный график определили, теперь ищем количество нужных совпадений, если они найдутся -
запоминаем их цену в массив. Ищем не во всем графике, а на определенном периоде, указанном в Settings:]]

    for i = (n_bars-Settings.Period), n_bars-Settings.Sovpadeniya-1 do
         schetchik_1=0 --каждый раз обнуляем счетчик
         for n = (i+1), (n_bars-1) do
              if moy_grafik[i].high == moy_grafik[n].high or moy_grafik[i].high == moy_grafik[n].low then
                   schetchik_1=schetchik_1+1 -- если есть совпадения - то считаем их количество
              end
              --[[если нашли количество нужных совпадений набралось - запоминаем значение цены в массив и                         выходим из цикла, дальше нет смысла искать:]]
              if schetchik_1 == Settings.Sovpadeniya then
                   skolko_lin = skolko_lin + 1
                   arr1[skolko_lin]=moy_grafik[i].high
                   break
              end
         end
    end
end

function OnCalculate(index)
    if index-1 < (Size()-(Settings.Period)-1) then
         return nil
    else
         return unpack(arr1)
    end
end
Массив (таблица) в OnCalculate
 
Цитата
s_mike@rambler.ru написал:
Не используйте unpack, если индикатор может иметь значение Ия nil в любой лини
А что делать в данном случае?
Массив (таблица) в OnCalculate
 
Цитата
Sergey Gorokhov написал:
Цитата
Айдар написал:
return ---как правильно прописать весь массив? return arr1[1] это понятно, возвращается 1 элемент массива. А как прописать, что бы возвращалось 5 элементов массива?

используйте функцию unpack

return unpack(arr1)
Спасибо!
Массив (таблица) в OnCalculate
 
Помогите разобраться с кодом.
Settings =
{
Name = "*Primer123",
}

function Init()
Settings.line = {}
for i = 1, 5 do
Settings.line[i] = {}
Settings.line[i] =
{
Color = RGB(20, 255, 20),
Type = TYPE_LINE,
Width = 1
}
end
return 5 --'это означает, что в графике всего будет 5 линий
end

--объявляем массив для возврата значений линии
arr1={}
for i = 1, 5 do
arr1[i]=i+185
end

function OnCalculate(index)
return ---как правильно прописать весь массив? return arr1[1] это понятно, возвращается 1 элемент массива. А как прописать, что бы возвращалось 5 элементов массива?
  ---можно конечно вот так return arr1[1],arr1[2],arr1[3],arr1[4],arr1[5] - но если в массиве элементов будет 1000?
  ---просто return arr1 - не работает
end
Линия тренда
 
Помогите начинающему привести пример кода нарисовать линию тренда, к примеру от Hi свечи №500 до Lo свечи №510.

Settings =
{  
Name = "*пример",
    line =
    {    { Name = "Line",
         Color = RGB(128, 128, 255),
         Type = TYPE_LINE,
         Width = 1
          }
    }
}

function Init()
    --не понятно что здесь нужно делать
end


function OnCalculate(index)
--не понятно что здесь нужно делать
end
Страницы: 1
Наверх