用Python进行交易 - 页 3

 
Mikhael1983 #:

使用库中描述的函数,实现启动与终端的连接和终止与终端的连接的函数。我们计划每5分钟无休止地循环做这件事。

...

程序运行。

这都是由mql5成功实现的手段

 
Vitaly Muzichenko #:

这都是用mql5成功实现的

自然而然。然而,有一大层人不熟悉mql5,他们认为学习一个过时的工具没有意义,这个工具只适用于一个特定公司的特定终端的极其狭窄的工作领域。
 

如果有问题,我可以解释如何和什么。

让我们写一个函数,将引号保存到文件中。原则上,根本不需要将报价保存到文件中。这足以让他们留在记忆中。我有它历史上来自这样一个事实:终端是在一个 Windows虚拟机 中,一个Python程序保存报价,所有的逻辑都在主机系统中,Debian GNU/Linux,有它自己的Python程序在运行,它读取这些文件并在其他文件中写入交易指令,虚拟Windows中的Python程序读取,并执行。

然而,把引号写进文件本身就是有用的。它是可视化的。允许你看到所发生的事情,感觉,通过其他手段(同样的Matcad)阅读,等等。因此,让我们这样做吧。

def pips_definer(instrument): 
    '''
    Функция возвращает величину пипса для инструмента, например для EURUSD - 0.0001, для USDJPY - 0.01 
    '''
    if instrument in ['EURUSD_i', 'GBPUSD_i', 'EURGBP_i', 'USDCHF_i', 'USDCAD_i']: 
        return 0.0001 
    elif instrument in ['USDJPY_i']: 
        return 0.01 
    else: 
        return None 


def save_prices_to_file(instrument, n=100):
    '''
    Функция принимает инструмент, количество отсчётов цены n в таймфрейме М5, 
    и сохраняет в файл (только сформировавшиеся полностью бары, время соответствует времени закрытия (!) бара)
    '''
    w = pips_definer(instrument) 
    tochn = int(abs(log10(w))+1)  
    path_file = os.path.join(work_catalog, instrument+'.txt') 
    
    bars = mt5.copy_rates_from_pos(instrument, mt5.TIMEFRAME_M5, 0, n+1) # в случае ошибки mt5.copy_rates_from_pos возвращает None 
    
    try: 
        f = open(path_file, 'w') 
        for i in range(0, n+1): 
            bar = bars[i] 
            dt_stamp = date_time.fromtimestamp(bar[0], dt.timezone.utc) + dt.timedelta(hours=1, minutes=5) 
            open_ = str(round(bar[1], tochn)) 
            high_ = str(round(bar[2], tochn))
            low_ = str(round(bar[3], tochn))
            close_ = str(round(bar[4], tochn))
            if i != n: 
                f.write(dt_stamp.M5_view + ' ' + open_ + ' ' + high_ + ' ' + low_ + ' ' + close_ + '\n')
        f.close()    
        print(date_time.now().nice_view, ' - котировки {} успешно записаны в файл'.format(instrument))
    except: 
        print(date_time.now().nice_view, ' - котировки {} записать в файл не удалось'.format(instrument)) 

让我们在主函数中添加一个保存报价的调用。

def main(N): 
    
    '''
    Главная функция, обеспечивающая в бесконечном цикле связь с терминалом, 
    сохранение котировок, и запуск функции, осуществляющей торговлю
    '''    
    
    dt_start = date_time.now() 
    dt_write = dt_stamp_from_M5_view(dt_start.M5_view) + dt.timedelta(minutes=5, seconds=10) 
    print('\n' + dt_start.nice_view, ' - начал работу, бездействую до ' + dt_write.nice_view + '\n') 
    timedelta_sleep = dt_write - date_time.now() 
    time.sleep(timedelta_sleep.seconds) 
    
    while True:
        
        # установка соединения с MetaTrader5 
        if terminal_init(os.path.join('C:\\', 'Program Files', 'Alpari MT5', 'terminal64.exe'), work_account): 
            
            # запись цен в файлы: для всех инструментов, N отсчётов  
            if (dt.datetime.now() - dt_write) < dt.timedelta(seconds=10): 
                print('\n' + date_time.now().nice_view + '  - начинаю запись котировок в файлы')
                for instrument in instruments: 
                    save_prices_to_file(instrument, N) 
            
            # пауза 10 секунд: временная заглушка, имитирующая анализ цен, принятие и выполнение решений 
            print('\nосуществляю торговлю: анализирую котировки, открываю и/или закрываю сделки')
            time.sleep(10)
            
            # завершение соединения с MetaTrader5 
            terminal_done() 
        
            # определение параметров ожидания до следующего выполнения тела цикла 
            dt_start = date_time.now()  
            dt_write = dt_stamp_from_M5_view(dt_start.M5_view) + dt.timedelta(minutes=5, seconds=10) 
            timedelta_sleep = dt_write - dt_start 
            print(date_time.now().nice_view + '  - засыпаю до {}\n\n\n\n\n'.format(dt_write.nice_view))  
            time.sleep(timedelta_sleep.seconds) 
        


