import os, time
import datetime as dt
from json import loads, dump
from random import randint
from numpy import log10
import Classes
import Functions
import MetaTrader5 as mt5
N = 1000 # количество отсчётов, сохраняемых в файлах котировок
N_sd_sell_max = 3 # максимальное количество сделок типа sell по одному инструменту
N_sd_buy_max = 3 # максимальное количество сделок типа buy по одному инструменту
volume = 0.01 # объём сделок
account_demo = ['Alpari-MT5-Demo', 12345678, 'password']
work_account = account_demo
work_catalog = 'Z:\\fx_for_forum\\fx\\'
instruments = ['EURUSD_i', 'GBPUSD_i', 'EURGBP_i', 'USDCHF_i', 'USDCAD_i', 'USDJPY_i']
import os, time
import datetimeas dt
from json import loads, dump
from random import randint
from numpy import log10
from Classes import date_time
import Functions
import MetaTrader5 as mt5
N = 1000 # количество отсчётов, сохраняемых в файлах котировок
N_sd_sell_max = 3 # максимальное количество сделок типа sell по одному инструменту
N_sd_buy_max = 3 # максимальное количество сделок типа buy по одному инструменту
volume = 0.01 # объём сделок
account_demo = ['Alpari-MT5-Demo', 12345678, 'password']
work_account = account_demo
work_catalog = 'Z:\\fx_for_forum\\fx\\'
instruments = ['EURUSD_i', 'GBPUSD_i', 'EURGBP_i', 'USDCHF_i', 'USDCAD_i', 'USDJPY_i']
def terminal_init(path_to_terminal, account):
'''
Функция осуществляет соединение с терминалом MT5
'''
if mt5.initialize(path_to_terminal, server=account[0], login=account[1], password=account[2]):
str1 = ' - соединение с терминалом {} билд {} установлено'
print(date_time.now().nice_view, str1.format(mt5.terminal_info().name, mt5.version()[1]))
return True
else:
print(date_time.now().nice_view, ' - соединение с терминалом установить не удалось')
return False
def terminal_done():
'''
Функция завершает соединение с терминалом MT5
'''
try:
mt5.shutdown()
print('\n' + date_time.now().nice_view, ' - соединение с терминалом успешно завершено')
except:
print('\n' + date_time.now().nice_view, ' - соединение с терминалом завершить не удалось')
def dt_stamp_from_M5_view(M5_view):
return date_time(int(M5_view[0:4]), int(M5_view[4:6]), int(M5_view[6:8]), int(M5_view[8:10]), int(M5_view[10:12]))
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):
# пауза 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)
if __name__ == '__main__':
main(N)
Pythonを使った取引は、MQL5のPRにもなっていますね。
インジケーターのデータを計算できないようにしているのは誰ですか? または、カスタムインジケーターのデータをmqlからpythonに渡しているのですか?
インジケータデータの計算を妨げるのは誰か? またはカスタムインジケータのデータをmqlからpythonに渡す。
少なくとも擬似コードで、例を挙げてもらえますか?pythonでスクリプトを作成します。一定期間のボリンジャーのデータ(イシモクなど)を受信したい。どうすればいいのでしょうか?
ニシキヘビとの取引もいいものです・・・。
...
PythonはSQLiteに相場や指標を保存します。ソケット、ファイル、データベースを介したMQL-Python通信(ソケットが良い)。
もちろん、その通りです。でも、データベースやソケットのようなものに詳しくない人がアルゴリズム取引に参入できるようにしたい...。
そこで、ファイルを通じて、シンプルに考えてみましょう。クリアで、十分な仕事量。
3つのファイルを作ることを提案します。
Classes.py - あらゆる種類のクラスをそこに置く。必ずしもすべてのクラスを置く必要はなく、必要なものだけを置いて、メイン ファイルに不必要に散らかったコードがないようにするためです。
Functions.py - あらゆる種類の関数を保存します。必ずしもすべての関数ではなく、メインファイルのコードを散らかさないようにする必要があるものだけを保存します。
TradeLogic.py - メインファイルです。
Classes.pyファイルにタイミング、バー、トレードのクラスを入れておきます(空白のトレードクラス)。
まだ解説はありません。解説は順次行っていく予定です。
少なくとも擬似コードで、例を教えてください。pythonでスクリプトを作成します。指定した時間のボリンジャー(イシモクなど)のデータを取得したいのですが、どうすればいいですか?どうすればいいのでしょうか?
つまり、任意の指標のデータをcsvファイルやSQLiteに保存し、それをpythonで読み込む方法の例を挙げてください。笑えなくなる?
TradeLogic.pyというファイルに、まずはこう書いておくといいと思います。
ここでは、後で必要となるものをインポートしていますが、実際のプログラムはN=1000行目から始まります。work_catalog "というアドレスは、価格や必要に応じてその他を記載したファイルを保存する予定のディレクトリです。私は仮想マシンで メタトレーダーを使用しており、このデモのPythonのために - また、そこに、楽器 - 我々が取引を計画している楽器のリストなので、アドレスは、とても奇妙です。
例えば、インジケータのデータをcsvファイルやSQLiteに保存して、それをpythonに読み込む例を教えてください。笑えなくなる?
いや、面白くはないだろう。Pythonを使えばすぐにアルゴリズム取引を始められるが、現在Pythonを全く使いこなせていない、MQLは必要ないという思いがある、応用範囲が極めて狭いツールを時間をかけて学ぶ気になれない、という人は少なくないはずです。Cライクな構文も語らないでください。C/C++に全く慣れていない人が多すぎるのです。
このブランチの目的は、アルゴリズム取引を何から始めればいいのか分からない人に、具体的な指示を与えることです。先制キック。余計な手間をかけずに。
Metatrader5ライブラリは、Metatrader5端末の管理に使用されます。
ライブラリはこちら:https://pypi.org/project/MetaTrader5
ドキュメントはこちら: https://www.mql5.com/ru/docs/integration/python_metatrader5
ライブラリに記載されている関数を用いて、端末との接続を開始する関数、端末との接続を終了する関数を実装する。5分おきに無限ループで行う予定です。
また、'202112101635'型の文字列から日付時刻のカウント( date_timeクラスのオブジェクト)を作成するdt_stamp_from_M5_view関数も書いてください(M5_viewと呼ぶことにします)。
このコードをTradeLogic.pyに記述してみましょう。
このコードはすでに機能しています。すなわち、起動し、5分+10秒の最も近い倍数を決定し(サーバーのバーが閉じることを保証するため、引用符を保存したい)、この瞬間まで眠り、起き、ターミナルに接続し、取引(何もしないという意味で)、ターミナルへの接続を終了して5分間眠り、この繰り返しになります。
プログラム操作。