错误、漏洞、问题 - 页 2132

 
fxsaber:

当作者是一个兼职的主持人。

而是一个版主和兼职编码员。

 
fxsaber:
KB的EA作者在相关讨论中删除指出其代码错误的第三方评论,这样做对吗?

当然不是。

 
fxsaber:
KB的EA作者在相关讨论中删除指出其代码错误的第三方评论,这样做对吗?
不,当然不是。这种评论有助于纠正这些错误。沉默或捣毁它们使KB成为一个糟糕的手册。
 

我不明白,在MQL中反其道而行之的意义何在?

C++ VS2017
MQL
printf( "%s", ... )
printf( "%S", ... )
printf( "%S", ... )
printf( "%s", ... )
printf( "%c", ... )
printf( "%C", ... )
printf( "%C", ... )
printf( "%c", ... )
事实上,MQL::printf与CPP::wprintf相对应,尽管在MQL中没有CPP::printf的类似物。
 
A100:

我不明白,在MQL中反其道而行之的意义何在?

C++ VS2017
MQL
printf( "%s", ... )
printf( "%S", ...)
printf( "%S", ...)
printf( "%s", ... )
printf( "%c", ... )
printf( "%C", ... )
printf( "%C", ... )
printf( "%c", ... )
实际上,MQL::printf与CPP::wprintf相对应,尽管在MQL中没有CPP::printf的类似物。
MQL5是所有的unicode,所以我们已经完全放弃了单字节的字符串。
 
Renat Fatkhullin:
MQL5是所有的unicode,所以我们已经完全放弃了单字节的字符串。

我并不完全相信!一切正常。

void OnStart()
{
        uchar ch[] = { 0x41,0x6E,0x73,0x69,0x20,0x69,0x73,0x20,0x61,0x6C,0x69,0x76,0x65,0x21 };
        string ansi;
        for ( int i = 0, j = 0; i < ArraySize( ch ); i+=2, j++ )
                StringSetCharacter( ansi, j, ch[ i ] | ch[ i + 1 ] << 8 );
        printf( "%S", ansi );
}

结果:安西还活着!

 
A100:

我并不完全相信!一切正常。

结果:安西还活着!

将二进制编码打包成unicode,然后在通过系统函数的调用中获得爆炸的风险是不明智的。

以后可能会过滤掉这种尝试。

 
Renat Fatkhullin:

在系统函数调用中获得爆炸的风险是不合理的。

不要夸大其词,因为字符串保证以零结束。此外,单字节字符和多字节字符实际上是Unicode的一部分,在MQL中也都能正常工作,这使得它可以用正常的(而不是那种可怕的单倍体)字体在专家标签中输出。

这就像禁止从dll函数中调用参数ugar[],担心用户会错误地填写(例如,不会以0结尾),而许多系统函数恰恰需要ugar[],而不是ushort[](顺便说一下,ushort也可能被错误地填写)。

 

第2行是以人名(非单色)字体输出。正如你所看到的,从技术上讲,只为::ArrayPrint()留下单色字体是很容易的。

 

你好。请帮助我找到这个错误的原因。我正在把一个指标从mql4转移到mql5.我正在使用以下 "外壳 "来实现iHigh功能。

double iHigh(string symbol,ENUM_TIMEFRAMES tf,int index)
  {
   if(index < 0) return(-1);
   double Arr[1];
   if(CopyHigh(symbol,tf,index,1,Arr)>0)
      return(Arr[0]);
   else
     {
      Print(__FUNCTION__,GetLastError());
      return(-1);
     }
  }

结果,我得到了错误4301:"未知符号",尽管Symbol()函数 返回的一个字符串被作为符号参数传递。下面是调用iHigh的函数的一段代码

ENUM_TIMEFRAMES tf=Period();
   string symbol = Symbol();
   if(filtr1==false) 
      return(true);  
   int i1,i2=0; 
   for(i1=i+1; i2<6; i1++)
     {
      
      if(iLow(symbol,tf,i1)<=iLow(symbol,tf,i1+1) && 
         iHigh(symbol,tf,i1)>=iHigh(symbol,tf,i1+1)) 
        {
         break; //выход из цикла
        }
      else
        {
         i2++;
        }
     }