Skip to content
This repository was archived by the owner on Feb 22, 2024. It is now read-only.

Commit e301ced

Browse files
authored
Merge branch 'dev' into same-xml
2 parents 0389fc9 + d3669d5 commit e301ced

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+2250
-436
lines changed

.github/stale.yml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Configuration for probot-stale - https://github.com/probot/stale
2+
3+
# Limit to only `issues`
4+
only: issues
5+
6+
# Number of days of inactivity before an Issue or Pull Request is closed.
7+
# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
8+
daysUntilClose: 14
9+
10+
# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
11+
exemptLabels:
12+
- bug
13+
- "technical issues"
14+
- "feature request"
15+
16+
17+
# Label to use when marking an issue as stale
18+
staleLabel: stale
19+
20+
# Comment to post when marking as stale. Set to `false` to disable
21+
markComment: false
22+
23+
# Comment to post when closing a stale Issue or Pull Request.
24+
closeComment: >
25+
This issue has been automatically closed since there has not been
26+
any recent activity. Please open a new issue for related bugs.
27+
28+
# Limit the number of actions per hour, from 1-30. Default is 30
29+
limitPerRun: 30

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ install: npm ci
55
cache:
66
directories:
77
- node_modules
8+
script: travis_retry npm test

src/botPage/bot/Interface/MiscInterface.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ export default Interface =>
2929
notifyTelegram: this.notifyTelegram,
3030
getTotalRuns : () => this.tradeEngine.getTotalRuns(),
3131
getBalance : type => this.tradeEngine.getBalance(type),
32-
getTotalProfit: () => this.tradeEngine.getTotalProfit(),
32+
getTotalProfit: toString =>
33+
this.tradeEngine.getTotalProfit(toString, this.tradeEngine.tradeOptions.currency),
3334
};
3435
}
3536
};

src/botPage/bot/Interface/ToolsInterface.js

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,78 @@
11
import CandleInterface from './CandleInterface';
22
import MiscInterface from './MiscInterface';
33
import IndicatorsInterface from './IndicatorsInterface';
4+
import { translate } from '../../../common/i18n';
45

