Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Development fixes #20

Merged
merged 32 commits into from
Aug 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
e0ba0f9
Adds README for multi-value indicators
kenorb Aug 26, 2023
4ab6544
Renames some oscillators to multi-value sub-category
kenorb Aug 26, 2023
76f0284
Renames TDI int shorter name to fit as resource name
kenorb Aug 26, 2023
bf48827
GHA: Adds workflow_call
kenorb Sep 12, 2023
703730c
SuperTrend: Adds properties for MQL4
kenorb Oct 4, 2023
0a54c86
SuperTrend: Adds OnCalculate()
kenorb Oct 4, 2023
4b14347
GHA: Compile: Clarify repository when calling workflow externally
kenorb Oct 24, 2023
dc15c77
Fixes newline at end of file
kenorb Oct 24, 2023
5c3ce59
GHA: Specifies the current branch
kenorb Oct 25, 2023
8f8b7ce
GHA: Uploads .ex[45] files only
kenorb Oct 25, 2023
7fe0600
Improves Compile workflow without matrix
kenorb Oct 26, 2023
bdf8229
GHA: Compile: Uses env.INDI_OTHER_WORKDIR syntax
kenorb Oct 26, 2023
f704b05
GHA: Improvements for INDI_OTHER_WORKDIR
kenorb Oct 27, 2023
ccd5ed1
Refs EA31337/Strategy-TDI#1. WIP. Fixes zero divide in MT4 code. Adde…
nseam Jan 4, 2024
133bbb1
Merge remote-tracking branch 'nseam/dev-tdi-mt5-wrapper' into dev
kenorb Jan 5, 2024
e6b75b6
GHA: Implements new method of compilation workflow
kenorb Feb 11, 2024
9309351
GHA: Compile: Adds with.workdir
kenorb Feb 11, 2024
ac29b3d
Revert "GHA: Compile: Adds with.workdir"
kenorb Feb 11, 2024
0c4ee92
Adds with variables
kenorb Feb 11, 2024
1599c3c
GHA: Uses workflow from EA-Tester repo instead
kenorb Feb 11, 2024
cff9ad8
GHA: Adds clean-up job
kenorb Feb 12, 2024
1177e07
GHA: Updates actions/checkout and actions/upload-artifact to v4
kenorb Feb 12, 2024
a77dcc8
Upload files to different artifacts
kenorb Feb 17, 2024
9d1ff39
Runs cleanup on failure
kenorb Feb 17, 2024
2cfc57c
Adds artifact_prefix workflow input
kenorb Feb 17, 2024
0d8e327
Revert "Adds artifact_prefix workflow input"
kenorb Feb 17, 2024
20ed9e0
GHA: Compile: Sets artifact_overwrite to true
kenorb Feb 17, 2024
92320a7
GHA: Compile: Improves Compile workflow
kenorb May 5, 2024
45610f8
GHA: Fixes for Compile workflow
kenorb Aug 20, 2024
d28c94f
GHA: Compile: Adds prefix to artifact
kenorb Aug 20, 2024
c86369a
GHA: Compile: Adds checkout_branch input
kenorb Aug 20, 2024
87b50d3
Merge remote-tracking branch 'origin/master' into dev
kenorb Aug 20, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
172 changes: 131 additions & 41 deletions .github/workflows/compile.yml
Original file line number Diff line number Diff line change
@@ -1,80 +1,170 @@
---
name: Compile

# Setting an environment variable with the value of a configuration variable.
env:
ARTIFACT_PREFIX: ${{ inputs.artifact_prefix || 'mt' }}
# yamllint disable-line rule:line-length
CHECKOUT_BRANCH: ${{ inputs.checkout_branch || github.head_ref || github.ref_name }}
INDI_OTHER_WORKDIR: ${{ vars.INDI_OTHER_WORKDIR || 'indicators-other' }}
REPOSITORY: EA31337/EA31337-indicators-other
SKIP_CLEANUP: ${{ inputs.skip_cleanup || false }}

# yamllint disable-line rule:truthy
on:
pull_request:
branches:
- 'master'
- 'dev*'
- '*dev*'
paths-ignore:
- '*.md'
- '.git*'
push:
branches:
- 'master'
- 'dev*'
- '*dev*'
paths-ignore:
- '*.md'
- '.git*'
workflow_call:
inputs:
artifact_prefix:
default: mt
description: Artifact prefix.
required: false
type: string
checkout_branch:
default: ${{ github.head_ref || github.ref_name }}
description: Checkout branch
required: false
type: string
skip_cleanup:
default: false
description: Whether to skip a clean-up job.
required: false
type: boolean

