MetaTrader 5 Python User Group - メタトレーダーでPythonを使用する方法 - ページ 51

 
MetaQuotes:

Python ライブラリの新しいビルド 5.0.25 がリリースされました。

経由で更新してください。

皆さん、こんなオブジェクトの追加をお願いできませんか。

TradePosition(ticket=55970661, time=1583523524, time_msc=1583523524484, time_update=1583523524, time_update_msc=1583523524484, 
type=1, magic=0, identifier=55970661, reason=0, volume=0.04, price_open=1.13022, sl=0.0, tp=0.0, price_current=1.13179, swap=0.0, 
profit=-6.28, symbol='EURUSD', comment='', external_id='55970661')

pls または __dict__ または as_dict() を追加する。

Pythonでは、標準的な構造、同じdict/listで操作する方がずっと便利です。

('__add__', <method-wrapper '__add__' of TradePosition object at 0x085A1808>)
('__class__', <class 'TradePosition'>)
('__contains__', <method-wrapper '__contains__' of TradePosition object at 0x085A1808>)
....
....
....
('symbol', 'EURUSD')
('ticket', 55970661)
('time', 1583523524)
('time_msc', 1583523524484)
('time_update', 1583523524)
('time_update_msc', 1583523524484)
('tp', 0.0)
('type', 1)
('volume', 0.04)

このクラスからディクトを引き出して(他の似たようなものも)作業するのはいいことだと思う。

 

initialize()についての質問、あります。

initialize(
   path                      // path to the MetaTrader 5 terminal EXE file
   timeout=TIMEOUT,          // timeout
   login=LOGIN,              // account number
   password="PASSWORD",      // password
   server="SERVER"           // server name as it is specified in the terminal
   )

を実行する2つの端末へのパスパスでそれぞれ、/portable

'c:\Works\MT5 - terminals\MetaTrader 5\terminal64.exe'

и 

'c:\Works\MT5 - terminals\Alpari MT5\terminal64.exe'

が、すべての初期化 コールは最後に実行された端末のインスタンスに送られます。

それぞれMTビルド2360とMetaTrader5-5.0.26-cp38-cp38-win32.whlです。

どうしたんですか?のパスが他のロジックで使用されるべきなのか、それとも何か他のものが /portable に渡されるべきなのか?

 

実際のコードを表示してください。

パスのパラメータはまだ受け付けていません。

 
Renat Fatkhullin:

実際のコードを表示してください。

パスのパラメータはまだ受け付けていません。

以下はそのコードです。

import MetaTrader5 as mt5

def check_order ():
    if mt5.initialize(path='c:\Works\MT5 - terminals\MetaTrader 5\terminal64.exe', 
                            login=25153683, server='MetaQuotes-Demo', password=''):
                print("mt5.version(): ", mt5.version())
                print("mt5.terminal_info()", mt5.terminal_info())
                print("mt5.account_info()", mt5.account_info())
                symbol="GBPUSD"
                if mt5.symbol_select(symbol,True):
                    info = mt5.symbol_info(symbol)
                    point=mt5.symbol_info(symbol).point
                    request = {
                        "action": mt5.TRADE_ACTION_DEAL,
                        "symbol": symbol,
                        "volume": 0.01,
                        "type": mt5.ORDER_TYPE_BUY,
                        "price": mt5.symbol_info_tick(symbol).ask,
                        "sl": mt5.symbol_info_tick(symbol).ask-100*point,
                        "tp": mt5.symbol_info_tick(symbol).ask+100*point,
                        "deviation": 10,
                        "magic": 234000,
                        "comment": "python script",
                    }
 
                    result = mt5.order_check(request)
                    print(result)
		 mt5.shutdown()


    if mt5.initialize(path='c:\Works\MT5 - terminals\Alpari MT5\terminal64.exe', 
                            login=50518455, server='Alpari-MT5-Demo', password=''):
                print("mt5.version(): ", mt5.version())
                print("mt5.terminal_info()", mt5.terminal_info())
                print("mt5.account_info()", mt5.account_info())
                symbol="GBPUSD"
                if mt5.symbol_select(symbol,True):
                    info = mt5.symbol_info(symbol)
                    point=mt5.symbol_info(symbol).point
                    request = {
                        "action": mt5.TRADE_ACTION_DEAL,
                        "symbol": symbol,
                        "volume": 0.01,
                        "type": mt5.ORDER_TYPE_BUY,
                        "price": mt5.symbol_info_tick(symbol).ask,
                        "sl": mt5.symbol_info_tick(symbol).ask-100*point,
                        "tp": mt5.symbol_info_tick(symbol).ask+100*point,
                        "deviation": 10,
                        "magic": 234000,
                        "comment": "python script",
                    }
 
                    result = mt5.order_check(request)
                    print(result)
		 mt5.shutdown()


