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

 
forexman77:

在脚本中,我是这样做的。

时间=0

周一的SymbolInfoTick。

你可以用这个代码来检查它。

void OnStart()
{
  double ask;
  uint start=GetTickCount();
  for(int i=0;i<1000000;i++)
  {
    ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
  }
  uint time=GetTickCount()-start;
  Print("SymbolInfoDouble = ",time," ms");
  
  MqlTick tick;
  start=GetTickCount();
  for(int i=0;i<1000000;i++)
  {
    SymbolInfoTick(Symbol(),tick);
  }
  time=GetTickCount()-start;
  Print("SymbolInfoTick = ",time," ms");
}

但你需要每个符号 的刻度。

 
Fleder:

你可以用这个代码来检查它。

但你需要每个符号的刻度。

是的,"SymbolInfoTick",今天没有检查。

试过了,在虱子来之前,它不会起作用。

void OnStart()
  {
uint start=GetTickCount();
double iask=0;
MqlTick latest_price;       // Будет использоваться для текущих котировок  
if(!SymbolInfoTick(_Symbol,latest_price)){iask=latest_price.ask;}
Alert("iask=",iask);
uint time=GetTickCount()-start;
Alert("time=",time);  
  }
iask=0
 
forexman77:

是的,SymbolInfoTick,今天没有检查。

试过了,直到嘀嗒声响起,什么都不能用了。

iask=0

这个函数的速度太快了。

为了测量性能,你需要在一个有大量迭代的循环中应用多个调用,并测量总执行时间。

 
barabashkakvn:
更有趣的是,有一个示例代码。我们正在等待结果。
 
forexman77:
谢谢你。它将会派上用场。
 

为了检查EA中的新条,我使用了基于 "CopyTime "和 "CopyRates "的函数,这是我在论坛上发现的。我得出的结论是,他们的计算需要大量的时间。

下面是检查数据(有趣的是,指标调用 需要171毫秒)。

datetime New_Time[];//буффер для проверки нового бара
void OnStart()
  {
uint start=GetTickCount();
for(int i=0;i<1000000;i++)
{
static datetime t;//записываем старое время  
ArraySetAsSeries(New_Time,true);//направление индексации
CopyTime(_Symbol,_Period,0,1,New_Time);//копируем время нового бара
t=New_Time[0];   
}
uint time=GetTickCount()-start;
Print("New_Time = ",time," ms");
  }

MqlRates rates[]; 
void OnStart()
  {
datetime t;  
uint start=GetTickCount();
for(int i=0;i<1000000;i++)
{
ArraySetAsSeries(rates,true);
int copied=CopyRates(Symbol(),Period(),0,1,rates);  
t=rates[0].time; 
}
uint time=GetTickCount()-start;
Print("t = ",time," ms");
  }

在这里我有一个想法,如果我尝试其他的东西。例如,"TimeCurrent"。

做了以下代码的优化。

void OnStart()
  {
int t;
int s;  
uint start=GetTickCount();
for(int i=0;i<1000000;i++)
{

MqlDateTime m;
TimeCurrent(m);
t=m.min;
s=m.sec;
}
uint time=GetTickCount()-start;
Print("time = ",time," ms");    
  }

在专家顾问中做了以下代码的优化。

static double ind1;//записываю значения
static double ind2;// значения
static double indsmall;//индикаторов
MqlDateTime m;
TimeCurrent(m);
int MIN=m.min;
int SEC=m.sec;
if (MIN==0 && SEC==0)//проверка только в начале часа
{
Здесь копирую значения индикатора из буфферов
}

在不检查新条形图的情况下,单次运行的结果是:817,196毫秒。

检查一个新棒:735 904 ms

差异不是特别大,有一些改进,但还不够。

我得到的指标如下。

int TSIHandle;   // хэндл индикатора  TSI
double TSI[]; // динамические массивы для хранения численных значений TSI

int OnInit()
  {
TSIHandle=iCustom(NULL,0,"Blau_TSI",q,r,s,u,PRICE_CLOSE);
if(TSIHandle<0){Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");return(-1);}
ArraySetAsSeries(TSI,true);
   return(0);
  }

void OnDeinit(const int reason)
  {
//--- освобождаем хэндлы индикаторов
   IndicatorRelease(TSIHandle);
   ArrayFree(TSI);
  }

void OnTick()
  {
MqlDateTime m;
TimeCurrent(m);
int MIN=m.min;
int SEC=m.sec;
static double tsismall;

if (MIN==0 && SEC==0)
{
//--- копируем значения индикаторов из индикаторных буферов
   if(CopyBuffer(TSIHandle,0,0,3,TSI)<0)
     {
      Alert("Ошибка копирования буферов индикатора Moving Average - номер ошибки:",GetLastError(),"!!");
      return;
     }
tsismall=TSI[1];
}
}

我试着在检查新条形图的区块中放置带有手柄调用的代码,但如果我在这里做,就会出现错误。

if(TSIHandle<0){Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");return(-1);}

我把 返回 ,什么也没返回,没有错误,但EA却不工作。

我想hendle调用,如果可能的话,一般来说,除了静态变量外,所有的主代码都应该放在条件运算符内,以检查新酒吧。

如果我没记错的话,我在某处读到,即使我们调用一个句柄,但不要求缓冲区内的指标,它仍然被计算出来。

 
谁能告诉我如何制作一个指标来输出公式缓冲区[i]=(1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID))*10000的结果。
 
rus-lot:
谁能建议如何制作一个显示单一公式结果的指标 buffer[i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID))*10000。

你需要写一个自定义指标。为了使这一过程更容易--采取最简单的指标之一--iMa 并改写一下。这里是另一个主题,其中谈到了MarketInfo。编写代码,如果有什么不成功的地方就问。

 
静态变量 怎么了?今天更新了终端的旧版本,现在编译时出现了错误。

unresolved static variable
 
sgreen:
静态变量 怎么了?今天更新了终端的旧版本,现在编译时出现了错误。

unresolved static variable

现在,类的静态成员-数据必须被放置

//+------------------------------------------------------------------+
//| Класс "Анализатор текстов"                                       |
//+------------------------------------------------------------------+
class СParser
  {
public:
   static int        s_words;
   static int        s_symbols;
   //--- конструктор и деструктор
                     Parser(void);
                    ~Parser(void){};
  };
...
//--- инициализация статических членов класса Parser на глобальном уровне
int CParser::s_words=0;
int CParser::s_symbols=0;