Индикатор Squeeze Momentum Indicator

Страницы: 1
RSS
Индикатор Squeeze Momentum Indicator, Прошу помощи по перекодировки индикатора в луа для Квик
 
Добрый вечер. Признаю опыта программирования у меня нет вообще, очень понравился всем известный индикатор Squeeze Momentum Indicator, даже нашел версию для МТ4, но вот для Квик сколько не искал всё бестолку. Прошу помочь перекодить его для квик. Прилагаю код из трейдингвью. С большим уважением к Вам.

//
study(shorttitle = "SQZMOM_LB", title="Squeeze Momentum Indicator [LazyBear]", overlay=false)

length = input(20, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(20, title="KC Length")
multKC = input(1.5, title="KC MultFactor")

useTrueRange = input(true, title="Use TrueRange (KC)", type=bool)

// Calculate BB
source = close
basis = sma(source, length)
dev = multKC * stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev

// Calculate KC
ma = sma(source, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC

sqzOn  = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz  = (sqzOn == false) and (sqzOff == false)

val = linreg(source  -  avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)),
           lengthKC,0)

bcolor = iff( val > 0,
           iff( val > nz(val[1]), lime, green),
           iff( val < nz(val[1]), red, maroon))
scolor = noSqz ? blue : sqzOn ? black : gray
plot(val, color=bcolor, st yle=histogram, linewidth=4)
plot(0, color=scolor, st yle=cross, linewidth=2)
 
Для МТ5 нашел следующий код.

   
 
