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

 
Алексей Барбашин:

嗯...我可能没有仔细看API,但我没有看到这样一个功能....。而且这可能会很方便。

任何其他提示...也许这个问题太......可笑了......。如何将一个数字,如双数,翻译成数组char?也就是说,在某些API中,需要将数字作为指针来传递。指针以一维数组的形式传递...对于字符串,我明白,为它们提供了StringToShortArray 和StringToCharArray函数,但对于数字,我仍然不明白如何将它们转换成字节数组(char)。

也许有些例子?
 
. ... Rick D. ... .:
也许有些例子?

我们不会走得太远。让我们来看看与注册表合作的情况。注册表可以存储字符串和数字值(不作为一个字符串)。将一个数字传递给注册表并获得其指针是通过数组完成的(根据你的更正)。这样的例子是否可行?

 
pivomoe:

我研究蜱虫的历史。它并不总是能查出蜱虫发生时市场上发生了什么。

SBER

i=987 2016.06.27 10:00:30.274 Ask=133.91 Bid=133.9 Last=133.9 Vol=50 TICK_FLAG_ASK

i=988 2016.06.27 10:00:30.280Ask=133.93 Bid=133.9 Last=133.9 Vol=50 TICK_FLAG_ASK

i=989 2016.06.27 10:00:30.280 Ask=133.93 Bid=133.9Last=133.91 Vol=100 TICK_FLAG_LAST TICK_FLAG_VOLUMETICK_FLAG_BUY TICK_FLAG_SELL

i=990 2016.06.27 10:00:30.280 Ask=133.93 Bid=133.9 Last=133.92 Vol=300 TICK_FLAG_LAST TICK_FLAG_VOLUMETICK_FLAG_BUY TICK_FLAG_SELL

i=991 2016.06.27 10:00:30.280 Ask=133.93 Bid=133.9 Last=133.92 Vol=100 TICK_FLAG_LAST TICK_FLAG_VOLUMETICK_FLAG_BUY TICK_FLAG_SELL

i=992 2016.06.27 10:00:30.281 Ask=133.94 Bid=133.9 Last=133.92 Vol=100 TICK_FLAG_ASK

1.这种同时具有TICK_FLAG_BUY和TICK_FLAG_SELL 标志的神秘的tick是什么 我甚至能够找到这种体积为1手的tick。

2.在蜱988。Ask=133.93 Bid=133.9 最后的133.91从哪里来?

市场上发生了什么?

这类问题最好在论坛的 "股票交易 "板块中单独发帖。

简而言之,如果你看到一个刻度线同时有一个买入标志和一个卖出标志,这意味着经纪人的服务器没有更新,它广播的交易方向不明。

你在哪台服务器上观察蜱虫?
 
Vladimir Karputov:

请重写你的问题,或者加上标点符号,或者最好加上一张图片,说明什么、哪里和谁。否则,我看到熟悉的字母,但我无法理解其含义或你的想法。

这里有一张图片


 
Seric29:

这里有一张照片。


那么,为什么要放我的照片(或者说是缓存疯了吗?)

 
Seric29:

这里有一张图片


澄清:你想在终端直接移动鼠标,通过鼠标右键复制POSITION的价格

 
Алексей Барбашин:

我们不会走得太远。让我们来看看与注册表合作的情况。注册表可以存储字符串和数字值(不作为一个字符串)。将一个数字传递给注册表并获得其指针是通过数组完成的(根据你的更正)。像这样的例子是否可行?

你去吧。我想你能想出办法。
附加的文件:
TestReg.mq5  33 kb
 
. ... Rick D. ... .:
给你。我想你会明白的。

那是原创的!我甚至没有想过这个问题。)))

按照我之前的例子,我试图找出导致内存和终端崩溃的原因。

首先,我拒绝用数组来获得指向一个开放的寄存器部分的指针。也就是说,我只是把uint& phkResult传给了API。一切都很顺利,没有错误。mql的文档说,简单类型可以通过引用来传递,当使用API时,引用就是变量的地址,也就是指针。这一部分的一切都很成功。我也返回了NULL参数,并在不使用数组的情况下传递了它们。

此外,我还致力于将数值本身传递给寄存器。函数描述中已经指出,它应该传递一个结尾为零的字符串。这正是字符串类型,所以在第一个版本中,我传递的只是一个变量。你在以前的版本中没有改变这一点,依靠的是相同的。但我决定尝试使用数组,并引入了ushort数组,并将必要的值填入其中。传递给函数时的参数之一

uint RegSetValueExW(uint hKey, string lpValueName, uint Reserved, uint dwType, ushort &lpData[], uint cbData)

是被传递的数据的大小。在你的例子中,它是这样的。

uint cbData = (StringLen(value)+1)*2;

这里的一切都很清楚。我们取字符串的长度,加上一个 "结束 "的零,然后乘以2个字节,再乘以ushort大小。

我是这样试的。

ushort Data[]。

StringToShortArray(value, Data)。

uint cbData = sizeof(Data);

想象一下,当数据的大小不等于前一个例子时,我的惊讶之情溢于言表!

我检查了数组的大小,它绝对等于StringLen(value)+1,但数据的大小却不一样......我还是不明白为什么。

但不要紧。

最后,原来的问题是从注册表中获取数值,因为我是以指针的形式通过引用传递一个字符串变量。这就是发生车祸的地方。

"如果我们把这个结构或对它的引用传入DLL,而不是字符串本身,我们会期待一个错误的结果--因为系统DLL肯定会接受一个末尾有零字符的诚实的字符串,而不是这个结构"--这句话已经是十年前的事了,但还没有失去其意义。

