为MT制作一个Python交易系统。 - 页 3

 
Yuriy Asaulenko:

那是另一个话题)。

我不把一个团队放在一起。我自己走路,做我认为正确和有趣的事情,不做任何承诺。

如果有人想和我约会,也不反对,也不承诺。

我不是在谈论团队,而是在谈论EXE应用程序形式的引擎,将Python和R与MQL连接起来,这是我在那个主题中建议的。
 
Ivan Negreshniy:
我说的不是团队,而是EXE应用程序形式的引擎,将Python和R与MQL连接起来,这是我在那个主题中建议的。

你会得到一个EXE--在Python中没有问题。如果这个垃圾场里有钻石,他们的搜索就有问题了。除非SanSanych告诉我)。

我主要与神经网络打交道,没有R就有足够的内容。

但是,实际上,这个交互方法计划是通用的,可能你也可以把它用于R。

 
现在我们有了一个预建的应用程序,是时候在终端和Python之间交换数据了。
对于初学者,我们将选择最简单的一种交换方式--通过文件进行数据交换。
现在很多人都会在他们的墨水瓶中嗤之以鼻,而且是徒劳的。所以让他们)。
1.在应用程序的 构建和调试过程中,文件共享是最有效的,因为它不需要努力升级。而一旦应用程序建成,它就可以被其他东西取代。
2.在大多数现成的TC中,文件交换速度是绰绰有余的。50-100毫秒。对你来说还不够吗?
3.当通过RAM-磁盘交换文件时,交换率达到1.5GByte/s。根本不可能测量延迟。
总而言之,把它吐出来,忘掉对手)。
好吧,实际上,如果我们或这个话题不负众望,计划在最后阶段进行另一次交流)。

我们将通过CSV文件与终端交换。到目前为止,有一种方式--从终端到应用程序。
为了避免利益冲突,我们将使用信号文件。
所以,让DataTS.csv作为数据文件,STS.s作为信号文件。
终端将数据写入DataTS.csv,并在写入后,创建一个空的信号文件STS.s。
应用程序检查STS.semaphore文件的存在,然后读取DataTS.csv文件,然后删除STS.semaphore文件。
然后终端检测STS.s信号文件的消失,然后才将新的数据写入DataTS.csv文件中。
可能的变化,取决于Phyton和MT文件功能--还没有看。
然而,不是一下子就能完成的,首先我们需要与Python合作,并确定其能力。
这就是我们要做的。
 
自从我上次访问以来,有一些变化。该应用程序现在已全面运作--上一篇文章中描述的所有内容都已实现。所有的按钮现在都能工作,文件交换也已实现。
- 清理按钮可以清除输出窗口。
- 发送按钮将输入窗口的一行发送到输出窗口。
- 开始 "按钮可开启文件交换。
- 停止按钮停止文件交换。
这很容易检查。我们创建C:\PyTS文件夹,放置数据文件--DFile.csv,放置信号文件--SFile.tx。我们的Python程序检测信号文件,读取数据文件,在输出窗口显示,并删除信号文件。
现在你可以改变DFile.csv中的数据并创建一个新的semaphore文件,程序将读取并输出新的数据。
你可以编写一个简单的MQL-程序,将我们程序中的读取文件夹改为MT写入的文件夹,然后你可以评估交换的速度,可能的数据差距和其他许多事情。
唯一负责文件交换的函数是FileExchange()。它是在一个额外的线程中实现的--定时器线程。我们可以有几十个这样的线程和函数,它们不会以任何方式影响应用程序--也就是说,我们可以有几十个平行的、独立的数据交换通道供我们使用。
现在,计时器被设置为10.0s--你可以把它设置为0.001s,见文档。
好吧,如果你真的想测量速度和其他特性--删除交换路径中的debugprint()函数--它们大大降低了速度。
Python程序代码在附件中。像往常一样,将其重命名为.py
附加的文件:
PyTS_1.0.txt  3 kb
 

我们谈到了交换CSV文件,但1.0版本(见上一篇文章)只是打开和读取文件。下一个版本--1.01,经过一些修改,可以读取CSV文件并将其存储在InData变量中。

