O Market Service transforma medições em oportunidades de compra e venda. No fluxo atual, os dados chegam dos devices a cada 15 minutos. A regra é simples: excedente vira oferta, déficit vira ordem. Quando uma ordem encontra uma oferta compatível, o serviço cria um trade e pede ao Transactions Service a preparação do pagamento com EuroToken.

Política de preço

Cada sensor pode ter uma política: Regras:
  • valores de preço precisam ser positivos;
  • os preços usam 6 casas decimais;
  • sem política ativa, a medição é ignorada pelo mercado.

Como o Market avalia uma medição

Excedente: criação de oferta

Quando net_kwh > 0, o Market cria uma oferta se:
  • existe política para o sensor;
  • a política está ativa;
  • min_sell_price_eur é maior que zero;
  • a medição de origem ainda está livre para criação de oferta.
Campos principais da oferta:

Déficit: criação de ordem

Quando net_kwh < 0, o Market cria uma ordem se:
  • existe política para o sensor;
  • a política está ativa;
  • max_buy_price_eur é maior que zero;
  • a medição de origem ainda está livre para criação de ordem.
O valor needed_kwh é o módulo de net_kwh.

Matching

Uma oferta é compatível quando:
  • está OPEN;
  • price_per_kwh é menor ou igual ao teto do comprador;
  • kwh é maior ou igual à necessidade da ordem.

Regra de concorrência

Quando vários participantes competem no mesmo ciclo (ou contra o book aberto): No ciclo de matching, as medições de excedente correm primeiro (para publicar asks), depois as de déficit ordenadas pelo maior bid. Uma oferta nova também tenta preencher ordens OPEN à espera, com a mesma prioridade de compradores. Não há compra parcial no fluxo atual: a oferta precisa cobrir toda a necessidade da ordem.

Trade

Quando há matching:
  1. a oferta muda de OPEN para RESERVED;
  2. o Market cria um trade em PENDING_PAYMENT;
  3. o total é calculado como needed_kwh * price_per_kwh da oferta;
  4. o total é quantizado para 6 casas;
  5. o valor é convertido para unidades mínimas do token;
  6. o Transactions Service prepara uma transação EuroToken.transfer;
  7. a oferta muda para SOLD;
  8. a ordem muda para FILLED.
O contrato privado correto EuroToken usa 18 decimais. O Market Service ainda usa a configuração EURC_DECIMALS para converter o total do trade antes de chamar o Transactions Service. Essa configuração precisa estar alinhada ao token privado usado no ambiente.

Status

Motivos de medição ignorada

Ciclo de matching

O matching off-chain não corre no POST de medições. Em develop/produção o ciclo é agendado por Celery Beat no Market Service (MATCHING_CYCLE_MINUTES, default 15), com worker + Redis dedicado do market.
Task: core.tasks.run_matching_cycle_task. Por padrão, o serviço processa a janela fixa de 15 minutos imediatamente anterior, alinhada à cadência de envio dos dados pelo device. Para execução manual ou laboratório:
--from e --to precisam ser informados juntos. A data final precisa ser posterior à inicial. Em produção use Celery, não CronJob.

Pagamentos

O que acontece depois que um trade fica pendente de pagamento