工作的结果。


/fx/文件夹包含六个文件。


它们的结构如下(以EURUSD_i.txt为例):日期-时间倒计时为M5_view,开盘,高点,低点,收盘,时间倒计时对应于条形收盘的时刻。

202112071335 1.1269 1.12697 1.12659 1.1266
202112071340 1.12669 1.12636 1.12659
202112071345 1.12661 1.12664 1.12627 1.12627
202112071350 1.12628 1.12633 1.12595 1.12595
202112071355 1.12598 1.126 1.12564 1.12586

...

202112110040 1.13173 1.13181 1.13164 1.13167
202112110045 1.13167 1.1317 1.13157 1.13163
202112110050 1.13163 1.13167 1.13155 1.13157


请注意,我的服务器时间比我电脑上的当前时间少1个小时,我用这个时间(莫斯科时间)思考是很方便的。

这就是为什么我在函数的代码中添加了一个1小时5分钟的时间差,以保存报价。

dt.timedelta(hours=1, minutes=5)

其中,1小时是服务器时间和我的时间之间的差异,5分钟是由于我对酒吧关门时间的思考很舒服,而终端给出的是开门时间。

每隔5分钟,价格文件就会被覆盖,被重写,不是在最后加一行,而是整个文件被覆盖。对于现代的固态硬盘,而且只有1000行,每5分钟才有一次,那就没什么可说的了。
 
Sergey Deev #:

即举个例子,把任何指标数据保存到csv文件或SQLite中,然后再读到python中?这不是很有趣吗?

这很荒唐。这与Python没有关系。有了这样的数据,可以用任何编程语言编写脚本

 
Malik Arykov #:

这恰恰是最有趣的地方。因为它与Python没有关系。同样的事情也可以在任何编程语言中完成

当然,你可以。但Python中的入门门槛比C++中的哪个低得多。完全不熟悉编程的人在3个月后可以轻松地开始使用Python做他们需要的事情。如果需要一些不复杂的东西。

 
Malik Arykov #:

这恰恰是最有趣的地方。因为它与Python没有关系。在任何编程语言中都可以做到这一点

用python来对抗其他语言是否有趣? 没有争议......如果任何其他语言与MT集成并允许你获得报价--去吧......

 

我不明白TC想要什么,根据消息,只有矛盾--有的人不想了解MQL,但这些人要访问一个专题资源,这些人还需要安装MT5,所以他们最终可以潜入Python ......,这有点困难


如果你真的想用Python 创造一些东西来造福社区,你可以用Python写,而把集成或交换的任务推迟到以后

为教育目的 引文导入Python也不是问题

我自己也发现了,几个月前我就在整理了。

import finplot as fplt
import yfinance
df = yfinance.download('AAPL')
fplt.candlestick_ochl(df[['Open', 'Close', 'High', 'Low']])
fplt.show()



我完全不明白这个话题的目的。

 
Sergey Deev #:

用python来对抗任何其他语言是荒谬的吗? 没有争议......如果任何其他语言与MT整合并允许你获得报价--去吧......

我的观点是,python与MT5的整合还不完善。你不能直接获得指标值

 

Igor Makanu 导入 引号也不是问题

在我身上发现了这个问题,几个月前解决了这个问题。

...


总的来说,这个话题的目标一点都不明确

集成问题已经被metatrader5库解决了,不需要再解决或放弃了。

导入报价不是为了教育目的,而是为了真正的交易,所以它不是来自神话中的*金融系统,而是直接来自终端,在其中进行交易的。

这个主题的目的很简单:让每个人都能在Python中开始算法交易,只需复制一些代码,如初始化与终端的连接、请求报价、请求服务器打开或关闭交易等,等等。只关注逻辑,而且是用一种极其方便用户的语言。

 
Malik Arykov #:

我的观点是,Python与MT5的整合还没有完成。你不能直接获得指标值

如果你有计算这些指标的价格,为什么你还需要指标值?我以后会给你几个简单的功能,比如SMA计算,只是作为一个例子。但你可以写你想写的东西,没有人阻止你。