jobs:
GetList:
outputs:
filelist: ${{ steps.get-files.outputs.filelist }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set output with list of files
id: get-files
run: |
import glob, json, os
fghout = os.environ["GITHUB_OUTPUT"]
files = glob.glob("**/*.mq?", recursive=True)
filelist = "filelist={}".format(json.dumps(files))
with open(fghout, "a") as fd:
fd.write(filelist)
shell: python
- name: Display outputs
run: echo "${{ toJson(steps.get-files.outputs) }}"
Compile:
mt4:
name: Installs platform (4)
uses: EA31337/EA-Tester/.github/workflows/platform-linux.yml@dev
with:
artifact_name: ${{ inputs.artifact_prefix || 'mt' }}4
artifact_overwrite: true
skip_cleanup: true
version: 4

mt5:
name: Installs platform (5)
uses: EA31337/EA-Tester/.github/workflows/platform-linux.yml@dev
with:
artifact_name: ${{ inputs.artifact_prefix || 'mt' }}5
artifact_overwrite: true
skip_cleanup: true
version: 5

compile-platform-indicators:
defaults:
run:
shell: powershell
needs: [GetList]
name: Compile platform indicators
needs: [mt4, mt5]
runs-on: windows-latest
strategy:
matrix:
file: ${{ fromJson(needs.GetList.outputs.filelist) }}
version: [4, 5]
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v3
- uses: actions/download-artifact@v4
with:
path: Include/EA31337-classes
ref: v3.000-dev
repository: EA31337/EA31337-classes
- name: Compile (build 2361)
uses: fx31337/mql-compile-action@master
name: ${{ env.ARTIFACT_PREFIX }}${{ matrix.version }}
path: .${{ env.ARTIFACT_PREFIX }}${{ matrix.version }}
- name: Compile MQL
uses: fx31337/mql-compile-action@dev
with:
include: .
init-platform: true
mt-version: 5.0.0.2361
path: ${{ matrix.file }}
mt-path: .${{ env.ARTIFACT_PREFIX }}${{ matrix.version }}
# yamllint disable-line rule:line-length
path: .${{ env.ARTIFACT_PREFIX }}${{ matrix.version }}/**/MQL?/Indicators
verbose: true
- name: Compile (build 2515)
if: endsWith(matrix.file, '.mq5')
- name: Copy MQL to the current location
run: >-
Copy-Item
-Path ".${{ env.ARTIFACT_PREFIX }}*\*\*\MQL?"
-Destination .
-Recurse
-Verbose
- name: List all source code files
run: '(Get-ChildItem -Recurse -Path "MQL?" -Include *.mq[45]).fullname'
- name: List compiled files
run: '(Get-ChildItem -Recurse -Path "MQL?" -Include *.ex[45]).fullname'
- name: Upload platform indicators
uses: actions/upload-artifact@v4
with:
if-no-files-found: error
name: ${{ env.ARTIFACT_PREFIX }}-indicators-ex${{ matrix.version }}
path: MQL?/**/*.[me][qx][45h]
- if: ${{ failure() }}
uses: mxschmitt/action-tmate@v3
timeout-minutes: 20

compile-indicators:
defaults:
run:
shell: powershell
name: Compile Indicators
needs: [compile-platform-indicators]
runs-on: windows-latest
strategy:
matrix:
version: [4, 5]
steps:
- uses: actions/checkout@v4
with:
path: ${{ env.INDI_OTHER_WORKDIR }}
ref: ${{ env.CHECKOUT_BRANCH }}
repository: EA31337/EA31337-indicators-other
- uses: actions/checkout@v4
with:
path: MQL${{ matrix.version}}/Include/EA31337-classes
ref: v3.000.1
repository: EA31337/EA31337-classes
- uses: actions/download-artifact@v4
with:
name: ${{ env.ARTIFACT_PREFIX }}${{ matrix.version }}
path: .${{ env.ARTIFACT_PREFIX }}${{ matrix.version }}
- uses: actions/download-artifact@v4
with:
merge-multiple: true
pattern: ${{ env.ARTIFACT_PREFIX }}-indicators-ex?
- name: List all source code files
run: '(Get-ChildItem -Recurse -Path . -Include *.mq[45]).fullname'
- name: List compiled files
run: '(Get-ChildItem -Recurse -Path . -Include *.ex[45]).fullname'
- name: Compile
uses: fx31337/mql-compile-action@master
with:
include: .
init-platform: true
mt-version: 5.0.0.2515
path: ${{ matrix.file }}
include: MQL${{ matrix.version }}
mt-path: .${{ env.ARTIFACT_PREFIX }}${{ matrix.version }}
path: ${{ env.INDI_OTHER_WORKDIR }}/**/*.mq${{ matrix.version }}
verbose: true
- name: List compiled files
run: '(Get-ChildItem -Recurse -Path . -Include *.ex[45]).fullname'
- run: Get-Location
- name: Upload indicator artifacts
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
# yamllint disable-line rule:line-length
name: ${{ env.ARTIFACT_PREFIX }}-indicators-other-ex${{ matrix.version }}
path: ${{ env.INDI_OTHER_WORKDIR }}/**/*.ex[45]
timeout-minutes: 30

cleanup:
if: inputs.skip_cleanup != true
name: Clean-up
needs: [compile-indicators]
runs-on: ubuntu-latest
steps:
- uses: geekyeggo/delete-artifact@v5
with:
name: Indicators-other
path: '**/*.ex?'
name: ${{ env.ARTIFACT_PREFIX }}*
File renamed without changes.
26 changes: 26 additions & 0 deletions Oscillators/Multi/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Oscillator multi-value indicators

Multi-value oscillators, often referred to as "multi-line" or "multi-buffer"
oscillators, are a variation of traditional oscillators used in technical
analysis. While traditional oscillators like the RSI or Stochastic oscillator
generate a single line that oscillates within a specific range,
multi-value oscillators plot multiple lines
or buffers on a histogram-like chart.

These additional lines on the histogram provide traders and analysts with
more information and insights into the price movement and momentum of an
asset. Each line represents a different aspect of price behavior, allowing
for a more comprehensive analysis of market conditions.

The interaction and relationship between these multiple lines can offer
valuable signals and indications of potential market trends, reversals, or
momentum shifts. Traders often look for crossovers, divergences, and
patterns among the lines to make more informed trading decisions.

## TDI (Traders Dynamic Index)

The Traders Dynamic Index (TDI) is a versatile trading indicator designed to
aid traders in analyzing market conditions related to trend direction, market
strength, and volatility. It combines RSI, Moving Averages, and volatility
bands to offer insights into trend direction, market strength, and volatility
which gives comprehensive overview of the market's behavior.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -92,12 +92,12 @@
#property indicator_separate_window

extern int RSI_Period = 13; //8-25
extern int RSI_Price = 0; //0-6
extern ENUM_APPLIED_PRICE RSI_Price = PRICE_CLOSE;
extern int Volatility_Band = 34; //20-40
extern int RSI_Price_Line = 2;
extern int RSI_Price_Type = 0; //0-3
extern ENUM_MA_METHOD RSI_Price_Type = MODE_SMA;
extern int Trade_Signal_Line = 7;
extern int Trade_Signal_Type = 0; //0-3
extern ENUM_MA_METHOD Trade_Signal_Type = MODE_SMA;

double RSIBuf[],UpZone[],MdZone[],DnZone[],MaBuf[],MbBuf[];

Expand Down Expand Up @@ -141,7 +141,7 @@ int start()
ArrayResize(RSI,Volatility_Band);
int counted_bars=IndicatorCounted();
int i;
int limit = Bars-counted_bars-1;
int limit = MathMax(0, Bars - counted_bars - Volatility_Band);
for(i=limit; i>=0; i--)
{
RSIBuf[i] = (iRSI(NULL,0,RSI_Period,RSI_Price,i));
Expand Down
46 changes: 29 additions & 17 deletions Oscillators/Traders Dynamic Index.mq5 → Oscillators/Multi/TDI.mq5
Original file line number Diff line number Diff line change
Expand Up @@ -28,32 +28,44 @@
#include <EA31337-classes/Indicators/Indi_MA.mqh>
#include <EA31337-classes/Indicators/Indi_RSI.mqh>

int BarsShrinked() {
static int _initial_bars = MathMax(0, ChartStatic::iBars(_Symbol, _Period) - 1000);
int _result = ChartStatic::iBars(_Symbol, _Period) - _initial_bars;
return _result;
}

// Defines macros.
#define extern input
#define Bars fmin(10000, (ChartStatic::iBars(_Symbol, _Period)))
#define Bars BarsShrinked()
#define Bid (SymbolInfoStatic::GetBid(_Symbol))
#define TimeDayOfWeek (DateTime::DateOfWeek())

// Includes the main file.
#include "Traders Dynamic Index.mq4"
#include "TDI.mq4"

// Custom indicator initialization function.
void OnInit() {
init();
if (!ArrayGetAsSeries(RSIBuf)) {
ArraySetAsSeries(RSIBuf, true);
ArraySetAsSeries(UpZone, true);
ArraySetAsSeries(MdZone, true);
ArraySetAsSeries(DnZone, true);
ArraySetAsSeries(MaBuf, true);
ArraySetAsSeries(MbBuf, true);
}
}
void OnInit() { init(); }

// Custom indicator iteration function.
int OnCalculate(const int rates_total, const int prev_calculated,
const int begin, const double &price[]) {
IndicatorCounted(fmin(prev_calculated, Bars));
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) {
ResetLastError();
return start() >= 0 ? rates_total : 0;

ArraySetAsSeries(RSIBuf, true);
ArraySetAsSeries(UpZone, true);
ArraySetAsSeries(MdZone, true);
ArraySetAsSeries(DnZone, true);
ArraySetAsSeries(MaBuf, true);
ArraySetAsSeries(MbBuf, true);

int _result = start() >= 0 ? rates_total : 0;

ArraySetAsSeries(RSIBuf, false);
ArraySetAsSeries(UpZone, false);
ArraySetAsSeries(MdZone, false);
ArraySetAsSeries(DnZone, false);
ArraySetAsSeries(MaBuf, false);
ArraySetAsSeries(MbBuf, false);

IndicatorCounted(fmin(rates_total, Bars));
return _result;
}
8 changes: 0 additions & 8 deletions Oscillators/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,3 @@ In summary, oscillators are a type of indicator used in technical
analysis that measure price momentum and provide insights into
overbought or oversold conditions. They are considered a subset of
indicators due to their specific function and characteristics.

## TDI (Traders Dynamic Index)

The Traders Dynamic Index (TDI) is a versatile trading indicator designed to
aid traders in analyzing market conditions related to trend direction, market
strength, and volatility. It combines RSI, Moving Averages, and volatility
bands to offer insights into trend direction, market strength, and volatility
which gives comprehensive overview of the market's behavior.
26 changes: 24 additions & 2 deletions Price/SuperTrend.mq4
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,35 @@
* @fixme
*/

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots 1
#property indicator_label1 "SuperTrend"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrGreen
#property indicator_color2 clrRed
#property indicator_color3 clrDarkGray
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2

// Includes EA31337 framework.
//#include <EA31337-classes/Indicator.mqh>
// #include <EA31337-classes/Indicator.mqh>

// Includes.
//#include "SuperTrend.mq5"
// #include "SuperTrend.mq5"

// Custom indicator initialization function.
void OnInit() {
// @fixme
}

// Custom indicator iteration function.
int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[],
const double &high[], const double &low[], const double &close[], const long &tick_volume[],
const long &volume[], const int &spread[]) {
int start = rates_total - prev_calculated;

// @todo: Call OnCalculate() in .mq5 file.

return (rates_total);
}
14 changes: 7 additions & 7 deletions enum.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@
#ifndef ENUM_INDICATOR_OTHER_DEFINED
// Defines enum with supported indicator list.
enum ENUM_INDICATOR_OTHER {
INDI_OTHER_0_NONE = 0, // (None)
INDI_OTHER_MISC_ATR_MA_TREND, // Misc: ATR MA Trend
INDI_OTHER_OSC_SUPERSLOPE, // Oscillator: Super Slope
INDI_OTHER_OSC_TDI, // Oscillator: TDI (Traders Dynamic Index)
INDI_OTHER_OSC_TDI_RT_CLONE, // Oscillator: TDI-RT-Clone
INDI_OTHER_OSC_TMA_CG, // Oscillator: TMA CG
INDI_OTHER_PRICE_EWO2, // Oscillator: Elliott Wave Oscillator 2
INDI_OTHER_0_NONE = 0, // (None)
INDI_OTHER_MISC_ATR_MA_TREND, // Misc: ATR MA Trend
INDI_OTHER_OSC_SUPERSLOPE, // Oscillator: Super Slope
INDI_OTHER_OSC_MULTI_EWO2, // Oscillator: Elliott Wave Oscillator 2
INDI_OTHER_OSC_MULTI_TDI, // Oscillator: TDI (Traders Dynamic Index)
INDI_OTHER_OSC_MULTI_TDI_RT_CLONE, // Oscillator: TDI-RT-Clone
INDI_OTHER_OSC_MULTI_TMA_CG, // Oscillator: TMA CG
INDI_OTHER_PRICE_MULTI_OHLC_HA_SMOOTHED, // Price/Range: SVE Bollinger Bands
INDI_OTHER_PRICE_RANGE_SVE_BB, // Price/Range: SVE Bollinger Bands
};
Expand Down
Loading