XXM
XXM личный блог
23 ноября 2014, 14:48

Macd.lua

                                                       
                                                       Воскресное чтиво.
                                                       В образовательных целях.

------------------------------------------------------------------------
— Macd.lua, © hismatullin.h@gmail.com, 23.11.2014
— Короткий период: period1
— Длинный период: period2
— Количество периодов сигнальной скользящей средней: period3
— метод усреднения линий: Exponential
------------------------------------------------------------------------
Settings =
     {
          Name = «Macd»,
          period1 = 12, period2 = 26, period3 = 9,
          line=
               {
                    {Name = «Macd», Color = 8404992, Type = 1, Width = 2},
                    {Name = «Sign», Color = 32768, Type = 1, Width = 2}
               }
     }
-------------------------------
function Init()
     Macd = cached_Macd()
     return 2
end
-------------------------------
function OnCalculate(index)
     return Macd(index, Settings.period1, Settings.period2, Settings.period3)
end
-------------------------------
function average(_start, _end)
     local sum=0
     for i = _start, _end do
          sum=sum+C(i)
     end
     return sum/(_end-_start+1)
end
-------------------------------
function cached_Macd()
     local cache_EMA_long={}
     local cache_EMA_short={}
     local cache_MACD={}
     local cache_Sign={}
     return function(ind, _p01, _p02, _p03)
          local n_ema_short = 0 --теущий EMA короткий
          local p_ema_short = 0 --предыдущий EMA короткий
          local n_sign = 0 --теущий sign
          local p_sign = 0 --предыдущий sign
          local period_short = _p01
          local period_long = _p02
          local period_sign = _p03
          local index = ind
          local k_short = 2/(period_short+1)
          local k_long = 2/(period_long+1)
          local k_sign = 2/(period_sign+1)
          if index == 1 then
               cache_EMA_long = {}
               cache_EMA_short = {}
               cache_MACD = {}
               cache_Sign={}
          end
          -----------------------------------------------
          if index < period_long then
               cache_EMA_long[index] = average(1,index)
               return nil
          end
          p_ema_long = cache_EMA_long[index-1] or C(index)
          n_ema_long = k_long*C(index)+(1-k_long)*p_ema_long
          cache_EMA_long[index] = n_ema_long
          -----------------------------------------------
          if index < period_short then
               cache_EMA_short[index] = average(1,index)
               return nil
          end
          p_ema_short = cache_EMA_short[index-1] or C(index)
          n_ema_short = k_short*C(index)+(1-k_short)*p_ema_short
          cache_EMA_short[index] = n_ema_short
          -----------------------------------------------
          --считаем сигнальную
          cache_MACD[index] = n_ema_short-n_ema_long
          p_sign = cache_Sign[index-1] or cache_MACD[index]
          n_sign = k_sign*cache_MACD[index]+(1-k_sign)*p_sign
          cache_Sign[index] = n_sign
          -----------------------------------------------
          return n_ema_short-n_ema_long, n_sign
     end
