500 lines
16 KiB
Plaintext
500 lines
16 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "4a6ab9a2-28a2-445d-8512-a0dc8d1b54e9",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Trading Code Generator\n",
|
|
"\n",
|
|
"A code generator that writes trading code to buy and sell equities in a simulated environment, based on a given API\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "e610bf56-a46e-4aff-8de1-ab49d62b1ad3",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "python"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# imports\n",
|
|
"\n",
|
|
"import os\n",
|
|
"import sys\n",
|
|
"import io\n",
|
|
"from dotenv import load_dotenv\n",
|
|
"from openai import OpenAI\n",
|
|
"from google import genai\n",
|
|
"from google.genai import types\n",
|
|
"import anthropic\n",
|
|
"import ollama\n",
|
|
"import gradio as gr\n",
|
|
"import requests\n",
|
|
"from typing import Any"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "4f672e1c-87e9-4865-b760-370fa605e614",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "python"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# environment\n",
|
|
"\n",
|
|
"load_dotenv(override=True)\n",
|
|
"os.environ['OPENAI_API_KEY'] = os.getenv('OPENAI_API_KEY', 'your-key-if-not-using-env')\n",
|
|
"os.environ['ANTHROPIC_API_KEY'] = os.getenv('ANTHROPIC_API_KEY', 'your-key-if-not-using-env')\n",
|
|
"os.environ['GOOGLE_API_KEY'] = os.getenv('GOOGLE_API_KEY', 'your-key-if-not-using-env')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "8aa149ed-9298-4d69-8fe2-8f5de0f667da",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "python"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# initialize\n",
|
|
"\n",
|
|
"openai = OpenAI()\n",
|
|
"claude = anthropic.Anthropic()\n",
|
|
"client = genai.Client()\n",
|
|
"\n",
|
|
"\n",
|
|
"OPENAI_MODEL = \"gpt-4o\"\n",
|
|
"CLAUDE_MODEL = \"claude-sonnet-4-20250514\"\n",
|
|
"GEMINI_MODEL = 'gemini-2.5-flash'\n",
|
|
"LLAMA_MODEL = \"llama3.2\"\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "36b0a6f6",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "python"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"system_message = \"\"\"\n",
|
|
"You are an effective programming assistant specialized to generate Python code based on the inputs.\n",
|
|
"Respond only with Python code; use comments sparingly and do not provide any explanation other than occasional comments.\n",
|
|
"Do not include Markdown formatting (```), language tags (python), or extra text.\n",
|
|
"\"\"\""
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "8e7b3546-57aa-4c29-bc5d-f211970d04eb",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "python"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def get_user_prompt_for_trade_code_generation(currency, wallet_balance):\n",
|
|
" wallet_balance = str(wallet_balance)\n",
|
|
"\n",
|
|
" user_prompt = \"\"\"\n",
|
|
" Create a simple Crypto trading engine Python code.\n",
|
|
" The engine will sell or buy the given crypto currency against USDT (Tether) based on the available wallet balance\n",
|
|
" This should be a simple Python code, not a function\n",
|
|
" The currency is: {}\n",
|
|
" The wallet balance is: {}\"\"\".format(currency, wallet_balance)\n",
|
|
" user_prompt += \"\"\"\n",
|
|
" Output will be a text containing the followings:\n",
|
|
" - advice to sell or buy\n",
|
|
" - amount in USDT\n",
|
|
" Rules you have to apply in the code:\n",
|
|
" - compose symbol: convert the input `crypto_currency` argument to upper case and concatenate it to string \"USDT\"\n",
|
|
" - compose url passing the previously composed symbol: `url = f\"https://data-api.binance.vision/api/v3/ticker/24hr?symbol={symbol}`\n",
|
|
" - call the api from with this url, expect to get the following json response, for example:\n",
|
|
" {'symbol': 'BTCUSDT',\n",
|
|
" 'priceChange': '1119.99000000',\n",
|
|
" 'priceChangePercent': '0.969',\n",
|
|
" 'weightedAvgPrice': '116314.23644195',\n",
|
|
" 'prevClosePrice': '115600.00000000',\n",
|
|
" 'lastPrice': '116719.99000000',\n",
|
|
" 'lastQty': '0.05368000',\n",
|
|
" 'bidPrice': '116719.99000000',\n",
|
|
" 'bidQty': '2.81169000',\n",
|
|
" 'askPrice': '116720.00000000',\n",
|
|
" 'askQty': '3.46980000',\n",
|
|
" 'openPrice': '115600.00000000',\n",
|
|
" 'highPrice': '117286.73000000',\n",
|
|
" 'lowPrice': '114737.11000000',\n",
|
|
" 'volume': '12500.51369000',\n",
|
|
" 'quoteVolume': '1453987704.98443060',\n",
|
|
" 'openTime': 1758015394001,\n",
|
|
" 'closeTime': 1758101794001,\n",
|
|
" 'firstId': 5236464586,\n",
|
|
" 'lastId': 5238628513,\n",
|
|
" 'count': 2163928}\n",
|
|
" - build a logic based on the retrieving values which can decide whether the engine should sell or buy he given crypto currency\n",
|
|
" - in the logic the code should also decide what is the confident level of selling or buying.\n",
|
|
" - if the confident level is high the `amount` should be higher (closer to the `current_wallet_balance`)\n",
|
|
" - if the confident level is lower then the amount should be lower as well\n",
|
|
" - error handling:\n",
|
|
" - if the api call returns with a json hving `code`, `msg` keys in it (eg. 'code': -1121, 'msg': 'Invalid symbol.') then handle this error message\n",
|
|
" Response rule: in your response do not include Markdown formatting (```), language tags (python), or extra text.\n",
|
|
" \"\"\"\n",
|
|
" return user_prompt\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "5030fdf5",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "python"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def get_user_prompt_for_docstring_generation(python_code):\n",
|
|
" return f\"\"\"\n",
|
|
" Consider the following Python code: \\n\\n\n",
|
|
" {python_code} \\n\\n\n",
|
|
"\n",
|
|
" Generate a docstring comment around this code and it alongside with the Python code. \\n\n",
|
|
" Response rule: in your response do not include Markdown formatting (```), language tags (python), or extra text.\n",
|
|
"\n",
|
|
" \"\"\""
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "8dc065c2",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "python"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def trade_gpt(currency, wallet_balance):\n",
|
|
" completion = openai.chat.completions.create(\n",
|
|
" model=OPENAI_MODEL,\n",
|
|
" messages=[\n",
|
|
" {\"role\": \"system\", \"content\": system_message},\n",
|
|
" {\"role\": \"user\", \"content\": get_user_prompt_for_trade_code_generation(\n",
|
|
" currency,\n",
|
|
" wallet_balance\n",
|
|
" )\n",
|
|
" }\n",
|
|
" ]\n",
|
|
" )\n",
|
|
" return completion.choices[0].message.content"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "3b402c67",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "python"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def code_comment_gpt(python_code):\n",
|
|
" completion = openai.chat.completions.create(\n",
|
|
" model=OPENAI_MODEL,\n",
|
|
" messages=[\n",
|
|
" {\"role\": \"system\", \"content\": system_message},\n",
|
|
" {\"role\": \"user\", \"content\": get_user_prompt_for_docstring_generation(python_code)}\n",
|
|
" ]\n",
|
|
" )\n",
|
|
" return completion.choices[0].message.content"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "0dc80287",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "python"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def trade_cloude(currency, wallet_balance):\n",
|
|
" message = claude.messages.create(\n",
|
|
" model=CLAUDE_MODEL,\n",
|
|
" max_tokens=2000,\n",
|
|
" temperature=0.7,\n",
|
|
" system=system_message,\n",
|
|
" messages=[\n",
|
|
" {\"role\": \"user\", \"content\": get_user_prompt_for_trade_code_generation(\n",
|
|
" currency,\n",
|
|
" wallet_balance\n",
|
|
" )\n",
|
|
" },\n",
|
|
" ],\n",
|
|
" )\n",
|
|
"\n",
|
|
" return message.content[0].text"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "90eb9547",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "python"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def code_comment_cloude(python_code):\n",
|
|
" message = claude.messages.create(\n",
|
|
" model=CLAUDE_MODEL,\n",
|
|
" max_tokens=2000,\n",
|
|
" temperature=0.7,\n",
|
|
" system=system_message,\n",
|
|
" messages=[\n",
|
|
" {\"role\": \"user\", \"content\": get_user_prompt_for_docstring_generation(python_code)\n",
|
|
" },\n",
|
|
" ],\n",
|
|
" )\n",
|
|
"\n",
|
|
" return message.content[0].text"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "b94fbd55",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "python"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"\n",
|
|
"def trade_gemini(currency, wallet_balance):\n",
|
|
" response = client.models.generate_content(\n",
|
|
" model=GEMINI_MODEL,\n",
|
|
" config=types.GenerateContentConfig(\n",
|
|
" system_instruction=system_message),\n",
|
|
" contents=get_user_prompt_for_trade_code_generation(\n",
|
|
" currency,\n",
|
|
" wallet_balance\n",
|
|
" )\n",
|
|
" )\n",
|
|
"\n",
|
|
" return response.text\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "f83ef7b8",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "python"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"\n",
|
|
"def code_comment_gemini(python_code):\n",
|
|
" response = client.models.generate_content(\n",
|
|
" model=GEMINI_MODEL,\n",
|
|
" config=types.GenerateContentConfig(\n",
|
|
" system_instruction=system_message),\n",
|
|
" contents=get_user_prompt_for_docstring_generation(python_code)\n",
|
|
" )\n",
|
|
"\n",
|
|
" return response.text\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "6737962d",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "python"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def trade_llama(currency, wallet_balance):\n",
|
|
" completion = ollama.chat(\n",
|
|
" model=LLAMA_MODEL,\n",
|
|
" messages=[\n",
|
|
" {\"role\": \"user\", \"content\": get_user_prompt_for_trade_code_generation(\n",
|
|
" currency,\n",
|
|
" wallet_balance\n",
|
|
" )\n",
|
|
" },\n",
|
|
" ],\n",
|
|
" )\n",
|
|
"\n",
|
|
" return completion['message']['content']\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "b815aa07",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "python"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def code_comment_llama(python_code):\n",
|
|
" completion = ollama.chat(\n",
|
|
" model=LLAMA_MODEL,\n",
|
|
" messages=[\n",
|
|
" {\"role\": \"user\", \"content\": get_user_prompt_for_docstring_generation(python_code)},\n",
|
|
" ],\n",
|
|
" )\n",
|
|
"\n",
|
|
" return completion['message']['content']"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "b9e07437",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "python"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def generate_python_code(input_model, currency, wallet_balance):\n",
|
|
" model_mapping = {\"GPT\": trade_gpt(currency, wallet_balance),\n",
|
|
" \"Claude\": trade_cloude(currency, wallet_balance),\n",
|
|
" \"Gemini\": trade_gemini(currency, wallet_balance),\n",
|
|
" \"Llama\": trade_llama(currency, wallet_balance)}\n",
|
|
" try:\n",
|
|
" return model_mapping[input_model]\n",
|
|
" except KeyError as e:\n",
|
|
" print(f\"{e}: {input_model} is not valid\")\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "016fed0e",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "python"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def comment_python_code(input_model, python_code):\n",
|
|
" model_mapping = {\"GPT\": code_comment_gpt(python_code),\n",
|
|
" \"Claude\": code_comment_cloude(python_code),\n",
|
|
" \"Gemini\": code_comment_gemini(python_code),\n",
|
|
" \"Llama\": code_comment_llama(python_code)\n",
|
|
" }\n",
|
|
" try:\n",
|
|
" return model_mapping[input_model]\n",
|
|
" except KeyError as e:\n",
|
|
" print(f\"{e}: {input_model} is not valid\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "e224a715",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "python"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def execute_python(code):\n",
|
|
" code = code.replace('```python\\n','').replace('```','')\n",
|
|
" try:\n",
|
|
" output = io.StringIO()\n",
|
|
" sys.stdout = output\n",
|
|
" exec(code)\n",
|
|
" finally:\n",
|
|
" sys.stdout = sys.__stdout__\n",
|
|
" return output.getvalue()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "ea96a88d",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "python"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"with gr.Blocks() as ui:\n",
|
|
" gr.Markdown(\"\"\"It generate Trading Python code, which will recommend you whether sell or buy a given crypto currency at its current price.\n",
|
|
" Based on the confindency level of the prediction it will recommend what amount should be placed from your available wallet balance\"\"\")\n",
|
|
" with gr.Row():\n",
|
|
" crypto_currency = gr.Dropdown([\"BTC\", \"ETH\", \"SOL\"], label=\"The Crypto cyrrency\")\n",
|
|
" wallet_balance = gr.Number(label=\"Enter a number\")\n",
|
|
" model = gr.Dropdown([\"GPT\", \"Claude\", \"Gemini\", \"Llama\"], label=\"Select model\", value=\"GPT\")\n",
|
|
" with gr.Row():\n",
|
|
" generate_python_code_bt = gr.Button(\"Genarate Python code\")\n",
|
|
" with gr.Row():\n",
|
|
" with gr.Column():\n",
|
|
" python = gr.TextArea(label=\"Python Code\")\n",
|
|
" python_comment = gr.Button(\"Comment Python code\")\n",
|
|
" python_run = gr.Button(\"Run Python code\")\n",
|
|
" with gr.Row():\n",
|
|
" result_out = gr.TextArea(label=\"Trading advice\")\n",
|
|
"\n",
|
|
" generate_python_code_bt.click(generate_python_code, inputs=[model, crypto_currency, wallet_balance], outputs=[python])\n",
|
|
" python_comment.click(comment_python_code, inputs=[model, python], outputs=python)\n",
|
|
" python_run.click(execute_python, inputs=[python], outputs=result_out)\n",
|
|
"\n",
|
|
"ui.launch(inbrowser=True)"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3 (ipykernel)",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"name": "",
|
|
"version": ""
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|