56
// prettier-ignore
67
export default Interface => class extends IndicatorsInterface(
78
MiscInterface(CandleInterface(Interface))) {
89
getToolsInterface() {
910
return {
10-
getTime: () => parseInt(new Date().getTime() / 1000),
11+
getTime : () => parseInt(new Date().getTime() / 1000),
12+
toDateTime: (timestamp) => {
13+
const getTwoDigitValue = input => {
14+
if (input < 10) {
15+
return `0${input}`;
16+
}
17+
return `${input}`;
18+
}
19+
const invalidTimestamp = () => `${translate('Invalid timestamp')}: ${timestamp}`;
20+
if (typeof timestamp === 'number') {
21+
const dateTime = new Date(timestamp * 1000);
22+
if (dateTime.getTime()) {
23+
const year = dateTime.getFullYear();
24+
const month = getTwoDigitValue(dateTime.getMonth() + 1);
25+
const day = getTwoDigitValue(dateTime.getDate());
26+
const hours = getTwoDigitValue(dateTime.getHours());
27+
const minutes = getTwoDigitValue(dateTime.getMinutes());
28+
const seconds = getTwoDigitValue(dateTime.getSeconds());
29+
const formatGTMoffset = () => {
30+
const GMToffsetRaw = dateTime.getTimezoneOffset();
31+
const sign = GMToffsetRaw > 0 ? '-' : '+';
32+
const GMToffset = Math.abs(GMToffsetRaw);
33+
const h = Math.floor(GMToffset / 60);
34+
const m = GMToffset - h * 60;
35+
return `GMT${sign}${getTwoDigitValue(h)}${getTwoDigitValue(m)}`;
36+
}
37+
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds} ${formatGTMoffset()}`;
38+
}
39+
return invalidTimestamp();
40+
}
41+
return invalidTimestamp();
42+
},
43+
toTimestamp: (dateTimeString) => {
44+
const invalidDatetime = () => `${translate('Invalid date/time')}: ${dateTimeString}`;
45+
if (typeof dateTimeString === 'string') {
46+
const dateTime = dateTimeString
47+
.replace(/[^0-9.:-\s]/g, '')
48+
.replace(/\s+/g,' ')
49+
.trim()
50+
.split(' ');
51+
52+
const d = /^[12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/;
53+
const t = /^(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9])(:([0-5][0-9])?)?$/;
54+
55+
let validatedDateTime;
56+
57+
if(dateTime.length >= 2) {
58+
validatedDateTime = d.test(dateTime[0]) && t.test(dateTime[1]) ? `${dateTime[0]}T${dateTime[1]}` : null;
59+
} else if(dateTime.length === 1) {
60+
validatedDateTime = d.test(dateTime[0]) ? dateTime[0] : null;
61+
} else {
62+
validatedDateTime = null;
63+
}
64+
65+
if(validatedDateTime) {
66+
const dateObj = new Date(validatedDateTime);
67+
// eslint-disable-next-line no-restricted-globals
68+
if(dateObj instanceof Date && !isNaN(dateObj)) {
69+
return dateObj.getTime() / 1000;
70+
}
71+
}
72+
return invalidDatetime();
73+
}
74+
return invalidDatetime();
75+
},
1176
...this.getCandleInterface(),
1277
...this.getMiscInterface(),
1378
...this.getIndicatorsInterface(),

src/botPage/bot/Interface/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export default class Interface extends ToolsInterface(TicksInterface(class {}))
3737
};
3838
}
3939
getBotInterface() {
40-
const getDetail = i => createDetails(this.get('contract'))[i];
40+
const getDetail = (i, pipSize) => createDetails(this.get('contract'), pipSize)[i];
4141

4242
return {
4343
init : (...args) => this.tradeEngine.init(...args),
@@ -50,7 +50,7 @@ export default class Interface extends ToolsInterface(TicksInterface(class {}))
5050
sellAtMarket : () => this.tradeEngine.sellAtMarket(),
5151
getSellPrice : () => this.getSellPrice(),
5252
isResult : result => getDetail(10) === result,
53-
readDetails : i => getDetail(i - 1),
53+
readDetails : i => getDetail(i - 1, this.tradeEngine.getPipSize()),
5454
};
5555
}
5656
sleep(arg = 1) {

src/botPage/bot/Interpreter.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,10 @@ export default class Interpreter {
149149
}
150150
terminateSession() {
151151
this.$scope.api.disconnect();
152-
globalObserver.emit('bot.stop');
153152
this.stopped = true;
153+
154+
globalObserver.emit('bot.stop');
155+
globalObserver.setState({ isRunning: false });
154156
}
155157
stop() {
156158
if (this.bot.tradeEngine.isSold === false && !this.isErrorTriggered) {

src/botPage/bot/TradeEngine/OpenContract.js

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ export default Engine =>
1717

1818
this.setContractFlags(contract);
1919

20-
this.sellExpired();
21-
2220
this.data = this.data.set('contract', contract);
2321

2422
broadcastContract({ accountID: this.accountInfo.loginid, ...contract });
@@ -45,11 +43,7 @@ export default Engine =>
4543
this.store.dispatch(openContractReceived());
4644
if (!this.isExpired) {
4745
this.resetSubscriptionTimeout();
48-
return;
49-
}
50-
if (!this.retriedUnsuccessfullSellExpired) {
51-
this.retriedUnsuccessfullSellExpired = true;
52-
this.resetSubscriptionTimeout(AFTER_FINISH_TIMEOUT);
46+
5347
}
5448
}
5549
});
@@ -61,7 +55,6 @@ export default Engine =>
6155
}
6256
subscribeToOpenContract(contractId = this.contractId) {
6357
if (this.contractId !== contractId) {
64-
this.retriedUnsuccessfullSellExpired = false;
6558
this.resetSubscriptionTimeout();
6659
}
6760
this.contractId = contractId;

src/botPage/bot/TradeEngine/Sell.js

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,4 @@ export default Engine =>
4646
delayIndex++
4747
).then(onSuccess);
4848
}
49-
sellExpired() {
50-
if (this.isSellAvailable && this.isExpired) {
51-
doUntilDone(() => this.api.sellExpiredContracts());
52-
}
53-
}
5449
};

src/botPage/bot/TradeEngine/Ticks.js

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,30 @@ export default Engine =>
3131
tickListenerKey = key;
3232
}
3333
}
34-
getTicks() {
35-
return new Promise(resolve =>
36-
this.$scope.ticksService
37-
.request({ symbol: this.symbol })
38-
.then(ticks => resolve(ticks.map(o => o.quote)))
39-
);
34+
getTicks(toString = false) {
35+
return new Promise(resolve => {
36+
this.$scope.ticksService.request({ symbol: this.symbol }).then(ticks => {
37+
const pipSize = this.getPipSize();
38+
const ticksList = ticks.map(o => {
39+
if (toString) {
40+
return o.quote.toFixed(pipSize);
41+
}
42+
return o.quote;
43+
});
44+
45+
resolve(ticksList);
46+
});
47+
});
4048
}
41-
getLastTick(raw) {
49+
getLastTick(raw, toString = false) {
4250
return new Promise(resolve =>
43-
this.$scope.ticksService
44-
.request({ symbol: this.symbol })
45-
.then(ticks => resolve(raw ? getLast(ticks) : getLast(ticks).quote))
51+
this.$scope.ticksService.request({ symbol: this.symbol }).then(ticks => {
52+
let lastTick = raw ? getLast(ticks) : getLast(ticks).quote;
53+
if (toString && !raw) {
54+
lastTick = lastTick.toFixed(this.getPipSize());
55+
}
56+
resolve(lastTick);
57+
})
4658
);
4759
}
4860
getLastDigit() {

src/botPage/bot/TradeEngine/Total.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,14 @@ export default Engine =>
8686
const accountStat = this.getAccountStat();
8787
return accountStat.totalRuns;
8888
}
89-
getTotalProfit() {
89+
getTotalProfit(toString, currency) {
9090
const accountStat = this.getAccountStat();
91-
return Number(accountStat.totalProfit);
91+
return toString && accountStat.totalProfit !== 0
92+
? roundBalance({
93+
currency,
94+
balance: +accountStat.totalProfit,
95+
})
96+
: +accountStat.totalProfit;
9297
}
9398
/* eslint-enable */
9499
checkLimits(tradeOption) {

0 commit comments

Comments
 (0)