[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要路过。没有你就无处可去 - 3. - 页 632

 
alsu:

例如,你需要用PeriodSMA计算一个简单的移动平均线。为了计算SMA,将最后一个PeriodSMA条的数值相加,然后除以PeriodSMA。很明显,对于编号为Bars-1, Bars-2, ..., Bars-PeriodSMA+1的条形图来说,它不会起作用,因为我们根本没有计算所需的条形图数量(最左边的条形图有Bars-1指数)。因此,我们必须开始计算指标,而不是从图表中的最后一个柱子开始,而是从具有Bars-PeriodSMA指数的柱子开始。

为什么他们要写这个值,而不是写一个任意值?这是因为这种计算起点的转移使我们能够在不影响计算正确性的情况下计算出最大的条数。

但请记住,这是最简单的情况。有时,从代码中可能无法立即清楚地看到程序需要多少个过去的小节来进行计算,以及这个转变究竟来自哪里。那么,你也许应该问写代码的开发者。但在一般情况下,有一个通用的方法 - 只要看看代码,在程序运行期间,原则上可以使用价格数据和指数缓冲区数据获得酒吧的最大指数,通常在这个阶段已经变得很清楚...

现在,一切都在步入正轨。感谢阿列克谢的回应!我们会继续努力。
 
skyjet:


谢谢你的澄清!

而且,我想说明的是,如果我机械地加0,TP和SL在这种类型的终端中会起作用吗?


他们会的,他们当然会的。
这就是它们的作用,外部变量,可以设置任何数值。

但把你所建议的放在初始化模块中会更容易。
或者以这种形式。
// для терминала с 5 знаками
if (Digits == 3 || Digits == 5) {
   decimal = 10; // Определяет кол-во пунктов в четвертом(втором) знаке
   STOPLOSS *= decimal;
   TAKEPROFIT *= decimal;
   slippage *= decimal; // прочие целочисленные переменные в пунктах
} else decimal = 1;
变量将被自动调整,对于其他需要,使用乘数"小数"。
 
skyjet:


Спасибо за разъяснения!

И просто чтобы уточнить, если я механическим путем добавлю 0, то TP и SL будут работать в данном типе терминалов?

朴实无华

当然,他们会的。
这就是它们的作用,外部变量,可以设置任何数值。

但把你被建议做的事情放在初始化模块中,还是比较容易的。
或者以这种形式。
变量将被自动调整,对于其他需求,使用乘数 "小数" 。

这项任务需要澄清。

  • 你的输入参数(STPOLOSS、TAKEPROFIT等)必须考虑到4/2位数 的输入!!!。
 

下午好...

SOS!!!"。好心人,救命啊!!!。我是一个普通的编程初学者(我是自学成才),特别是在MQL 方面。我写了一个简单的指标:RSI+布林线合一。但问题是:如果我 明确 指定数组Buf_std_dev 中元素的数量(即数组声明行看起来像这样:double Buf_std_dev[]),那么当在客户终端窗口(CT)中显示这个指标时,我得到了以下图片。

图片的解释。

a) 顶部是RSI,在CT 提供的指标集中有RSI,布林线已经通过拖动 ,拖到了这个RSI 的窗口中)。

b) 底部是RSI,它是由我编程的。

编译器没有检测到任何错误或警告

 

另一方面,如果在声明数组Buf_std_dev 时,我明确 指定了其中的元素数量(即,数组声明行看起来像这样:double Buf_std_dev[5502],其中 5502 是条数,用变量 Bars 获得 ),那么一切恢复正常(因为正如你从两个指标的比较中看到的:所有值都是一样的)。

你能告诉我怎么做才能保存图片,就像第二张图片那样,但明确不设置数组Buf_std_dev 中的元素数量。

P.S. 提前感谢您的回答。

 
显示所有的代码
 

附上代码(不包括某些部分--4MB内装不下!!)。