实际上是所有的修改。

def FileExchange():
    global Change
    if Change==True:
        if os.path.exists(SFile):
            print("SFile.txt is")
            if os.path.exists(DFile):
                print("DFile.csv is")
                InData = csv.reader(open(DFile, 'r'))
                data_read = [row for row in InData]
                print(data_read)
                os.remove(SFile)
            else:
                print("DFile.csv no")
        else:
            print("SFile.txt no")
        print('Вывод таймера')
        timer =threading.Timer(10.0,FileExchange)
        timer.start()

只改变了3行+csv库连接。

还可以控制InData变量的CSV内容的输出。

In [18]: [['04.08.2018 14:00', ' 1300', ' 1295', '1310', '1305', '100'], ['04.08.2018 14:10', ' 1307', ' 1297', '1320', '1315', '150']]

现在,行的值可以通过索引、类型--行、列来获得。

嗯,还有代码本身--见附件。

附加的文件:
PyTS_1.01.txt  3 kb
 
Yuriy Asaulenko:

我们谈到了交换CSV文件,但1.0版本(见上一篇文章)只是打开和读取文件。下一个版本--1.01,经过一些修改,可以读取CSV文件并将其存储在InData变量中。

实际上是所有的修改。

只改变了3行+csv库连接。

还可以控制InData变量的CSV内容的输出。

现在,行的值可以通过索引、类型--行、列来获得。

嗯,还有代码本身--见附件。

使用文件共享并不是最好的解决方案。文件操作非常缓慢。你必须连接一个RAM磁盘来进行这样的交换。
 
Grigoriy Chaunin:
使用文件进行交换并不是最好的解决方案。文件操作非常缓慢。你必须连接一个RAM磁盘来进行这样的交换。
你能给出文件交换的性能特点(有什么)和所需的任务(需要什么)吗?


而我,会说,他们的速度非常快,而不是慢。如果没有数字特征,你和我的声明都是毫无根据的,因此在手头的任务中没有意义。你需要文件交换和问题的需求这两方面的特征,只有在比较之后,你才能得出有效的结论。既然Yuri Asaulenko决定文件是合适的,我想他更清楚计划的数据传输量和处理时间。

一般来说,磁盘文件比易失性存储器有很大的优势--它们存储在关闭的磁盘上,可以在一周或一年后被访问。要控制,要分析,要验证,只是要观察。

 
Grigoriy Chaunin:
使用文件来交换不是最好的解决方案。文件操作非常缓慢。你必须连接一个RAM磁盘来进行这样的交换。

这个问题已经在这个主题中讨论过了,在以前的帖子中,包括必要时可能使用RAM-Disk。

关于交易、自动交易系统和测试交易策略的论坛

如何用Python制作MT的交易系统。

Yuriy Asaulenko, 2018.08.01 19:33

现在我们有了应用程序的蓝图,是时候用Python进行终端的数据交换了。
首先,我们将选择最简单的交换类型--通过文件进行数据交换。
现在,许多人将在他们的墨水瓶中窃笑,而且是徒劳的。所以让他们)。
1.在应用程序的 构建和调试过程中,文件共享是最有效的,因为它不需要努力升级。而一旦应用程序建成,它就可以被其他东西取代。
2.在大多数现成的TC中,文件交换速度是绰绰有余的。50-100毫秒。对你来说还不够吗?
3.当通过RAM-磁盘交换文件时,交换率达到1.5GByte/s。根本不可能测量延迟。
总而言之,把它吐出来,忘掉对手)。
好吧,实际上,如果我们或这个话题不负众望,计划在最后阶段进行另一次交流)。
也是在该主题的第一个帖子中。
 

我提出了PyTS 1.02的新版本。这个版本在功能上等同于1.01版本,但从代码中删除了不必要的print() 控件,并开始实施类的方法(列宁写道--方法必须是基于类的)--CSV文件的处理被完全分配给类--cCSVJob。

在附件中的Zip-file中,你还可以找到该程序的所有以前的版本,以及在PyTS文件夹中的测试用源数据的必要文件。

附加的文件:
PyTS.zip  6 kb