//+------------------------------------------------------------------+
//|                                             Squeeze_Momentum.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                                 https://mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com&quot;
#property version   "1.00"
#property description "Squeeze Momentum indicator"
#property indicator_separate_window
#property indicator_buffers 9
#property indicator_plots   2
//--- plot UP
#property indicator_label1  "SqMom Up"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  8
//--- plot DN
#property indicator_label2  "SqMom Down"
#property indicator_type2   DRAW_HISTOGRAM
#property indicator_color2  clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  8
//--- input parameters
input uint     InpPeriod   =  20;   // Period
//--- indicator buffers
double         BufferUP[];
double         BufferDN[];
double         BufferRaw[];
double         BufferLRL[];
double         BufferLocalExUP[];
double         BufferLocalExDN[];
double         BufferCloseLocalUP[];
double         BufferCloseLocalDN[];
double         BufferMA[];
//--- global variables
int            period;
int            handle_ma;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
 {
//--- set global variables
  period=int(InpPeriod<1 ? 1 : InpPeriod);
//--- indicator buffers mapping
  SetIndexBuffer(0,BufferUP,INDICATOR_DATA);
  SetIndexBuffer(1,BufferDN,INDICATOR_DATA);
  SetIndexBuffer(2,BufferRaw,INDICATOR_CALCULATIONS);
  SetIndexBuffer(3,BufferLRL,INDICATOR_CALCULATIONS);
  SetIndexBuffer(4,BufferLocalExUP,INDICATOR_CALCULATIONS);
  SetIndexBuffer(5,BufferLocalExDN,INDICATOR_CALCULATIONS);
  SetIndexBuffer(6,BufferCloseLocalUP,INDICATOR_CALCULATIONS);
  SetIndexBuffer(7,BufferCloseLocalDN,INDICATOR_CALCULATIONS);
  SetIndexBuffer(8,BufferMA,INDICATOR_CALCULATIONS);
//--- setting buffer arrays as timeseries
  ArraySetAsSeries(BufferUP,true);
  ArraySetAsSeries(BufferDN,true);
  ArraySetAsSeries(BufferRaw,true);
  ArraySetAsSeries(BufferLRL,true);
  ArraySetAsSeries(BufferLocalExUP,true);
  ArraySetAsSeries(BufferLocalExDN,true);
  ArraySetAsSeries(BufferCloseLocalUP,true);
  ArraySetAsSeries(BufferCloseLocalDN,true);
  ArraySetAsSeries(BufferMA,true);
//--- setting indicator parameters
  IndicatorSetString(INDICATOR_SHORTNAME,"Squeeze Momentum");
  IndicatorSetInteger(INDICATOR_DIGITS,0);
//--- create MA's handles
  ResetLastError();
  handle_ma=iMA(NULL,PERIOD_CURRENT,period,0,MODE_SMA,PRICE_CLOSE);
  if(handle_ma==INVALID_HANDLE)
    {
     Print("The iMA(",(string)period,") object was not created: Error ",GetLastError());
     return INIT_FAILED;
    }
//---
  return(INIT_SUCCEEDED);
 }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
               const int prev_calculated,
               const datetime &time[],
               const double &open[],
               const double &high[],
               const double &low[],
               const double &close[],
               const long &tick_volume[],
               const long &volume[],
               const int &spread[])
 {
//--- Установка массивов буферов как таймсерий
  ArraySetAsSeries(open,true);
  ArraySetAsSeries(high,true);
  ArraySetAsSeries(low,true);
  ArraySetAsSeries(close,true);
  ArraySetAsSeries(time,true);
//--- Проверка количества доступных баров
  if(rates_total<fmax(period,4)) return 0;
//--- Проверка и расчёт количества просчитываемых баров
  int limit=rates_total-prev_calculated;
  if(limit>1)
    {
     limit=rates_total-period-3;
     ArrayInitialize(BufferUP,EMPTY_VALUE);
     ArrayInitialize(BufferDN,EMPTY_VALUE);
     ArrayInitialize(BufferRaw,0);
     ArrayInitialize(BufferLRL,0);
     ArrayInitialize(BufferLocalExUP,0);
     ArrayInitialize(BufferLocalExDN,0);
     ArrayInitialize(BufferCloseLocalUP,0);
     ArrayInitialize(BufferCloseLocalDN,0);
     ArrayInitialize(BufferMA,0);
    }
//--- Подготовка данных
  int count=(limit>1 ? rates_total : 1),copied=0;
  copied=CopyBuffer(handle_ma,0,0,count,BufferMA);
  if(copied!=count) return 0;
  for(int i=limit; i>=0 && !IsStopped(); i--)
    {
     double Median=(high[i]+low[i])/2.0;
     BufferRaw[i]=close[i]-((Median+BufferMA[i])/2.0);
    }
  for(int i=limit; i>=0 && !IsStopped(); i--)
    {
     double x=0,y=0,xy=0,x2=0;
     for(int j=0;j<period;j++)
       {
        y+=BufferRaw[i+j];
        xy+=BufferRaw[i+j]*j;
        x+=j;
        x2+=j*j;
       }
     double tmp=period*x2-x*x;
     double m=(period*xy-x*y)/(tmp!=0 ? tmp : 1.0);
     double yint=(y+m*x)/period;
     BufferLRL[i]=yint-m*period;
    }
 
//--- Расчёт индикатора
  for(int i=limit; i>=0 && !IsStopped(); i--)
    {
     if((BufferLRL[i]>0) && (BufferLRL[i]<BufferLRL[i+1]) && (BufferLRL[i+1]>BufferLRL[i+2]))
        BufferLocalExUP[i]=BufferLRL[i];
     else
        BufferLocalExUP[i]=BufferLocalExUP[i+1];

     if((BufferLRL[i]>0) && (BufferLRL[i]<BufferLRL[i+1]) && (BufferLRL[i+1]>BufferLRL[i+2]))
        BufferCloseLocalUP[i]=close[i];
     else
        BufferCloseLocalUP[i]=BufferCloseLocalUP[i+1];

     if((BufferLRL[i]<0) && (BufferLRL[i]>BufferLRL[i+1]) && (BufferLRL[i+1]<BufferLRL[i+2]))
        BufferLocalExDN[i]=BufferLRL[i];
     else
        BufferLocalExDN[i]=BufferLocalExDN[i+1];

     if((BufferLRL[i]<0) && (BufferLRL[i]>BufferLRL[i+1]) && (BufferLRL[i+1]<BufferLRL[i+2]))
        BufferCloseLocalDN[i]=close[i];
     else
        BufferCloseLocalDN[i]=BufferCloseLocalDN[i+1];

     bool dn_sg=((BufferCloseLocalUP[i]>BufferCloseLocalUP[i+1]) && (BufferLocalExUP[i+1]>BufferLocalExUP[i]) ? true : false);
     bool dn_sg_custom=((BufferCloseLocalDN[i]>BufferCloseLocalDN[i+1]) && (BufferLocalExDN[i+1]>BufferLocalExDN[i]) ? true : false);
     bool up_sg=((BufferCloseLocalDN[i]<BufferCloseLocalDN[i+1]) && (BufferLocalExDN[i+1]<BufferLocalExDN[i]) ? true : false);
     bool up_sg_custom=((BufferCloseLocalUP[i]<BufferCloseLocalUP[i+1]) && (BufferLocalExUP[i+1]<BufferLocalExUP[i]) ? true : false);
     
     BufferUP[i]=((dn_sg || dn_sg_custom || up_sg || up_sg_custom) && (BufferLRL[i]>BufferLRL[i+1]) ? 1 : 0);
     BufferDN[i]=((dn_sg || dn_sg_custom || up_sg || up_sg_custom) && (BufferLRL[i]<BufferLRL[i+1]) ? 1 : 0);
    }
 
//--- return value of prev_calculated for next call
  return(rates_total);
 }