if __name__ == "__main__":
    check_order()

最後に起動した端末です。

"c:\Works\MT5 - terminals\ForexClub MT5\terminal64.exe" 

スクリーンショットから判断すると、最後に起動しているものに電話がかかってきたようです。

アクセスされた具体的なものを呼び出したいと思います。

 
Renat Fatkhullin:

トラック内のパラメータはまだ受け付けていません。

うーん ...値があってもパラメータがない、この点がよくわからないのですが、ここで接続パラメータをコンフィグから取り出しています。

            if mt5.initialize(path=acc['path'], login=acc['login'], server=acc['server'], password=acc['pass']):
                print("mt5.version(): ", mt5.version())
                print("mt5.terminal_info()", mt5.terminal_info())
                print("mt5.account_info()", mt5.account_info())
 
Дмитрий Прокопьев:

initialize()についての質問、あります。

を実行する2つの端末へのパスパスでそれぞれ、/portable

が、すべての初期化 コールは最後に実行された端末のインスタンスに送られます。

それぞれMTビルド2360とMetaTrader5-5.0.26-cp38-cp38-win32.whlです。

どうしたんですか?のパスが他のロジックで使用されるべきなのか、それとも何か他のものが /portable に渡されるべきなのか?

1つのスクリプトで2つの端末を同時に動作させたいのですか?それは不可能です。次の初期化コールで最初の端末との接続が切断されます。そのためには、異なる端末を区別するために接続エンティティを入力する必要があります。現在の接続が1つの場合のみ動作します。

initializeにはもう一つパラメータがあります(まだ文書化されていません)mt5.initialize(blabla, portable=True) はポータブルモードで端末を ハード的に起動させます。

 
Almaz:

1つのスクリプトで2つの端末を同時に操作したいですか?これは不可能です。次の初期化コールで最初の端末との接続が切断されるので、異なる端末を区別するために接続実体を入力する必要があります。現在の接続が1つの場合のみ動作します。

initializeにはもう一つパラメータがあります(まだ文書化されていません)mt5.initialize(blabla, portable=True) でポータブルモードで端末を 起動します。

はい、ポータブル モードで動作する複数の端末で作業する必要があります。異なる2つの端末で同時に接続を初期化することはできません。ここに質問はありません。

端末を1つ1つアドレス指定するようにしました。

if mt5.initialize(login=11111, path='/works/MT5-1'...):
        ...   
        mt5.shutdown()
else:
   print('error')

if mt5.initialize(login=2222, path='/works/MT5-2'...):
        ...   
        mt5.shutdown()
else:
   print('error')

この方式では、うまくいきません。すべての場合において、システム内で手動で起動した最後の端末にクラッシュします。から始まったとしても

path='/works/MT5-3'
mt5.initialize(blabla, portable=True)- あまり役に立ちませんでした、システムで最後に起動した ターミナルをプロンプトするままです。
 

ここに疑問がある。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

