Skip to content

Commit 49db1f4

Browse files
committed
admin ui allows to specify entry strategy
1 parent e3d86e5 commit 49db1f4

6 files changed

+120
-3
lines changed

admin/src/app/app.module.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {TradesRoutingModule} from './trades-routing.module';
1111
import {FormsModule} from '@angular/forms';
1212
import {ExitDetailsComponent} from './trade-details/exit-details.component';
1313
import {SLDetailsComponent} from './trade-details/sl-details.component';
14+
import {EntryDetailsComponent} from './trade-details/entry-details.component';
1415
import {SymbolValidatorDirective} from './trade-details/symbol-validator';
1516
import {AuthInterceptor} from './auth.interceptor';
1617
import { LogInComponent } from './log-in/log-in.component';
@@ -22,11 +23,12 @@ import { LogInComponent } from './log-in/log-in.component';
2223
declarations: [
2324
AppComponent,
2425
AssetTableComponent,
26+
EntryDetailsComponent,
2527
TradeDetailsComponent,
2628
ExitDetailsComponent,
2729
SLDetailsComponent,
2830
SymbolValidatorDirective,
29-
LogInComponent
31+
LogInComponent,
3032
],
3133
imports: [
3234
// CollapseModule.forRoot(),

admin/src/app/botapi.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {Observable, of, throwError} from 'rxjs';
44
import {TradeInfo} from './tradeInfo';
55
import {catchError, map, retry, tap} from 'rxjs/operators';
66
import {ApiResult} from './apiresult';
7-
import {TradeDetails} from './trade-details';
7+
import {TradeDetails, Entry} from './trade-details';
88
import deleteProperty = Reflect.deleteProperty;
99
import {environment} from '../environments/environment';
1010

@@ -40,7 +40,13 @@ export class BotApi {
4040
return this.http.get<TradeDetails>(`${this.API_URL}/trade/${id}`, httpOptions).pipe(
4141
retry(this.RETRIES),
4242
tap(trade => this.log(`fetched trade ${id} info`)),
43-
map(data => Object.assign(new TradeDetails(), data)),
43+
map(data => {
44+
const trade = Object.assign(new TradeDetails(), data);
45+
if (data.entry) {
46+
trade.entry = Object.assign(new Entry(), data.entry); // restore nested class Entry
47+
}
48+
return trade;
49+
}),
4450
catchError(this.handleError('getActiveTradeInfo', null))
4551
);
4652
}

admin/src/app/trade-details.ts

+18
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export class TradeDetails {
1111
side: 'BUY' | 'SELL' = 'SELL';
1212
status: 'NEW' | 'ACTIVE' | 'COMPLETED';
1313
exit: ExitInfo;
14+
entry?: Entry;
1415

1516
get stoploss(): StopLoss {
1617
return this._stoploss;
@@ -71,7 +72,24 @@ export class ExitInfo {
7172
smart: boolean;
7273
threshold: string;
7374
targets: Target[];
75+
}
76+
77+
export class EntryTarget {
78+
price: string;
79+
vol: string;
80+
}
81+
82+
export class Entry {
83+
constructor() {
84+
this.targets = [new EntryTarget()];
85+
}
86+
87+
side: 'BUY' | 'SELL' = 'BUY';
88+
targets: [EntryTarget];
89+
smart: boolean;
7490

91+
isBuy(): boolean { return this.side === 'BUY'; }
92+
isSell(): boolean { return !this.isBuy(); }
7593
}
7694

7795
export class Target {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<fieldset [disabled]="mode.isView()">
2+
<legend>
3+
Entry
4+
5+
<button
6+
type="button"
7+
class="btn btn-sm btn-outline-success"
8+
(click)="addNewTarget()"
9+
tooltip="Add Target"
10+
*ngIf="!trade.entry"
11+
>
12+
<span class="oi oi-plus"></span>
13+
</button>
14+
</legend>
15+
16+
17+
<div class="form-group row row-no-btm-margin" *ngIf="trade.entry?.targets.length > 0">
18+
<div class="col-form-label-sm col-md-2"><label for="targetPrice">Price</label></div>
19+
<div class="col-form-label-sm col-md-2"><label for="targetVol">Volume</label></div>
20+
</div>
21+
22+
<div class="form-group row row-no-btm-margin" *ngFor="let entryTarget of trade.entry?.targets">
23+
<div class="form-group col-md-2">
24+
<input type="text" class="form-control form-control-sm" id="targetPrice" [(ngModel)]="entryTarget.price">
25+
</div>
26+
<div class="form-group col-md-2">
27+
<input type="text" class="form-control form-control-sm" id="targetVol" [(ngModel)]="entryTarget.vol">
28+
</div>
29+
<div class="form-group col-md-1" *ngIf="mode.isCreate()">
30+
<button type="button" class="btn btn-sm btn-outline-danger" (click)="deleteTarget(entryTarget)" tooltip="Remove Target" >
31+
<span class="oi oi-trash"></span>
32+
</button>
33+
</div>
34+
<div class="form-group col-md-1">
35+
<div class="btn-group btn-group-toggle" data-toggle="buttons" id="buysellBtn">
36+
<label class="btn btn-sm btn-outline-danger {{trade.entry.isSell() ? 'active' : ''}}" *ngIf="mode.isCreate() || (!mode.isCreate() && trade.entry.isSell())">
37+
<input type="radio" name="options" id="sideSell" value="SELL" autocomplete="off" [(ngModel)]="trade.entry.side"> Sell
38+
</label>
39+
<label class="btn btn-sm btn-outline-success {{trade.entry.isBuy() ? 'active' : ''}}" *ngIf="mode.isCreate() || (!mode.isCreate() && trade.entry.isBuy())">
40+
<input type="radio" name="options" id="sideBuy" value="BUY" autocomplete="off" [(ngModel)]="trade.entry.side"> Buy
41+
</label>
42+
</div>
43+
</div>
44+
</div>
45+
</fieldset>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import {Component, Input, OnInit} from '@angular/core';
2+
import {Mode, Entry, EntryTarget, TradeDetails} from '../trade-details';
3+
4+
@Component({
5+
selector: 'app-entry-details',
6+
templateUrl: './entry-details.component.html',
7+
styleUrls: ['./trade-details.component.css']
8+
})
9+
10+
export class EntryDetailsComponent implements OnInit {
11+
@Input()
12+
trade: TradeDetails;
13+
14+
@Input()
15+
mode: Mode;
16+
17+
entryTarget: EntryTarget;
18+
19+
constructor() {
20+
21+
}
22+
23+
ngOnInit(): void {
24+
}
25+
26+
deleteTarget(exitTarget: EntryTarget) {
27+
this.entryTarget = null;
28+
this.trade.entry = null;
29+
}
30+
31+
addNewTarget() {
32+
if (this.entryTarget) {
33+
return;
34+
}
35+
36+
this.entryTarget = new EntryTarget();
37+
38+
if (!this.trade.entry) {
39+
this.trade.entry = new Entry();
40+
}
41+
42+
this.trade.entry.targets = [this.entryTarget];
43+
}
44+
}
45+

admin/src/app/trade-details/trade-details.component.html

+1
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ <h4 class="modal-title pull-left">Trade ({{mode.str()}} mode)</h4>
7575
</div>
7676
</div>
7777
</fieldset>
78+
<app-entry-details [trade]="trade" [mode]="mode"></app-entry-details>
7879
<app-exit-details [trade]="trade" [mode]="mode"></app-exit-details>
7980
<app-sl-details [trade]="trade" [mode]="mode"></app-sl-details>
8081
</div>

0 commit comments

Comments
 (0)