Обновлено: 2026-10-26
Начните с программы, которая не может отправить ордер. Рабочий пример ниже принимает синтетический снимок, отклоняет отсутствующие или устаревшие данные и рассчитывает два исхода. Он не прогнозирует событие, не подключается к бирже и не доказывает прибыльность. Нужна только стандартная библиотека Python: без счёта, кошелька, ключа и дополнительных установок.
Прежний цикл покупок считал цену 95–99 центов свидетельством будущего выигрыша. Это не доказательство разрешения. При вероятности победы 95% и цене 97 центов ожидаемый результат равен минус 2 цента на долю до расходов, даже если оценка вероятности надёжна. YES не обязательно является выигравшим токеном.
Разделите идентификацию, доказательства и исполнение
Официальный обзор данных различает события, рынки и идентификаторы исходов. Документация разрешения отсылает к правилам, не только заголовку. Источники проверены 26 октября; они не подтверждают прежние SDK-фрагменты, комиссии или личные результаты автора.
Сохраняйте точный вопрос, ID исхода, версию правил, источник разрешения, часовой пояс и время наблюдения. Исходный ответ храните отдельно от преобразованных полей: это помогает исследовать ошибку парсера. Перед созданием сборщика только для чтения проверьте текущую версию API и правила пагинации. Формат примера здесь не выдаётся за ответ провайдера.
Небольшой пример для проверки
Сохраните код как paper_check.py, запустите python paper_check.py. Он не читает секреты, не обращается к сети и не пишет файлы. Порог свежести 30 секунд — учебный параметр, не универсальный стандарт. Ссылка на правила лишь обязательное поле: программа не проверяет подлинность и смысл этих правил.
from decimal import Decimal, InvalidOperation
def inspect(snapshot, now, max_age=30):
# Teaching schema only: not a provider API response or trading signal.
if not isinstance(snapshot, dict):
return {"status": "invalid"}
required = ("market", "outcome", "rules_ref", "observed_at")
if any(not snapshot.get(k) for k in required):
return {"status": "missing_identity_or_rules"}
if snapshot["outcome"] not in ("YES", "NO"):
return {"status": "invalid_outcome"}
stamp = snapshot["observed_at"]
if type(stamp) is not int or type(now) is not int:
return {"status": "invalid_time"}
if not 0 <= now - stamp <= max_age:
return {"status": "stale_or_future"}
try:
ask = Decimal(str(snapshot["ask"]))
shares = Decimal(str(snapshot["shares"]))
costs = Decimal(str(snapshot["costs"]))
values = (ask, shares, costs)
if not all(x.is_finite() for x in values):
return {"status": "invalid_number"}
if not (Decimal("0.000001") <= ask < 1
and Decimal("0.000001") <= shares <= 1000000
and 0 <= costs <= 1000000):
return {"status": "invalid_number"}
except (KeyError, InvalidOperation, ValueError):
return {"status": "invalid_number"}
paid = ask * shares + costs
return {
"status": "paper_scenarios_only",
"win_net": str(shares - paid),
"lose_net": str(-paid),
"break_even_probability": str(paid / shares),
"probability_evidence": "not_established",
}
sample = dict(market="synthetic-election", outcome="YES",
rules_ref="fixture-rules-v1", observed_at=1000,
ask="0.97", shares="100", costs="1")
if __name__ == "__main__":
good = inspect(sample, 1010)
assert good["win_net"] == "2.00"
assert good["lose_net"] == "-98.00"
assert good["break_even_probability"] == "0.98"
assert inspect(sample, 1040)["status"] == "stale_or_future"
assert inspect({**sample, "ask": "NaN"}, 1010)["status"] == "invalid_number"
assert inspect({**sample, "rules_ref": ""}, 1010)["status"] == "missing_identity_or_rules"
print(good)
Числовые границы ограничивают крайние входные значения только в этой демонстрации; это не шаг цены, лимиты количества или разрешённые торговые параметры.
Условные 100 долей по 0,97 плюс 1 расходов стоят 98: прибыль при выигрыше 2, потеря при проигрыше 98, безубыточная вероятность 0,98. Код намеренно не даёт оценки вероятности и команды купить. Расходы — входной параметр, не фиксированная комиссия площадки. Если безубыточная вероятность выше 1, положительное ожидание невозможно при принятой бинарной выплате.
Расширяйте проверки раньше системы
Прокрутите таблицу по горизонтали, чтобы увидеть все столбцы. С клавиатуры: перейдите к области таблицы и используйте стрелки.
| Сбой в тестовых данных | Ожидаемая реакция |
|---|---|
| Нет правил или неверно сопоставлен исход | Нет пригодного исследовательского решения до сверки идентичности |
| Устаревшее или будущее время | Сохранить отказ, не использовать прежний сигнал |
| Пустая книга или недостаточный размер | Недоступность или частичная глубина, без выдуманного полного исполнения |
| Повторное событие | Удаление дубля по документированной идентичности; конфликтующие данные требуют проверки |
| Разрыв соединения | Пометить пробел и восстановить состояние из проверенного снимка |
| Перезапуск после остановки | Сохранять остановку до явной сверки; рестарт не разрешает продолжение |
Пример реализует только первые две строки и числовые проверки. Постоянное хранилище, порядок событий, дедупликация, модель глубины и восстановление — дальнейшая работа. Проверьте её на сохранённых фикстурах до подключения потока. Один процесс с локальным журналом может быть проще для исследования, чем несколько сервисов; архитектура сама по себе не создаёт преимущество.
Исполнитель ордеров — отдельная задача
Реальному исполнителю нужны идентификаторы ордеров, учёт частичных исполнений, балансы, отмены, разрешения и восстановление после неизвестного результата. Тайм-аут не означает отказ ордера. Повтор запроса может создать второй. Остановка новых входов не закрывает запас, а отмена не устраняет уже исполненную часть. Определяйте состояния по документированному жизненному циклу ордера, не угадывая поведение SDK без указанной версии.
Здесь нет разрешения на тест деньгами или правила, будто месяц наблюдений обеспечивает готовность. Сохраняйте состояния отказа и отсутствия данных, отдельно проверяйте допустимость использования и не обходите ограничения доступа. Руководство по исследовательскому досье разбирает источники и калибровку.
Раскрытие: AITR может получать комиссии по отмеченным ссылкам в других материалах. Здесь нет отчёта о финансируемом тесте или прогноза доходности. Торговый капитал можно потерять; это автономное инженерное упражнение, не финансовая рекомендация.