MetaTrader 5 Python Kullanıcı Grubu - Metatrader'da Python nasıl kullanılır - sayfa 60

 
Sürüm 5.0.30 yayınlandı
 
MetaQuotes :
Sürüm 5.0.30 yayınlandı

Teşekkür ederim!

 
MetaTrader 5 Python User Group - the summary
MetaTrader 5 Python User Group - the summary
  • 2020.03.30
  • www.mql5.com
The Main Study MetaTrader Python online documentation Python Releases for Windows - website MetaTrader5 : Python Package - website...
 
Sürüm 5.0.31 yayınlandı
 
MetaQuotes :
Sürüm 5.0.31 yayınlandı
Önemli değişiklikler var mı?
 
MetaTrader 5 Python User Group - the summary
MetaTrader 5 Python User Group - the summary
  • 2020.04.02
  • www.mql5.com
The Main Study MetaTrader Python online documentation Python Releases for Windows - website MetaTrader5 : Python Package - website...
 
Kiran Sawant :
Ö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

MetaTrader 5 Python User Group - the summary
MetaTrader 5 Python User Group - the summary
  • 2020.03.30
  • www.mql5.com
The Main Study MetaTrader Python online documentation Python Releases for Windows - website MetaTrader5 : Python Package - website...
 
pymt5adapter
pymt5adapter
  • 2020.04.02
  • pypi.org
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...
 
Dmitry Prokopyev :

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

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.0 else Order.as_sell()
            order(volume=abs(volume), symbol=symbol.name)
             for _ in range( 5 ):
                symbol.refresh_rates()
                price = symbol.ask if volume > 0.0 else symbol.bid
                res = order(price=price).send()
                 if res.retcode == mt5.TRADE_RETCODE_DONE:
                    result_positions.append(result_to_dict(res))
                     break
     return 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()

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.

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
 

Yükleme başarısız

----- Установка "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" . -----

Win10, Py3.6.10 ve WinPy3.7.7.