....
double Buf_rsi[];                                                       //открываем индикаторный массив для значений RSI+
double Buf_ma[];                                                        //открываем индикаторный массив для значений скользящей средней по RSI+
double Buf_up_line[];                                                   //открываем индикаторный массив для значений ВЛБ по RSI+
double Buf_down_line[];                                                 //открываем индикаторный массив для значений НЛБ по RSI+
double Buf_std_dev[5498];                                               //открываем массив для хранения данных по стандартному отклонению  

string timeframe[9];                                                    //объявляем массив для значений таймфреймов
extern int Период_RSI=14;                                               //внешняя переменная: период RSI+
extern int Применить_к=PRICE_CLOSE;                                     //внешняя переменная: цена, для к-й рассчитывается RSI+
extern int Сдвиг=0;                                                     //внешняя переменная: сдвиг относительно текущего графика RSI+
extern double Сигма=2.0;                                                //внешняя переменная: количество стандартных отклонений для расчета лент Боллинджера по RSI+
extern int МА=21;                                                       //внешняя переменная: период скользящей средней для расчета лент Боллинджера по RSI+
....
   if(Bars<=Период_RSI) return(0);                                      //если баров на графике меньше, чем период RSI+, то выходим
//+-------------------------------------------------------------------------------------- 9 --
   int counted_bars=IndicatorCounted();                                 //количество посчитанных баров
   int i;                                                               //техническая переменные: счетчики

   int limit=Bars-counted_bars;                                         //индекс первого непосчитанного по массиву Buf_ma (т.к. этот массив НЕ является массивом таймсерией)
   if(counted_bars<0)limit--;                                           //если значение переменной counted_bars больше 0, то увеличиваем на 1 значение переменной limit
//+-------------------------------- Рассчет линий индикатора ---------------------------- 10 --
   for(i=0;i<=limit;i++)Buf_rsi[i]=iRSI(NULL,0,Период_RSI,Применить_к,i);//рассчет значения RSI+ на i-ом баре      
   for(i=0;i<=limit;i++)                                                //цикл по рассчету линий на основе RSI+     
       {                                                                //начало for
        Buf_std_dev[i]=iStdDevOnArray(Buf_rsi,Bars,МА,Сдвиг,MODE_SMA,i);//рассчитываем стандатное отклонение по массиву RSI+
        Buf_ma[i]=iMAOnArray(Buf_rsi,Bars,МА,Сдвиг,MODE_SMA,i);         //рассчет значения MA по RSI+ на i-ом баре
        Buf_up_line[i]=Buf_ma[i]+Сигма*Buf_std_dev[i];                  //рассчет значения ВЛБ по RSI+
        Buf_down_line[i]=Buf_ma[i]-Сигма*Buf_std_dev[i];                //рассчет значения НЛБ по RSI+
       }                                                                //конец for
   for(i=0;i<=Bars;i++)                                                 //цикл по подсчету количества данных внутри ЛБ
      {                                                                 //начало for
       int sum;                                                         //техническая переменные: сумма данных, к-е находятся внутри ЛБ 
       if(Buf_rsi[i]>Buf_down_line[i]&&Buf_rsi[i]<Buf_up_line[i])sum++; //если значение RSI+ > НЛБ и значение RSI+ < НЛБ, то переменная sum увеличиваестся на 1 (т.о.)
      }                                                                 //конец for
//+------------------------------------------------------------------------------------- 11 --
 
FAQ:
显示所有代码

请告知是否有办法将超过4Mb的代码转储到这里(或分部分转储到这里)?
 

如果你的Buf_std_dev 不是一个指示器缓冲区(八个之一),你需要在声明它的时候指定它的大小,或者任何大小(如果你打算以后改变它(大小))。

 

对,这不是...如果我可以的话,那就同时再问两个问题。

1.如果我给它指定一个缓冲区(数组Buf_std_dev) ,这意味着它也会显示在指示器窗口中?

如果我不给它指定一个缓冲区,那么(如果我理解正确的话)会出现以下情况:假设我指定了100条的大小。然后,当新的条形图出现时(例如,如果Bars=101),我们将只对我们指定的最后100个条形图进行计算(即最古老的条形图--101将被丢弃)。那么,当加载历史记录时,数组的大小 将总是只等于100条(或其他一些值,我将在声明时指定)?