因此,当传递任何字符串常量值,如注册表部分名称或字符串参数值时,一切都很正确。而当像我这样通过引用传递一个字符串变量时,会导致引文中指出的问题。)))

关于接收的大小,在API文档中有一个例子,当出现 "有更多的数据 "的错误时,我们在循环中增加接收缓冲区的大小,并再次获得数据。

所以它是这样的。

再次感谢您的帮助!)))


 
Алексей Барбашин:

那是原创的!我甚至没有想过这个问题。)))

联盟使用起来很方便。你不必考虑哪里是高字节,哪里是低字节。联盟甚至可以用于REG_BINARY。你描述你的数据结构。然后你把它和一个按结构大小排列的字节数一起加入Union。但我认为你并不真正需要它。任何数据都可以转换为字符串,并作为字符串存储。

根据前面的例子判断,我试图了解到底是什么原因导致了内存和终端崩溃。

也许是因为堆栈在飞,你可能在函数描述中指定了long而不是int。

mql的文档说,简单的类型可以通过引用来传递,当与API一起工作时,它是一个变量的地址,即一个指针。

你能下载这部分文件的链接吗?

uint cbData = sizeof(Data);

如果你传递ushort数组,你需要uint cbData = ArraySize(Data) * 2。

和uint cbData = ArraySize(Data)如果你传递一个数组uchar。

在最后一个例子中,我把uchar数组作为API函数参数传递,以便与wind的LPBYTE lpData完全兼容。

它是正确的。但要把所有数据转换为字节数组,就会增加麻烦。

至于接收的大小,API文档给出了一个例子,在 "有更多数据 "的错误情况下,我们在循环中增加接收缓冲区的大小,然后再次接收数据。

看一下最后的代码。在实现中,首先是请求获得数据的大小,然后设置数组的大小,然后所有的数据都被全部拿走。

 
. ... Rick D. ... .:

联盟使用起来很方便。没有必要去想高字节在哪里,低字节在哪里。你甚至可以对REG_BINARY使用Union。你描述你的数据结构。然后你把它和按结构大小排列的字节数一起加入Union。但我认为你并不真正需要它。任何数据都可以转换为字符串,并作为字符串存储。

也许也是因为堆栈在飞,你在函数描述中指定了long而不是int。

你能下载这部分文件的链接吗?

如果你传递ushort数组,你需要uint cbData = ArraySize(Data) * 2。

和uint cbData = ArraySize(Data)如果你传递一个数组uchar。

在最后一个例子中,我把uchar数组作为API函数参数传递,以便与Windows的LPBYTE lpData完全兼容。

它是正确的。但将所有数据转换为字节数组会增加麻烦。

看一下最后的代码。在实现中,首先是请求获得数据的大小,然后设置数组的大小,然后所有的数据被全部取走。

再次问候!

我真的希望我们在这个主题中的讨论不仅对新手有用,而且对有经验的程序员也有用。

长呢。是的,这是我的错误,但最初使用的是int。我使用Long是因为我使用的是64位终端。但是,一切都能很好地使用int。

关于指针。我认为以下文章对这一切描述得非常好:https://www.mql5.com/ru/docs/basis/types/this,https://www.mql5.com/ru/docs/runtime/imports。

我也承认我对sizeof的错误。我们正在使用一个动态数组进行交换,而对于动态数组来说,sizeof只是返回数组本身的大小,而不是数据大小:https://www.mql5.com/ru/docs/basis/operations/other。

关于获得数据的完整尺寸。是的,你是对的。事实上,在第一次调用时,该函数返回放置在参数中的数据的大小,所以你可以不做我写的循环。我一定是误解了这里的函数描述,因为它说这个变量返回所读数据的大小。

让我们回到字符串...原则上,正如事实所证明的,当接收数据时,我们可以通过引用来传递变量,但首先我们可以用一些最大长度的值来初始化它。在我看来,这似乎是一个拐杖,因为之后价值本身应该从这个字符串中切出来。从数组缓冲区获取数据是更理想的变体,也就是说,在我看来,我们的解决方案更好)))。

这里是关于将字符串作为指针传递的问题:https://www.mql5.com/ru/forum/103532/page2#comment_2983919

Andriy告诉我们关于与dll的工作非常好:https://www.mql5.com/ru/articles/96


我认为,在你的帮助下,我们完全涵盖了不仅与注册表合作,而且与库API的细微差别的主题。

与注册表一起工作的类别对于在一个图表上的工具之间以及在一般的图表和终端之间交换数据都非常有用。

曾经在这个论坛上,他们说为这些目的使用注册表无异于用灯泡敲钉子,建议使用虚拟文件(映射)。但我不同意这一点,因为在将注册表写入磁盘之前,它只是一个虚拟文件。而当使用REG_OPTION_VOLATILE属性时,该值将始终是虚拟的。而且在注册表中存储会话间的数据是非常方便的。IMHO。

Документация по MQL5: Основы языка / Типы данных / Ссылки. Модификатор & и ключевое слово this
Документация по MQL5: Основы языка / Типы данных / Ссылки. Модификатор & и ключевое слово this
  • www.mql5.com
В MQL5 параметры простых типов можно передавать как по значению, так и по ссылке, в то время как параметры сложных типов всегда передаются по ссылке. Для указания компилятору на необходимость передачи параметра по ссылке, перед именем параметра ставится знак амперсанда Передача параметра по ссылке означает передачу адреса переменной, поэтому...
原因: