初学者的问题 MQL5 MT5 MetaTrader 5 - 页 763

 
Vitaly Muzichenko:

在循环中似乎是这样的,你可以不使用这个功能

谢谢你。

然而,删除了该功能 - 刹车仍然....。该死的。

 
Aleksey Vyazmikin:

谢谢。

然而,删除了该功能 - 刹车仍然....。该死的。

我曾经从4=>5开始重写程序,然后在4中,我把Low[1]、Time[0]等所有结构都换成了现代结构,即CopyLowCopyTime,程序在4中也变得更快了。我现在不使用旧的结构,只使用新的结构。因此,代码很容易移植到第5个平台上,你只需要改变交易功能 即可。

 
Vitaly Muzichenko:

一旦我开始从4=>5重写程序,然后我把所有的结构,如Low[1],Time[0]和其他结构替换成现代结构,即CopyLowCopyTime,程序甚至在4中也变得更快。我现在不使用旧的结构,只使用新的结构。因此,代码很容易移植到第5个平台上,你只需要改变交易功能 即可。

在每次打喷嚏时填充阵列 不是一种资源消耗吗?

也许在酒吧开业时将信息复制到数组中,然后随着代码的展开从那里获取信息是有意义的?我在酒吧开业时进行交易。


 
Aleksey Vyazmikin:

每次打喷嚏都要填充一个数组,难道不消耗资源吗?

也许在条形图打开时将信息复制到数组中,然后随着代码的进行从那里获取信息是有意义的?我在酒吧开业时进行交易。

数组可以在一个新的条形上填充,它将消耗较少的资源。如果你在多个地方使用iLow[1],你应该把它存储在一个变量中一次,然后读取它而不是数组。

假设这

// Инициализация TIME[0] TIME[1]
  ArraySetAsSeries(TM,true);
  if(CopyTime(dSymbol,Period(),0,2,TM)<0) return;
  TIME_0=TM[0];
  TIME_1=TM[1];
然后我们用变量TIME_0和TIME_1而不是TM[0]TM[1] 工作。
 
Vitaly Muzichenko:

阵列可以在一个新的条形上填充,它将占用更少的资源。例如,如果你在多个地方使用iLow[1],最好是把它一次写入一个变量,然后读取变量而不是数组。

假设如此

但是,MT4还是要快得多--我很失望。

 

关于交易、自动交易系统和交易策略测试的论坛

虫子,虫子,问题

Aleksey Vyazmikin, 2017.07.21 15:07

你为什么要幻想呢?我理解了你的想法,并确认它是有效的,如果请求发生一次,如果知道EA需要多少个柱子才能工作,就会有效果。

或者你建议用不同的方式来使用这个结构? 那么请解释,但不要被冒犯!你的建议是什么?


没有幻想。如果你需要获得一个蜡烛图的2个或更多参数,那么使用你的信息/问题中的函数,我们需要为蜡烛图的每个参数分别调用这些函数。这是2次或更多次产生Copy***(),但使用CopyRates()你只需要调用一次Copy。

至于要复制的数量,这是另一个问题。也许我们应该先计算出包含所需指标值的条形图,然后再复制它。如果我没记错的话,说的是一个未知量的复制。我们谈论的是什么样的幻想?

在极端情况下,我们可以复制,比如说,10条,然后在其中搜索。 如果没有找到,我们再复制10条。复制是一个耗时的操作,复制一个数组会更便宜。

一般来说,有很多的变化。你不能把所有这些都写进文档,那就根本不是文档了。他们在编程课上教这个。但不幸的是,并不是所有的老师都能做到,也不是所有的学生都想在课上理解。而最开始是在2-5年级的算术课上,老师要求对问题进行详细解释。但这里的问题是一样的。

 
Alexey Viktorov:

没有花哨的东西。如果你需要获得一个蜡烛图的2个或更多参数,那么使用你的信息/问题中的函数,你应该为每个蜡烛图参数分别调用这些函数。这是2次或更多次执行Copy***(),但使用CopyRates()你只需要调用一次Copy。

至于要复制的数量,这是另一个问题。也许,我们应该先计算出指标的所需值在哪个条形上,然后再复制它。如果我没记错的话,说的是一个未知量的复制。我们谈论的是什么样的幻想?

而且,作为最后的手段,我们可以复制,比如说,10个小节,然后在其中搜索,如果找不到,我们再复制10个小节。复制是一个相当昂贵的操作;在数组中搜索会更便宜。

在这种情况下有很多变种。所有这些都不能写进文档;实际上,它不会再是文档了。他们在编程课上教这个。但是,不幸的是,不是所有的老师都知道如何做,也不是所有的学生都想在课上了解它。而最开始是在2-5年级的算术课上,老师要求对问题进行详细解释。但这里的问题是一样的。

关于幻想--是对你说的 "你没有试图理解所说的话,弄清楚你得到的东西,而是提出一些令人难以置信的反对意见 "的回应,而不是对你提供的版本是来自幻想领域的事实的回应。

我完全理解你的概念,它蕴含在对你的回应中。

然而,我不太明白你建议如何处理未知的数据量--你能以代码的形式给我一个例子吗?


 

请帮助审核和优化指标,使用这个链接https://www.mql5.com/ru/code/16805 - 麻烦的是,当出现大量的条形图时,指标开始变得很慢 - 在测试时显示出来。

我想知道如何使其工作,使其不在每个tick上计算,而只在bar opening上计算?专家顾问的方法并不合适--在第一个刻度线之后,所有的数值都消失了,只在下一个柱子上出现...。

