is a wrapper and drop-in replacement for the python package by MetaQuotes. The API functions return the same values from the functions, but adds the following functionality: Typing hinting has been added to all functions and return objects for linting and IDE integration. Intellisense will now work now matter how nested the objects are...
position_get - TradePosition listesi bana iade edilecek. Prensip olarak, pandaları fırlatabilir ve iyi çalışabilirsiniz.
Ancak her şey bir panda ile sınırlı değildir ve aşağıdaki gibi bir şeye ihtiyacınız varsa:
bir şekilde beste yapmalısınız, pandalar ya da ... bir şekilde fazladan vücut hareketleri için.
_asdict() ile çok daha kullanışlı hale geldi, eğer yazan kişi bir MQL5 prog değil, diyelim ki bir pitonist ... veya bir datasynetist ise, o zaman list / dict
Python'un temel öğeleri, birçoğunun liste/dikt üzerine bir veri aktarımı oluşturmasıdır.
Tuple'lar çok sık ve çok kullanılır, ancak yalnızca içinde hareket eden veri türlerini sıkı bir şekilde kontrol etmeniz gerekiyorsa.
ve ayrıca düzgün kullanılmamış veya atanmamışsa bir hata işleyicisi asın. Eh, bir yerde ... :) Yanılıyor olabilirim.
Tamam, şimdi bu düşünceye tamamen katılıyorum ve ayrıca verileri sözlükler yerine adlandırılmış kümeler olarak döndürmenin bir API için çok fazla düşünüldüğünü düşünüyorum. Son zamanlarda bu tasarımla ilgili sorunlar yaşadım çünkü adlandırılmış kümeleri toplamak imkansız. Aşağıdaki eşzamanlı ticari fotokopi komut dosyasını göz önünde bulundurun. ProcessPoolExectutor'u kullanmak için tüm adlandırılmış grupları sözlüklere dönüştürmenin ne kadar zor olduğuna dikkat edin?
trade_copier.py
import json
import time
from concurrent.futures.process import ProcessPoolExecutor
from typing import List
import pymt5adapter as mt5
from pymt5adapter.order import Order
from pymt5adapter.symbol import Symbol
def result_to_dict(result):
res = result._asdict()
res[ 'request' ] = res[ 'request' ]._asdict()
return res
def p2d(positions):
return [p._asdict() for p in positions]
def get_position_map(positions: List[dict]):
position_map = {}
for p in positions:
position_map.setdefault(p[ 'symbol' ], {}).setdefault( 'positions' , []).append(p)
v = -p[ 'volume' ] if p[ 'type' ] else p[ 'volume' ]
inner = position_map[p[ 'symbol' ]]
inner[ 'net_volume' ] = inner. get ( 'net_volume' , 0.0 ) + v
return position_map
def match_positions(terminal, positions):
result_positions = []
incoming = get_position_map(positions)
with mt5.connected(**terminal):
my_pos_map = get_position_map(p2d(mt5.positions_get()))
for symbol, d in incoming.items():
if symbol not in my_pos_map:
volume = d[ 'net_volume' ]
else :
volume = d[ 'net_volume' ] - my_pos_map[symbol][ 'net_volume' ]
if volume == 0.0 :
continue
symbol = Symbol(symbol)
order = Order.as_buy() if volume > 0.0else Order.as_sell()
order(volume=abs(volume), symbol=symbol.name)
for _ in range( 5 ):
symbol.refresh_rates()
price = symbol.ask if volume > 0.0else symbol.bid
res = order(price=price).send()
if res.retcode == mt5.TRADE_RETCODE_DONE:
result_positions.append(result_to_dict(res))
breakreturn result_positions
def main():
with open( 'terminal_config.json' ) as f:
terminals = json.load(f)
master = terminals[ 'master' ]
slaves = terminals[ 'slaves' ]
with mt5.connected(**master), ProcessPoolExecutor() as pool:
while True:
positions = [p2d(mt5.positions_get())] * len(slaves)
results = list(pool.map(match_positions, slaves, positions))
for result in results:
for sub in result:
if sub:
print(sub)
time.sleep( 0.01 )
if __name__ == "__main__" :
main()
OrderSendResult.request örneğinde olduğu gibi, nametuple'ın içine yerleştirilmiş adlandırılmış kümeler olduğunda bu özellikle zordur. Bu nedenle, onları tekrar seçilebilen veri türlerine dönüştürmek için benzersiz dönüştürme işlevleri oluşturmanız gerekir. Her şeyi yerel veri türlerine dönüştürmek için özyinelemeli bir işlev aracılığıyla çalıştırabilirsiniz, ancak bu hesaplama açısından pahalıdır.
def as_dict(data: Any):
try :
return as_dict(data._asdict())
except AttributeError:
T = type(data)
if T is list or T is tuple:
return T(as_dict(i) for i in data)
if T is dict:
return {k: as_dict(v) for k, v in data.items()}
return data
----- Установка "pymt5adapter" -----
ERROR: Could not find a version that satisfies the requirement pymt5adapter ( from versions: none)
ERROR: No matching distribution found for pymt5adapter
----- Не удалось установить "pymt5adapter" . -----
----- Установка "pymt5adapter==0.1.11" -----
ERROR: Could not find a version that satisfies the requirement pymt5adapter== 0.1 . 11 ( from versions: none)
ERROR: No matching distribution found for pymt5adapter== 0.1 . 11
----- Не удалось установить "pymt5adapter==0.1.11" . -----
----- Установка "pymt5adapter" -----
ERROR: Could not find a version that satisfies the requirement pymt5adapter ( from versions: none)
ERROR: No matching distribution found for pymt5adapter
----- Не удалось установить "pymt5adapter" . -----
MQL5.com web sitesine giriş yapmak için çerezlerin kullanımına izin vermelisiniz.
Lütfen tarayıcınızda gerekli ayarı etkinleştirin, aksi takdirde giriş yapamazsınız.
Hesabınıza giriş yaptınız. İki faktörlü kimlik doğrulama devre dışı bırakıldı. Yeniden kurup yeni bir QR kodu tarayın veya iki faktörlü kimlik doğrulama devre dışıyken devam edin.
Sürüm 5.0.30 yayınlandı
Teşekkür ederim!
Sürüm 5.0.31 yayınlandı
Önemli değişiklikler var mı?
Hayır, yalnızca https://www.mql5.com/en/forum/306742/page13#comment_15699363 için bazı düzeltmeler
https://pypi.org/project/pymt5adapter/
https://github.com/nicholishen/pymt5adapter
Teşekkürler, bu örneği gördüm, işe yarıyor.
Ben biraz başka bir şey hakkındayım.
position_get - TradePosition listesi bana iade edilecek. Prensip olarak, pandaları fırlatabilir ve iyi çalışabilirsiniz.
Ancak her şey bir panda ile sınırlı değildir ve aşağıdaki gibi bir şeye ihtiyacınız varsa:
bir şekilde beste yapmalısınız, pandalar ya da ... bir şekilde fazladan vücut hareketleri için.
_asdict() ile çok daha kullanışlı hale geldi, eğer yazan kişi bir MQL5 prog değil, diyelim ki bir pitonist ... veya bir datasynetist ise, o zaman list / dict
Python'un temel öğeleri, birçoğunun liste/dikt üzerine bir veri aktarımı oluşturmasıdır.
Tuple'lar çok sık ve çok kullanılır, ancak yalnızca içinde hareket eden veri türlerini sıkı bir şekilde kontrol etmeniz gerekiyorsa.
ve ayrıca düzgün kullanılmamış veya atanmamışsa bir hata işleyicisi asın. Eh, bir yerde ... :) Yanılıyor olabilirim.
Tamam, şimdi bu düşünceye tamamen katılıyorum ve ayrıca verileri sözlükler yerine adlandırılmış kümeler olarak döndürmenin bir API için çok fazla düşünüldüğünü düşünüyorum. Son zamanlarda bu tasarımla ilgili sorunlar yaşadım çünkü adlandırılmış kümeleri toplamak imkansız. Aşağıdaki eşzamanlı ticari fotokopi komut dosyasını göz önünde bulundurun. ProcessPoolExectutor'u kullanmak için tüm adlandırılmış grupları sözlüklere dönüştürmenin ne kadar zor olduğuna dikkat edin?
trade_copier.py
terminal_config.json
{ "master" : { "path" : "C:\\Users\\nicho\\Desktop\\terminal1\\terminal64.exe" , "portable" : true }, "slaves" : [ { "path" : "C:\\Users\\nicho\\Desktop\\terminal2\\terminal64.exe" , "portable" : true },{ "path" : "C:\\Users\\nicho\\Desktop\\terminal3\\terminal64.exe" , "portable" : true } ] }OrderSendResult.request örneğinde olduğu gibi, nametuple'ın içine yerleştirilmiş adlandırılmış kümeler olduğunda bu özellikle zordur. Bu nedenle, onları tekrar seçilebilen veri türlerine dönüştürmek için benzersiz dönüştürme işlevleri oluşturmanız gerekir. Her şeyi yerel veri türlerine dönüştürmek için özyinelemeli bir işlev aracılığıyla çalıştırabilirsiniz, ancak bu hesaplama açısından pahalıdır.
https://pypi.org/project/pymt5adapter/
https://github.com/nicholishen/pymt5adapter
Yükleme başarısız
Win10, Py3.6.10 ve WinPy3.7.7.