В конце каждого рабочего дня я автоматически закрываю свои открытые позиции. Я снова использую Cron, чтобы запланировать запуск скрипта bash каждый будний вечер. Скрипт bash запускает скрипт python для закрытия всех открытых позиций.
Строка в крон. Это означает запуск в одну минуту после 22:00 каждый будний день.
1 22 * * 1-5 bash /Users/user name/Test/script2.sh
Содержимое script2.sh
#!/bin/sh python Test/04_Close_all_positions.py
Содержимое файла 04_Close_all_positions.py. Этот скрипт:
- Вход в систему (снова!),
- Получает идентификаторы всех сделок с открытыми позициями (которые могут быть позициями на покупку или продажу)
- Перебирает каждый идентификатор сделки, закрывая их, выполняя действие, противоположное их открытию. Например, если она была открыта с помощью позиции на покупку, она закрывается с помощью действия на продажу, и наоборот.
- Поскольку он использует цикл while, он не перейдет к следующему идентификатору сделки, пока текущая сделка не будет успешно закрыта.
import requests import json import pandas as pd import json import numpy as np from datetime import date, datetime, timedelta # --------------------------------------------------------------- def log_in(): IG_Demo_API_key = 'api key' url = 'https://demo-api.ig.com/gateway/deal' s = requests.Session() s.headers = { 'Content-Type' : 'application/json; charset=UTF-8', 'Accept' : 'application/json; charset=UTF-8', 'VERSION' : '2', 'X-IG-API-KEY' : IG_Demo_API_key} data = { 'identifier' : "user name",'password' : "password"} # first load and create your session r = s.post(url + '/session', json=data) s.headers.update({'X-SECURITY-TOKEN': r.headers['X-SECURITY-TOKEN'],'CST': r.headers['CST']}) return(r, s) #log in r_login , s = log_in() # -------------------------------------------------------- def get_open_positions(s): url = 'https://demo-api.ig.com/gateway/deal/positions' s.headers.update({'VERSION': '2'}) r = s.get(url) r = json.loads(r.text) r_df = pd.json_normalize(r['positions']) return(r_df) open_positions_df = get_open_positions(s) #print(open_positions_df) # ------------------------------------------------------------- def close_positions(s, dealID, orig_direction, size ): s.headers.update({'VERSION': '1', "_method" :"DELETE"}) url = 'https://demo-api.ig.com/gateway/deal/positions/otc' #print(dealID) if orig_direction == 'BUY': direction = 'SELL' else: direction = 'BUY' data = { "dealId":dealID, #"epic": null, "expiry":'DFB', "direction": direction, "size": size, #"level": 'null', "orderType": 'MARKET', "timeInForce": 'FILL_OR_KILL' #"quoteID":'null' } r = s.post(url, json = data) return(r) for index, row in open_positions_df.iterrows(): dealID = str(row['position.dealId']) orig_direction = str(row['position.direction']) size = str(int(row['position.size'])) status_code = 400 while status_code != 200: r_close_positions = close_positions(s, dealID, orig_direction, size) status_code = r_close_positions.status_code #print(r_close_positions.status_code)