在MQL5中一起学习和写作 - 页 13

 
Yedelkin:

很奇怪。你需要MQL5的代码,这应该已经在网站上了。你所要做的就是查一查。这正是我所说的。

但这取决于你。

这是一个非常繁琐的搜索,也许有人会直接告诉你。

顺便说一下,我已经为mql5重新制作了这个代码。也许有人可以使用它。

input double risk=0.01;
   double lot_min =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   double lot_max =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   double lot_step=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   double contract=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
   double free_margin=AccountInfoDouble(ACCOUNT_FREEMARGIN);
   int leverage=(int)AccountInfoInteger(ACCOUNT_LEVERAGE);
   double lot;
   
     lot=NormalizeDouble(free_margin*risk*leverage/contract,2);
     lot=NormalizeDouble(lot/lot_step,0)*lot_step;
   if(lot<lot_min) lot=lot_min;
   if(lot>lot_max) lot=lot_max;
 
先生们。
请发表意见。

enum_trade_return_codes
代码 ID 说明
10004 TRADE_RETCODE_REQUOTE 请求被拒绝
10006 TRADE_RETCODE_REJECT 请求被拒绝
...
没有代码10005。这不是一个错误吗?
恭敬地...
 

问题。有一个叫GetTickCount() 的函数-- 返回 系统启动后经过的毫秒数说明中说,"计数受系统定时器的分辨率限制 由于时间被存储为无符号整数,当计算机连续运行时,它每49.7天就会溢出 "。

那么在计数器溢出后会发生什么?它是否重置并开始新的倒计时,还是系统冻结了?

 

Yedelkin:

当计数器溢出时会发生什么?它是重置并开始新的计数还是系统停止?

它溢出并从零开始。
 
Renat:
它溢出并从头开始。
好的,知道了!。
 

问题。switch(expression){...}的描述说,"切换 操作符的表达式 必须是整数类型" 我在互联网上看到这个运算符与其他类型的表达式的描述。开关运算符的使用是否会通过增加字符串类型的表达式来扩展?

 
Yedelkin:

问题。switch(expression){...}的描述说,"切换 操作符的表达式 必须是整数类型" 我在互联网上看到这个运算符与其他类型的表达式的描述。我们将通过增加字符串类型的表达式来扩展开关运算符的使用吗?

不,不幸的是,它不会。对于字符串类型,只有在...否则,如果...否则 .

在switch中使用整数类型,将使switch操作者的速度提高数倍,如果

Документация по MQL5: Основы языка / Типы данных / Целые типы
Документация по MQL5: Основы языка / Типы данных / Целые типы
  • www.mql5.com
Основы языка / Типы данных / Целые типы - Документация по MQL5
 
stringo:

不,不幸的是,它不会。对于字符串类型,只有在...否则,如果...否则

在switch中使用整数类型 将使代码的速度提高数倍于如果

好的,谢谢你的提示!
 

问题。StringConcatenate() 函数描述说:"由于不使用字符串类型的 临时变量,StringConcatenate()比通过加法运算的字符串连接工作得更快、更节省内存"。我使用了《参考手册》中的例子,对它们稍作改动。

   string a="a",b="b",c;
   uint   start,stop;
   long   i,length=10000000;
//--- первый способ
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      c=a+b;
     }
   stop=GetTickCount();
   Print("time for 'c = a + b' = ",(stop-start)," milliseconds, i = ",i);


//--- второй способ
   a="a"; // заново инициализируем переменную a
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      StringAdd(a,b);
     }
   stop=GetTickCount();
   Print("time for 'StringAdd(a,b)' = ",(stop-start)," milliseconds, i = ",i);

//--- третий способ
   a="a";c="";  
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      int k=StringConcatenate(c,a,b);
      //c="";   //с такой строчкой работает ещё дольше.          
     }
   stop=GetTickCount();
   Print("time for 'StringConcatenate(c,a,b)' = ",(stop-start)," milliseconds, i = ",i);
输出是。

DR 0 DoubleToString (EURGBP,M1) 22:15:55  time for 'c = a + b'              = 2359 milliseconds, i = 10000000
QE 0 DoubleToString (EURGBP,M1) 22:15:56  time for 'StringAdd(a,b)'          = 1031 milliseconds, i = 10000000
FE 0 DoubleToString (EURGBP,M1) 22:16:00  time for 'StringConcatenate(c,a,b)' = 3891 milliseconds, i = 10000000

事实证明,StringConcatenate的 工作速度比使用加法运算的字符串绑定慢。问题是什么?

Документация по MQL5: Основы языка / Типы данных / Тип string
Документация по MQL5: Основы языка / Типы данных / Тип string
  • www.mql5.com
Основы языка / Типы данных / Тип string - Документация по MQL5
 
Yedelkin:

问题。StringConcatenate() 函数描述说:"由于不使用字符串类型的 临时变量,StringConcatenate()比通过加法运算的字符串连接工作得更快、更节省内存"。我使用了《参考》中的例子,对它们进行了一些改变。

我得到了输出。

事实证明,StringConcatenate的 工作速度比使用加法运算的字符串绑定慢。有什么障碍?

这是一个有点名不副实的检查(如果我理解正确的话)。该功能的诀窍是别的东西...

大约是这样的代码

////////////////////////////////////////////////////////////////////////////////
//             Global variables, used in working the trade system             //
////////////////////////////////////////////////////////////////////////////////
string a="Пример";
double b=1.26,c = 1.27;
string d;

uint   start,stop;

long   i,length=10000000;
////////////////////////////////////////////////////////////////////////////////
void OnStart()
{
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//

start=GetTickCount();
   
  for(i=0;i<length;i++)
  {
  d=a+(string)b+(string)c;
  }

stop=GetTickCount();

Print("time for 'd = a + b + c' = ",(stop-start)," milliseconds, i = ",i);

//Второй способ
d= "";

start=GetTickCount();

  for(i=0;i<length;i++)
  {
  StringAdd(d,a);
  StringAdd(d,(string)b);
  StringAdd(d,(string)c);
  }
stop=GetTickCount();

Print("time for 'StringAdd()' = ",(stop-start)," milliseconds, i = ",i);

//Третий способ
d= "";

start=GetTickCount();

  for(i=0;i<length;i++)
  {
  int k=StringConcatenate(d,a,b,c);
  }

stop=GetTickCount();

Print("time for 'StringConcatenate(d,a,b,c)' = ",(stop-start)," milliseconds, i = ",i);
//----------------------------------------------------------------------------//   
}
////////////////////////////////////////////////////////////////////////////////

而这个结果

2011.04.15 15:28:58     123 (EURUSD,D1) time for 'd = a + b + c' = 81094 milliseconds, i = 10000000
2011.04.15 15:30:24     123 (EURUSD,D1) time for 'StringAdd()' = 85828 milliseconds, i = 10000000
2011.04.15 15:31:46     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 81812 milliseconds, i = 10000000
2011.04.15 15:33:36     123 (EURUSD,D1) time for 'd = a + b + c' = 82938 milliseconds, i = 10000000
2011.04.15 15:35:00     123 (EURUSD,D1) time for 'StringAdd()' = 83859 milliseconds, i = 10000000
2011.04.15 15:36:21     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 80719 milliseconds, i = 10000000

PS

最有可能的是,这一行d=""应该放在for循环中,但我不认为这个bug对结果有什么影响。