//---начало блока глобальных переменных---------------int GLOBAL_DATA_LIMIT;
bool first_run=true;
//---конец блока глобальных переменных//++++++++++++++++++++++++++++++++++++//---начало блока инициализацииvoidOnInit()
{
GLOBAL_DATA_LIMIT= расчет числа данных(длины окна данных), необходимых для расчета окна условного индикатора заданной длины
....инициализация
}
//---конец блока инициализации индикатора//+++++++++++++++++++++++++++++++++++++++//---начало блока обновления индикатора--intOnCalculate (
constint rates_total, // current size of the timeseries arrayconstint prev_calculated, // size of the timeseries array got by reurn value the last timeconstdatetime& time[], // Timeconstdouble& open[], // Openconstdouble& high[], // Highconstdouble& low[], // Lowconstdouble& close[], // Closeconstlong& tick_volume[], // Tick Volumeconstlong& volume[], // Real Volumeconstint& spread[] // Spread
)
{
if(rates_total<0)
{
printf("На графике отсутствуют исторические данные");
return(0);
}
if(rates_total<GLOBAL_DATA_LIMIT)
{
printf("Недостаточно исторических данных, необходимое количество: "+string(GLOBAL_DATA_LIMIT));
return(0);
}
if(prev_calculated==0) // срабатывает при первом запуске, или когда история поменялась
{
if (first_run==true) первый расчет при запуске - в момент первого тика после инициализации
*{
ArrayCopy(cur_price_array, close, 0, (rates_total-1)-GLOBAL_DATA_LIMIT, GLOBAL_DATA_LIMIT); - копируем в массив необходимое количество значений цены
...
Со скопированным массивом проводим расчет
Отображаем результат
...
first_run=false;
*}
else расчет на каждом тике
{
в это место вставить код *(без first_run=false;), если считать на каждом тике. Если считать не на каждом тике, а по новому бару, то вставить * в функцию isNewBar
}
}
if(isNewBar(_Period)) расчет на каждом баре
{
*{
ArrayCopy(cur_price_array, close, 0, (rates_total-1)-GLOBAL_DATA_LIMIT, GLOBAL_DATA_LIMIT); - копируем в массив необходимое количество значений цены
...
Со скопированным массивом проводим расчет
Отображаем результат
...
*}
}
return(rates_total);
}
//---конец блока обновления индикатора---
澄清一个问题:条件指标值是需要针对图表上任何时候的所有蜡烛图,还是针对一定数量的近期蜡烛图?
下面是我的一段工作代码。关闭时从未出现过问题(调整了一下)。
int i, total = OrdersTotal(), slippage = 50;
bool Ans;
for (i = total-1; i >=0; i-) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol(){
if(OrderType()==OP_BUY){
Print("CLOSE BUY");
Ans = false;
while(Ans==false) {
Ans = OrderClose(OrderTicket(),OrderLots(),Bid, slippage, DodgerBlue);
Sleep(1000);
RefreshRates();
}
}
if(OrderType() == OP_SELL) {
Print("CLOSE SALE");
Ans = false;
while(Ans==false) {
Ans = OrderClose(OrderTicket() ,OrderLots(),Ask, slippage, Orange);
Sleep(1000);
RefreshRates();
}
}
}
}
下面是我的一段工作代码。关闭时从未出现过问题(调整了一下)。
...
我会试一试的。
最好是后者,由某种窗口设置。
我是这样实施的。
这是一个基于每个条形或刻度上复制的m(GLOBAL_DATA_LIMIT)价格值来计算一个或多个n个指标值的方案。
如果计算值窗口的过去值没有变化,那么在计算(内部)中,你可以按以下步骤进行
-只计算新值(一个)。
-将计算值窗口(有结果的数组)向左移动1个索引。
-在结果数组的 最后一个索引 中写入一个新值。
我不知道这是否清楚。代码是在MQL5中,我不知道4,但我想应该是类似的。
...
管理员们,绝对的权力导致独裁。即使是我们政治上正确的Timbo也无法忍受这种混乱的局面,而去了某个地方:)
必须有一个反对派,至少有时会把一切都放在它的位置上,但在这里,不清楚是谁认真地定义了数学的部分,而他们没有学童的帮助就不能关闭秩序。明天会发生什么?
你是为另一个禁令而提出的。
谢谢你的主题。如果你有什么需要,请务必提出。
为了保持这个话题的活力:)
在莫斯科时间周一上午11:15,在没有任何分析的情况下,我在MT5中观察到了配对(我应该习惯它)。
我没有打开欧元兑美元和英镑兑美元,因为它们显示的是平盘。 不过我还是要坚持到星期五,我应该好好看看,可能每天都会纠正。
如果有人感兴趣,你可以观看。
登录:729566