MetaTrader 5 Python User Group - 概要

nikoli shen, 2020.03.07 15:46

Pythonに付属するpip版を使用してMetaTrader 5のパッケージをダウンロードする際に問題があります。回避策としては、pipを更新することです。Windows で pip を更新するコマンド:
python -m pip install -U pip

を使用するか、またはvenvで

(inside virtualenv):easy_install -U pip

 
Almaz:

1つのスクリプトで2つの端末を同時に操作したいですか?これは不可能です。次の初期化コールで最初の端末との接続が切断されるので、異なる端末を区別するために接続実体を入力する必要があります。現在の接続が1つの場合のみ動作します。

initializeにはもう一つパラメータがあります(まだ文書化されていません)mt5.initialize(blabla, portable=True) はポータブルモードで端末を ハード的に起動させます。

なお、mt5.terminal_info()には

mt5.version():  [500, 2360, '06 Mar 2020']
mt5.terminal_info() TerminalInfo(community_account=False, community_connection=False, connected=True, dlls_allowed=False, trade_allowed=True, 
tradeapi_disabled=False, email_enabled=False, ftp_enabled=False, notifications_enabled=False, mqid=False, build=2360, maxbars=100000000, codepage=0, ping_last=42381,
community_balance=0.0, retransmission=7.976601967561818, company='MetaQuotes Software Corp.', name='MetaTrader 5', language='English', 
path='C:\\Works\\MT5 - terminals\\MetaTrader 5', data_path='C:\\Works\\MT5 - terminals\\MetaTrader 5', commondata_path='C:\\Users\\rip\\AppData\\Roaming\\MetaQuotes\\Terminal\\Common')
mt5.version():  [500, 2360, '06 Mar 2020']
mt5.terminal_info() TerminalInfo(community_account=False, community_connection=False, connected=True, dlls_allowed=False, trade_allowed=True, 
tradeapi_disabled=False, email_enabled=False, ftp_enabled=False, notifications_enabled=False, mqid=False, build=2360, maxbars=100000000, codepage=0, ping_last=40849,
community_balance=0.0, retransmission=7.976601967561818, company='MetaQuotes Software Corp.', name='MetaTrader 5', language='English', 
path='C:\\Works\\MT5 - terminals\\MetaTrader 5', data_path='C:\\Works\\MT5 - terminals\\MetaTrader 5', commondata_path='C:\\Users\\rip\\AppData\\Roaming\\MetaQuotes\\Terminal\\Common')

path='C:\WorksGuide- terminals

は同一である。こんなんでいいのか?

そのコードは以下の通りです。

import MetaTrader5 as mt5

def check_order ():
    if mt5.initialize(path='c:\\Works\\MT5 - terminals\\MetaTrader 5\\terminal64.exe', 
                            login=25153683, server='MetaQuotes-Demo', password='',  portable=True):
        print("mt5.version(): ", mt5.version())
        print("mt5.terminal_info()", mt5.terminal_info())
        mt5.shutdown()

    if mt5.initialize(path='c:\\Works\\MT5 - terminals\\Alpari MT5\\terminal64.exe', 
                            login=50518455, server='Alpari-MT5-Demo', password='',  portable=True):
        print("mt5.version(): ", mt5.version())
        print("mt5.terminal_info()", mt5.terminal_info())
        mt5.shutdown()

if __name__ == "__main__":
    check_order()
 
Almaz:

1つのスクリプトで2つの端末を同時に操作したいですか?これは不可能です。次の初期化コールで最初の端末との接続が切断 されるので、異なる端末を区別するために接続実体を入力する必要があります。 現在の接続が1つの場合のみ動作します。


実体(コネクション)を作ることは原理的に可能なのでしょうか?そこまで必要とは思いませんが、今後の参考のために。

チャート上に別のスクリプト(Py)をインストールすると、最初のスクリプトはリセットされます。これがあるべき姿なのか?