Donchian Channel MTF
Donchian Channel MTF
  • 投票: 13
  • 2016.12.13
  • Mladen Rakic
  • www.mql5.com
Мультитаймфреймовая версия канала Дончиана.
 
Aleksey Vyazmikin:

关于幻想--这是对你说的 "不试图理解所说的内容,了解什么会成功,而是推出一些令人难以置信的反对意见 "的回应,而不是说你提出的方案来自幻想领域。

我完全理解你的概念,它蕴含在对你的回应中。

然而,我不太明白你建议如何处理未知的数据量--你能以代码的形式给我一个例子吗?


回答是在...

阿列克谢-维克多罗夫

作为最后的手段,你可以复制,比如说,一次复制10条,然后在其中搜索;如果你没有找到,你再复制10条。复制是昂贵的操作,在数组中搜索会更便宜。

但我们最好不要试图从数组中获得最大数量的条数,而是尽量用一份来做。

我不打算写一个代码样本。一个正常的程序员只需要一个提示。下面是一个算法的样本。

  1. 确定通道被穿过的大致条数。让它成为15。
  2. 复制指标的两个缓冲区。
  3. 使用CopyRates()复制条形图的值。
  4. 在循环中,我们开始比较通道的上限和高条的值,同时将低条与通道的下限进行比较。如果发现其中一个交叉点,则将条形索引存储在一个变量中,然后我们继续寻找第二个交叉点。当相交条的两个变量都有值时,我们退出循环。

因此,必要时可以在一个副本和一个周期内找到两个交叉点。在ArraySetAsSeries() 中甚至没有必要,因为在寻找交叉点时,有可能,而且在我看来,最好是记住酒吧的时间,而不是它的编号。虽然,知道了酒吧的时间,确定其数量并不困难。

问题:在一个周期内,是复制指标缓冲区的1个值和复制高位栏的1个值并比较这些值,还是单次复制一定量并将两个数组的值相互比较,哪个更快?

 

昨天刚写了这个。

任务。

每个tick 上得到 "InpCountCopy "元素open, high, low, close和time。

实施。

  1. 从 "0 "到 "InpCountCopy-1 "的循环 - 循环每次获得一个开放、高、低、关闭和时间。
  2. 一次,我们将 "InpCountCopy "元素放入MqlRates结构中,然后循环浏览该结构。

特点。

你可以选择检查的方式:在OnTick或在OnTimer(1秒)。

//+------------------------------------------------------------------+
//|                                      Copy OHLC vc Copy Rates.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.001"
//--- input parameter
input int InpCountCopy=1000;
input bool OnTickOnTimer=false; // OnTickOnTimer: false -> OnTick, true -> OnTimer 1 second
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(OnTickOnTimer)
      EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(OnTickOnTimer)
      return;
   Testing();
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(!OnTickOnTimer)
      return;
   Testing();
  }
//+------------------------------------------------------------------+
//| Main function                                                    |
//+------------------------------------------------------------------+
void Testing()
  {
//--- for once one element
   ulong start=GetMicrosecondCount();
   for(int i=0;i<InpCountCopy;i++) // in one operation we get one element.
     {
      double open=iOpen(i);
      double high=iHigh(i);
      double low=iLow(i);
      double close=iClose(i);
      datetime time=iTime(i);
     }
   ulong end=GetMicrosecondCount()-start;
   string text=(OnTickOnTimer)?"OnTimer":"OnTick";
   text=text+"\n"+"OHLC: "+IntegerToString(end);

//--- for one operation we get "InpCountCopy" elements.
   start=GetMicrosecondCount();
   MqlRates Rates[];
   if(!iRates(Rates,0,InpCountCopy))
      return;
   for(int i=0;i<InpCountCopy;i++)
     {
      double open=Rates[i].open;
      double high=Rates[i].high;
      double low=Rates[i].low;
      double close=Rates[i].close;
      datetime time=Rates[i].time;
     }
   end=GetMicrosecondCount()-start;
   text=text+"\n"+"Rates: "+IntegerToString(end);

   Comment(text);
  }
//+------------------------------------------------------------------+ 
//| Get Open for specified bar index                                 | 
//+------------------------------------------------------------------+ 
double iOpen(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Open[1];
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,Open);
   if(copied==1)
      open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Get the High for specified bar index                             | 
//+------------------------------------------------------------------+ 
double iHigh(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double High[1];
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,High);
   if(copied==1)
      high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Get Low for specified bar index                                  | 
//+------------------------------------------------------------------+ 
double iLow(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Low[1];
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,Low);
   if(copied==1)
      low=Low[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Get Close for specified bar index                                | 
//+------------------------------------------------------------------+ 
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Close[1];
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,Close);
   if(copied==1)
      close=Close[0];
   return(close);
  }
//+------------------------------------------------------------------+ 
//| Get Time for specified bar index                                 | 
//+------------------------------------------------------------------+ 
datetime iTime(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   datetime Time[1];
   datetime time=0;
   int copied=CopyTime(symbol,timeframe,index,1,Time);
   if(copied==1)
      time=Time[0];
   return(time);
  }
//+------------------------------------------------------------------+ 
//| Get Rates for specified bar index                                | 
//+------------------------------------------------------------------+ 
bool iRates(MqlRates  &Rates[],const int index,int count,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   int copied=CopyRates(symbol,timeframe,index,count,Rates);
   if(copied!=count)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+


附加的文件: