This commit is contained in:
2024-05-17 21:12:22 +03:30
parent 642713072e
commit 4b14a57293
1703 changed files with 684613 additions and 0 deletions
View File
+946
View File
@@ -0,0 +1,946 @@
# Market Conditions
we study market and retrieve it's sense in an specific time by Capturing Market Conditions, which it is a Data Model based on Combination of Oscillators and Indicators in our Provider.
## Market Condition Model
```MQ5
//
// Represent Market Conditions ...
struct XEU5MarketConditions
{
//
// XTM ...
bool isXTMPeak;
bool isXTMVale;
bool isXTMBullish;
bool isXTMBearish;
bool isXTMNeutural;
bool isXTMEndBullish;
bool isXTMEndBearish;
bool isXTMStartBullish;
bool isXTMStartBearish;
bool isXTMEndBullishByNeutural;
bool isXTMEndBearishByNeutural;
bool isXTMStartBullishAfterNeutural;
bool isXTMStartBearishAfterNeutural;
//
// XAMA ...
bool isXAMAPeak;
bool isXAMAVale;
bool isXAMABullish;
bool isXAMABearish;
bool isXAMANeutural;
bool isXAMAEndBullish;
bool isXAMAEndBearish;
bool isXAMAStartBullish;
bool isXAMAStartBearish;
bool isXAMAEndBullishByNeutural;
bool isXAMAEndBearishByNeutural;
bool isXAMAStartBullishAfterNeutural;
bool isXAMAStartBearishAfterNeutural;
//
// XLH ...
bool isXLHHHIncreased;
bool isXLHHHDecreased;
bool isXLHLLIncreased;
bool isXLHLLDecreased;
bool isXLHLowAttachedLL;
bool isXLHHighAttachedHH;
bool isXLHHHSameInLength;
bool isXLHLLSameInLength;
bool isXLHPriceOverSignal;
bool isXLHPriceUnderSignal;
bool isXLHPriceInSignalRange;
bool isXLHPriceCrossedOverSignal;
bool isXLHPriceCrossedUnderSignal;
//
// XTD ...
bool isXTDSignalPeak;
bool isXTDSignalVale;
bool isXTDBullishPeak;
bool isXTDBullishVale;
bool isXTDBearishPeak;
bool isXTDBearishVale;
bool isXTDBullOverBear;
bool isXTDBullUnderBear;
bool isXTDSignalOverBear;
bool isXTDSignalUnderBear;
bool isXTDBullCrossedOverBear;
bool isXTDBullCrossedUnderBear;
bool isXTDSignalCrossedOverBear;
bool isXTDSignalCrossedUnderBear;
//
// XFI ...
bool isXFIPeak;
bool isXFIVale;
bool isXFICrossedOverZero;
bool isXFIOverZero;
bool isXFICrossedUnderZero;
bool isXFIUnderZero;
//
// XTS ...
bool isXTSAllSame;
bool isXTSCurrentMin;
bool isXTSCurrentMax;
bool isXTSCurrentOverFarest;
bool isXTSCurrentOverNearest;
bool isXTSCurrentOverMediest;
bool isXTSCurrentUnderFarest;
bool isXTSCurrentUnderNearest;
bool isXTSCurrentUnderMediest;
bool isXTSCurrentCrossedOverFarest;
bool isXTSCurrentCrossedOverNearest;
bool isXTSCurrentCrossedOverMediest;
bool isXTSCurrentCrossedUnderFarest;
bool isXTSCurrentCrossedUnderNearest;
bool isXTSCurrentCrossedUnderMediest;
//
// XRSI ...
bool isXRSIPeak;
bool isXRSIVale;
bool isXRSICrossedOverLongExit;
bool isXRSICrossedOverLongEntry;
bool isXRSICrossedUnderShortExit;
bool isXRSICrossedUnderShortEntry;
//
// XOBD ...
bool isXOBDSwingLow;
bool isXOBDSwingHigh;
//
// XCHLH ...
//
bool isXCHLHSameHHs;
bool isXCHLHSameLLs;
//
bool isXCHLHSCMCHHSame;
bool isXCHLHSCMCLLSame;
//
bool isXCHLHSCLCHHSame;
bool isXCHLHSCLCLLSame;
//
bool isXCHLHMCLCHHSame;
bool isXCHLHMCLCLLSame;
//
bool isXCHLHMCOnTopOfLC;
bool isXCHLHMCInBottomOfLC;
//
// XCHMA ...
//
bool isXCHMASCOverMax;
bool isXCHMASCOverMin;
bool isXCHMASCUnderMax;
bool isXCHMASCUnderMin;
//
bool isXCHMASCCrossedOverMax;
bool isXCHMASCCrossedUnderMax;
bool isXCHMASCCrossedOverMin;
bool isXCHMASCCrossedUnderMin;
//
bool isXCHMASCPeak;
bool isXCHMASCVale;
bool isXCHMASCTrendsUp;
bool isXCHMASCTrendsDown;
bool isXCHMASCFastOverSlow;
bool isXCHMASCFastUnderSlow;
bool isXCHMASCFastCrossedOverSlow;
bool isXCHMASCFastCrossedUnderSlow;
//
bool isXCHMAMCPeak;
bool isXCHMAMCVale;
bool isXCHMAMCTrendsUp;
bool isXCHMAMCTrendsDown;
bool isXCHMAMCFastOverSlow;
bool isXCHMAMCFastUnderSlow;
bool isXCHMAMCFastCrossedOverSlow;
bool isXCHMAMCFastCrossedUnderSlow;
//
bool isXCHMALCPeak;
bool isXCHMALCVale;
bool isXCHMALCTrendsUp;
bool isXCHMALCTrendsDown;
bool isXCHMALCFastOverSlow;
bool isXCHMALCFastUnderSlow;
bool isXCHMALCFastCrossedOverSlow;
bool isXCHMALCFastCrossedUnderSlow;
};
```
## Used Cases
for each Strategy we have some sort of Conditions, which i try to describe it here
```MQ5
//
// Define a Function based on Strategy and Signal Type ...
bool XStrategyHasLongSignal() {
//
// Define a result Variable to determines there is a Signal
// on Specific Time or not ...
bool result = false;
//
// Start Analysing Market based On Conditions ...
result =
//
// Base Condition:
// each Strategy must has a Base Conditions, which they are usually common combinations
// of Market Properties that must be happens to lookup for signals ...
(
//
false
//
)
//
&&
//
// Next Step is combine sorts of Conditions which make our choice
// so Exact in Market ...
(
//
false
//
)
//
&&
//
// Exceptions:
// there some commonly Exceptions which makes our choice incorrect,
// here we are combined knownly Exceptions ...
!(
//
// for Exception we used XLH Conditions as follow ...
//
// Check Conditions if Price In Signal Range ...
(xAU5Conditions.isXLHPriceInSignalRange &&
//
(
//
// Next Step is to Check LL and HH Same Style ...
//
// Check if Both LL and HH Same In Length ...
((xAU5Conditions.isXLHLLSameInLength &&
xAU5Conditions.isXLHHHSameInLength) &&
//
(
false)
//
)
//
||
//
// Check If LL Same In Length ...
((xAU5Conditions.isXLHLLSameInLength &&
!xAU5Conditions.isXLHHHSameInLength) &&
//
(
false)
//
)
//
||
//
// Check If HH is Same In Length ...
((xAU5Conditions.isXLHHHSameInLength &&
!xAU5Conditions.isXLHLLSameInLength) &&
//
(
false)
//
)
//
||
//
// Not Same LL or HH in Lenght ...
((!xAU5Conditions.isXLHHHSameInLength &&
!xAU5Conditions.isXLHLLSameInLength) &&
//
(
false)
//
)
//
)
//
)
//
||
//
// Check Conditions if Price is Under Signal ...
(
//
((xAU5Conditions.isXLHPriceUnderSignal ||
xAU5Conditions.isXLHPriceCrossedUnderSignal) &&
(
//
// Next Step is to Check LL and HH Same Style ...
//
// Check if Both LL and HH Same In Length ...
((xAU5Conditions.isXLHLLSameInLength &&
xAU5Conditions.isXLHHHSameInLength) &&
//
(
false)
//
)
//
||
//
// Check If LL Same In Length ...
((xAU5Conditions.isXLHLLSameInLength &&
!xAU5Conditions.isXLHHHSameInLength) &&
//
(
false)
//
)
//
||
//
// Check If HH is Same In Length ...
((xAU5Conditions.isXLHHHSameInLength &&
!xAU5Conditions.isXLHLLSameInLength) &&
//
(
false)
//
)
//
||
//
// Not Same LL or HH in Lenght ...
((!xAU5Conditions.isXLHHHSameInLength &&
!xAU5Conditions.isXLHLLSameInLength) &&
//
(
false)
//
)
//
)
//
)
//
)
//
||
//
// Check Conditions if Price is Over Signal ...
(
//
((xAU5Conditions.isXLHPriceOverSignal ||
xAU5Conditions.isXLHPriceCrossedOverSignal) &&
(
//
// Next Step is to Check LL and HH Same Style ...
//
// Check if Both LL and HH Same In Length ...
((xAU5Conditions.isXLHLLSameInLength &&
xAU5Conditions.isXLHHHSameInLength) &&
//
(
false)
//
)
//
||
//
// Check If LL Same In Length ...
((xAU5Conditions.isXLHLLSameInLength &&
!xAU5Conditions.isXLHHHSameInLength) &&
//
(
false)
//
)
//
||
//
// Check If HH is Same In Length ...
((xAU5Conditions.isXLHHHSameInLength &&
!xAU5Conditions.isXLHLLSameInLength) &&
//
(
false)
//
)
//
||
//
// Not Same LL or HH in Lenght ...
((!xAU5Conditions.isXLHHHSameInLength &&
!xAU5Conditions.isXLHLLSameInLength) &&
//
(
false)
//
)
//
)
//
)
//
)
//
||
//
// Check Conditions if Price is not has clear state ...
(
//
((!xAU5Conditions.isXLHPriceOverSignal &&
!xAU5Conditions.isXLHPriceUnderSignal &&
!xAU5Conditions.isXLHPriceInSignalRange &&
!xAU5Conditions.isXLHPriceCrossedOverSignal &&
!xAU5Conditions.isXLHPriceCrossedUnderSignal) &&
(
//
// Next Step is to Check LL and HH Same Style ...
//
// Check if Both LL and HH Same In Length ...
((xAU5Conditions.isXLHLLSameInLength &&
xAU5Conditions.isXLHHHSameInLength) &&
//
(
false)
//
)
//
||
//
// Check If LL Same In Length ...
((xAU5Conditions.isXLHLLSameInLength &&
!xAU5Conditions.isXLHHHSameInLength) &&
//
(
false)
//
)
//
||
//
// Check If HH is Same In Length ...
((xAU5Conditions.isXLHHHSameInLength &&
!xAU5Conditions.isXLHLLSameInLength) &&
//
(
false)
//
)
//
||
//
// Not Same LL or HH in Lenght ...
((!xAU5Conditions.isXLHHHSameInLength &&
!xAU5Conditions.isXLHLLSameInLength) &&
//
(
false)
//
)
//
)
//
)
//
)
//
)
//
;
//
// return the result ...
return result;
}
```
## Common Cases
there are many conditions which contains a combination of one or more condition and they are most commonly used.
here i described them and document them for prevent time spending to write them in each used case ...
### Resolve Stop Outs
in this step just focused on Peaks and Vales;
```MQ5
//
// Peaks ...
// Use Trends Down ...
//
(mConditions.isXCHMASCPeak &&
(mConditions.isXCHMASCFastOverSlow ||
mConditions.isXCHMASCFastCrossedOverSlow))
//
//
(mConditions.isXCHMAMCPeak &&
(mConditions.isXCHMAMCFastOverSlow ||
mConditions.isXCHMAMCFastCrossedOverSlow))
//
//
(mConditions.isXCHMALCPeak &&
(mConditions.isXCHMALCFastOverSlow ||
mConditions.isXCHMALCFastCrossedOverSlow))
//
// Vales ...
// Use Trends Up ...
//
(mConditions.isXCHMASCVale &&
(mConditions.isXCHMASCFastUnderSlow ||
mConditions.isXCHMASCFastCrossedUnderSlow))
//
//
(mConditions.isXCHMAMCVale &&
(mConditions.isXCHMAMCFastUnderSlow ||
mConditions.isXCHMAMCFastCrossedUnderSlow))
//
//
(mConditions.isXCHMALCVale &&
(mConditions.isXCHMALCFastUnderSlow ||
mConditions.isXCHMALCFastCrossedUnderSlow))
```
```MQ5
//
// Unders ...
//
((mConditions.isXCHMASCFastUnderSlow ||
mConditions.isXCHMASCFastCrossedUnderSlow) &&
(
//
()
//
)
//
)
//
//
((mConditions.isXCHMAMCFastUnderSlow ||
mConditions.isXCHMAMCFastCrossedUnderSlow) &&
(
//
()
//
)
//
)
//
//
((mConditions.isXCHMALCFastUnderSlow ||
mConditions.isXCHMALCFastCrossedUnderSlow) &&
(
//
()
//
)
//
)
//
//
// Overs ...
//
((mConditions.isXCHMASCFastOverSlow ||
mConditions.isXCHMASCFastCrossedOverSlow) &&
(
//
()
//
)
//
)
//
//
((mConditions.isXCHMAMCFastOverSlow ||
mConditions.isXCHMAMCFastCrossedOverSlow) &&
(
//
()
//
)
//
)
//
//
((mConditions.isXCHMALCFastOverSlow ||
mConditions.isXCHMALCFastCrossedOverSlow) &&
(
//
()
//
)
//
)
//
```
### Resolve Old Guard Attacks
in this step complete conditions;
### Resolve DrawDown Guard Attacks
in this step complete conditions;
### XCHMA Max Min Exceptions
```MQ5
//
// Exception Cases for XCHMA Min or Max ...
(
//
// XCHMA MAX ...
(
//
(mConditions.isXCHMASCOverMax ||
mConditions.isXCHMASCCrossedOverMax) &&
(mConditions.isXCHMASCUnderMax ||
mConditions.isXCHMASCCrossedUnderMax)
//
)
//
||
//
// XCHMA MIN ...
(
//
(mConditions.isXCHMASCOverMin ||
mConditions.isXCHMASCCrossedOverMin) &&
(mConditions.isXCHMASCUnderMin ||
mConditions.isXCHMASCCrossedUnderMin)
//
)
)
```
### XCHMA Cycles State
#### Short Cycle
```MQ5
//
// Check Bullish ...
bool isXCHMASCBullish =
//
(mConditions.isXCHMASCFastOverSlow ||
mConditions.isXCHMASCFastCrossedOverSlow)
//
;
//
// Check Full Bullish ...
bool isXCHMASCFullBullish =
//
(isXCHMASCBullish &&
!isXCHMASCTrendsDown)
//
;
```
```MQ5
//
// Check Bearish ...
bool isXCHMASCBearish =
//
(mConditions.isXCHMASCFastUnderSlow ||
mConditions.isXCHMASCFastCrossedUnderSlow)
//
;
//
// Check Full Bearish ...
bool isXCHMASCFullBearish =
//
(isXCHMASCBearish &&
!isXCHMASCTrendsDown)
//
;
```
```MQ5
//
// Check Not Vale and Peak ...
bool isXCHMASCNormal =
//
(!mConditions.isXCHMASCPeak &&
!mConditions.isXCHMASCVale)
//
;
```
#### Medium Cycle
```MQ5
//
// Check Bullish ...
bool isXCHMAMCBullish =
//
(mConditions.isXCHMAMCFastOverSlow ||
mConditions.isXCHMAMCFastCrossedOverSlow)
//
;
//
// Check Full Bullish ...
bool isXCHMAMCFullBullish =
//
(isXCHMAMCBullish &&
!isXCHMAMCTrendsDown)
//
;
```
```MQ5
//
// Check Bearish ...
bool isXCHMAMCBearish =
//
(mConditions.isXCHMAMCFastUnderSlow ||
mConditions.isXCHMAMCFastCrossedUnderSlow)
//
;
//
// Check Full Bearish ...
bool isXCHMAMCFullBearish =
//
(isXCHMAMCBearish &&
!isXCHMAMCTrendsDown)
//
;
```
```MQ5
//
// Check Not Vale and Peak ...
bool isXCHMAMCNormal =
//
(!mConditions.isXCHMAMCPeak &&
!mConditions.isXCHMAMCVale)
//
;
```
#### Long Cycle
```MQ5
//
// Check Bullish ...
bool isXCHMALCBullish =
//
(mConditions.isXCHMALCFastOverSlow ||
mConditions.isXCHMALCFastCrossedOverSlow)
//
;
//
// Check Full Bullish ...
bool isXCHMALCFullBullish =
//
(isXCHMALCBullish &&
!isXCHMALCTrendsDown)
//
;
```
```MQ5
//
// Check Bearish ...
bool isXCHMALCBearish =
//
(mConditions.isXCHMALCFastUnderSlow ||
mConditions.isXCHMALCFastCrossedUnderSlow)
//
;
//
// Check Full Bearish ...
bool isXCHMALCFullBearish =
//
(isXCHMALCBearish &&
!isXCHMALCTrendsDown)
//
;
```
```MQ5
//
// Check Not Vale and Peak ...
bool isXCHMALCNormal =
//
(!mConditions.isXCHMALCPeak &&
!mConditions.isXCHMALCVale)
//
;
```
### XCHMA Bullish Trend
```MQ5
//
// XCHMA Bullish Trend ...
bool isXCHMABullish =
//
(
//
// All of Cycles Bullish ...
(isXCHMASCBullish &&
isXCHMAMCBullish &&
isXCHMALCBullish)
//
||
//
// Two of Cycles Bullish ...
(
//
(isXCHMASCBullish &&
isXCHMAMCBullish)
//
||
//
(isXCHMASCBullish &&
isXCHMALCBullish)
//
||
//
(isXCHMAMCBullish &&
isXCHMALCBullish)
//
)
)
//
;
//
// XCHMA Full Bullish Trend ...
bool isXCHMAFullBullish =
//
(
//
// All of Cycles Fully Bullish ...
(isXCHMASCFullBullish &&
isXCHMAMCFullBullish &&
isXCHMALCFullBullish)
//
||
//
// Two Of Cycles Fully Bullish ...
(
//
(isXCHMASCFullBullish &&
isXCHMAMCFullBullish)
//
||
//
(isXCHMASCFullBullish &&
isXCHMALCFullBullish)
//
||
//
(isXCHMAMCFullBullish &&
isXCHMALCFullBullish)
//
)
//
)
//
;
```
### XCHMA Bearish Trend
```MQ5
//
// XCHMA Bearish Trend ...
bool isXCHMABearish =
//
(
//
// All of Cycles Bearish ...
(isXCHMASCBearish &&
isXCHMAMCBearish &&
isXCHMALCBearish)
//
||
//
// Two of Cycles Bearish ...
(
//
(isXCHMASCBearish &&
isXCHMAMCBearish)
//
||
//
(isXCHMASCBearish &&
isXCHMALCBearish)
//
||
//
(isXCHMAMCBearish &&
isXCHMALCBearish)
//
)
)
//
;
//
// XCHMA Full Bearish Trend ...
bool isXCHMAFullBearish =
//
(
//
// All of Cycles Fully Bearish ...
(isXCHMASCFullBearish &&
isXCHMAMCFullBearish &&
isXCHMALCFullBearish)
//
||
//
// Two Of Cycles Fully Bearish ...
(
//
(isXCHMASCFullBearish &&
isXCHMAMCFullBearish)
//
||
//
(isXCHMASCFullBearish &&
isXCHMALCFullBearish)
//
||
//
(isXCHMAMCFullBearish &&
isXCHMALCFullBearish)
//
)
//
)
//
;
```
+24
View File
@@ -0,0 +1,24 @@
# Best Forex Pairs
1.EURUSD
USDCHF => Negative Correlation
GBPUSD => Positive Correlation
2.USDJPY
Best for Carry Trade ...
USDCHF
USDCAD => Positive Correlation
3.GBPUSD
4.USDCAD
5.USDCNY
6.USDAUD
## High Risks
1.USDMXN
2.USDZAR
3.USDTHB
View File
+506
View File
@@ -0,0 +1,506 @@
/**
* XColor Tools Module ...
* a module for handle colorify text contents in node js ...
*
* Maintainer
*
* Hadi Khazaee Asl <https://saherelm.ir> (hadi_khazaee_asl@yahoo.com)
*/
//
//#region Module Imports ...
const XValueTools = require("./x-value.tools");
//#endregion
//
//#region Constants ...
/**
* these are available style which can applied to an string ...
*/
const AVAILABLE_STYLES = {
//
Bold: "\x1b[1m",
Dim: "\x1b[2m",
Underlined: "\x1b[4m",
Blink: "\x1b[5m",
ReverseFandB: "\x1b[7m",
Hidden: "\x1b[8m",
//
// Commonly used for reset all Styles ...
Reset: "\x1b[0m"
};
/**
* these are available foreground colors which can applied to an string ...
*/
const AVAILABLE_FOREGROUND_COLORS = {
Default: "\x1b[39m",
Black: "\x1b[30m",
Red: "\x1b[31m",
Green: "\x1b[32m",
Yellow: "\x1b[33m",
Blue: "\x1b[34m",
Magenta: "\x1b[35m",
Cyan: "\x1b[36m",
LightGray: "\x1b[37m",
DarkGray: "\x1b[90m",
LightRed: "\x1b[91m",
LightGreen: "\x1b[92m",
LightYellow: "\x1b[93m",
LightBlue: "\x1b[94m",
LightMagenta: "\x1b[95m",
LightCyan: "\x1b[96m",
White: "\x1b[97m",
};
/**
* these are available background colors which can applied to an string ...
*/
const AVAILABLE_BACKGROUND_COLORS = {
Default: "\x1b[49m",
Black: "\x1b[40m",
Red: "\x1b[41m",
Green: "\x1b[42m",
Yellow: "\x1b[43m",
Blue: "\x1b[44m",
Magenta: "\x1b[45m",
Cyan: "\x1b[46m",
LightGray: "\x1b[47m",
DarkGray: "\x1b[100m",
LightRed: "\x1b[101m",
LightGreen: "\x1b[102m",
LightYellow: "\x1b[103m",
LightBlue: "\x1b[104m",
LightMagenta: "\x1b[105m",
LightCyan: "\x1b[106m",
White: "\x1b[107m",
};
/**
* these are available style names, which exports from module and
* users can use them ...
*/
const STYLE_NAMES = {
Bold: "Bold",
Dim: "Dim",
Underlined: "Underlined",
Blink: "Blink",
ReverseFandB: "ReverseFandB",
Hidden: "Hidden",
Reset: "Reset",
};
/**
* these are available color names, which exports from module and
* users can use them ...
*/
const COLOR_NAMES = {
Default: "Default",
Black: "Black",
Red: "Red",
Green: "Green",
Yellow: "Yellow",
Blue: "Blue",
Magenta: "Magenta",
Cyan: "Cyan",
LightGray: "LightGray",
DarkGray: "DarkGray",
LightRed: "LightRed",
LightGreen: "LightGreen",
LightYellow: "LightYellow",
LightBlue: "LightBlue",
LightMagenta: "LightMagenta",
LightCyan: "LightCyan",
White: "White",
};
//#endregion
//
//#region Actions ...
/**
* apply specified style and color on a content ...
*
* @param {string} content specified content for styling ...
* @param {string} color specific color name for using to styling ...
* @param {string} style soecufic style name to use ...
* @param {boolean} toForeground apply specified color as foreground ...
* @param {boolean} toBackground apply specified color as background ...
* @returns {string} styled content ...
*/
function apply(
content,
color,
style,
toForeground = true,
toBackground = false
) {
//
let result = content;
//
// Validate Arg ...
if (!XValueTools.isValidArg(content)) {
return result;
}
//
// Detect and Validate Style and Apply it ...
let eStyle = AVAILABLE_STYLES[style];
if (XValueTools.isValidArg(eStyle)) {
result = `${eStyle}${result}${AVAILABLE_STYLES.Reset}`;
}
//
// Detect and Validate Foreground Color and Apply it ...
let eFColor = AVAILABLE_FOREGROUND_COLORS[color];
if (
!!toForeground
&& XValueTools.isValidArg(eFColor)
) {
result = `${eFColor}${result}${AVAILABLE_STYLES.Reset}`;
}
//
// Detect and Validate Background Color and Apply it ...
let eBColor = AVAILABLE_BACKGROUND_COLORS[color];
if (
!!toBackground
&& XValueTools.isValidArg(eBColor)
) {
result = `${eBColor}${result}${AVAILABLE_STYLES.Reset}`;
}
}
/**
* apply specific style on a content ...
*
* @param {string} content specific content which going to styled ...
* @param {string} style a member of STYLE_NAMES which specified that which style going to applied to content ...
* @returns {string} styled content ...
*/
function applyStyle(content, style) {
//
// Validate Arg ...
if (!XValueTools.isValidArg(content)) {
return content;
}
//
let eStyle = AVAILABLE_STYLES[style];
if (eStyle === undefined) {
return content;
}
//
return `${eStyle}${content}${AVAILABLE_STYLES.Reset}`;
}
/**
* apply specific foreground color on a content ...
*
* @param {string} content specific content which going to colorified ...
* @param {string} color a member of COLOR_NAMES which specified that which color going to applied to content ...
* @returns {string} colorified content ...
*/
function applyForegroundColor(content, color) {
//
// Validate Arg ...
if (!XValueTools.isValidArg(content)) {
return content;
}
//
let eColor = AVAILABLE_FOREGROUND_COLORS[color];
if (eColor === undefined) {
return content;
}
//
return `${eColor}${content}${AVAILABLE_STYLES.Reset}`;
}
/**
* apply specific background color on a content ...
*
* @param {string} content specific content which going to colorified ...
* @param {string} color a member of COLOR_NAMES which specified that which color going to applied to content ...
* @returns {string} colorified content ...
*/
function applyBackgroundColor(content, color) {
//
// Validate Arg ...
if (!XValueTools.isValidArg(content)) {
return content;
}
//
let eColor = AVAILABLE_BACKGROUND_COLORS[color];
if (eColor === undefined) {
return content;
}
//
return `${eColor}${content}${AVAILABLE_STYLES.Reset}`;
}
/**
* generate style and color applier expression ...
*
* @param {string} color specific color name for using to styling ...
* @param {string} style soecufic style name to use ...
* @param {boolean} reset close applier string by reset styles ...
* @param {boolean} toForeground apply specified color as foreground ...
* @param {boolean} toBackground apply specified color as background ...
* @returns {string} style and color applier string ...
*/
function getApplier(
style = "",
color = "",
reset = false,
toForeground = true,
toBackground = false
) {
//
let result = "";
//
// Detect and Validate Style and Apply it ...
let eStyle = AVAILABLE_STYLES[style];
if (XValueTools.isValidArg(eStyle)) {
result = `${eStyle}`;
}
//
// Detect and Validate Foreground Color and Apply it ...
let eFColor = AVAILABLE_FOREGROUND_COLORS[color];
if (
!!toForeground
&& XValueTools.isValidArg(eFColor)
) {
result = `${eFColor}`;
}
//
// Detect and Validate Background Color and Apply it ...
let eBColor = AVAILABLE_BACKGROUND_COLORS[color];
if (
!!toBackground
&& XValueTools.isValidArg(eBColor)
) {
result = `${eBColor}`;
}
//
if (
!!reset &&
result.length > 0
) {
result = `${result}${AVAILABLE_STYLES.Reset}`;
}
//
return result;
}
/**
* generate style applier expression ...
*
* @param {string} style soecufic style name to use ...
* @param {boolean} reset close applier string by reset styles ...
* @returns {string} style applier string ...
*/
function getStyleApplier(
style = "",
reset = false
) {
//
let result = "";
//
// Detect and Validate Style and Apply it ...
let eStyle = AVAILABLE_STYLES[style];
if (XValueTools.isValidArg(eStyle)) {
result = `${eStyle}`;
}
//
if (
!!reset &&
result.length > 0
) {
result = `${result}${AVAILABLE_STYLES.Reset}`;
}
//
return result;
}
/**
* generate color applier expression ...
*
* @param {string} color specific color name for using to styling ...
* @param {boolean} reset close applier string by reset styles ...
* @param {boolean} toForeground apply specified color as foreground ...
* @param {boolean} toBackground apply specified color as background ...
* @returns {string} color applier string ...
*/
function getColorApplier(
color = "",
reset = false,
toForeground = true,
toBackground = false
) {
//
let result = "";
//
// Detect and Validate Foreground Color and Apply it ...
let eFColor = AVAILABLE_FOREGROUND_COLORS[color];
if (
!!toForeground
&& XValueTools.isValidArg(eFColor)
) {
result = `${eFColor}`;
}
//
// Detect and Validate Background Color and Apply it ...
let eBColor = AVAILABLE_BACKGROUND_COLORS[color];
if (
!!toBackground
&& XValueTools.isValidArg(eBColor)
) {
result = `${eBColor}`;
}
//
if (
!!reset &&
result.length > 0
) {
result = `${result}${AVAILABLE_STYLES.Reset}`;
}
//
return result;
}
/**
* colorified specific content ...
*
* @param {string} content specified content for styling ...
* @param {string} color specific color name for using to styling ...
* @param {boolean} toForeground apply specified color as foreground ...
* @param {boolean} toBackground apply specified color as background ...
* @returns {string}
*/
function colorifyContent(
content = "",
color = "",
toForeground = true,
toBackground = false
) {
//
let result = content;
//
if (!XValueTools.isValidArg(content)) {
return result;
}
//
// Finde Colors ...
//
// Detect and Validate Foreground Color and Apply it ...
let eFColor = AVAILABLE_FOREGROUND_COLORS[color];
if (
!!toForeground
&& XValueTools.isValidArg(eFColor)
) {
result = `${eFColor}${result}`;
}
//
// Detect and Validate Background Color and Apply it ...
let eBColor = AVAILABLE_BACKGROUND_COLORS[color];
if (
!!toBackground
&& XValueTools.isValidArg(eBColor)
) {
result = `${eBColor}${result}`;
}
//
if (
result.length > 0
&& (
XValueTools.isValidArg(eFColor) ||
XValueTools.isValidArg(eBColor)
)
) {
result = `${result}${AVAILABLE_STYLES.Reset}`;
}
//
return result;
}
/**
* apply style on specific content ...
*
* @param {string} content specified content for styling ...
* @param {string} style soecufic style name to use ...
* @returns {string}
*/
function stylifiyContent(
content = "",
style = "",
) {
//
let result = content;
//
if (!XValueTools.isValidArg(content)) {
return result;
}
//
// Detect and Validate Style and Apply it ...
let eStyle = AVAILABLE_STYLES[style];
if (XValueTools.isValidArg(eStyle)) {
result = `${eStyle}${result}`;
}
//
if (
result.length > 0
&& XValueTools.isValidArg(eStyle)
) {
result = `${result}${AVAILABLE_STYLES.Reset}`;
}
//
return result;
}
//#endregion
//
//#region Module Exports ...
module.exports = {
//
STYLE_NAMES,
COLOR_NAMES,
//
apply,
applyStyle,
getApplier,
getColorApplier,
getStyleApplier,
colorifyContent,
stylifiyContent,
applyForegroundColor,
applyBackgroundColor,
}
//#endregion
+830
View File
@@ -0,0 +1,830 @@
/**
* XFile Tools Module ...
* a module for handle all file/folder manipulating task in node js ...
*
* Maintainer
*
* Hadi Khazaee Asl <https://saherelm.ir> (hadi_khazaee_asl@yahoo.com)
*/
//
//#region Module Imports ...
const fs = require('fs');
const os = require('os');
const Path = require('path');
const http = require('http');
const https = require('https');
const XValueTools = require('./x-value.tools');
//#endregion
//
//#region Constants ...
/**
* current os path separators ...
*/
const PathSeparator = Path.sep;
/**
* current directory ...
*/
const CurrentDir = __dirname;
//#endregion
//
//#region Actions ...
//
//#region Global ...
/**
* retrieve a path status ...
*
* @param {string} path a path value to check ...
* @returns an stat object ...
*/
function getStatus(path = '') {
//
if (!XValueTools.isValidArg(path)) {
return undefined;
}
//
return fs.statSync(path);
}
/**
* retrieve user's Home path ...
*
* @returns {string} a path ...
*/
function getHomePath() {
return os.homedir();
}
//#endregion
//
//#region Path ...
/**
* retrieve the base name of specific address path ...
*
* @param {string} path address of file or folder ...
* @returns string ...
*/
function basename(path = '') {
//
if (!XValueTools.isValidArg(path)) {
return '';
}
//
const result = Path.basename(path);
return result;
}
/**
* join several path segments together ...
*
* @param {...string} path path params ...
* @returns a joined paths ...
*/
function joinPath(...path) {
return Path.join(...path);
}
/**
* resolve a relative path to absolute ...
*
* @param {string[]} path a path value to check ...
* @returns {string}
*/
function resolvePath(...path) {
return Path.resolve(...path);
}
//#endregion
//
//#region File ...
/**
* determines a path destination is a file or not ...
*
* @param {string} path a path value to check ...
* @returns a boolean value ...
*/
function isFileExists(path = '') {
//
if (!XValueTools.isValidArg(path)) {
return false;
}
//
try {
const stat = getStatus(path);
if (!stat) {
return false;
}
//
return stat.isFile();
} catch {
return false;
}
}
/**
* remove a file ...
*
* @param {string} path a file path ...
* @returns {Promise<boolean>} action done or not ...
*/
function removeFile(path = '') {
return new Promise((resolve) => {
//
if (!isFileExists(path)) {
resolve(false);
}
//
fs.unlink(path, (err) => {
//
if (err) {
resolve(false);
return;
}
//
resolve(true);
});
});
}
/**
* copy a file to destination path ...
*
* @param {string} source source file path ...
* @param {string} dest dest folder path ...
* @returns {Promise<boolean>} action done or not ...
*/
function copyFile(
source = '',
dest = ''
) {
return new Promise((resolve) => {
//
if (
!isFileExists(source) ||
!isDirectoryExists(dest)
) {
resolve(false);
return;
}
//
const destFilePath = Path.join(dest, Path.basename(source));
fs.copyFile(source, destFilePath, (err) => {
//
if (err) {
resolve(false);
return;
}
//
resolve(true);
});
});
}
/**
* reading specified file content ...
*
* @param {string} path a file path ...
* @returns {Promise<string>} file content ...
*/
function readFile(path = '') {
return new Promise((resolve) => {
//
if (!isFileExists(path)) {
resolve('');
return;
}
//
fs.readFile(path, 'utf8', (err, content) => {
//
if (err) {
resolve(undefined);
return;
}
//
resolve(content);
});
});
}
/**
* write content to a file ...
*
* @param {string} path a file path ...
* @param {string} content the content which going to write to the file ...
* @param {bool} overwrite determines file overwrite if exists ...
* @returns {Promise<boolean>} action done or not ...
*/
function writeFile(
path = '',
content = '',
overwrite = true
) {
return new Promise((resolve) => {
//
if (isFileExists(path) && !overwrite) {
//
resolve(false);
return;
}
//
// Normalize Content ...
content = XValueTools.isValidArg(content) ?
content :
'';
//
fs.writeFile(path, content, (err) => {
//
if (err) {
//
resolve(false);
return;
}
//
resolve(true);
});
});
}
/**
* create a file ...
*
* @param {string} path file path ...
* @param {string} fileName file name ...
* @returns {Promise<boolean>} action done or not ...
*/
function createFile(
path = '',
fileName = ''
) {
return new Promise((resolve) => {
//
const filePath = Path.join(path, fileName);
if (
isFileExists(filePath) ||
!XValueTools.isValidArg(path) ||
!XValueTools.isValidArg(fileName)
) {
//
resolve(false);
return;
}
//
fs.writeFile(filePath, '', (err) => {
//
if (err) {
//
resolve(false);
return;
}
//
resolve(true);
});
});
}
/**
* remove a file name extension ...
*
* @param {string} name
* @returns {string} name without extension ...
*/
function removeFileExtension(name = '') {
return name.substring(0, name.lastIndexOf('.')) || name;
}
/**
* retrieve a file extension ...
*
* @param {string} path a path which locate a file ...
* @returns {string}
*/
function getFileExtension(path = '') {
//
let result = "";
//
// Validate Arg ...
if (
!XValueTools.isValidArg(path)
|| !isFileExists(path)
) {
return result;
}
//
// Retrieve just file name ...
const fileName = basename(path);
result = fileName.replace(
removeFileExtension(fileName),
""
);
//
return result;
}
/**
* retrieve all files list recursively from specific path ...
*
* @param {string} path a source folder path ...
* @param {string[]} extensions which file extensions need to be listed, live empty for all files ...
* @returns {Promise<string[]>}
*/
async function getRecursiveFilesList(
path = "",
extensions = []
) {
//
let result = [];
//
// Validate Args ...
if (
!XValueTools.isValidArg(path)
|| !isDirectoryExists(path)
) {
return result;
}
//
const contents = await getDirectoryContents(path);
for(const item of contents) {
//
const itemPath = joinPath(
path,
item
);
//
const isItemFile = isFileExists(itemPath);
if (isItemFile) {
//
const itemFileExtension = getFileExtension(itemPath);
const isFileInSupportedExtensions =
extensions === undefined || extensions.length === 0
? true
: extensions.includes(itemFileExtension)
;
if (isFileInSupportedExtensions) {
result.push(itemPath);
}
} else if (isDirectoryExists(itemPath)) {
//
const itemPathFiles = await getRecursiveFilesList(itemPath, extensions);
result.push(...itemPathFiles);
}
}
//
return result;
}
//#endregion
//
//#region Directory ...
/**
* create a directory ...
*
* @param {string} path destination path including dir name ...
* @param {boolean} recursive create directories recursively ...
* @returns action done or not ...
*/
function createDirectory(
path = '',
recursive = true
) {
//
let result = false;
//
if (
isDirectoryExists(path) ||
!XValueTools.isValidArg(path)
) {
return false;
}
//
try {
//
fs.mkdirSync(path, { recursive: recursive });
result = true;
return result;
} catch {
return false;
}
}
/**
* remove a directory ...
*
* @param {string} path destination path including dir name ...
* @param {boolean} recursive removes directories recursively ...
* @returns {Promise<boolean>} action done or not ...
*/
function removeDirectory(
path = '',
recursive = false
) {
return new Promise((resolve) => {
//
if (!isDirectoryExists(path)) {
resolve(false);
return;
}
//
fs.rm(path, {
recursive
}, (err) => {
//
if (err) {
resolve(false);
return;
}
//
resolve(true);
});
});
}
/**
* determines a path destination is a directory or not ...
*
* @param {string} path a folder path ...
* @returns represent destnation path is Directory or not ...
*/
function isDirectoryExists(path = '') {
//
if (!XValueTools.isValidArg(path)) {
return false;
}
//
try {
//
const isExists = fs.existsSync(path);
if (!isExists) {
return false;
}
//
const stat = getStatus(path);
if (!stat) {
return false;
}
//
const result = stat.isDirectory();
return result;
} catch {
return false;
}
}
/**
* retrieve a directory content ...
*
* @param {string} path a folder path ...
* @returns {Promise<string[]>} a collection of folder files ...
*/
function getDirectoryContents(path = '') {
return new Promise((resolve) => {
//
if (!isDirectoryExists(path)) {
resolve([]);
return;
}
//
fs.readdir(path, (err, content) => {
//
if (err) {
resolve([]);
return;
}
//
resolve(content);
});
});
}
/**
* retrieve a directory files ...
*
* @param {string} path a folder path ...
* @returns {Promise<string[]>} a collection of folder files ...
*/
function getDirectoryFiles(
path = '',
containsHiddenFiles = false
) {
return new Promise((resolve) => {
//
if (!isDirectoryExists(path)) {
resolve([]);
return;
}
//
fs.readdir(path, (err, content) => {
//
if (err) {
resolve([]);
return;
}
//
if (!containsHiddenFiles) {
content = content.filter(c => !c.startsWith('.'));
}
//
const result = [];
content
.forEach(c => {
//
const cPath = Path.join(path, c);
if (isFileExists(cPath)) {
result.push(c);
}
});
//
resolve(result);
});
});
}
/**
* retrieve a directory folders ...
*
* @param {string} path a folder path ...
* @returns {Promise<string[]>} a collection of folder names ...
*/
function getDirectoryFolders(path = '') {
return new Promise((resolve) => {
//
if (!isDirectoryExists(path)) {
resolve([]);
return;
}
//
fs.readdir(path, (err, content) => {
//
if (err) {
resolve([]);
return;
}
//
const result = [];
content.forEach(c => {
//
const cPath = Path.join(path, c);
if (isDirectoryExists(cPath)) {
result.push(c);
}
});
//
resolve(result);
});
});
}
/**
* copy a folder with all of it's content to dest ...
*
* @param {string} source source folder path ...
* @param {string} dest dest folder path ...
* @returns {Promise<boolean>} action done or not ...
*/
async function copyFolder(
source = '',
dest = ''
) {
//
if (
!isDirectoryExists(source) ||
!XValueTools.isValidArg(dest) ||
!XValueTools.isValidArg(source)
) {
return false;
}
//
const folderName = Path.basename(source);
const destPath = Path.join(dest, folderName);
//
// Create Dest Path folder if not exists ...
if (!isDirectoryExists(destPath)) {
//
let result = createDirectory(destPath, true);
if (!result) {
return false;
}
}
//
// Files ...
const files = await getDirectoryFiles(source);
if (files && files.constructor === Array && files.length > 0) {
//
const filesPromises = files.map(file => copyFile(Path.join(source, file), destPath));
const filesResult = (await Promise.all(filesPromises)).every(r => !!r);
if (!filesResult) {
return false;
}
}
//
// Folders ...
const folders = await getDirectoryFolders(source);
if (folders && folders.constructor === Array && folders.length > 0) {
//
const folderPromises = folders.map(folder => copyFolder(Path.join(source, folder), destPath));
const filesResult = (await Promise.all(folderPromises)).every(r => !!r);
if (!filesResult) {
return false;
}
}
//
return true;
}
//#endregion
//
//#region Downloader ...
/**
* download a file from specific url and store it ...
*
* @param {string} filepath the file name and path which required to put download file on it ...
* @param {string} url the web url for downloading ...
*/
function download(filepath, url) {
//
// Validate Args ...
if (
!XValueTools.isValidArg(url)
|| !XValueTools.isValidURL(url)
|| !XValueTools.isValidArg(filepath)
) {
return;
}
//
var file = fs.createWriteStream(filepath);
//
if (url.startsWith('https:')) {
https.get(url, function (response) {
response.pipe(file);
});
} else if (url.startsWith('http:')) {
http.get(url, function (response) {
response.pipe(file);
});
}
}
//#endregion
//
//#region JSON ...
/**
* read and parse a JSON content from a file ...
*
* @param {string} path source file path ...
* @returns {any}
*/
function readJSON(path = "") {
//
// Validate Args ...
if (!isFileExists(path)) {
return undefined;
}
//
let result = undefined;
try {
result = require(path);
} catch {
result = undefined;
}
//
return result;
}
/**
* write a JSON Object content into a file ...
*
* @param {string} path dest file path ...
* @param {any} content an object which required to write to file ...
* @returns {Promise<boolean>}
*/
async function writeJSON(
path = "",
content = undefined
) {
//
let result = false;
//
// Validate Args ...
if (!XValueTools.isValidArg(path)) {
return result;
}
//
// Normallize Content ...
if (content === undefined) {
content = {};
}
//
const contentString = XValueTools.beautifyJSON(content);
//
result = await writeFile(
path,
contentString,
true
);
//
return result;
}
//#endregion
//#endregion
//
//#region Module Exports ...
module.exports = {
//
CurrentDir,
PathSeparator,
//
getStatus,
getHomePath,
//
basename,
joinPath,
resolvePath,
//
download,
//
readJSON,
writeJSON,
//
copyFile,
readFile,
writeFile,
createFile,
removeFile,
isFileExists,
getFileExtension,
removeFileExtension,
getRecursiveFilesList,
//
copyFolder,
createDirectory,
removeDirectory,
createDirectory,
removeDirectory,
isDirectoryExists,
isDirectoryExists,
getDirectoryFiles,
getDirectoryFolders,
getDirectoryContents,
}
//#endregion
+219
View File
@@ -0,0 +1,219 @@
/**
* XShell Tools Module ...
* a module for handling shell actions and retrieve OS Info in node js ...
*
* Maintainer
*
* Hadi Khazaee Asl <https://saherelm.ir> (hadi_khazaee_asl@yahoo.com)
*/
//
//#region Imports ...
const os = require('os');
const process = require('process');
const { exec } = require("child_process");
const XFileTools = require('./x-file.tools');
//#endregion
//
//#region Constants ...
//
const OS = {
Aix: 'aix',
Darwin: 'darwin',
FreeBSD: 'freebsd',
Linux: 'linux',
OpenBSD: 'openbsd',
SnOS: 'sunos',
Windows: 'win32'
};
//
const isWindows = process.platform === OS.Windows;
//#endregion
//
//#region Actions ...
//
//#region Pure shell commands ...
/**
* execute a command using NodeJS on shell ...
*
* @param {string} cmd command to execute ...
* @param {string} cwd working directory ...
*
* @returns Promise<any, errr> instance ...
*/
function execute(cmd, cwd) {
return new Promise((resolve, reject) => {
//
if (!cmd || cmd.toString().length === 0 || (cwd && !XFileTools.isDirectoryExists(cwd))) {
reject('invalid args ...');
return;
}
//
exec(cmd, { cwd }, (err, result, stdError) => {
//
if (err) {
reject(err);
return;
}
//
if (stdError) {
//
// reject(stdError);
// return;
}
//
resolve(result);
});
});
};
/**
* determines a command exists on host or not ...
*
* @param {string} name specific command name ...
*
* @returns boolean Promise ...
*/
function checkCommandExists(name) {
return new Promise(resolve => {
//
if (!name) {
resolve(false);
return;
}
//
const cmd = isWindows ? `${name} >nul 2>&1` : `type ${name} >/dev/null 2>&1`;
execute(cmd).then(result => {
resolve(true);
})
.catch(err => {
resolve(false);
});
});
}
//#endregion
//
//#region required commands state ...
/**
* check al required commands exists or not ...
*
* @returns
*/
async function isRequiredCommandsExists() {
//
let result = false;
//
// const isTarExists = await isTarCommandExists();
// const isCatExists = await isCatCommandExists();
// const isGrepExists = await isGrepCommandExists();
// const isSedExists = await isSedCommandExists();
const isNpmExists = await isNpmCommandExists();
const isNgExists = await isNgCommandExists();
const isIonicExists = await isIonicCommandExists();
const isCordovaExists = await isCordovaCommandExists();
//
result = isNpmExists
&& isNgExists
&& isIonicExists
&& isCordovaExists
;
//
return result;
}
/**
* retrieve required commands state object ...
*
* @returns
*/
async function getRequiredCommandsStates() {
//
const result = {};
//
// const isTarExists = await isTarCommandExists();
// const isCatExists = await isCatCommandExists();
// const isGrepExists = await isGrepCommandExists();
// const isSedExists = await isSedCommandExists();
const isNpmExists = await isNpmCommandExists();
const isNgExists = await isNgCommandExists();
const isIonicExists = await isIonicCommandExists();
const isCordovaExists = await isCordovaCommandExists();
//
result['npm'] = isNpmExists;
result['ng'] = isNgExists;
result['ionic'] = isIonicExists;
result['cordova'] = isCordovaExists;
//
return result;
}
//#endregion
//
//#region Commonly used Command Checkers ...
/**
* determines npm command exists or not ...
*
* @returns
*/
function isNpmCommandExists() {
return checkCommandExists('npm');
}
/**
* determines ng command exists or not ...
*
* @returns
*/
function isNgCommandExists() {
return checkCommandExists('ng');
}
/**
* determines ionic command exists or not ...
*
* @returns
*/
function isIonicCommandExists() {
return checkCommandExists('ionic');
}
/**
* determines cordova command exists or not ...
*
* @returns
*/
function isCordovaCommandExists() {
return checkCommandExists('cordova');
}
//#endregion
//#endregion
//
//#region Module Exports ...
module.exports = {
//
execute,
checkCommandExists,
isRequiredCommandsExists,
getRequiredCommandsStates,
//
isNgCommandExists,
isIonicCommandExists,
isCordovaCommandExists,
}
//#endregion
@@ -0,0 +1,268 @@
/**
* DataType Tools Module ...
* a module for manipulate and detect supported data types in node js ...
*
* Maintainer
*
* Hadi Khazaee Asl <https://saherelm.ir> (hadi_khazaee_asl@yahoo.com)
*/
//
//#region Constants ...
/**
* all supported data types ...
*/
const DataTypes = {
Null: 'null',
Date: 'date',
Array: 'array',
Object: 'object',
String: 'string',
Number: 'number',
Unknown: 'unknown',
Boolean: 'boolean',
Function: 'function',
Undefined: 'undefined',
};
//#endregion
//
//#region Actions ...
/**
* detect type of a content ...
*
* @param {any} value the content which going to check ...
* @returns
*/
function getType(value) {
//
const type = typeof value;
//
let result = DataTypes.Unknown;
let dateIdentifier = '[object Date]';
let constructor = value && value.constructor ?
value.constructor.toString() :
'';
//
switch (type) {
//
case 'undefined':
result = DataTypes.Undefined;
break;
//
case 'boolean':
result = DataTypes.Boolean;
break;
//
case 'string':
result = DataTypes.String;
break;
//
case 'number':
result = DataTypes.Number;
break;
//
case 'function':
result = DataTypes.Function;
break;
//
case 'object':
//
// Null ...
if (value === null) {
result = DataTypes.Null;
} else
//
// Array ...
if (Array.isArray(value)) {
result = DataTypes.Array;
} else
//
// Data ...
if (
value instanceof Date ||
isFunction(value.getMonth) ||
constructor.includes(dateIdentifier) ||
Object.prototype.toString.call(value) === dateIdentifier
) {
result = DataTypes.Date;
} else
//
// Object ...
{
result = DataTypes.Object;
}
break;
//
default:
result = DataTypes.Unknown;
break;
}
//
return result;
}
/**
* retrieve an object constructor ...
*
* @param {any} value the content which going to check ...
* @returns
*/
function getConstructor(value) {
//
const result = value && value.constructor ?
value.constructor.toString() :
'';
//
return result;
}
/**
* retrieve an object prototype ...
*
* @param {any} value the content which going to check ...
* @returns
*/
function getPrototype(value) {
//
const result = value ?
Object.prototype.toString.call(value) :
'';
//
return result;
}
/**
* check an object is null or not ...
*
* @param {any} value the content which going to check ...
* @returns
*/
function isNull(value) {
return getType(value) === DataTypes.Null;
}
/**
* check an object is undefined or not ...
*
* @param {any} value the content which going to check ...
* @returns
*/
function isUndefined(value) {
return getType(value) === DataTypes.Undefined;
}
/**
* check an object is null or undefined or not ...
*
* @param {any} value the content which going to check ...
* @returns
*/
function isNullOrUndefined(value) {
return isNull(value) || isUndefined(value);
}
/**
* check an object is a date or not ...
*
* @param {any} value the content which going to check ...
* @returns
*/
function isDate(value) {
return getType(value) === DataTypes.Date;
}
/**
* check an object is number or not ...
*
* @param {any} value the content which going to check ...
* @returns
*/
function isNumber(value) {
return getType(value) === DataTypes.Number;
}
/**
* check an object is string or not ...
*
* @param {any} value the content which going to check ...
* @returns
*/
function isString(value) {
return getType(value) === DataTypes.String;
}
/**
* check an object is boolean or not ...
*
* @param {any} value the content which going to check ...
* @returns
*/
function isBoolean(value) {
return getType(value) === DataTypes.Boolean;
}
/**
* check an object is an Array or not ...
*
* @param {any} value the content which going to check ...
* @returns
*/
function isArray(value) {
return getType(value) === DataTypes.Array;
}
/**
* check an object is and Object or not ...
*
* @param {any} value the content which going to check ...
* @returns
*/
function isObject(value) {
return getType(value) === DataTypes.Object;
}
/**
* check an object is a Function or not ...
*
* @param {any} value the content which going to check ...
* @returns
*/
function isFunction(value) {
return getType(value) === DataTypes.Function;
}
//#endregion
//
//#region Module Exports ...
module.exports = {
//
DataTypes,
//
getType,
getConstructor,
getPrototype,
isNull,
isUndefined,
isNullOrUndefined,
isDate,
isNumber,
isString,
isBoolean,
isArray,
isObject,
isFunction,
}
//#endregion
File diff suppressed because it is too large Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+82
View File
@@ -0,0 +1,82 @@
AMarkets-Real
GrowthNext
OANDA
MetaQuotes
HFMarkets
AMarkets-Demo
IFCMarkets
ErranteSC
Alpari
All Markets
Resolve Guard Attacks ...
XTD
----
Resolve XGBUS5 XTD Long Stopouts in IFCMarkets ...
Resolve XGBUS5 XTD Long Stopouts in AMarkets-Demo ...
Resolve XGBUS5 XTD All Longs Critical Guard Attacks in All Markets ...
Resolve XGBUS5 XTD All Guard Attacks in All Markets ...
XTAM
-----
Resolve XGBUS5 XTAM All Stopouts in All Markets ...
Resolve XGBUS5 XTAM All Critical Guard Attacks in All Markets ...
Resolve XGBUS5 XTAM All Guard Attacks in All Markets ...
XSI
----
Resolve XGBUS5 XSI All Stopouts in All Markets ...
Resolve XGBUS5 XSI All Critical Guard Attacks in All Markets ...
Resolve XGBUS5 XSI All Guard Attacks in All Markets ...
XTSFI
------
Resolve XGBUS5 XTSFI All Stopouts in All Markets ...
Resolve XGBUS5 XTSFI All Critical Guard Attacks in All Markets ...
Resolve XGBUS5 XTSFI All Guard Attacks in All Markets ...
XCHMACC
--------
Resolve XGBUS5 XCHMACC All Stopouts in All Markets ...
Resolve XGBUS5 XCHMACC All Critical Guard Attacks in All Markets ...
Resolve XGBUS5 XCHMACC All Guard Attacks in All Markets ...
XOBDLH
--------
Resolve XGBUS5 XOBDLH All Stopouts in All Markets ...
Resolve XGBUS5 XOBDLH Longs All Critical Guard Attacks in All Markets ...
Resolve XGBUS5 XOBDLH Shorts All Critical Guard Attacks in All Markets ...
Resolve XGBUS5 XOBDLH All Guard Attacks in All Markets ...
XCHMAMX
--------
Resolve XGBUS5 XCHMAMX All Stopouts in All Markets ...
Resolve XGBUS5 XCHMAMX Longs All Critical Guard Attacks in All Markets ...
Resolve XGBUS5 XCHMAMX Shorts All Critical Guard Attacks in All Markets ...
Resolve XGBUS5 XCHMAMX All Guard Attacks in All Markets ...
XCHMAMN
--------
Resolve XGBUS5 XCHMAMN All Stopouts in All Markets ...
Resolve XGBUS5 XCHMAMN Longs All Critical Guard Attacks in All Markets ...
Resolve XGBUS5 XCHMAMN Shorts All Critical Guard Attacks in All Markets ...
Resolve XGBUS5 XCHMAMN All Guard Attacks in All Markets ...
@@ -0,0 +1,65 @@
//
// Check if SC Fast Over Slow ...
((mConditions.isXCHMASCFastOverSlow ||
mConditions.isXCHMASCFastCrossedOverSlow) &&
(
//
//
)
//
)
//
// Check if SC Fast Under Slow ...
((mConditions.isXCHMASCFastUnderSlow ||
mConditions.isXCHMASCFastCrossedUnderSlow) &&
(
//
//
)
//
)
//
// Check if MC Fast Over Slow ...
((mConditions.isXCHMAMCFastOverSlow ||
mConditions.isXCHMAMCFastCrossedOverSlow) &&
(
//
//
)
//
)
//
// Check if MC Fast Under Slow ...
((mConditions.isXCHMAMCFastUnderSlow ||
mConditions.isXCHMAMCFastCrossedUnderSlow) &&
(
//
//
)
//
)
//
// Check LC Fast Over Slow ...
((mConditions.isXCHMALCFastOverSlow ||
mConditions.isXCHMALCFastCrossedOverSlow) &&
(
//
//
)
//
)
//
// Check LC Fast Under Slow ...
((mConditions.isXCHMALCFastUnderSlow ||
mConditions.isXCHMALCFastCrossedUnderSlow) &&
(
//
//
)
//
)
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,171 @@
//
// Enable Signaller ...
bool EnableSXSIGNALLERNAMEignaller() {
//
bool result = false;
//
// Validate Args ...
if (mXSIGNALLERNAMEEnableSignaller) {
return result;
}
//
result = true;
mXSIGNALLERNAMEEnableSignaller = true;
//
return result;
}
//
// Disable Signaller ...
bool DisbaleXSIGNALLERNAMESignaller() {
//
bool result = false;
//
// Validate Args ...
if (!mXSIGNALLERNAMEEnableSignaller) {
return result;
}
//
result = true;
mXSIGNALLERNAMEEnableSignaller = false;
//
return result;
}
//
// Allow Sginaller to Issue Long Signals ...
bool EnableXSIGNALLERNAMELongs() {
//
bool result = false;
//
// Validate Args ...
if (
!mXSIGNALLERNAMEEnableSignaller ||
mXSIGNALLERNAMEAllowLongSignals
) {
return result;
}
//
result = true;
mXSIGNALLERNAMEAllowLongSignals = true;
//
return result;
}
//
// Disallow Signaller to Issue Long Signals ...
bool DisbaleXSIGNALLERNAMELongs() {
//
bool result = false;
//
// Validate Args ...
if (
!mXSIGNALLERNAMEEnableSignaller ||
!mXSIGNALLERNAMEAllowLongSignals
) {
return result;
}
//
result = true;
mXSIGNALLERNAMEAllowLongSignals = false;
//
return result;
}
//
// Allow Signaller to Issue Short Sginals ...
bool EnableXSIGNALLERNAMEShorts() {
//
bool result = false;
//
// Validate Args ...
if (
!mXSIGNALLERNAMEEnableSignaller ||
mXSIGNALLERNAMEAllowShortSignals
) {
return result;
}
//
result = true;
mXSIGNALLERNAMEAllowShortSignals = true;
//
return result;
}
//
// Disallow Signaller to Issue Short Signals ...
bool DisableXSIGNALLERNAMEShorts() {
//
bool result = false;
//
// Validate Args ...
if (
!mXSIGNALLERNAMEEnableSignaller ||
!mXSIGNALLERNAMEAllowShortSignals
) {
return result;
}
//
result = true;
mXSIGNALLERNAMEAllowShortSignals = false;
//
return result;
}
//
// Check Market Base Conditions for Long Signals ...
bool XSIGNALLERNAMEHasLongConditions() {
//
bool result = false;
//
// Validate Args ...
if (
!mXSIGNALLERNAMEEnableSignaller ||
!mXSIGNALLERNAMEAllowLongSignals
) {
return result;
}
//
return result;
}
//
// Check Market Base Conditions for Short Signals ...
bool XSIGNALLERNAMEHasShortConditions() {
//
bool result = false;
//
// Validate Args ...
if (
!mXSIGNALLERNAMEEnableSignaller ||
!mXSIGNALLERNAMEAllowShortSignals
) {
return result;
}
//
return result;
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff