2022.01.12 ~ 2022.01.18
박현준 Dookong
이준영 rubinstory
3주차 과제의 경우 각 조별 자유 프로젝트를 진행하는 것이다. 우리 조의 프로젝트 주제는 아래와 같다.
투자에 미숙한 사람들을 위한 맞춤형 암호화폐 자동매매 어플리케이션
이번 프로젝트는 프론트, 백엔드, 투자 알고리즘 등 총 3개의 파트로 나누어 진행헀다.
- ftx - FTX 거래소의 데이터 수신 및 주문 전송
- apscheduler - 거래소 데이터의 주기적인 업데이트
- requests - 백엔드 서버로의 데이터 전송
- pandas - 가격 데이터 분석
볼린저 밴드와 캔들 패턴의 수렴발산을 이용한 단타 전략. 가격의 이동평균의 표준편차를 계산하여 순간적인 극값을 도출 후 공매수/공매도하여 수익 창출.
RSI와 MACD 지표를 조합하여 매매하는 중단기 스윙 전략. 과매수 구간에 돌입할 때 진입하여 과매수 구간을 이탈할 때 청산하는 방식으로 수익 창출.
이번 프로젝트에서는 서버와의 통신을 REST API를 기반으로 설계했다. 따라서 클라이언트에서도 REST 방식으로 통신을 해야한다.
클라이언트의 경우 iOS 단말기를 대상으로 진행했으며, Dart와 Flutter를 이용해 프로그래밍했다.
@RestApi(baseUrl: "http://192.249.18.201:80/")
abstract class RestClient {
factory RestClient(Dio dio, {String baseUrl}) = _RestClient;
@GET('user/{user_id}')
Future<UserModel> fetchCurrentUser(@Path('user_id') int userId);
@GET('asset_manage/{user_id}')
Future<AssetManageModel> fetchAssetManageItem(@Path('user_id') int userId);
@POST('asset_manage/')
Future<AssetManageModel> updateAssetManageModel(
@Body() AssetManageModel assetManageModel,
);
@GET('transaction/')
Future<List<TransactionModel>> fetchTransactionList(
@Query('user') int userId);
}
REST 통신을 위해 Retrofit 라이브러리를 사용했다.
이번 프로젝트에서는 사용자 정보 저장을 위한 Django 서버와 거래 관련 정보 조회를 위한 FTX, 총 2군데의 서버와 통신을 해야한다. 따라서 Google에서 권장하는 BLOC 디자인 패턴을 클라이언트에 적용하였다.
class UserModel {
int _id = 0;
String _firstName = "";
String _lastName = "";
String _username = "";
UserModel.fromJson(Map<String, dynamic> parsedJson) {
_id = parsedJson['id'];
_firstName = parsedJson['first_name'];
_lastName = parsedJson['last_name'];
_username = parsedJson['username'];
}
int get id => _id;
String get firstName => _firstName;
String get lastName => _lastName;
String get fullName => _lastName + _firstName;
String get username => _username;
}
class UserAPIProvider {
Future<UserModel> fetchUser(int userId) async {
final response = RestClient(Dio()).fetchCurrentUser(userId);
return response;
}
}
class UserRepository {
final userAPIProvider = UserAPIProvider();
Future<UserModel> fetchUser(int userId) => userAPIProvider.fetchUser(userId);
}
class UserBloc {
final _repository = UserRepository();
final _userFetcher = PublishSubject<UserModel>();
Stream<UserModel> get currentUser => _userFetcher.stream;
fetchCurrentUser() async {
UserModel userModel = await _repository.fetchUser(CURRENT_USER_ID);
CURRENT_USER_ID = userModel.id;
_userFetcher.sink.add(userModel);
}
dispose() {
_userFetcher.close();
}
}
메인화면에서는 사용자의 자산 현황과 수익률을 조회할 수 있다. 그리고 수익률을 분석하여 시각화한 그래프를 통해 최근 3일간의 투자 현황을 확인할 수 있으며, 배너와 카드뉴스를 통해 추천 받은 정보를 확인할 수 있다.
투자 관련 정보는 모두 FTX 거래소에 요청을 보내 받아오는 정보들이며, 그 이외의 경우 모두 Django 서버로부터 받아오는 정보이다.
투자 정보 조회 화면에서는 사용자가 보유하고 있는 자산 현황과 현재 적용 중인 알고리즘의 종류를 확인할 수 있다. 그리고 사용자의 투자 성향에 대해 간단히 설명해주는 섹션이 있으며, 투자 유형 변경과 거래 내역을 조회할 수 있다.