intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
int i,limit;
if(prev_calculated == 0) {
limit = rates_total - 1; //--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
}
else limit = rates_total - prev_calculated + 1;
for(i = limit; i >= 0; i--) { //--- В этом цикле основные вычисления. Таким образом обрабатываться будет только "свежая" информация
}
return(rates_total);
for(i = limit; i >= 0; i--) { //--- В этом цикле основные вычисления. Таким образом обрабатываться будет только "свежая" информация
Buffer[i] = close[i];
}
//+------------------------------------------------------------------+//| 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[])
{
//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)if(rates_total<4) return0;
//--- Проверка и расчёт количества просчитываемых баровint limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.if(limit>1)
// если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории// если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,// при подгрузке истории и на первом запуске - перерасчёт всей истории
{
limit=rates_total-1;
// здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
}
//--- Расчёт индикатораfor(int i=limit; i>=0 && !IsStopped(); i--)
{
// необходимые действия по расчёту индикатора
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+
如何创建一个类实例的数组?
我做了ClassName* className[],然后对它进行ArrayResize,但它没有给我访问方法 的 机会
你的类,你想把它的实例收集成一个数组,必须继承自CObject。
然后就很简单了:创建一个对象的列表(数组)CArrayObj,然后把你的对象加入其中。
搜索 "指标模板 "和你的名字并没有找到任何东西,而且你已经在这里写过关于那本《战争与和平》的书。
我想到了帖子中的任何词语组合。
好吧,我很抱歉,关于指标模板,也许我把它搞混了--拖网模板已经发布。
我们这样说吧:在编辑器中创建一个指标模板,添加所需数量的输入变量和要绘制的缓冲区。
接下来,从具体任务中分解出你需要做的事情。
如果你说它不好,请告诉我如何使它好。把计算移到OnInit?
公平的斥责))这里,是在这里发表的代码的一个变体。
试试这样做。你不需要向OnInit移动任何东西。
公平的斥责))这里,是在这里发表的代码的一个变体。
试着这样做。你不需要向OnInit移动任何东西。
我没有在这里发表过这样的代码--不是我的事:)
我使用其他结构--它更简单、更清晰。
在OnInit()中,它应该被转移。为什么你需要在每个tick上给指标缓冲区分配一个数组?
我没有在这里发布这样的代码--这不是我的事情 :)
我使用其他结构--更简单、更清晰。
这是我的,怎么可能更简单?)))(至少,我的模板中也有注释limit = rates_total - 1;//--- 第一次调用指标 或改变时间框架或从历史上加载数据)和我的格式化风格---for()附近的一个大括号{
要学习编写你自己的指标,请采用上述模板,并至少添加收盘价,得到你的第一个指标,然后学习从这个收盘价制作MAH。
我没有在这里发布这样的代码--这不是我的事情 :)
我使用不同的结构--更简单和更清晰。
没有什么需要被复制到OnInit()中。为什么我应该在每个刻度线上给指标缓冲区分配一个数组?
这不是你的代码。它是由我的一些同事发表的,但我记不起是谁,在哪里发表的。当我写到没有什么东西应该被移到OnInit上时,我指的正是这段代码,但不是源代码。我说得不太清楚。
那你建议采用什么结构?这似乎非常简单。
啊,这就是这篇文章的作者))))在我前面。顺便说一下,我也使用这种格式化风格--在一行中使用一个开口大括号。啊,这里是该片段的作者))))在我前面。顺便说一下,我也使用这种格式化风格--在一行中使用一个开口大括号。
你运行创建指标 的向导,选择线的类型和颜色,并在必要时添加输入's。
就这样,指标已经准备好了,然后从模板的 OnCalculate() 中复制主体,写出 计算结果。
你可以在1分钟内写出你的第一个指标,代码 "Hello word I indicator!- 我展示了:)
ZS:顺便说一下,指标可以以这种形式从MT4转移到MT5,主要是正确设置指标缓冲区,在MT5中,缓冲区下的数组索引有一个蠕动....。它们只是具有通常数组)))) 索引的数组....。以前很难适应MT4中指标缓冲区的索引,现在恰恰相反,不可能习惯它而转到MT5 ))))。这不是你的代码。它是由我的一位同事出版的,但我不记得是谁,在哪里出版的。当我说不应该把任何东西移到OnInit上时,我指的正是这段代码,而不是源代码。我说得不太清楚。
那你建议采用什么结构?这个似乎很简单。
啊,这就是这篇文章的作者))))在我前面。是的,指标模板代码有什么用?运行向导以创建指标,选择线条的类型和颜色,如有必要,添加 input 的
就是这样,指标已准备就绪,然后从OnCalculate()模板复制正文并编写计算,
您可以在 1 分钟内编写您的第一个指标,上面的代码是“Hello word I 指标!!!”我展示出 :)
PS:顺便说一句,在这种形式下,指标可以从 MT4 转移到 MT5,主要是正确设置指标缓冲区,在 MT5 中,有一个可怕的问题是缓冲区索引数组......它们只是数组使用通常的数组)))) 索引.. .. 以前很难习惯 MT4 中指标缓冲区的索引,现在相反,不可能习惯它并切换到 MT5))))没什么复杂的。跨平台指标的示例(使用类),但模板可以被拉出 - 删除类和所有多余的会导致错误的东西 - 跨平台模板将保留。
该指标在两个平台上的工作原理相同,无需修改 - 只需使用所需的扩展进行编译。我不得不将代码分成两部分——类和指标本身(一切都在一个清单中)
班级:
指标。