С этой статьи я начинаю еще одну серию, относящуюся к разработке графических интерфейсов. На текущий момент нет ни одной библиотеки кода, которая позволяла бы легко и быстро создавать качественные графические интерфейсы в MQL-приложениях. Я имею в виду графические интерфейсы, к которым мы все привыкли в известных операционных системах. Цель проекта — дать конечному пользователю такую возможность и научить это делать с помощью моей библиотеки. Я постарался сделать ее максимально понятной в изучении, с возможностями дальнейшего развития.
[in] Режим открытия. Это может быть одна величина или их комбинация: FILE_BIN, FILE_CSV, FILE_READ, FILE_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE. Клиентский терминал может подключаться к серверам разных брокерских компаний. Исторические данные (файлы HST) каждой брокерской компании хранятся в соответствующей подпапке папки истории...
Файлы истории котировок Metatrader 4 имеют расширение и находятся в папке данных торгового терминала, в каталоге . Они сгруппированы в подкаталогах, имена которых совпадают с названиями серверов, например: или . Имена файлов начинаются с наименования торгового инструмента, далее указывается таймфрейм (количество минут), например, для часового...
亲爱的鉴赏家们!
我希望我的问题是在正确的分支中提出的!
问题是:是否可以用#define来定义一个结构,从而展开成以下代码。
if(a) printf("%s(%04d)", __FUNCTION__, __LINE__)+printf("%s", _Symbol)。
这是为了了解...正确的建设可能是不同的。理想情况下,我想找到一个解决方案,使输出字符串开头的任何printf()在条件匹配时,在字符串前面打印出 "Function(string in function) " 结构。这都是为了缩短书面说明
我希望用下面的(类似的)结构来取代红色突出的结构。
#define P(a) if(variable>=a) printf("%s(%04d)", __FUNCTION__, __LINE__)
我在Inet中发现了一些东西,有点类似,但我没有用过类,因此我还不能设法找出工作代码。我试着以下列形式应用下层构造
P(3)+printf("%s(%s) Accuracy=%d", Symbol, (Command==0? "Buy": "Sell"), Accuracy);
但代码中的任何这样的条目都会导致 "打印 "错误--"void "类型的表达式是非法的......。
你好!
请解释以下的区别
if(!OrderSelect(order,SELECT_BY_TICKET,MODE_TRADES)){PrintFormat("OrderSelect error %d",GetLastError()); return;}
и
如果(OrderSelect(order,SELECT_BY_TICKET,MODE_TRADES)==false){PrintFormat("OrderSelect error %d",GetLastError(); return;}。
谢谢你
你好!
请解释以下的区别
if(!OrderSelect(order,SELECT_BY_TICKET,MODE_TRADES)){PrintFormat("OrderSelect error %d",GetLastError()); return;}
и
如果(OrderSelect(order,SELECT_BY_TICKET,MODE_TRADES)==false){PrintFormat("OrderSelect error %d",GetLastError(); return;}。
谢谢!
在逻辑上没有区别。区别只在于这种逻辑比较是如何写的。
"!"符号是 "不"。也就是说,if(!Select())与if(Select()==false)相同。在俄语中,它看起来像这样: if(NOT Select())。
你可以快速 "反转 "一个布尔变量的值。
我还有一个问题。下面是一个程序的例子。
double Lots=0.01。
int slippage=30。
int Subr1()
{
int result=-1。
int_result=OrderSend(_symbol,OP_BUY,Lots,slipage,0,0)。
if(int_res<0){PrintFormat("OrderSend error = ",GetError();})
返回int_result。
}
空白的OnTick()
{
int numer=-10;
if(OrdersTotal()==0)numer=Subr1();
如果(OrdersTotal()>0)Subr2(numer)。
返回。
}
空白Subr2(int order)。
{
if(!OrderSelect(order,SELECT_BY_TICKET,MODE_TRADES)){PrintFormat("OrderSelect error %d",GetLastError()); return;}else PrintFormat("Ok, OrderTicket = ",OrderTicket())。
}
响应:OrderSelect错误4051。如果我用SELECT_BY_POS代替它,OrderSelect错误1。对策略测试器 和 "在真实数据上运行 "的反应是一样的。我试着为SELECT_BY_TICKET的情况删除MODE_TRADES:没有区别。 问题是什么,如何解决。谢谢你!
响应:OrderSelect错误4051。如果我用SELECT_BY_POS代替它,OrderSelect错误1。反应对于策略测试器 和 "在真实数据上运行 "是一样的。我试着为SELECT_BY_TICKET的情况删除MODE_TRADES:没有区别。 问题是什么,如何解决。谢谢你!
SELECT_BY_POS是在订单列表和你的设计中 "按优先级 "选择一个订单。
您正在尝试选择一个订单,该订单是由订单队列# ...而你在这里使用票号,你只有1个订单,票号是10023444 ....所以呢? 这里你需要一个数字 ,从1到2,3......嗯,你在市场上有多少订单,......纠正数字从0,1,2......。- 编号从0开始,一直到OrdersTotal()-1...
SELECT_BY_TICKET应该工作,但只到你有票号的那一刻,也就是你在市场上的订单,上面有一个检查发送订单,如果订单没有发送,票号=-1 !
总而言之,你的订单工作设计是不正确的。 如果你决定学习MQL,这里有现成的订单工作实例https://www.mql5.com/ru/forum/131859
你说到了数组,你说到了外汇。多么自相矛盾啊
而且傻子都知道MT4/MT4的所有基本阵列都是缓冲的。
在MT4/MT5中,没有同样水平的程序员,让用户能够处理基本的数组。
此外,MT4/MT5中的基本数组有自己的扩展名(.hts或.hss--我不记得具体内容了,但类似这样的)。
因此,它们不是以文本格式(扩展名为.txt)来到终端,而是以它们自己的格式。
而在MT4/MT5中,基本数组被解码并转换为所选时间段的数组(1分钟、5分钟、15分钟等),之后才被复制和缓冲。
为什么它们是缓冲的?
作为比较。因此,没有数据丢失。其中一个数组不断地被重新计算(不时地),第二个数组(从第一个数组复制)在我们复制到用户数据时使用。
换句话说,向用户提供数据的程序是相当复杂的。
这是关于数组的,如果你有兴趣的话。
顺便说一下,Android和Window的基本MT4/MT5阵列都有相同的扩展。
--------------------------------------------------------------------------------------------------------------------------------
至于从第三方来源将DYNAMIC数据导入MT4/MT5,据我所知,不提供这种导入。
所以在MT4/MT5的C++Builder中没有客户/服务器程序。
--------------------------------------------------------------------------------------------------------------------------------
我想知道这个程序是否会出现在图书馆里
http://tol64.blogspot.com/2015/12/easy-and-fast-gui-mql.html
当然,最可能的是,它也不会出现在那里。
也就是说,你可以尝试将动态数组 仅以基本格式导入MT4/MT5,它们将自动通过标准数据处理。
而且傻子都知道MT4/MT4的所有基本阵列都是缓冲的。
MT4/MT5中的程序员水平不高,他们允许用户使用基本的数组工作。
此外,MT4/MT5中的基本数组有自己的扩展名(.hts或.hss--我不记得具体内容了,但类似这样的)。
因此,它们不是以文本格式(扩展名为.txt)来到终端,而是以它们自己的格式。
而在MT4/MT5中,基本数组被解码并转换为所选时间段的数组(1分钟、5分钟、15分钟等),之后才被复制和缓冲。
为什么它们是缓冲的?
作为比较。因此,没有数据丢失。其中一个数组不断地被重新计算(不时地),第二个数组(从第一个数组复制)在我们复制到用户数据时使用。
换句话说,向用户提供数据的程序是相当复杂的。
这是关于数组的,如果你有兴趣的话。
顺便说一下,Android和Window的基本MT4/MT5阵列都有相同的扩展。
你的脑子里有这么多乱七八糟的东西,我甚至都过不去。
你在MQL中把事情搞得一团糟--数组、文件、时间序列和指标缓冲区。
如果你设法消化我在一行中给出的信息,我会给你一些思考的空间:MT4和MT5以不同的方式存储历史数据,在MT4中,用户可以访问.hst 文件https://docs.mql4.com/ru/files/fileopenhistory。
在MT5中,不能直接访问历史文件,但可以使用自定义符号https://www.mql5.com/ru/docs/customsymbols
你的脑子里有这么多乱七八糟的东西,我甚至都过不了关。
你在MQL中所做的是数组、文件和指标缓冲器
如果你能设法消化我在一行中给出的信息,我会给你一些思考的空间:MT4和MT5以不同的方式存储历史数据,在MT4中,用户可以访问.hst 文件https://docs.mql4.com/ru/files/fileopenhistory。
在MT5中,不能直接访问历史文件,但可以使用自定义符号https://www.mql5.com/ru/docs/customsymbols
我在帖子中根本没有说过一个关于历史文件的字。
你又把一些东西搞混了,而且又偏离了主题。
我说的是动态的数据集。那是一个完全不同的话题。感受不同。
我在帖子中根本没有说过一个关于历史文件的字。
你又糊涂了,又偏离了主题。
我说的是动态数据数组。那是一个完全不同的话题。
此外,MT4/MT5中的基本数组甚至有自己的扩展名(.hts或.hss--我不记得具体内容了,但类似的)。
好吧,继续,我不明白你在这个论坛上的目的是什么
我说的是动态的数据集。这是一个完全不同的话题。感受不同。
好吧,继续,我不明白你出现在这个论坛的目的是什么
我觉得你也应该明白,在所有的编程语言中,动态 数组只是动态数组,而时间序列是时间序列,对时间序列 的部分工作(访问)被组织成对数组的工作......这就是对终端的数据形成问题的详细讨论。
http://profitraders.com/Python/hstRead.html
我想提请读者注意,这篇文章不是关于历史数据,历史数据位于:MT4->服务->数字档案。
和直接关于终端的.hst格式的动态数据,这些数据直接参与了市场报价的获取和处理过程。
------------------------------------------------------------------------------------------
也许我说得还不够清楚。阅读其他作者。我希望它能变得更加清晰。