Логика для эксперта по алгоритмической торговле в реальном времени

Я сделал торгового эксперта, который просматривает свечи, чтобы проверить, был ли найден сигнал, а затем выполнить ордера на покупку, продажу.

for i in range (len(df['Open'])) : 
  if some logic :
     buy or sell

Теперь я хочу, чтобы этот эксперт работал с данными в реальном времени, а не с историческими данными, и я изо всех сил пытаюсь понять, как это будет работать.

что я хочу сделать, это:

Ищите последние 30 баров, затем сделайте для них некоторые расчеты, затем перейдите в цикл, чтобы проверить последние 2 свечи, чтобы увидеть, был ли найден какой-либо сигнал. Я хочу, чтобы цикл работал каждые 4 часа, так как я работаю 4 часа. таймфрейм, поэтому с каждой новой свечой

Я пытаюсь использовать библиотеку MetaTrader5

copy_rates_from_pos(
       symbol,       // symbol name
       timeframe,    // timeframe
       start_pos,    // initial bar index
       count         // number of bars
       )

этот код помог бы мне найти последние 30 тактов, но все еще не могу понять, как сделать цикл for!


person mr.m    schedule 13.05.2020    source источник
comment
@DanielKniaz, спасибо за ваш комментарий. Итак, я поместил свою стратегию в цикл ставок? и после того, как я получу сигнал или нет, петля выйдет! , как я могу сделать этот запуск на неопределенный срок?   -  person mr.m    schedule 13.05.2020
comment
Я не знаю, в чем заключается ваша стратегия. возможно вам нужно получить сигнал в результате анализа (зацикливания) этих 30 баров. Получив сигнал - идите дальше с отправкой сделки. Может стоит начать с как можно более простой стратегии, если у вас есть такие вопросы :)   -  person Daniel Kniaz    schedule 13.05.2020
comment
@DanielKniaz еще раз спасибо за помощь, rates = mt5.copy_rates_from_pos("EURUSD",mt5.TIMEFRAME_D1, 0, 30) for rate in rates : if signal : buy or sell мой вопрос заключается в том, что после выхода из цикла (30 баров) мне нужно снова войти в цикл, как только сформируется новая свеча! я должен поместить весь приведенный выше код через какое-то время, чтобы сделать это ?!   -  person mr.m    schedule 13.05.2020
comment
я полагаю, он должен начинаться один раз за бар. поставить таймер или что-то в этом роде, или вызывать МТ5 каждую секунду   -  person Daniel Kniaz    schedule 14.05.2020


Ответы (1)


вы могли бы использовать что-то вроде этого

import pytz
import pandas as pd
import MetaTrader5 as mt5
import time
from datetime import datetime
from threading import Timer



server_name = "AMPGlobalUSA-Demo"
server_num = # your server num
password = # password



#------------------------------------------------------------------------------
def actualtime():
    # datetime object containing current date and time
    now = datetime.now()
    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
    #print("date and time =", dt_string)
    return str(dt_string)
#------------------------------------------------------------------------------
def sync_60sec(op):

    info_time_new = datetime.strptime(str(actualtime()), '%d/%m/%Y %H:%M:%S')
    waiting_time = 60 - info_time_new.second

    t = Timer(waiting_time, op)
    t.start()

    print(actualtime(), f'waiting till next minute and 00 sec...')
#------------------------------------------------------------------------------
def program(symbol):
    if not mt5.initialize(login=server_num, server=server_name, password=password):
        print("initialize() failed, error code =",mt5.last_error())
        quit()

    timezone = pytz.timezone("Etc/UTC")
    utc_from = datetime.now()

    ######### Change here the timeframe
    rates = mt5.copy_rates_from(symbol, mt5.TIMEFRAME_M1, utc_from, 70)

    mt5.shutdown()

    rates_frame = pd.DataFrame(rates)
    rates_frame['time']=pd.to_datetime(rates_frame['time'], unit='s')

    # If you want to work only with open, high, low, close you could use
    #rates_frame = rates_frame.drop(['tick_volume', 'real_volume'], axis=1)

    print(f"\n", actualtime(),f"|| waiting for signals {symbol} ||\n")

    if not mt5.initialize():
        print("initialize() failed, error code =",mt5.last_error())
        quit()

    point = mt5.symbol_info(symbol).point
    price = mt5.symbol_info_tick(symbol).ask

    request = {
                "action": mt5.TRADE_ACTION_PENDING,
                "symbol": symbol,
                "volume": 1.0,
                "type": mt5.ORDER_TYPE_BUY_LIMIT,
                "price": price,
                "sl": price + 40 * point,
                "tp": price - 80 * point,
                "deviation": 20,
                "magic": 234000,
                "comment": "st_1_min_mod_3",
                "type_time": mt5.ORDER_TIME_GTC,
                "type_filling": mt5.ORDER_FILLING_RETURN,
            }


    condition_buy_1 = (
        (rates_frame.close.iloc[-2] > rates_frame.open.iloc[-2])& 
        (rates_frame.close.iloc[-2] > rates_frame.close.iloc[-3])
    )

    if condition_buy_1:
        #result = mt5.order_send(request)
        print('Sending Order!')


# Im using AMPGlobalUSA-Demo Server
# starting mt5
if not mt5.initialize(login=server_num, server=server_name, password=password):
    print("initialize() failed, error code =",mt5.last_error())
    quit()          
#------------------------------------------------------------------------------
#                   S T A R T I N G   M T 5 
#------------------------------------------------------------------------------
authorized=mt5.login(server_num, password=password)
if authorized:
    account_info=mt5.account_info()
    if account_info!=None:       
        account_info_dict = mt5.account_info()._asdict()
        df=pd.DataFrame(list(account_info_dict.items()),columns=['property','value'])
        print("account_info() as dataframe:")
        print(df)
else:
    print(f"failed to connect to trade account {server_num} with password={password}, error code =",mt5.last_error())

mt5.shutdown()
#------------------------------------------------------------------------------
def trading_bot():
    symbol_1 = 'EURUSD'
    symbol_2 = 'EURCAD'
    while True:
        program(symbol_1)
        program(symbol_2)
        time.sleep(59.8) # it depends on your computer and ping

sync_60sec(trading_bot)

Здесь у вас есть основы того, как подключиться и работать с Python и MT5. Вы можете сохранить его как файл py. И у вас есть первый скрипт, который ищет сигналы на 1-минутном графике для вашего символа. У вас может быть два разных скрипта для поиска сигналов на 5- и 15-минутных графиках (program_5min.py и program_15min.py). Затем вы должны добавить новую функцию синхронизации. Например, за 5 минут надо ждать один час и 0,5,10,15 минут и так один.

Надеюсь, это сработает для вас, получайте удовольствие!

person Hugo Martin    schedule 22.05.2020