//+------------------------------------------------------------------+
 
Конечно если у кого есть я был бы крайне благодарен. Если нет, готов заплатить за перекодировку для луа.
 
Нашел код для МТ4

//+------------------------------------------------------------------+
//|                                      Created for MT4 by Ravish A |
//|                                                 Ravish Anandaram |
//|                                  mailto: aravishstocks@gmail.com |
//+------------------------------------------------------------------+
// ============================================================­===============================================
// This indicator is based on a strategy mentioned in John Carter's book, Mastering the Trade.
// It is also a fully improvised version of Squeeze_Break indicator by DesO'Regan.
// You can find that implementation here:
// https://www.mql5.com/en/code/8840?utm_campaign=MetaTrader+4+Terminal&utm_medium=special&...
// The main improvements include plotting squeeze values (some BB/KC calculation changes) on the zero-line and then to smoothen the momentum values as rising/falling positive/negative histograms
// to match the ones sold on commercial websites. This is easy on the eye.
// Uses some of the Linear Regression code fr om Victor Nicolaev aka Vinin's V_LRMA.mq4 for smoothening the histograms
// This version DOES NOT have any alerts functionality and also does not have inputs to change.
// The reason is - this is V1 and generally no body changes the BB and KC values. Feel free to enhance on your own.
// And if you like this indicator pa$$ :-) on to -->  Ravish Anandaram (aravishstocks@gmail.com)
// ============================================================­===============================================
#property copyright "Ravish Anandaram (aravishstocks@gmail.com)"
#property link      "mailto: aravishstocks@gmail.com"
//+------------------------------------------------------------------+
//| indicator properties                                             |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_color1 MediumBlue
#property indicator_color2 Tomato
#property indicator_color3 DodgerBlue
#property indicator_color4 Orange
#property indicator_color5 ForestGreen
#property indicator_color6 Red
//+------------------------------------------------------------------+
//| Buffer Array Declarations                                        |
//+------------------------------------------------------------------+
double Squeeze_Off[]; // Green Dots on the zero line
double Squeeze_On[]; // Red Dots on the zero line
double SqzFiredLong_Strong[]; // Rising Positive Histograms
double SqzFiredShort_Strong[]; // Falling Negative Histograms
double SqzFiredLong_Weak[]; // Falling Positive Histograms
double SqzFiredShort_Weak[]; // Rising Negative Histograms
//+------------------------------------------------------------------+
//| Internal Global Variables                                        |
//+------------------------------------------------------------------+
int       Bollinger_Period=20;
double    Bollinger_Deviation=2.0;
int       Keltner_Period=20;
double    Keltner_ATR=1.5;
int       Bollinger_MaMode=MODE_SMA;
int       Keltner_MaMode=MODE_SMA;
int       BarsToGoBack=1000;
int       Smooth_Factor=10;
double      LSmoothX=1.0;
double      LSmoothY=1.0;
double      LSmoothFactor_1=3.0;
double      LSmoothFactor_2=3.0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
 {
  IndicatorDigits(4);  // indicator value precision
//--- Indicator Setup
  SetIndexStyle(0,DRAW_HISTOGRAM,EMPTY,3);
  SetIndexBuffer(0,SqzFiredLong_Strong);
  SetIndexStyle(1,DRAW_HISTOGRAM,EMPTY,3);
  SetIndexBuffer(1,SqzFiredShort_Strong);
  SetIndexStyle(2,DRAW_HISTOGRAM,EMPTY,3);
  SetIndexBuffer(2,SqzFiredLong_Weak);
  SetIndexStyle(3,DRAW_HISTOGRAM,EMPTY,3);
  SetIndexBuffer(3,SqzFiredShort_Weak);
  SetIndexStyle(4,DRAW_HISTOGRAM,EMPTY,3);
  SetIndexBuffer(4,Squeeze_Off);
  SetIndexStyle(5,DRAW_HISTOGRAM,EMPTY,3);
  SetIndexBuffer(5,Squeeze_On);
//--- Indicator Labels
  IndicatorShortName("Squeeze RA V1");
//---
  return(0);
 }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
 {
  ObjectsDeleteAll();
  return(0);
 }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double GetSmoothenedValuesForHistograms(int nShift,int nLength)
 {
  double LSmooth1,LSmooth2,LSmoothVal;
  LSmooth1=LSmoothX*iMA(Symbol(),0,nLength,0,MODE_SMA,PRICE_CLOSE,nShift);
  LSmooth2=iMA(Symbol(),0,nLength,0,MODE_LWMA,PRICE_CLOSE,nShift)/LSmoothY;
  LSmoothVal=LSmoothFactor_1*LSmooth2-LSmoothFactor_2*LSmooth1;
  return LSmoothVal*Smooth_Factor;
 }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
 {
//--- Indicator Optimization
  int Counted_Bars=IndicatorCounted();
  if(Counted_Bars < 0) return -1;
  if(Counted_Bars>0) Counted_Bars=Counted_Bars-Keltner_Period;
  int limit=Bars-Counted_Bars;
  int lim it2=0;
//---
  if(_Period==PERIOD_MN1)
     Smooth_Factor= 4;
  else if(_Period == PERIOD_W1)
     Smooth_Factor= 4;
  else if(_Period == PERIOD_D1)
     Smooth_Factor= 6;
  else if(_Period == PERIOD_H4)
     Smooth_Factor= 8;
  else if(_Period == PERIOD_H1)
     Smooth_Factor= 30;
  else if(_Period == PERIOD_M30)
     Smooth_Factor= 50;
  else if(_Period == PERIOD_M15)
     Smooth_Factor= 50;
  else if(_Period == PERIOD_M5)
     Smooth_Factor= 100;
  else if(_Period == PERIOD_M1)
     Smooth_Factor= 300;
//--- Main Indicator Loop
  for(int i=limit-2; i>=limit2; i--) //main indicator FOR loop
    {
     //--- Indicator Calculations
     double Kelt_Mid_Band=iMA(Symbol(),0,Keltner_Period,0,Keltner_MaMode,PRICE_CLOSE,i);
     double Kelt_Upper_Band = Kelt_Mid_Band + (iATR(Symbol(),0,Keltner_Period,i)*Keltner_ATR);
     double Kelt_Lower_Band = Kelt_Mid_Band - (iATR(Symbol(),0,Keltner_Period,i)*Keltner_ATR);
     //---
     double StdDev=iStdDev(Symbol(),0,Bollinger_Period,0,Bollinger_MaMode,PRICE_CLOSE,i);
     double Ma=iMA(Symbol(),0,Bollinger_Period,0,Bollinger_MaMode,PRICE_CLOSE,i);
     double Boll_Upper_Band = Ma + (StdDev*Bollinger_Deviation);
     double Boll_Lower_Band = Ma - (StdDev*Bollinger_Deviation);
     //---
     double dLSmoothVal=0;
     //--- Buffer Calculations
     //--- Smoothen the histogram bars using linear reg methods
     dLSmoothVal=GetSmoothenedValuesForHistograms(i,Keltner_Period);
     if(dLSmoothVal>0)
       {
        if((SqzFiredLong_Strong[i+1]!=0 && dLSmoothVal>SqzFiredLong_Strong[i+1]) || (SqzFiredLong_Weak[i+1]!=0 && dLSmoothVal>SqzFiredLong_Weak[i+1]))
          {
           SqzFiredLong_Strong[i]=dLSmoothVal;
           SqzFiredLong_Weak[i]=0;
          }
        else
          {
           SqzFiredLong_Weak[i]=dLSmoothVal;
           SqzFiredLong_Strong[i]=0;
          }
        SqzFiredShort_Strong[i]=0;
        SqzFiredShort_Weak[i]=0;
       }
     else
       {
        if((SqzFiredShort_Strong[i+1]!=0 && dLSmoothVal<SqzFiredShort_Strong[i+1]) || (SqzFiredShort_Weak[i+1]!=0 && dLSmoothVal<SqzFiredShort_Weak[i+1]))
          {
           SqzFiredShort_Strong[i]=dLSmoothVal;
           SqzFiredShort_Weak[i]=0;
          }
        else
          {
           SqzFiredShort_Weak[i]=dLSmoothVal;
           SqzFiredShort_Strong[i]=0;
          }
        SqzFiredLong_Strong[i]=0;
        SqzFiredLong_Weak[i]=0;
       }
     //---
     if(Boll_Upper_Band<Kelt_Upper_Band && Boll_Lower_Band>Kelt_Lower_Band)
       {
        Squeeze_On[i]=0.01;
        Squeeze_Off[i]=0;
       }
     else
       {
        Squeeze_Off[i]= 0.01;
        Squeeze_On[i] = 0;
       }
    } // end of main indicator FOR loop
//---
  return(0);
 }
