//+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ intOnCalculate(constint rates_total, constint prev_calculated, constdatetime &time[], constdouble &open[], constdouble &high[], constdouble &low[], constdouble &close[], constlong &tick_volume[], constlong &volume[], constint &spread[]) { //--- if(rates_total<1) return(0); // проверка достаточности данных для расчёта индикатора, если не достаточно - выходим // если для расчёта требуются некое количество баров слева от индекса цикла, ... // ... то проверять нужно это количество, а не 1
//--- Действия для полного перерасчёта индикатора int limit=rates_total-prev_calculated; // количество посчитанных уже баров if(limit>1) { // если количество больше 1, значит имеем новые данные, и нужно полностью пересчитать индикатор limit=rates_total-1; // задаём количество требуемых для расчёта баров равным количеству баров в истории, // если для расчёта требуются некое количество баров слева от индекса цикла, ... // ... то это количество тоже нужно вычесть из rates_total чтобы не выйти за пределы массива // так же тут нужно при необходимости произвести инициализацию буферов индикатора }
//--- Основной цикл индикатора for(int i=limit; i>=0; i--) { // тут выполняем нужные расчёты и записываем их результат в нужные буферы, например: ExtMapBuffer[i]=(open[i]+high[i]+low[i]+close[i])/4.0; // Выведем на график среднюю цену каждой свечи (OHLC/4.0) }
//--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
有几种方法可以获得当前的价格。
1.对于任何符号:如果你想获得有保证的当前价格,在使用前用正确的标识符调用SymbolInfoDouble()。
2.对于当前的符号,你也可以通过预定义的变量Bid和Ask获得当前价格。它们可能会过时,所以如果OnTick()正在运行,你应该用RefreshRates()刷新它们。
"由于类型转换可能导致数据丢失"
我如何克服这个警告?
编译器警告:
"由于类型转换可能导致数据丢失" 我如何克服这个警告?
你需要知道由函数返回的值的确切类型,并使用显式转换。https://www.mql5.com/ru/docs/basis/types/casting
你没有一个完整的模板--你可能还没有在向导中设置指标缓冲区,计算的数据将被写入其中。
但大多数指标的基本原则如下。
//| 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[])
{
//---
if(rates_total<1) return(0); // проверка достаточности данных для расчёта индикатора, если не достаточно - выходим
// если для расчёта требуются некое количество баров слева от индекса цикла, ...
// ... то проверять нужно это количество, а не 1
//--- Действия для полного перерасчёта индикатора
int limit=rates_total-prev_calculated; // количество посчитанных уже баров
if(limit>1) { // если количество больше 1, значит имеем новые данные, и нужно полностью пересчитать индикатор
limit=rates_total-1; // задаём количество требуемых для расчёта баров равным количеству баров в истории,
// если для расчёта требуются некое количество баров слева от индекса цикла, ...
// ... то это количество тоже нужно вычесть из rates_total чтобы не выйти за пределы массива
// так же тут нужно при необходимости произвести инициализацию буферов индикатора
}
//--- Основной цикл индикатора
for(int i=limit; i>=0; i--) {
// тут выполняем нужные расчёты и записываем их результат в нужные буферы, например:
ExtMapBuffer[i]=(open[i]+high[i]+low[i]+close[i])/4.0; // Выведем на график среднюю цену каждой свечи (OHLC/4.0)
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
Artem,编译器给出了一个错误。'ExtMapBuffer' - 未声明的标识符
这就是为什么我加入了这个缓冲区。你应该重新创建模板,但你应该对这个简单的动作更负责任,并问自己--"但是向导问我什么,它需要什么?
你好!大约四个月前,我开始使用Kovalev的教程学习MQL4。我也有视频。我看视频,研究教程,我重复那里使用的代码。我知道这是一个非常严肃的问题,需要时间来掌握它。但我确切地知道我需要练习。我需要简单的任务,并写出它们,有人检查它们,然后我将能够更进一步!另一个问题是,书和视频已经更新,我甚至重复书中的代码,编译它,我得到错误,我看起来像一只羊在新门......,这是悲伤的!
阅读一次文档。教科书在某些地方已经过时了。文件将对此有所帮助。关于任务--解决课本中描述的相同任务。读一读问题,看一看解决方案,重复一遍。以此类推,直到你掌握了它的窍门。最好是将任务尽可能地接近你想学习的任务,以便自己实施。
当然,都是IMHO。
对我来说,它编译得很好。
好吧,你想解释一下为什么这样的物体没有被区分出来吗?
如果你改变了对象的类型,属性将以2个标签或趋势线的形式折叠起来
阅读一次文档。教科书在某些地方已经过时了。文件将对此有所帮助。关于任务--解决课本中描述的相同任务。读一读问题,看一看解决方案,重复一遍。以此类推,直到你掌握了它的窍门。最好是将任务尽可能地接近你想学习的任务,以便自己实施。
当然,都是IMHO。
谢谢你!
好吧,你想解释一下为什么这样的物体没有被区分出来吗?
如果你改变了对象的类型,属性将以2个标签或趋势线的形式折叠起来