В конце каждого рабочего дня я автоматически закрываю свои открытые позиции. Я снова использую 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)