using Bitget_Server.Api.Dtos;
using Bitget_Server.Application.Services;
using Bitget_Server.Application.State;
using Microsoft.AspNetCore.Mvc;
namespace Bitget_Server.Api.Controllers;
///
/// 기존 WinForms 의 구름떼/영호 조건식 체크박스 및 신호검색 그리드를 REST 화.
///
[ApiController]
[Route("api/signals")]
[Produces("application/json")]
public class SignalsController : ControllerBase
{
private readonly SignalProcessService _signalProcess;
private readonly MarketState _state;
public SignalsController(SignalProcessService signalProcess, MarketState state)
{
_signalProcess = signalProcess;
_state = state;
}
/// 현재 활성화된 시그널 목록 + 카운트.
[HttpGet]
[ProducesResponseType(typeof(SignalListResponse), StatusCodes.Status200OK)]
public ActionResult GetSignals()
{
var result = new SignalListResponse(
_signalProcess.SignalsLongUp.Select(Map),
_signalProcess.SignalsShortDown.Select(Map),
_signalProcess.SignalsLongDown.Select(Map),
_signalProcess.SignalsShortUp.Select(Map),
_signalProcess.LongCount,
_signalProcess.ShortCount);
return Ok(result);
static SignalSummaryDto Map(Domain.Models.SignalInfoData s)
=> new(s.MarketName, s.Description, s.SignalStart, s.Price, s.Rate,
s.IndicatorPrice, s.IndicatorRate, s.MCandleTimeType);
}
/// 조건식 상태 조회.
[HttpGet("conditions")]
[ProducesResponseType(typeof(SignalConditionsDto), StatusCodes.Status200OK)]
public ActionResult GetConditions()
=> Ok(new SignalConditionsDto(
_signalProcess.Checked구름떼상향돌파,
_signalProcess.Checked구름떼하향돌파,
_signalProcess.영호조건식_상향돌파,
_signalProcess.영호조건식_하향돌파));
/// 조건식 상태 변경.
[HttpPut("conditions")]
[ProducesResponseType(typeof(SignalConditionsDto), StatusCodes.Status200OK)]
public ActionResult UpdateConditions([FromBody] UpdateSignalConditionsRequest req)
{
_signalProcess.Checked구름떼상향돌파 = req.구름떼상향돌파;
_signalProcess.Checked구름떼하향돌파 = req.구름떼하향돌파;
_signalProcess.영호조건식_상향돌파 = req.영호조건식_상향돌파;
_signalProcess.영호조건식_하향돌파 = req.영호조건식_하향돌파;
return Ok(new SignalConditionsDto(
_signalProcess.Checked구름떼상향돌파,
_signalProcess.Checked구름떼하향돌파,
_signalProcess.영호조건식_상향돌파,
_signalProcess.영호조건식_하향돌파));
}
/// 체크된 마켓/인터벌 목록 조회 (신호검색 대상).
[HttpGet("checked-markets")]
[ProducesResponseType(typeof(CheckedMarketsDto), StatusCodes.Status200OK)]
public ActionResult GetCheckedMarkets()
{
lock (_state.SyncRoot)
{
return Ok(new CheckedMarketsDto(
_state.CheckedMarkets.Select(m => m?.ToString() ?? string.Empty).ToList(),
_state.IntervalList.Select(i => i?.ToString() ?? string.Empty).ToList()));
}
}
/// 체크된 마켓/인터벌 일괄 설정.
[HttpPut("checked-markets")]
[ProducesResponseType(typeof(CheckedMarketsDto), StatusCodes.Status200OK)]
public ActionResult UpdateCheckedMarkets([FromBody] UpdateCheckedMarketsRequest req)
{
lock (_state.SyncRoot)
{
_state.CheckedMarkets = req.Markets.Cast