end
------------------------------------------------------------------------ 
34 Комментария
  • Нечто
    23 ноября 2014, 15:06
    а как запустить этот скрипт?)
    • Нечто
      23 ноября 2014, 15:55
      XXM,
      Спасибо за пояснение)
      Наткнулся вот на Ваш привод — SuperScalp)
      Вопрос — для торговли одновременно несколькими инструментами — где и как надо редактировать function getIniSection() — а то в коде SuperScalp эту функцию вообще не нашёл?

      можно с примером? как Вы указали для " переворота" в коментариях
        • Нечто
          23 ноября 2014, 19:33
          XXM,
          Спасибо за оперативный ответ)
          а как создать таблицу настроек и где?
          как это выглядит в коде например для пары инструментов?
          если Вам не трудно)
            • Нечто
              23 ноября 2014, 21:53
              XXM,
              Спасибо буду пробовать, хотя сам только начал осваивать LUA
              Я Вам ещё в личку написал по поводу индикатора на Lua
  • Sdu
    23 ноября 2014, 15:49
    Сам скрипт в студию (ссылка для скачивания ).
    • R14
      23 ноября 2014, 16:22
      kdu, копипаст не работает?
      • Sdu
        23 ноября 2014, 16:35
        R14,
        Тут ВСЕ прям знают как из простого текстового файла сделать скрипт LUA, поэтому и попросил ссылку.
        • Нечто
          23 ноября 2014, 16:42
          kdu,
          Возмите любой файл с расширением lua, откройте в блокноте — сотрите все и копируйте этот (см выше) потом сохраняете — получатся то что надо — файл с расширением lua — его копируем в папку LuaIndicators
  • R14
    23 ноября 2014, 16:16
    не подскажете где можно глянуть номера цветов? как прописать например красный цвет в индикаторе?
      • R14
        23 ноября 2014, 18:20
        XXM, разобрался вроде, спасибо!
  • ccoonnsstt
    23 ноября 2014, 17:39
    А кроме кода, можно как-то рассказать, что за зверь такой и с чем его едят, что в нем эксклюзивного? Может картинки какие-нибудь показать. Мол, это самый MACD-ный MACD, все остальные MACD-ы отдыхают…
    Или этот индикатор позволяет:
    1...
    2...
      • amandra
        23 ноября 2014, 18:13
        XXM, а смысл переписывать то, что уже реализовано в QUIK?
        вот если бы изложили не тривиальные моменты в программировании на qlua или в технологии разработки индикаторов на qlua
          • amandra
            23 ноября 2014, 20:17
            XXM, я к тому, что, если это в образовательных целях, то опишите назначение каждой функции, смысловую нагрузку частей программы и тп. Иначе в Вашем посте нет ничего образовательного.
            Вы ведь книжки читаете, хоть раз видели книгу, которая содержит код в чистом виде? — нет...
            вот Вам пример, как я вижу «печеньки» в программировании индикаторов.
            На мой взгляд, SMA рассчитывать как у Вас нельзя, а точнее, можно выполнить расчет более эффективно, с точки зрения времени вычисления SMA.
            В вашем примере для текущего индекса выбирается N предыдущих, суммируются и находится среднее значение.
            А можно:
            1) завести массив из N элементов, при появлении новой свечи удалять первый и добавлять текущий в конец.
            2) завести переменную S, в которой будет содержаться текущая сумма или среднее значение из N элементов
            3) при появлении новой свечи из S вычесть первый элемент массива, удалить из массива первый элемент, добавить в конец новый и прибавить его к S

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

            UPDATE: циклы в любом языке программирования — ЗЛО (всегда замедляют процесс вычисления), их использовать нужно только тогда, когда без них никак нельзя обойтись.
              • amandra
                23 ноября 2014, 21:46
                XXM, XXM, я знаю, что SMA высчитывается, только пока index<period_long
                я привел подход, который в некоторых задачах даст серьезный прирост производительности.
                В данном случае, оптимизация без цикла может ничего особо не дать, но, если, будет на 5% лучше, я бы потратил время на оптимизацию.
      • ccoonnsstt
        23 ноября 2014, 18:39
        XXM,
        Про сам MACD, я очень даже знаю. А вот Ваш MACD, чем отличается, чем замечателен? Чем может помочь трейдеру MACD на LUA, какие у него новые уникальные свойства?
      • ccoonnsstt
        23 ноября 2014, 21:58
        XXM,
        Если внимательно почитать мой вопрос, то можно легко выяснить, что я не спрашиваю, что такое MACD! Я спрашиваю — чем Ваш MACD отличается от известного всем MACDа?
        И можно было не отправлять меня на википедию, а просто ответить, что это MACD, просто MACD… (хотя и видно, что он модифицирован)…
          • ccoonnsstt
            23 ноября 2014, 23:18
            XXM,
            Именно это и хотелось бы сразу услышать)

            Подсказываю стратегию, один macd расчитывать по High, второй по Low. Первый использовать для открытия лонгов, второй для выходов.

            Для шортов наоборот.

            На высоколиквидных инструментах, на старших таймфреймах, при соблюдении правил управления капиталом, может получиться прибыльная стратегия.

            Удачи!
              • ccoonnsstt
                24 ноября 2014, 08:13
                XXM,
                К Вашему посту как раз картинка)
  • R14
    23 ноября 2014, 18:38
    ещё вопрос, как можно в индикатор добавить уровень? любой допустим 0 или 50, что б по умолчанию он там был.
    • R14
      23 ноября 2014, 20:05
      XXM, ок попробую, это не вызовет дополнительной нагрузки? но я маленько другое имел ввиду, в окне свойств индикатора есть три вкладки Общие, Дополнительно и Уровни, вот как программно добавить уровни в третью вкладку «Уровни».
        • R14
          23 ноября 2014, 20:24
          XXM, понял, большое спасибо!
  • netlink
    23 ноября 2014, 21:37
    А можно примеры с картинками?

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн