所有行业的表。通过MQL5访问 - 页 4

 
prostotrader:

我没有深入思考,我看到的是来自深处的 "粘附"。

为什么要思考?

运行指标,自己看看吧!

而且你甚至读过所写的东西吗?

我读过了,但现在交易已经结束了,当我启动它时,我将再次检查在什么方向上下载点子(在我的脚本上)。
 
Karputov Vladimir:
我看过了,但现在招标已经结束了,我再检查一下(在我的脚本上)向哪个方向下载蜱虫。

你不应该在脚本 上检查,而是在RTS-9.16 chavs上运行指标,时间是-8-9pm,莫斯科时间(看看)。

而且,刻度线并不总是 深度复制,只有当新区块的第一个刻度线与前一个区块的时间相同时,才会复制。

你必须等待新的 刻度线(块),而不是复制后的事实。

如果你运行你的脚本,它将会很好,因为它将从历史记录 中复制,而不是

不是"等待"新区块。

 
prostotrader:

有必要不在脚本上检查,而是在莫斯科时间晚上8-9点在RTS-9.16 chavs上运行指标。

而且,刻度线并不总是 按深度复制的,只有当一个新区块的第一个刻度线与前一个区块的时间相同时,才会复制。

你应该 期望有新的 刻度线(块),而不是复制后的事实。

我有一个指标,输出20-30个最后的点。我想我可以给它加上一个检查:检查所有收到的蜱虫,看它们是否在有异常时间的历史蜱虫中。
 
Karputov Vladimir:
我有一个指标,它输出20-30个最后的刻度。我想我可以给它加上一个检查:检查所有收到的蜱虫,看它们是否在有异常时间的历史蜱虫中。

你将无法 "栓住 "检查(这对我不起作用),因为你不知道它们是否是旧虱子。

检查的标准是什么?只有当指示器和磁带并排放置时,才能通过 "眼睛 "看到这一点。

但你将不得不等待很长时间(正如我所说的,只按一个标准深入复制)。

请记住,该缺陷只在两种条件下出现。

1.我们 "等待 "新的蜱虫(块)。

2.只有在新的区块中,第1个刻度的时间与上一个区块的前一个刻度的时间相同时,它才会在深度上被 "粘上"。

 
prostotrader:

你将无法 "栓住 "检查(这对我不起作用),因为你不知道它们是否是旧虱子。

检查的标准是什么?只有当指示器和磁带并排放置时,才能通过 "眼睛 "看到这一点。

但你将不得不等待很长时间(正如我所说的,只按一个标准深入复制)。

请记住,该缺陷只在两种条件下出现。

1.我们 "等待 "新的蜱虫(块)。

2.只有在新的区块中,第1个刻度的时间与上一个区块的前一个刻度的时间相同时,它才会在深度上被 "粘上"。

切断不必要的东西--计算和渲染指标。只留下获取和检查刻度线的数组。为了寻找一个错误(不管是谁的),你需要尽可能地简化代码。
 
Karputov Vladimir:
砍掉不必要的东西--计算和绘制指标。只留下获取和检查刻度线阵列。为了寻找一个错误(不管是谁的),你需要尽可能地简化代码。

如果我的代码中有一个错误,它就会一直显示出来。

但现在,该指标工作正常(我用表中的数据检查了很多次)。

如果你在中等流动性的工具上运行指标,可以清楚地看到这一点。

而且几乎不可能 "在两棵松中迷失方向"(这段代码中没有任何一行可以被削减:( )。

if(start_time==0)
        {
         if(CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,0,1)==1)
           {
            start_time=ulong(ticks[0].time_msc);
           }
        }
      else
        {
         sell_deals= 0;
         buy_deals = 0;
         sell_vol= 0;
         buy_vol = 0;
         int copied=CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,start_time,0);
         if(copied>0)
           {
            for(int i=0; i<copied; i++)
              {
               if(( ticks[i].flags  &TICK_FLAG_BUY)==TICK_FLAG_BUY)
                 {
                  buy_deals++;
                  buy_vol+=ticks[i].volume;
                 }
               else
               if(( ticks[i].flags  &TICK_FLAG_SELL)==TICK_FLAG_SELL)
                 {
                  sell_deals++;
                  sell_vol+=ticks[i].volume;
                 }
              }
            if(start_time==ulong(ticks[copied-1].time_msc)) return;
            start_time=ulong(ticks[copied-1].time_msc);
            if(( sell_deals==0) && (buy_deals==0)) return;
}
 
prostotrader:

如果我的代码中有一个错误,它就会一直显示出来。

但现在,该指标工作正常(我用表中的数据检查了很多次)。

如果你在中等流动性的工具上运行指标,可以清楚地看到这一点。

而且几乎不可能 "在两棵松中迷失方向"(这段代码中没有任何一行可以被砍掉:() )。

你需要在start_time考虑之前加载的ticks,否则会发生ticks的重复。

这里有一个例子,函数返回最后的ticks,是从我的tick历史 处理类中提取的,但我想,从代码中一切都会很清楚。

