[Python] pyetrade problem with placing buy orders (any maybe sell orders)

Discussão em 'Python' iniciado por Stack, Abril 30, 2025.

  1. Stack

    Stack Membro Participativo

    When I try to set orders, I get this error:

    Failed to place BUY order for JAN, status code:
    400, response: {"Error":{"code":101,"message":"For your protection, we have timed out your original order request. If you would like to place this order, please resubmit it now."}}


    E*TRADE Documentation: https://apisb.etrade.com/docs/api/order/api-order-v1.html#/definition/orderPlace

    In my code I even have it so that it retries the same order 3 times beacuse I thought that would fix it, but its not working.

    this is obviously called properly, and when its called, it should be placing a buy (or sell) order, but currently every time it tries, it throws back that error I provided earlier.

    here is my code:

    def preview_order(etrade, session, ticker, quantity, limit_price, order_action):
    preview_url = etrade.base_url + "/v1/accounts/" + ETRADE_ACCOUNT_KEY + "/orders/preview.json"
    client_order_id = random.randint(1000000000, 9999999999)

    limit_price_rounded = "{:.2f}".format(limit_price)

    root = ET.Element("PreviewOrderRequest")
    ET.SubElement(root, "orderType").text = "EQ"
    ET.SubElement(root, "clientOrderId").text = str(client_order_id)
    order = ET.SubElement(root, "Order")
    ET.SubElement(order, "allOrNone").text = "false"
    ET.SubElement(order, "priceType").text = "LIMIT"
    ET.SubElement(order, "orderTerm").text = "GOOD_FOR_DAY"
    ET.SubElement(order, "marketSession").text = "REGULAR"
    ET.SubElement(order, "limitPrice").text = limit_price_rounded
    instrument = ET.SubElement(order, "Instrument")
    product = ET.SubElement(instrument, "Product")
    ET.SubElement(product, "securityType").text = "EQ"
    ET.SubElement(product, "symbol").text = ticker
    ET.SubElement(instrument, "orderAction").text = order_action.upper()
    ET.SubElement(instrument, "quantityType").text = "QUANTITY"
    ET.SubElement(instrument, "quantity").text = str(quantity)

    payload = ET.tostring(root, encoding='unicode')
    headers = {"Content-Type": "application/xml"}

    response = session.post(preview_url, header_auth=True, headers=headers, data=payload)

    if response.status_code == 200:
    response_data = response.json()
    if "PreviewOrderResponse" in response_data and "PreviewIds" in response_data["PreviewOrderResponse"]:
    preview_id = response_data["PreviewOrderResponse"]["PreviewIds"][0]["previewId"]
    return preview_id
    else:
    print("Preview order response is not as expected.")
    return None
    else:
    print(f"Failed to preview order, status code: {response.status_code}, response: {response.text}")
    return None

    def place_order(etrade, session, ticker, quantity, limit_price, order_action, max_attempts=3):
    attempt = 1
    while attempt <= max_attempts:
    preview_id = preview_order(etrade, session, ticker, quantity, limit_price, order_action)
    if not preview_id:
    print("Failed to preview the order.")
    if attempt == max_attempts:
    return None
    else:
    print(f"Retrying preview order... Attempt {attempt} of {max_attempts}")
    attempt += 1
    continue

    order_url = etrade.base_url + "/v1/accounts/" + ETRADE_ACCOUNT_KEY + "/orders/place.json"
    limit_price_rounded = "{:.2f}".format(limit_price)
    client_order_id = random.randint(1000000000, 9999999999)

    root = ET.Element("PlaceOrderRequest")
    ET.SubElement(root, "orderType").text = "EQ"
    ET.SubElement(root, "clientOrderId").text = str(client_order_id)
    ET.SubElement(root, "PreviewId").text = str(preview_id)
    order = ET.SubElement(root, "Order")
    ET.SubElement(order, "allOrNone").text = "false"
    ET.SubElement(order, "priceType").text = "LIMIT"
    ET.SubElement(order, "orderTerm").text = "GOOD_FOR_DAY"
    ET.SubElement(order, "marketSession").text = "REGULAR"
    ET.SubElement(order, "limitPrice").text = limit_price_rounded
    instrument = ET.SubElement(order, "Instrument")
    product = ET.SubElement(instrument, "Product")
    ET.SubElement(product, "securityType").text = "EQ"
    ET.SubElement(product, "symbol").text = ticker
    ET.SubElement(instrument, "orderAction").text = order_action.upper()
    ET.SubElement(instrument, "quantityType").text = "QUANTITY"
    ET.SubElement(instrument, "quantity").text = str(quantity)

    payload = ET.tostring(root, encoding='unicode')
    headers = {"Content-Type": "application/xml"}
    response = session.post(order_url, header_auth=True, headers=headers, data=payload)

    if response.status_code == 201:
    response_data = response.json()
    if "OrderResponse" in response_data and "orderId" in response_data["OrderResponse"]:
    order_id = response_data["OrderResponse"]["orderId"]
    print(f"{order_action} order placed for {quantity} of {ticker} at {limit_price_rounded}, Order ID: {order_id}")
    return order_id
    else:
    print(f"Failed to place {order_action} order for {ticker}, status code: {response.status_code}, response: {response.text}")

    if response.status_code == 400 and "timed out" in response.text:
    print("Resubmitting order due to timeout...")
    attempt += 1
    else:
    return None

    return None


    please if you can figure out why I keep getting a "for your protection" error and why even when I re submit the order it still errors with the same error

    here is some minimal working code (I think) that should work if you have the right keys

    import xml.etree.ElementTree as ET
    import random
    from rauth import OAuth1Service
    import webbrowser

    CONSUMER_KEY = 'CONSUMER_KEY'
    CONSUMER_SECRET = 'CONSUMER_SECRET'
    ETRADE_ACCOUNT_KEY = 'ACCOUNT_KEY'

    def initialize_etrade_oauth():
    etrade = OAuth1Service(
    name="etrade",
    consumer_key=CONSUMER_KEY,
    consumer_secret=CONSUMER_SECRET,
    request_token_url="https://api.etrade.com/oauth/request_token",
    access_token_url="https://api.etrade.com/oauth/access_token",
    authorize_url="https://us.etrade.com/e/t/etws/authorize?key={}&token={}",
    base_url="https://api.etrade.com"
    )
    return etrade

    def place_order(etrade, session, ticker, quantity, limit_price):
    order_url = etrade.base_url + "/v1/accounts/" + ETRADE_ACCOUNT_KEY + "/orders/place.json"
    client_order_id = random.randint(1000000000, 9999999999)

    root = ET.Element("PlaceOrderRequest")
    ET.SubElement(root, "orderType").text = "EQ"
    ET.SubElement(root, "clientOrderId").text = str(client_order_id)
    order = ET.SubElement(root, "Order")
    ET.SubElement(order, "allOrNone").text = "false"
    ET.SubElement(order, "priceType").text = "LIMIT"
    ET.SubElement(order, "orderTerm").text = "GOOD_FOR_DAY"
    ET.SubElement(order, "marketSession").text = "REGULAR"
    ET.SubElement(order, "limitPrice").text = str(limit_price)
    instrument = ET.SubElement(order, "Instrument")
    product = ET.SubElement(instrument, "Product")
    ET.SubElement(product, "securityType").text = "EQ"
    ET.SubElement(product, "symbol").text = ticker
    ET.SubElement(instrument, "orderAction").text = "BUY"
    ET.SubElement(instrument, "quantityType").text = "QUANTITY"
    ET.SubElement(instrument, "quantity").text = str(quantity)

    payload = ET.tostring(root, encoding='unicode')
    headers = {"Content-Type": "application/xml"}

    response = session.post(order_url, header_auth=True, headers=headers, data=payload)

    if response.status_code == 201:
    print(f"Buy order placed for {quantity} shares of {ticker} at limit price {limit_price}")
    else:
    print(f"Failed to place order: {response.text}")

    def preview_order(etrade, session, ticker, quantity, limit_price, order_action):
    preview_url = etrade.base_url + "/v1/accounts/" + ETRADE_ACCOUNT_KEY + "/orders/preview.json"
    client_order_id = random.randint(1000000000, 9999999999)

    root = ET.Element("PreviewOrderRequest")
    ET.SubElement(root, "orderType").text = "EQ"
    ET.SubElement(root, "clientOrderId").text = str(client_order_id)
    order = ET.SubElement(root, "Order")
    ET.SubElement(order, "allOrNone").text = "false"
    ET.SubElement(order, "priceType").text = "LIMIT"
    ET.SubElement(order, "orderTerm").text = "GOOD_FOR_DAY"
    ET.SubElement(order, "marketSession").text = "REGULAR"
    ET.SubElement(order, "limitPrice").text = str(limit_price)
    instrument = ET.SubElement(order, "Instrument")
    product = ET.SubElement(instrument, "Product")
    ET.SubElement(product, "securityType").text = "EQ"
    ET.SubElement(product, "symbol").text = ticker
    ET.SubElement(instrument, "orderAction").text = order_action.upper()
    ET.SubElement(instrument, "quantityType").text = "QUANTITY"
    ET.SubElement(instrument, "quantity").text = str(quantity)

    payload = ET.tostring(root, encoding='unicode')
    headers = {"Content-Type": "application/xml"}

    response = session.post(preview_url, header_auth=True, headers=headers, data=payload)

    if response.status_code == 200:
    response_data = response.json()
    if "PreviewOrderResponse" in response_data and "PreviewIds" in response_data["PreviewOrderResponse"]:
    preview_id = response_data["PreviewOrderResponse"]["PreviewIds"][0]["previewId"]
    return preview_id
    else:
    print(f"Failed to preview order, status code: {response.status_code}, response: {response.text}")
    return None

    def main():
    etrade = initialize_etrade_oauth()

    request_token, request_token_secret = etrade.get_request_token(
    params={"oauth_callback": "oob", "format": "json"})

    authorize_url = etrade.authorize_url.format(etrade.consumer_key, request_token)
    print("Please authorize the application by visiting this URL: ", authorize_url)
    webbrowser.open(authorize_url)

    verifier_code = input("Enter the verification code from the browser: ")

    session = etrade.get_auth_session(request_token, request_token_secret,
    params={"oauth_verifier": verifier_code})

    ticker = "PLTR"
    quantity = 10
    limit_price = 17

    preview_id = preview_order(etrade, session, ticker, quantity, limit_price, "BUY")
    if preview_id is None:
    print("Failed to preview the order.")
    return

    place_order(etrade, session, ticker, quantity, limit_price, "BUY", preview_id)

    if __name__ == "__main__":
    main()

    Continue reading...

Compartilhe esta Página