//+------------------------------------------------------------------+
 
Стучитесь в скайп mikemsk
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Что он показывает. Может как по другому называется.
И тут не помогут. Тут клуб для своих!
 
Цитата
Александр написал:
Что он показывает. Может как по другому называется.
И тут не помогут. Тут клуб для своих!
Добрый день.
Речь про индикатор Squeeze Momentum Indicator?

Если да, то ответ можете найти в открытом доступе в интернете.
 
Добрый день. Искал пару месяцев, нашел только на МТ4 и МТ5 на луа его нигде нет.
 
Цитата
Игорь78 написал:
Добрый день. Искал пару месяцев, нашел только на МТ4 и МТ5 на луа его нигде нет.
Добрый день.
У нас такого индикатора на Lua нет. Можете написать самостоятельно.
 
А у АДХ не такой-же принцип расчета? Такой же моментум цены. Или я что то путаю?
 
Код
function Init()
    indicator:name("Squeeze Momentum Indicator");
    indicator:description("");
    indicator:requiredSource(core.Bar);
    indicator:type(core.Oscillator);   
   indicator.parameters:addGroup("Calculation"); 
    indicator.parameters:addInteger("lengthKC", "KC Length", "", 20, 2, 2000);
    indicator.parameters:addGroup("Style");    
    indicator.parameters:addColor("Up", "Up Color", "", core.#00ff00);
    indicator.parameters:addColor("Down", "Down Color", "", core.#ff0000);
   indicator.parameters:addColor("Neutral", "Neutral Color", "", core.#808080);
end
-- Indicator instance initialization routine
-- Processes indicator parameters and creates output streams
-- Parameters block
local first;
local source = nil;
local MA, Average,Raw;
local Alert;  
local close_local_up, local_ex_up;
local close_local_dn,local_ex_dn;
local val;
local lengthKC;
local Up,Down,Neutral;
-- Routine
 function Prepare(nameOnly)   
    lengthKC= instance.parameters.lengthKC;
    local name = profile:id() .. "(" ..  instance.source:name() .. ", " ..  lengthKC .. ")";
    instance:name(name); 
    Up= instance.parameters.Up;
   Down= instance.parameters.Down;
   Neutral= instance.parameters.Neutral;
    if   (nameOnly) then
        return;
    end
   close_local_up = instance:addInternalStream(0, 0);
   local_ex_up = instance:addInternalStream(0, 0);
    close_local_dn = instance:addInternalStream(0, 0);
   local_ex_dn = instance:addInternalStream(0, 0);
   val = instance:addInternalStream(0, 0); 
   MA= instance:addInternalStream(0, 0); 
   Average= instance:addInternalStream(0, 0);
   Raw = instance:addInternalStream(0, 0);
    source = instance.source;
    first=source:first()+lengthKC; 
   Alert = instance:addStream("Alert" , core.Bar, " Alert"," Alert",instance.parameters.Neutral, first+lengthKC);
    Alert:setPrecision(math.max(2, instance.source:getPrecision()));
end
-- Indicator calculation routine
function Update(period, mode)   
    if period < first then
   return;
   end
    MA[period]=  mathex.avg(source.close, period-lengthKC+1, period);
    Average[period] = ((source.high[period]+source.low[period])/2 + MA[period])/2;    
   Raw[period]= source.close[period]-Average[period];   
    if period < first+lengthKC then
   return;
   end   
   val[period] =mathex.lreg (  Raw, period-lengthKC+1,period);   
   if(val[period]>0 and val[period]<val[period-1] and val[period-1]>val[period-2]) then
   local_ex_up[period]= val[period]
   else
   local_ex_up[period]=local_ex_up[period-1]
    end      
     if val[period]>0 and val[period]<val[period-1] and val[period-1]>val[period-2] then
    close_local_up[period]=source.close[period]
    else
    close_local_up[period]=close_local_up[period-1]
    end 
     if val[period]<0 and val[period]>val[period-1] and val[period-1]<val[period-2] then
    local_ex_dn[period]=val[period]
     else
    local_ex_dn[period]=local_ex_dn[period-1] 
    end
     if val[period]<0 and val[period]>val[period-1] and val[period-1]<val[period-2] then
    close_local_dn[period]=source.close[period]
    else
    close_local_dn[period]=close_local_dn[period-1] 
    end      
   if (close_local_up[period]>close_local_up[period-1] and local_ex_up[period-1]>local_ex_up[period])  then
   dn_sg=true;
   else
   dn_sg=false;
   end      
    if (close_local_dn[period]>close_local_dn[period-1] and local_ex_dn[period-1]>local_ex_dn[period]) then
   dn_sg_custom=true;
   else
   dn_sg_custom=false;
   end   
     if (close_local_dn[period]<close_local_dn[period-1] and local_ex_dn[period-1]<local_ex_dn[period]) then
    up_sg=true;
     else
    up_sg=false;
    end    
    if (close_local_up[period]<close_local_up[period-1] and local_ex_up[period-1]<local_ex_up[period]) then
    up_sg_custom=true;
    else
    up_sg_custom=false;
    end   
   if dn_sg or dn_sg_custom or up_sg or up_sg_custom then   
    Alert[period]=1;
   else
   Alert[period]=0;
   end   
   if( val[period] >val[period-1]) then
   Alert:setColor(period, Up);
   elseif( val[period] < val[period-1]) then
   Alert:setColor(period, Down);
   else
   Alert:setColor(period, Neutral);
   end              
end
 
Squeeze Momentum Indicator lua
 
Ради интереса посмотрел на индикатор. Проблема в том, что везде разный код. А первоистчника нет.
В одном месте линейная регрессия одна, в другом другая.
В третьем вижу, что выводят линейную регрессию как гистограмму, что нонсенс, т.к. это прямая.
 
Ага, надо было просто найти первоисточник. Это же просто TTM Squeeze от John Carter.

Кельтнер канал и полосы болинджера. Так себе...
Но ради коллекции можно сделать, конечно.
 
Вот, сделал вариант https://github.com/nick-nh/qlua/blob/master/TTM_Squeeze.lua
 
Цитата
Nikolay написал:
Вот, сделал вариант  https://github.com/nick-nh/qlua/blob/master/TTM_Squeeze.lua
что-то не появляется в списке индикаторов даже. где то ошибка. Quik 8.4.1.6
 
Если Вы скачали файлы с GitHub, то необходимо провести конвертацию файла в кодировку 1251, т.к. на сайте все хранится в UTF-8.
Также не забудьте положить рядом файл maLib.lua т.к. индикатор зависит от нее.
Впрочем, это видно из кода.
 
Цитата
Nikolay написал:
необходимо провести конвертацию файла в кодировку 1251
Всё сделал. По прежнему в списке нет. Проверял на 8.4 и 8.6 версиях Квика. Впрочем остальные ваши индикаторы и без конвертации прекрасно работали. Вот файл, если интересно https://cloud.mail.ru/public/Efiq%2FRCqtM3y3d
А еще в 8.6 перестал работать priceAvgProfile. К сожалению Квик не выдает, на какой строчке ошибка :-(
 
Добавьте файл индикатора в окно доступные скрипты: Сервисы - Lua скрипты.
Запустите его. Будет показана ошибка компиляции. Именно она не дает добавить индикатор в список.
Файл я посмотрел - он в правильно кодировке.

Также обновил priceAvgProfile. Напомнили, он был не совместим с lua 5.3
 
Цитата
Nikolay написал:
Также обновил priceAvgProfile. Напомнили, он был не совместим с lua 5.3
файл обновил. вижу 29 отличий, но на версии Квик 8.6 все равно ошибка «attempt to compare number with string». Вариант с загрузкой LuaIndicators как LuaScripts тоже не работает. они даже никаких ошибок не выдают. может на 7 Квике это работало, но на 8 —  нет...
 
Ну раз у Вас нет ошибок при запуске индикатора как скрипта а я его вижу перед глазами в версии > 8.5, то, скорее всего, не подгружается maLib через require('maLib')

Можете заменить загрузку библиотеки такой конструкцией:
_G.load   = _G.loadfile or _G.load
local maLib = load(_G.getWorkingFolder().."\\Luaindicators\\maLib.lua")()

Либо пропишите пути поиска библиотеки через package.path

Что касается priceAvgProfile, то тоже вижу его перед собой. Но возможно, у Вас проблема в данных и надо отловить ошибку. Посмотрю еще на разных бумагах.
 
Цитата
Nikolay написал:
Можете заменить загрузку библиотеки такой конструкцией:_G.load   = _G.loadfile or _G.loadlocal maLib = load(_G.getWorkingFolder().."\\Luaindicators\\maLib.lua")()
Про прощение задержку ответа, эта конструкция заработала. priceAvgProfile тоже (не понятно, что было не так, может нулевые значения цен), но почему то начиная с 8 версии (любой) изменение параметра Period никак не влияет на результат. в 7 версии индикатор меняется от смены параметра. В идеале бы добавить опцию зеркального отображения с прилипанием к правому краю окна, но это не принципиально
Страницы: 1
Читают тему
Наверх