int CTickHistory::LastTicks(MqlTick &_ticks[])
{
   if(m_lasttick<=0) return(-1);  //нет загруженной истории
   int n=CopyTicks(m_symbol,tk,COPY_TICKS_TRADE,m_lasttick,TICKHISTORY_MAX_TICKS);
   if(n>m_lastcount)
   {
      n=ArrayResize(_ticks,n-m_lastcount);//размер массива под новые тики
      ArrayCopy(_ticks,tk,0,m_lastcount,n);//копирование только новых тиков
      //определим количество всех тиков, приходящихся на последний момент времени,
      //необходимое для отсечки загруженных тиков при следующем вызове
      if(m_lasttick!=_ticks[n-1].time_msc)
      {
         m_lasttick=_ticks[n-1].time_msc;
         m_lastcount=1;
         for(int i=n-2; i>=0; i--)
         {
            if(_ticks[i].time_msc<m_lasttick) break;
            m_lastcount++;
         }
      }else m_lastcount+=n;
   }else n=0;//нет новых тиков
   return(n);
}
 

滴答请求模式--滴答的最后 "滴答"--即时间为 "0"。

   int copied=CopyTicks(_Symbol,tick_array,type,0,ticks);

一个指标(在左图)在OnCalculate()中要求CopyTicks(),第二个指标(在右图)在OnBookEvent()中要求CopyTicks()。

这里是图片。

?

滴答时间显示如下:索引为 "0 "的元素在图表的最底部,索引为 "0 "的元素的滴答时间是最古老的。索引为 "29 "的元素具有最年轻的滴答时间。我们在这里:我发现,至少在这个图中,有两个不一致的地方,下面是第一个例子。

项目索引打勾时间注意事项



231472205757952错误:1472205757952 < 1472205757959
221472205757959这就对了:1472205757959 !< 1472205757432
211472205757432
附加的文件:
 
Yury Kulikov:
你需要考虑到之前在start_time加载的ticks,否则会发生ticks的重复。

这是一个例子,该函数返回最后的ticks,是从我的tick历史 处理类中拉出来的,但我想从代码中可以看出这一点。

下面是我的代码中的防止重复的方法。

if(start_time==ulong(ticks[copied-1].time_msc)) return;
 

将 COPY_TICKS_ALL 改为 COPY_TICKS_TRADE,似乎可以正常工作了。

2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Pred tiks
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Prev ticks, element 0 time = 2016.08.26 10:42:15.576
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Prev ticks, element 1 time = 2016.08.26 10:42:15.595
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr tiks
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 0 time = 2016.08.26 10:42:15.595
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 1 time = 2016.08.26 10:42:17.225
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 2 time = 2016.08.26 10:42:17.225
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 3 time = 2016.08.26 10:42:17.225
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 4 time = 2016.08.26 10:42:17.225
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 5 time = 2016.08.26 10:42:17.235

if(start_time==0)
        {
         if(CopyTicks(Symbol(),ticks,COPY_TICKS_TRADE,0,1)==1)
           {
            start_time=ulong(ticks[0].time_msc);
           }
        }
      else
        {
         sell_deals= 0;
         buy_deals = 0;
         sell_vol= 0;
         buy_vol = 0;
         int copied=CopyTicks(Symbol(),ticks,COPY_TICKS_TRADE,start_time,0);
         if(copied>0)
           {
             int a_size = ArraySize(prev_ticks);
             if (a_size>0)
             {
               if (prev_ticks[a_size-1].time_msc == ticks[0].time_msc)
               {
                 Print("Pred tiks");
                 for(int i=0; i<a_size; i++)
                 {
                   
                   Print("Prev ticks, element ", i, " time = ", ConvTimeMscToStr( prev_ticks[i].time_msc ) );
                 }
                  Print("Curr tiks");
                 for(int i=0; i<copied; i++)
                 {
                  
                   Print("Curr ticks, element ", i, " time = ", ConvTimeMscToStr(ticks[i].time_msc ));
                 }
               }
               else
               {
                 ArrayResize(prev_ticks, copied);
                 for(int i=0; i<copied; i++)
                 {
                   prev_ticks[i]=ticks[i]; 
                 }   
               }
             }
             else
             {
               ArrayResize(prev_ticks, copied);
                 for(int i=0; i<copied; i++)
                 {
                   prev_ticks[i]=ticks[i]; 
                 }
             }
           
           /* for(int i=0; i<copied; i++)
              {
               if(( ticks[i].flags  &TICK_FLAG_BUY)==TICK_FLAG_BUY)
                 {
                  buy_deals++;
                  buy_vol+=ticks[i].volume;
                 }
               else
               if(( ticks[i].flags  &TICK_FLAG_SELL)==TICK_FLAG_SELL)
                 {
                  sell_deals++;
                  sell_vol+=ticks[i].volume;
                 }
              }*/
            if(start_time==ulong(ticks[copied-1].time_msc)) return;
            start_time=ulong(ticks[copied-1].time_msc);
            if(( sell_deals==0) && (buy_deals==0)) return;

但我将继续检查。:)

我不能静态地看磁带,所以我等着清场。

原因: