错误、漏洞、问题 - 页 2575

 
Roman:

内存在mql代码中被分配为

出,并作为分配内存的 指针传递,因为mql中的字符串在dll中是wichar_t*。

哦,多么混乱...

我不知道字符串的实现,我只能猜测,但根据错误判断,字符串输出在堆栈上创建了一个初始化为0x0000000000的指针,你可以安全地解除对dll中空指针的引用。

 
Vladimir Simakov:

哦,这太复杂了......

我不知道字符串的实现,我只能猜测,但根据错误判断,字符串输出在堆栈上创建了一个初始化为0x0000000000的指针,你可以安全地解除对dll中空指针的引用。

对不起,没有注意到StringInit(()。
 
Roman:

内存在mql代码中被分配为

出,并作为分配内存的 指针传递,因为mql中的字符串在dll中是wchar_t*。

挖掘一下Dll本身,有些东西很可能就在那里。最近,我一直在从mql向第三方的C++/C#应用程序输送数据,一点问题都没有。

 
Vladimir Simakov:

挖掘一下dll本身,那里可能有一些东西。最近,我一直在从mql向第三方C++/C#应用程序输送数据,一点问题都没有。

dll很简单,不需要清楚,想法本身就显示出来了。

wchar_t* out        = L"";
const wchar_t* data = L"";

while(condition)
{
   data = getData();  //getData библиотечная функция возвращает const wchar_t*
   wcscpy(out, data);
}

将结果数据输出到控制台,控制台中的所有行都是清晰的,没有空隙,也没有闪失。
我通过wcscpy(out, data)将结果传递给mql,但现在我遇到了问题。
但如果我通过手写的检查字符串。

wchar_t* out        = L"";
const wchar_t* data = L"";

while(condition)
{
   data = L"{\"p\":\"2000\"}";  //проверочная строка
   wcscpy(out, data);
}

不知道为什么,我没有遇到问题。

嗯,mql中的string类型 是否考虑终端空wchar_t *?

附加的文件:
 

建议扩大一点OnTimer()事件的可能性

此刻,当EventSetTimer()函数设置了调用的周期后,OnTimer()事件开始发生。

事实证明,以下是专家顾问。

bool timer_set = false;
int OnInit()
{
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTick()
{
   if (!timer_set)
      {
         // -- имитация включения советника в какое-то
         // -- случайное время
         string time = TimeToString(TimeTradeServer(), TIME_DATE | TIME_MINUTES | TIME_SECONDS);
         if (TimeCurrent() >= D'2019.09.24 3:47:40')
            {
               EventSetTimer(600);
               timer_set = true;
            }
      }
}
//+------------------------------------------------------------------+
void OnTimer()
{
//---
   string time = TimeToString(TimeTradeServer(), TIME_DATE | TIME_MINUTES | TIME_SECONDS);
   printf("Current time: %s", time);
}
//+------------------------------------------------------------------+

输出大约如下。

QJ      0       07:53:10.369    test_timer (GBPUSD_i,D1)        2019.09.24 03:57:41   Current time: 2019.09.24 03:57:41
NF      0       07:53:11.246    test_timer (GBPUSD_i,D1)        2019.09.24 04:07:41   Current time: 2019.09.24 04:07:41

然而,通常在另一个柱状体出现后检查信号的发生就足够了。

例如,事实证明,例如PERIOD_M15,条形图出现在00:15:00,但专家顾问的检查只能在00:29:59检查。

也就是说,为了获得或多或少的稳定和平等的结果,无论专家顾问的启动时间如何。

你需要为较短的时间间隔设置一个定时器,或者另外使用OnTick()。

正如实验所显示的,它极大地减慢了策略测试器的测试速度。

建议。

增加一个函数,允许设置OnTimer事件开始计数的初始时间。

例如,一些函数EventSetTimerFrom(const datetime SinceDT),可以让你在一个新的条形图后几秒钟内设置定时器的调用。

 
Roman:

dll很简单,为了清晰起见,多余的东西已经被删除,想法已经显示出来。

我把结果粘贴到控制台,所有的线条都很好,没有间隙,没有故障。
我通过wcscpy(out, data) 将结果传递给mql,但现在我遇到了问题。
但如果我通过手写的检查字符串。

不知道为什么,我没有遇到问题。

嗯,mql中的string类型 是否考虑终端空wchar_t *?

但这个功能是有效的。

wcsncpy(out, data, wcslen(data));

但它不太对,在字符串的末尾似乎有一个坏字符,一个额外的括号}出现后又消失了。
wcslen(data)+1
wcslen(data)+2
没有任何帮助。
并得到解析,没有错误,没有泄漏。

不知道在mql-looking字符串中一个字符的长度或大小是什么?
字符串类型肯定有错误。

而在很久以前的一篇文章 第3.3段传递和修改字符串中,这个例子很可能犯了一个错误。

_DLLAPI void fnReplaceString(wchar_t *text, wchar_t *from, wchar_t *to)
  {
   wchar_t *cp;
    
   //проверка параметров
   if(text==NULL || from==NULL || to==NULL) return;
   if(wcslen(from)!=wcslen(to))             return;
   
   //поищем подстроку
   if((cp=wcsstr(text,from))==NULL)         return;
   
   //заменим
   memcpy(cp,to,wcslen(to)*sizeof(wchar_t));  //в этой строке должен быть указатель sizeof(wchar_t *)
  }

也许在终端代码的某个地方,mql字符串转换的工作方式是一样的,没有指针。

 
Maksim Emeliashin:

设置OnTimer事件开始倒计时的初始时间。

你可以自己通过重复调用EventSetTimer来完成这个任务。请注意,在账户中(不是在测试器中),计时器是浮动的,需要不断调整

 
fxsaber:

你可以自己通过重复调用EventSetTimer来完成这个任务。请记住,在账户上(而不是在测试器中),定时器是浮动的,需要不断调整

谢谢你,有用的东西!

当然,非常奇怪的是,如此简单的一点在终端 "开箱 "时没有被考虑到。

 
Roman:

但这个功能是有效的。

但这似乎有点尴尬,在字符串的末尾出现或消失了一个额外的小括号}。
wcslen(data)+1
wcslen(data)+2
没有任何帮助。
并得到解析,没有错误,没有泄漏。

不知道在mql-looking字符串中一个字符的长度或大小是什么?
字符串类型肯定有错误。

而在很久以前的一篇文章 第3.3段传递和修改字符串中,这个例子很可能犯了一个错误。

也许在终端代码的某个地方,mql字符串转换的工作方式是一样的,没有指针。

getData() dig.我有一种感觉,那里有一个问题。
 
Roman:

dll很简单,为了清晰起见,它已经被删除了,想法是这样的

你的例子很有趣,你删除了所有的东西,留下了UB(对字符串字面的修改),每个人都要心灵感应。如果你期望得到一些聪明的建议,请给出最小的工作代码(在两边),否则就是垃圾。