Indicators Timing or Kwan for cTrader?
15 Oct 2013, 02:48
cTrader have indicators the same MBFX Timing or Kwan ZigZag Beta on MT4?
Please help me
Thanks and best regards!
Replies
facestockvn
27 Oct 2013, 12:38
Yes, I have. You can download here http://www.faceforex.vn/threads/kwan-zigzag-beta-mbfx-timing-indicators-chi-bao-xu-huong-thi-thuong.1230/
@facestockvn
Forex19
27 Oct 2013, 12:53
RE:
facestockvn said:
Yes, I have. You can download here http://www.faceforex.vn/threads/kwan-zigzag-beta-mbfx-timing-indicators-chi-bao-xu-huong-thi-thuong.1230/
I wanted to say the file MBFX Timing.mq4
The file MBFX Timing.ex4, is already completed and it's not needed for the conversion in cAlgo
@Forex19
facestockvn
27 Oct 2013, 13:06
I understand, but I want to be perfect cTrader. I want to have full on cTrader indicator as MT4 indicator. Because I want all my customers only user cTrader to trading. Not necessarily to use MT4 for analysis and then trading with cTrader.
@facestockvn
Forex19
27 Oct 2013, 13:19
RE:
facestockvn said:
I understand, but I want to be perfect cTrader. I want to have full on cTrader indicator as MT4 indicator. Because I want all my customers only user cTrader to trading. Not necessarily to use MT4 for analysis and then trading with cTrader.
I asked you the file. Mq4 because you can start with that code to convert cAlgo.
@Forex19
facestockvn
27 Oct 2013, 13:35
Sorry, I'm not a coder. I'm not the person who created MBFX Timing.mq4. So i can't convert this file .mq4 to cAlgo. Please give me a guide.
@facestockvn
facestockvn
27 Oct 2013, 14:10
RE:
Forex19 said:
I found a solution. Soon I open a new 3d with the code ;)
Sorry Forex19, I found script MBFX Timing.mq4. You can dowload here http://www.tradingsystemforex.com/attachment.php?attachmentid=27890&d=1359364214
@facestockvn
facestockvn
03 Nov 2013, 09:50
( Updated at: 21 Dec 2023, 09:20 )
RE:
facestockvn said:
cTrader have indicators the same MBFX Timing or Kwan ZigZag Beta on MT4?
Please help meThanks and best regards!
I solved by http://2calgo.com . Thanks 2calgo.com very much!
// ------------------------------------------------------------
// Paste this code into your cAlgo editor.
// -----------------------------------------------------------
using System;
using System.Collections.Generic;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Reflection;
using System.Threading;
using System.Diagnostics;
using System.Runtime.InteropServices;
using Microsoft.Win32;
using System.Threading;
using cAlgo.API.Requests;
// ---------------------------------------------------------------------------
// Converted from MQ4 to cAlgo with http://2calgo.com
// ---------------------------------------------------------------------------
namespace cAlgo.Indicators
{
[Indicator(ScalePrecision = 5, AutoRescale = false, IsOverlay = false)]
[Levels(70, 30, 50)]
public class ConvertedIndicator : Indicator
{
Mq4Double Mq4Init()
{
IndicatorShortName("MBFX Timing Indicator");
SetIndexStyle(0, DRAW_LINE);
SetIndexBuffer(0, g_ibuf_88);
SetIndexStyle(1, DRAW_LINE);
SetIndexBuffer(1, g_ibuf_92);
SetIndexStyle(2, DRAW_LINE);
SetIndexBuffer(2, g_ibuf_96);
return 0;
return 0;}
Mq4Double deinitFunc()
{
return 0;
return 0;}
Mq4Double Mq4Start()
{
Mq4Double li_224 = 0;
Mq4Double ld_216 = 0;
Mq4Double ld_208 = 0;
Mq4Double ld_200 = 0;
Mq4Double ld_192 = 0;
Mq4Double ld_184 = 0;
Mq4Double ld_176 = 0;
Mq4Double ld_168 = 0;
Mq4Double ld_160 = 0;
Mq4Double ld_152 = 0;
Mq4Double ld_144 = 0;
Mq4Double ld_136 = 0;
Mq4Double ld_128 = 0;
Mq4Double ld_120 = 0;
Mq4Double ld_112 = 0;
Mq4Double ld_104 = 0;
Mq4Double ld_96 = 0;
Mq4Double ld_88 = 0;
Mq4Double ld_80 = 0;
Mq4Double ld_72 = 0;
Mq4Double ld_64 = 0;
Mq4Double ld_56 = 0;
Mq4Double ld_48 = 0;
Mq4Double ld_40 = 0;
Mq4Double ld_32 = 0;
Mq4Double ld_24 = 0;
Mq4Double ld_16 = 0;
Mq4Double ld_8 = 0;
Mq4Double ld_0 = 0;
ld_216 = Bars - Len - 1;
for (li_224 = ld_216; li_224 >= 0; li_224--) {
if (ld_8 == 0.0) {
ld_8 = 1.0;
ld_16 = 0.0;
if (Len - 1 >= 5) ld_0 = Len - 1.0;
else ld_0 = 5.0;
ld_80 = 100.0 * ((High[li_224] + Low[li_224] + Close[li_224]) / 3.0);
ld_96 = 3.0 / (Len + 2.0);
ld_104 = 1.0 - ld_96;
} else {
if (ld_0 <= ld_8) ld_8 = ld_0 + 1.0;
else ld_8 += 1.0;
ld_88 = ld_80;
ld_80 = 100.0 * ((High[li_224] + Low[li_224] + Close[li_224]) / 3.0);
ld_32 = ld_80 - ld_88;
ld_112 = ld_104 * ld_112 + ld_96 * ld_32;
ld_120 = ld_96 * ld_112 + ld_104 * ld_120;
ld_40 = 1.5 * ld_112 - ld_120 / 2.0;
ld_128 = ld_104 * ld_128 + ld_96 * ld_40;
ld_208 = ld_96 * ld_128 + ld_104 * ld_208;
ld_48 = 1.5 * ld_128 - ld_208 / 2.0;
ld_136 = ld_104 * ld_136 + ld_96 * ld_48;
ld_152 = ld_96 * ld_136 + ld_104 * ld_152;
ld_56 = 1.5 * ld_136 - ld_152 / 2.0;
ld_160 = ld_104 * ld_160 + ld_96 * MathAbs(ld_32);
ld_168 = ld_96 * ld_160 + ld_104 * ld_168;
ld_64 = 1.5 * ld_160 - ld_168 / 2.0;
ld_176 = ld_104 * ld_176 + ld_96 * ld_64;
ld_184 = ld_96 * ld_176 + ld_104 * ld_184;
ld_144 = 1.5 * ld_176 - ld_184 / 2.0;
ld_192 = ld_104 * ld_192 + ld_96 * ld_144;
ld_200 = ld_96 * ld_192 + ld_104 * ld_200;
ld_72 = 1.5 * ld_192 - ld_200 / 2.0;
if (ld_0 >= ld_8 && ld_80 != ld_88) ld_16 = 1.0;
if (ld_0 == ld_8 && ld_16 == 0.0) ld_8 = 0.0;
}
if (ld_0 < ld_8 && ld_72 > 0.0000000001) {
ld_24 = 50.0 * (ld_56 / ld_72 + 1.0);
if (ld_24 > 100.0) ld_24 = 100.0;
if (ld_24 < 0.0) ld_24 = 0.0;
} else ld_24 = 50.0;
g_ibuf_88[li_224] = ld_24;
g_ibuf_92[li_224] = ld_24;
g_ibuf_96[li_224] = ld_24;
if (g_ibuf_88[li_224] > g_ibuf_88[li_224 + 1] - Filter) g_ibuf_96[li_224] = EMPTY_VALUE;
else {
if (g_ibuf_88[li_224] < g_ibuf_88[li_224 + 1] + Filter) g_ibuf_92[li_224] = EMPTY_VALUE;
else {
if (g_ibuf_88[li_224] == g_ibuf_88[li_224 + 1] + Filter) {
g_ibuf_92[li_224] = EMPTY_VALUE;
g_ibuf_96[li_224] = EMPTY_VALUE;
}
}
}
}
return 0;
return 0;}
[Parameter("Len", DefaultValue = 7)]
public int Len_parameter { get; set; }
bool _LenGot;
Mq4Double Len_backfield;
Mq4Double Len { get { if (!_LenGot) Len_backfield = Len_parameter; return Len_backfield; } set { Len_backfield = value; } }
[Parameter("Filter", DefaultValue = 0.0)]
public double Filter_parameter { get; set; }
bool _FilterGot;
Mq4Double Filter_backfield;
Mq4Double Filter { get { if (!_FilterGot) Filter_backfield = Filter_parameter; return Filter_backfield; } set { Filter_backfield = value; } }
[Output("g_ibuf_88", Color = Colors.Yellow, PlotType = PlotType.DiscontinuousLine)]
public IndicatorDataSeries g_ibuf_88_AlgoOutputDataSeries { get; set; }
[Output("g_ibuf_92", Color = Colors.Green, PlotType = PlotType.DiscontinuousLine)]
public IndicatorDataSeries g_ibuf_92_AlgoOutputDataSeries { get; set; }
[Output("g_ibuf_96", Color = Colors.Orange, PlotType = PlotType.DiscontinuousLine)]
public IndicatorDataSeries g_ibuf_96_AlgoOutputDataSeries { get; set; }
int indicator_buffers = 3;
int indicator_color1 = Yellow;
int indicator_color2 = Green;
int indicator_color3 = Orange;
Mq4Double indicator_width1 = 2;
Mq4Double indicator_width2 = 2;
Mq4Double indicator_width3 = 2;
Mq4Double indicator_width4 = 1;
Mq4Double indicator_width5 = 1;
Mq4Double indicator_width6 = 1;
Mq4Double indicator_width7 = 1;
Mq4Double indicator_width8 = 1;
Mq4Double indicator_level1 = 70;
Mq4Double indicator_level2 = 30;
Mq4Double indicator_level3 = 50;
private Mq4OutputDataSeries g_ibuf_88;
private Mq4OutputDataSeries g_ibuf_92;
private Mq4OutputDataSeries g_ibuf_96;
List<Mq4OutputDataSeries> AllBuffers = new List<Mq4OutputDataSeries>();
public List<DataSeries> AllOutputDataSeries = new List<DataSeries>();
protected override void Initialize()
{
if (g_ibuf_88_AlgoOutputDataSeries == null) g_ibuf_88_AlgoOutputDataSeries = CreateDataSeries();
g_ibuf_88 = new Mq4OutputDataSeries(this, g_ibuf_88_AlgoOutputDataSeries, ChartObjects, 0, 0, () => CreateDataSeries(), 2, Colors.Yellow);
AllBuffers.Add(g_ibuf_88);
if (g_ibuf_92_AlgoOutputDataSeries == null) g_ibuf_92_AlgoOutputDataSeries = CreateDataSeries();
g_ibuf_92 = new Mq4OutputDataSeries(this, g_ibuf_92_AlgoOutputDataSeries, ChartObjects, 0, 1, () => CreateDataSeries(), 2, Colors.Green);
AllBuffers.Add(g_ibuf_92);
if (g_ibuf_96_AlgoOutputDataSeries == null) g_ibuf_96_AlgoOutputDataSeries = CreateDataSeries();
g_ibuf_96 = new Mq4OutputDataSeries(this, g_ibuf_96_AlgoOutputDataSeries, ChartObjects, 0, 2, () => CreateDataSeries(), 2, Colors.Orange);
AllBuffers.Add(g_ibuf_96);
AllOutputDataSeries.Add(g_ibuf_88_AlgoOutputDataSeries);
AllOutputDataSeries.Add(g_ibuf_92_AlgoOutputDataSeries);
AllOutputDataSeries.Add(g_ibuf_96_AlgoOutputDataSeries);
CommonInitialize();
}
private bool _initialized;
public override void Calculate(int index)
{
try
{
_currentIndex = index;
g_ibuf_88.SetCurrentIndex(index);
g_ibuf_92.SetCurrentIndex(index);
g_ibuf_96.SetCurrentIndex(index);
if (IsLastBar)
{
if (!_initialized)
{
Mq4Init();
_initialized = true;
}
Mq4Start();
_indicatorCounted = index;
}
}
catch(Exception e)
{
throw;
}
}
private bool IsTradeAllowed()
{
return false;
}
int _currentIndex;
CachedStandardIndicators _cachedStandardIndicators;
Mq4ChartObjects _mq4ChartObjects;
Mq4ArrayToDataSeriesConverterFactory _mq4ArrayToDataSeriesConverterFactory;
Mq4MarketDataSeries Open;
Mq4MarketDataSeries High;
Mq4MarketDataSeries Low;
Mq4MarketDataSeries Close;
Mq4MarketDataSeries Median;
Mq4MarketDataSeries Volume;
Mq4TimeSeries Time;
private void CommonInitialize()
{
Open = new Mq4MarketDataSeries(MarketSeries.Open);
High = new Mq4MarketDataSeries(MarketSeries.High);
Low = new Mq4MarketDataSeries(MarketSeries.Low);
Close = new Mq4MarketDataSeries(MarketSeries.Close);
Volume = new Mq4MarketDataSeries(MarketSeries.TickVolume);
Median = new Mq4MarketDataSeries(MarketSeries.Median);
Time = new Mq4TimeSeries(MarketSeries.OpenTime);
_cachedStandardIndicators = new CachedStandardIndicators(Indicators);
_mq4ChartObjects = new Mq4ChartObjects(ChartObjects, MarketSeries.OpenTime);
_mq4ArrayToDataSeriesConverterFactory = new Mq4ArrayToDataSeriesConverterFactory(() => CreateDataSeries());
}
private int Bars
{
get { return MarketSeries.Close.Count; }
}
private int Period()
{
if (TimeFrame == TimeFrame.Minute)
return 1;
if (TimeFrame == TimeFrame.Minute2)
return 2;
if (TimeFrame == TimeFrame.Minute3)
return 3;
if (TimeFrame == TimeFrame.Minute4)
return 4;
if (TimeFrame == TimeFrame.Minute5)
return 5;
if (TimeFrame == TimeFrame.Minute10)
return 10;
if (TimeFrame == TimeFrame.Minute15)
return 15;
if (TimeFrame == TimeFrame.Minute30)
return 30;
if (TimeFrame == TimeFrame.Hour)
return 60;
if (TimeFrame == TimeFrame.Hour4)
return 240;
if (TimeFrame == TimeFrame.Hour12)
return 720;
if (TimeFrame == TimeFrame.Daily)
return 1440;
if (TimeFrame == TimeFrame.Weekly)
return 10080;
return 43200;
}
public TimeFrame PeriodToTimeFrame(int period)
{
switch (period)
{
case 0:
return TimeFrame;
case 1:
return TimeFrame.Minute;
case 2:
return TimeFrame.Minute2;
case 3:
return TimeFrame.Minute3;
case 4:
return TimeFrame.Minute4;
case 5:
return TimeFrame.Minute5;
case 10:
return TimeFrame.Minute10;
case 15:
return TimeFrame.Minute15;
case 30:
return TimeFrame.Minute30;
case 60:
return TimeFrame.Hour;
case 240:
return TimeFrame.Hour4;
case 720:
return TimeFrame.Hour12;
case 1440:
return TimeFrame.Daily;
case 10080:
return TimeFrame.Weekly;
case 43200:
return TimeFrame.Monthly;
default:
throw new NotSupportedException(string.Format("TimeFrame {0} minutes isn't supported by cAlgo", period));
}
}
Mq4Double MathAbs(double x)
{
return Math.Abs(x);
}
const string NotSupportedDifferentTimeFrame = "Converter doesn't support working with different timeframe";
const string NotSupportedMaShift = "Converter supports only ma_shift = 0";
const string NotSupportedBandsShift = "Converter supports only bands_shift = 0";
const string AdxSupportsOnlyClosePrice = "Adx can be applied only to Close price";
private int _lastError;
const string GlobalVariablesPath = "Software\\2calgo\\Global Variables\\";
Symbol GetSymbol(string symbolCode)
{
if (symbolCode == "0" || string.IsNullOrEmpty(symbolCode))
symbolCode = Symbol.Code;
return MarketData.GetSymbol(symbolCode);
}
MarketSeries GetSeries(string symbol, int period)
{
var timeFrame = PeriodToTimeFrame(period);
var symbolObject = GetSymbol(symbol);
return MarketData.GetSeries(symbolObject.Code, timeFrame);
}
private DataSeries ToAppliedPrice(string symbol, int timeframe, int constant)
{
var series = GetSeries(symbol, timeframe);
switch (constant)
{
case PRICE_OPEN:
return series.Open;
case PRICE_HIGH:
return series.High;
case PRICE_LOW:
return series.Low;
case PRICE_CLOSE:
return series.Close;
case PRICE_MEDIAN:
return series.Median;
case PRICE_TYPICAL:
return series.Typical;
case PRICE_WEIGHTED:
return series.Weighted;
}
throw new NotImplementedException("Converter doesn't support working with this type of AppliedPrice");
}
const string xArrow = "?";
public static string GetArrowByCode(int code)
{
switch (code)
{
case 0:
return string.Empty;
case 32:
return " ";
case 33:
return "?";
case 34:
return "?";
case 35:
return "?";
case 40:
return "?";
case 41:
return "?";
case 42:
return "?";
case 54:
return "?";
case 55:
return "?";
case 62:
return "?";
case 63:
return "?";
case 65:
return "?";
case 69:
return "?";
case 70:
return "?";
case 71:
return "?";
case 72:
return "?";
case 74:
return "?";
case 76:
return "?";
case 78:
return "?";
case 79:
return "?";
case 81:
return "?";
case 82:
return "?";
case 84:
return "?";
case 86:
return "?";
case 88:
return "?";
case 89:
return "?";
case 90:
return "?";
case 91:
return "?";
case 92:
return "?";
case 93:
return "?";
case 94:
return "?";
case 95:
return "?";
case 96:
return "?";
case 97:
return "?";
case 98:
return "?";
case 99:
return "?";
case 100:
return "?";
case 101:
return "?";
case 102:
return "?";
case 103:
return "?";
case 104:
return "?";
case 105:
return "?";
case 106:
return "&";
case 107:
return "&";
case 108:
return "?";
case 109:
return "?";
case 110:
return "?";
case 111:
case 112:
return "?";
case 113:
return "?";
case 114:
return "?";
case 115:
case 116:
return "?";
case 117:
case 119:
return "?";
case 118:
return "?";
case 120:
return "?";
case 121:
return "?";
case 122:
return "?";
case 123:
return "?";
case 124:
return "?";
case 125:
return "?";
case 126:
return "?";
case 127:
return "?";
case 128:
return "?";
case 129:
return "?";
case 130:
return "?";
case 131:
return "?";
case 132:
return "?";
case 133:
return "?";
case 134:
return "?";
case 135:
return "?";
case 136:
return "?";
case 137:
return "?";
case 138:
return "?";
case 139:
return "?";
case 140:
return "?";
case 141:
return "?";
case 142:
return "?";
case 143:
return "?";
case 144:
return "?";
case 145:
return "?";
case 146:
return "?";
case 147:
return "?";
case 148:
return "?";
case 149:
return "?";
case 158:
return "·";
case 159:
return "•";
case 160:
case 166:
return "?";
case 161:
return "?";
case 162:
case 164:
return "?";
case 165:
return "?";
case 167:
return "?";
case 168:
return "?";
case 170:
return "?";
case 171:
return "?";
case 172:
return "?";
case 173:
return "?";
case 174:
return "?";
case 175:
return "?";
case 177:
return "?";
case 178:
return "?";
case 179:
return "?";
case 181:
return "?";
case 182:
return "?";
case 195:
case 197:
case 215:
case 219:
case 223:
case 231:
return "?";
case 196:
case 198:
case 224:
return "?";
case 213:
return "?";
case 214:
return "?";
case 216:
return "?";
case 220:
return "?";
case 232:
return "?";
case 233:
case 199:
case 200:
case 217:
case 221:
case 225:
return "?";
case 234:
case 201:
case 202:
case 218:
case 222:
case 226:
return "?";
case 239:
return "?";
case 240:
return "?";
case 241:
return "?";
case 242:
return "?";
case 243:
return "?";
case 244:
return "?";
case 245:
case 227:
case 235:
return "?";
case 246:
case 228:
case 236:
return "?";
case 247:
case 229:
case 237:
return "?";
case 248:
case 230:
case 238:
return "?";
case 249:
return "?";
case 250:
return "?";
case 251:
return "?";
case 252:
return "?";
case 253:
return "?";
case 254:
return "?";
default:
return xArrow;
}
}
class Mq4OutputDataSeries : IMq4Array<Mq4Double>
{
public IndicatorDataSeries OutputDataSeries { get; private set; }
private readonly IndicatorDataSeries _originalValues;
private int _currentIndex;
private int _shift;
private double _emptyValue = EMPTY_VALUE;
private readonly ChartObjects _chartObjects;
private readonly int _style;
private readonly int _bufferIndex;
private readonly ConvertedIndicator _indicator;
public Mq4OutputDataSeries(
ConvertedIndicator indicator,
IndicatorDataSeries outputDataSeries,
ChartObjects chartObjects,
int style,
int bufferIndex,
Func<IndicatorDataSeries> dataSeriesFactory,
int lineWidth,
Colors? color = null)
{
OutputDataSeries = outputDataSeries;
_chartObjects = chartObjects;
_style = style;
_bufferIndex = bufferIndex;
_indicator = indicator;
Color = color;
_originalValues = dataSeriesFactory();
LineWidth = lineWidth;
}
public int LineWidth { get; private set; }
public Colors? Color { get; private set; }
public int Length
{
get
{
return OutputDataSeries.Count;
}
}
public void SetCurrentIndex(int index)
{
_currentIndex = index;
}
public void SetShift(int shift)
{
_shift = shift;
}
public void SetEmptyValue(double emptyValue)
{
_emptyValue = emptyValue;
}
public Mq4Double this[int index]
{
get
{
var indexToGetFrom = _currentIndex - index + _shift;
if (indexToGetFrom < 0 || indexToGetFrom > _currentIndex)
return 0;
if (indexToGetFrom >= _originalValues.Count)
return _emptyValue;
return _originalValues[indexToGetFrom];
}
set
{
var indexToSet = _currentIndex - index + _shift;
if (indexToSet < 0)
return;
_originalValues[indexToSet] = value;
var valueToSet = value;
if (valueToSet == _emptyValue)
valueToSet = double.NaN;
if (indexToSet < 0)
return;
OutputDataSeries[indexToSet] = valueToSet;
switch (_style)
{
case DRAW_ARROW:
var arrowName = GetArrowName(indexToSet);
if (double.IsNaN(valueToSet))
_chartObjects.RemoveObject(arrowName);
else
{
var color = Color.HasValue ? Color.Value : Colors.Red;
_chartObjects.DrawText(arrowName , _indicator.ArrowByIndex[_bufferIndex], indexToSet, valueToSet, VerticalAlignment.Center, HorizontalAlignment.Center, color);
}
break;
case DRAW_HISTOGRAM:
if (false)
{
var anotherLine = _indicator.AllBuffers.FirstOrDefault(b => b.LineWidth == LineWidth && b != this);
if (anotherLine != null)
{
var name = GetNameOfHistogramLineOnChartWindow(indexToSet);
Colors color;
if (this[index] > anotherLine[index])
color = Color ?? Colors.Green;
else
color = anotherLine.Color ?? Colors.Green;
var lineWidth = LineWidth;
if (lineWidth != 1 && lineWidth < 5)
lineWidth = 5;
_chartObjects.DrawLine(name, indexToSet, this[index], indexToSet, anotherLine[index], color, lineWidth);
}
}
break;
}
}
}
private string GetNameOfHistogramLineOnChartWindow(int index)
{
return string.Format("Histogram on chart window {0} {1}", LineWidth, index);
}
private string GetArrowName(int index)
{
return string.Format("Arrow {0} {1}", GetHashCode(), index);
}
}
bool SetIndexBuffer(int index, Mq4OutputDataSeries dataSeries)
{
return true;
}
void SetIndexStyle(int index, int type, int style = EMPTY, int width = EMPTY, int clr = CLR_NONE) { }
void IndicatorShortName(Mq4String name) { }
public Dictionary<int, string> ArrowByIndex = new Dictionary<int, string>{ {0, xArrow}, {1, xArrow}, {2, xArrow}, {3, xArrow}, {4, xArrow}, {5, xArrow}, {6, xArrow}, {7, xArrow}};
void SetIndexArrow(int index, int code)
{
ArrowByIndex[index] = GetArrowByCode(code);
}
private int _indicatorCounted;
private static MovingAverageType ToMaType(int constant)
{
switch (constant)
{
case MODE_SMA:
return MovingAverageType.Simple;
case MODE_EMA:
return MovingAverageType.Exponential;
case MODE_LWMA:
return MovingAverageType.Weighted;
default:
throw new ArgumentOutOfRangeException("Not supported moving average type");
}
}
class CachedStandardIndicators
{
private readonly IIndicatorsAccessor _indicatorsAccessor;
public CachedStandardIndicators(IIndicatorsAccessor indicatorsAccessor)
{
_indicatorsAccessor = indicatorsAccessor;
}
}
const bool True = true;
const bool False = false;
const bool TRUE = true;
const bool FALSE = false;
Mq4Null NULL;
const int EMPTY = -1;
const double EMPTY_VALUE = 2147483647;
const int WHOLE_ARRAY = 0;
const int MODE_SMA = 0; //Simple moving average
const int MODE_EMA = 1; //Exponential moving average,
const int MODE_SMMA = 2; //Smoothed moving average,
const int MODE_LWMA = 3; //Linear weighted moving average.
const int PRICE_CLOSE = 0; //Close price.
const int PRICE_OPEN = 1; //Open price.
const int PRICE_HIGH = 2; //High price.
const int PRICE_LOW = 3; //Low price.
const int PRICE_MEDIAN = 4; //Median price, (high+low)/2.
const int PRICE_TYPICAL = 5; //Typical price, (high+low+close)/3.
const int PRICE_WEIGHTED = 6; //Weighted close price, (high+low+close+close)/4.
const int DRAW_LINE = 0;
const int DRAW_SECTION = 1;
const int DRAW_HISTOGRAM = 2;
const int DRAW_ARROW = 3;
const int DRAW_ZIGZAG = 4;
const int DRAW_NONE = 12;
const int STYLE_SOLID = 0;
const int STYLE_DASH = 1;
const int STYLE_DOT = 2;
const int STYLE_DASHDOT = 3;
const int STYLE_DASHDOTDOT = 4;
const int MODE_OPEN = 0;
const int MODE_LOW = 1;
const int MODE_HIGH = 2;
const int MODE_CLOSE = 3;
const int MODE_VOLUME = 4;
const int MODE_TIME = 5;
const int MODE_BID = 9;
const int MODE_ASK = 10;
const int MODE_POINT = 11;
const int MODE_DIGITS = 12;
const int MODE_SPREAD = 13;
const int MODE_TRADEALLOWED = 22;
const int MODE_PROFITCALCMODE = 27;
const int MODE_MARGINCALCMODE = 28;
const int MODE_SWAPTYPE = 26;
const int MODE_TICKSIZE = 17;
const int MODE_FREEZELEVEL = 33;
const int MODE_STOPLEVEL = 14;
/*const int MODE_LOTSIZE = 15;
const int MODE_TICKVALUE = 16;
const int MODE_SWAPLONG = 18;
const int MODE_SWAPSHORT = 19;
const int MODE_STARTING = 20;
const int MODE_EXPIRATION = 21;
const int MODE_MINLOT = 23;
const int MODE_LOTSTEP = 24;
const int MODE_MAXLOT = 25;
const int MODE_MARGININIT = 29;
const int MODE_MARGINMAINTENANCE = 30;
const int MODE_MARGINHEDGED = 31;
const int MODE_MARGINREQUIRED = 32;*/
const int OBJ_VLINE = 0;
const int OBJ_HLINE = 1;
const int OBJ_TREND = 2;
const int OBJ_FIBO = 10;
/*const int OBJ_TRENDBYANGLE = 3;
const int OBJ_REGRESSION = 4;
const int OBJ_CHANNEL = 5;
const int OBJ_STDDEVCHANNEL = 6;
const int OBJ_GANNLINE = 7;
const int OBJ_GANNFAN = 8;
const int OBJ_GANNGRID = 9;
const int OBJ_FIBOTIMES = 11;
const int OBJ_FIBOFAN = 12;
const int OBJ_FIBOARC = 13;
const int OBJ_EXPANSION = 14;
const int OBJ_FIBOCHANNEL = 15;*/
const int OBJ_RECTANGLE = 16;
/*const int OBJ_TRIANGLE = 17;
const int OBJ_ELLIPSE = 18;
const int OBJ_PITCHFORK = 19;
const int OBJ_CYCLES = 20;*/
const int OBJ_TEXT = 21;
const int OBJ_ARROW = 22;
const int OBJ_LABEL = 23;
const int OBJPROP_TIME1 = 0;
const int OBJPROP_PRICE1 = 1;
const int OBJPROP_TIME2 = 2;
const int OBJPROP_PRICE2 = 3;
const int OBJPROP_TIME3 = 4;
const int OBJPROP_PRICE3 = 5;
const int OBJPROP_COLOR = 6;
const int OBJPROP_STYLE = 7;
const int OBJPROP_WIDTH = 8;
const int OBJPROP_BACK = 9;
const int OBJPROP_RAY = 10;
const int OBJPROP_ELLIPSE = 11;
//const int OBJPROP_SCALE = 12;
const int OBJPROP_ANGLE = 13;//angle for text rotation
const int OBJPROP_ARROWCODE = 14;
const int OBJPROP_TIMEFRAMES = 15;
//const int OBJPROP_DEVIATION = 16;
const int OBJPROP_FONTSIZE = 100;
const int OBJPROP_CORNER = 101;
const int OBJPROP_XDISTANCE = 102;
const int OBJPROP_YDISTANCE = 103;
const int OBJPROP_FIBOLEVELS = 200;
const int OBJPROP_LEVELCOLOR = 201;
const int OBJPROP_LEVELSTYLE = 202;
const int OBJPROP_LEVELWIDTH = 203;
const int OBJPROP_FIRSTLEVEL = 210;
const int PERIOD_M1 = 1;
const int PERIOD_M5 = 5;
const int PERIOD_M15 = 15;
const int PERIOD_M30 = 30;
const int PERIOD_H1 = 60;
const int PERIOD_H4 = 240;
const int PERIOD_D1 = 1440;
const int PERIOD_W1 = 10080;
const int PERIOD_MN1 = 43200;
const int TIME_DATE = 1;
const int TIME_MINUTES = 2;
const int TIME_SECONDS = 4;
const int MODE_MAIN = 0;
const int MODE_PLUSDI = 1;
const int MODE_MINUSDI = 2;
const int MODE_SIGNAL = 1;
const int MODE_UPPER = 1;
const int MODE_LOWER = 2;
const int CLR_NONE = 32768;
const int White = 16777215;
const int Snow = 16448255;
const int MintCream = 16449525;
const int LavenderBlush = 16118015;
const int AliceBlue = 16775408;
const int Honeydew = 15794160;
const int Ivory = 15794175;
const int Seashell = 15660543;
const int WhiteSmoke = 16119285;
const int OldLace = 15136253;
const int MistyRose = 14804223;
const int Lavender = 16443110;
const int Linen = 15134970;
const int LightCyan = 16777184;
const int LightYellow = 14745599;
const int Cornsilk = 14481663;
const int PapayaWhip = 14020607;
const int AntiqueWhite = 14150650;
const int Beige = 14480885;
const int LemonChiffon = 13499135;
const int BlanchedAlmond = 13495295;
const int LightGoldenrod = 13826810;
const int Bisque = 12903679;
const int Pink = 13353215;
const int PeachPuff = 12180223;
const int Gainsboro = 14474460;
const int LightPink = 12695295;
const int Moccasin = 11920639;
const int NavajoWhite = 11394815;
const int Wheat = 11788021;
const int LightGray = 13882323;
const int PaleTurquoise = 15658671;
const int PaleGoldenrod = 11200750;
const int PowderBlue = 15130800;
const int Thistle = 14204888;
const int PaleGreen = 10025880;
const int LightBlue = 15128749;
const int LightSteelBlue = 14599344;
const int LightSkyBlue = 16436871;
const int Silver = 12632256;
const int Aquamarine = 13959039;
const int LightGreen = 9498256;
const int Khaki = 9234160;
const int Plum = 14524637;
const int LightSalmon = 8036607;
const int SkyBlue = 15453831;
const int LightCoral = 8421616;
const int Violet = 15631086;
const int Salmon = 7504122;
const int HotPink = 11823615;
const int BurlyWood = 8894686;
const int DarkSalmon = 8034025;
const int Tan = 9221330;
const int MediumSlateBlue = 15624315;
const int SandyBrown = 6333684;
const int DarkGray = 11119017;
const int CornflowerBlue = 15570276;
const int Coral = 5275647;
const int PaleVioletRed = 9662683;
const int MediumPurple = 14381203;
const int Orchid = 14053594;
const int RosyBrown = 9408444;
const int Tomato = 4678655;
const int DarkSeaGreen = 9419919;
const int Cyan = 16776960;
const int MediumAquamarine = 11193702;
const int GreenYellow = 3145645;
const int MediumOrchid = 13850042;
const int IndianRed = 6053069;
const int DarkKhaki = 7059389;
const int SlateBlue = 13458026;
const int RoyalBlue = 14772545;
const int Turquoise = 13688896;
const int DodgerBlue = 16748574;
const int MediumTurquoise = 13422920;
const int DeepPink = 9639167;
const int LightSlateGray = 10061943;
const int BlueViolet = 14822282;
const int Peru = 4163021;
const int SlateGray = 9470064;
const int Gray = 8421504;
const int Red = 255;
const int Magenta = 16711935;
const int Blue = 16711680;
const int DeepSkyBlue = 16760576;
const int Aqua = 16776960;
const int SpringGreen = 8388352;
const int Lime = 65280;
const int Chartreuse = 65407;
const int Yellow = 65535;
const int Gold = 55295;
const int Orange = 42495;
const int DarkOrange = 36095;
const int OrangeRed = 17919;
const int LimeGreen = 3329330;
const int YellowGreen = 3329434;
const int DarkOrchid = 13382297;
const int CadetBlue = 10526303;
const int LawnGreen = 64636;
const int MediumSpringGreen = 10156544;
const int Goldenrod = 2139610;
const int SteelBlue = 11829830;
const int Crimson = 3937500;
const int Chocolate = 1993170;
const int MediumSeaGreen = 7451452;
const int MediumVioletRed = 8721863;
const int FireBrick = 2237106;
const int DarkViolet = 13828244;
const int LightSeaGreen = 11186720;
const int DimGray = 6908265;
const int DarkTurquoise = 13749760;
const int Brown = 2763429;
const int MediumBlue = 13434880;
const int Sienna = 2970272;
const int DarkSlateBlue = 9125192;
const int DarkGoldenrod = 755384;
const int SeaGreen = 5737262;
const int OliveDrab = 2330219;
const int ForestGreen = 2263842;
const int SaddleBrown = 1262987;
const int DarkOliveGreen = 3107669;
const int DarkBlue = 9109504;
const int MidnightBlue = 7346457;
const int Indigo = 8519755;
const int Maroon = 128;
const int Purple = 8388736;
const int Navy = 8388608;
const int Teal = 8421376;
const int Green = 32768;
const int Olive = 32896;
const int DarkSlateGray = 5197615;
const int DarkGreen = 25600;
const int Black = 0;
const int SYMBOL_LEFTPRICE = 5;
const int SYMBOL_RIGHTPRICE = 6;
const int SYMBOL_ARROWUP = 241;
const int SYMBOL_ARROWDOWN = 242;
const int SYMBOL_STOPSIGN = 251;
/*
const int SYMBOL_THUMBSUP = 67;
const int SYMBOL_THUMBSDOWN = 68;
const int SYMBOL_CHECKSIGN = 25;
*/
const int MODE_ASCEND = 1;
const int MODE_DESCEND = 2;
const int MODE_TENKANSEN = 1;
const int MODE_KIJUNSEN = 2;
const int MODE_SENKOUSPANA = 3;
const int MODE_SENKOUSPANB = 4;
const int MODE_CHINKOUSPAN = 5;
const int OP_BUY = 0;
const int OP_SELL = 1;
const int OP_BUYLIMIT = 2;
const int OP_SELLLIMIT = 3;
const int OP_BUYSTOP = 4;
const int OP_SELLSTOP = 5;
const int OBJ_PERIOD_M1 = 0x0001;
const int OBJ_PERIOD_M5 = 0x0002;
const int OBJ_PERIOD_M15 = 0x0004;
const int OBJ_PERIOD_M30 = 0x0008;
const int OBJ_PERIOD_H1 = 0x0010;
const int OBJ_PERIOD_H4 = 0x0020;
const int OBJ_PERIOD_D1 = 0x0040;
const int OBJ_PERIOD_W1 = 0x0080;
const int OBJ_PERIOD_MN1 = 0x0100;
const int OBJ_ALL_PERIODS = 0x01FF;
const int REASON_REMOVE = 1;
const int REASON_RECOMPILE = 2;
const int REASON_CHARTCHANGE = 3;
const int REASON_CHARTCLOSE = 4;
const int REASON_PARAMETERS = 5;
const int REASON_ACCOUNT = 6;
const int ERR_NO_ERROR = 0;
const int ERR_NO_RESULT = 1;
const int ERR_COMMON_ERROR = 2;
const int ERR_INVALID_TRADE_PARAMETERS = 3;
const int ERR_SERVER_BUSY = 4;
const int ERR_OLD_VERSION = 5;
const int ERR_NO_CONNECTION = 6;
const int ERR_NOT_ENOUGH_RIGHTS = 7;
const int ERR_TOO_FREQUENT_REQUESTS = 8;
const int ERR_MALFUNCTIONAL_TRADE = 9;
const int ERR_ACCOUNT_DISABLED = 64;
const int ERR_INVALID_ACCOUNT = 65;
const int ERR_TRADE_TIMEOUT = 128;
const int ERR_INVALID_PRICE = 129;
const int ERR_INVALID_STOPS = 130;
const int ERR_INVALID_TRADE_VOLUME = 131;
const int ERR_MARKET_CLOSED = 132;
const int ERR_TRADE_DISABLED = 133;
const int ERR_NOT_ENOUGH_MONEY = 134;
const int ERR_PRICE_CHANGED = 135;
const int ERR_OFF_QUOTES = 136;
const int ERR_BROKER_BUSY = 137;
const int ERR_REQUOTE = 138;
const int ERR_ORDER_LOCKED = 139;
const int ERR_LONG_POSITIONS_ONLY_ALLOWED = 140;
const int ERR_TOO_MANY_REQUESTS = 141;
const int ERR_TRADE_MODIFY_DENIED = 145;
const int ERR_TRADE_CONTEXT_BUSY = 146;
const int ERR_TRADE_EXPIRATION_DENIED = 147;
const int ERR_TRADE_TOO_MANY_ORDERS = 148;
const int ERR_TRADE_HEDGE_PROHIBITED = 149;
const int ERR_TRADE_PROHIBITED_BY_FIFO = 150;
const int ERR_NO_MQLERROR = 4000;
const int ERR_WRONG_FUNCTION_POINTER = 4001;
const int ERR_ARRAY_INDEX_OUT_OF_RANGE = 4002;
const int ERR_NO_MEMORY_FOR_CALL_STACK = 4003;
const int ERR_RECURSIVE_STACK_OVERFLOW = 4004;
const int ERR_NOT_ENOUGH_STACK_FOR_PARAM = 4005;
const int ERR_NO_MEMORY_FOR_PARAM_STRING = 4006;
const int ERR_NO_MEMORY_FOR_TEMP_STRING = 4007;
const int ERR_NOT_INITIALIZED_STRING = 4008;
const int ERR_NOT_INITIALIZED_ARRAYSTRING = 4009;
const int ERR_NO_MEMORY_FOR_ARRAYSTRING = 4010;
const int ERR_TOO_LONG_STRING = 4011;
const int ERR_REMAINDER_FROM_ZERO_DIVIDE = 4012;
const int ERR_ZERO_DIVIDE = 4013;
const int ERR_UNKNOWN_COMMAND = 4014;
const int ERR_WRONG_JUMP = 4015;
const int ERR_NOT_INITIALIZED_ARRAY = 4016;
const int ERR_DLL_CALLS_NOT_ALLOWED = 4017;
const int ERR_CANNOT_LOAD_LIBRARY = 4018;
const int ERR_CANNOT_CALL_FUNCTION = 4019;
const int ERR_EXTERNAL_CALLS_NOT_ALLOWED = 4020;
const int ERR_NO_MEMORY_FOR_RETURNED_STR = 4021;
const int ERR_SYSTEM_BUSY = 4022;
const int ERR_INVALID_FUNCTION_PARAMSCNT = 4050;
const int ERR_INVALID_FUNCTION_PARAMVALUE = 4051;
const int ERR_STRING_FUNCTION_INTERNAL = 4052;
const int ERR_SOME_ARRAY_ERROR = 4053;
const int ERR_INCORRECT_SERIESARRAY_USING = 4054;
const int ERR_CUSTOM_INDICATOR_ERROR = 4055;
const int ERR_INCOMPATIBLE_ARRAYS = 4056;
const int ERR_GLOBAL_VARIABLES_PROCESSING = 4057;
const int ERR_GLOBAL_VARIABLE_NOT_FOUND = 4058;
const int ERR_FUNC_NOT_ALLOWED_IN_TESTING = 4059;
const int ERR_FUNCTION_NOT_CONFIRMED = 4060;
const int ERR_SEND_MAIL_ERROR = 4061;
const int ERR_STRING_PARAMETER_EXPECTED = 4062;
const int ERR_INTEGER_PARAMETER_EXPECTED = 4063;
const int ERR_DOUBLE_PARAMETER_EXPECTED = 4064;
const int ERR_ARRAY_AS_PARAMETER_EXPECTED = 4065;
const int ERR_HISTORY_WILL_UPDATED = 4066;
const int ERR_TRADE_ERROR = 4067;
const int ERR_END_OF_FILE = 4099;
const int ERR_SOME_FILE_ERROR = 4100;
const int ERR_WRONG_FILE_NAME = 4101;
const int ERR_TOO_MANY_OPENED_FILES = 4102;
const int ERR_CANNOT_OPEN_FILE = 4103;
const int ERR_INCOMPATIBLE_FILEACCESS = 4104;
const int ERR_NO_ORDER_SELECTED = 4105;
const int ERR_UNKNOWN_SYMBOL = 4106;
const int ERR_INVALID_PRICE_PARAM = 4107;
const int ERR_INVALID_TICKET = 4108;
const int ERR_TRADE_NOT_ALLOWED = 4109;
const int ERR_LONGS_NOT_ALLOWED = 4110;
const int ERR_SHORTS_NOT_ALLOWED = 4111;
const int ERR_OBJECT_ALREADY_EXISTS = 4200;
const int ERR_UNKNOWN_OBJECT_PROPERTY = 4201;
const int ERR_OBJECT_DOES_NOT_EXIST = 4202;
const int ERR_UNKNOWN_OBJECT_TYPE = 4203;
const int ERR_NO_OBJECT_NAME = 4204;
const int ERR_OBJECT_COORDINATES_ERROR = 4205;
const int ERR_NO_SPECIFIED_SUBWINDOW = 4206;
const int ERR_SOME_OBJECT_ERROR = 4207;
class Mq4ChartObjects
{
private readonly ChartObjects _algoChartObjects;
private readonly TimeSeries _timeSeries;
private readonly Dictionary<string, Mq4Object> _mq4ObjectByName = new Dictionary<string, Mq4Object>();
private readonly List<string> _mq4ObjectNameByIndex = new List<string>();
public Mq4ChartObjects(ChartObjects chartObjects, TimeSeries timeSeries)
{
_algoChartObjects = chartObjects;
_timeSeries = timeSeries;
}
public void Set(string name, int index, Mq4Double value)
{
if (!_mq4ObjectByName.ContainsKey(name))
return;
_mq4ObjectByName[name].Set(index, value);
_mq4ObjectByName[name].Draw();
}
public void SetText(string name, string text, int font_size, string font, int color)
{
if (!_mq4ObjectByName.ContainsKey(name))
return;
Set(name, OBJPROP_COLOR, color);
}
private T GetObject<T>(string name) where T : Mq4Object
{
Mq4Object mq4Object;
if (!_mq4ObjectByName.TryGetValue(name, out mq4Object))
return null;
return mq4Object as T;
}
}
abstract class Mq4Object : IDisposable
{
private readonly ChartObjects _chartObjects;
protected Mq4Object(string name, int type, ChartObjects chartObjects)
{
Name = name;
Type = type;
_chartObjects = chartObjects;
}
public int Type { get; private set; }
public string Name { get; private set; }
protected DateTime Time1
{
get
{
int seconds = Get(OBJPROP_TIME1);
return Mq4TimeSeries.ToDateTime(seconds);
}
}
protected double Price1
{
get
{
return Get(OBJPROP_PRICE1);
}
}
protected DateTime Time2
{
get
{
int seconds = Get(OBJPROP_TIME2);
return Mq4TimeSeries.ToDateTime(seconds);
}
}
protected double Price2
{
get
{
return Get(OBJPROP_PRICE2);
}
}
protected Colors Color
{
get
{
int intColor = Get(OBJPROP_COLOR);
if (intColor != CLR_NONE)
return Mq4Colors.GetColorByInteger(intColor);
return Colors.Yellow;
}
}
protected int Width
{
get
{
return Get(OBJPROP_WIDTH);
}
}
protected int Style
{
get
{
return Get(OBJPROP_STYLE);
}
}
public abstract void Draw();
private readonly Dictionary<int, Mq4Double> _properties = new Dictionary<int, Mq4Double>
{
{OBJPROP_WIDTH, new Mq4Double(1)},
{OBJPROP_COLOR, new Mq4Double(CLR_NONE)},
{OBJPROP_RAY, new Mq4Double(1)},
{OBJPROP_LEVELCOLOR, new Mq4Double(CLR_NONE)},
{OBJPROP_LEVELSTYLE, new Mq4Double(0)},
{OBJPROP_LEVELWIDTH, new Mq4Double(1)},
{OBJPROP_FIBOLEVELS, new Mq4Double(9)},
{OBJPROP_FIRSTLEVEL + 0, new Mq4Double(0)},
{OBJPROP_FIRSTLEVEL + 1, new Mq4Double(0.236)},
{OBJPROP_FIRSTLEVEL + 2, new Mq4Double(0.382)},
{OBJPROP_FIRSTLEVEL + 3, new Mq4Double(0.5)},
{OBJPROP_FIRSTLEVEL + 4, new Mq4Double(0.618)},
{OBJPROP_FIRSTLEVEL + 5, new Mq4Double(1)},
{OBJPROP_FIRSTLEVEL + 6, new Mq4Double(1.618)},
{OBJPROP_FIRSTLEVEL + 7, new Mq4Double(2.618)},
{OBJPROP_FIRSTLEVEL + 8, new Mq4Double(4.236)},
};
public virtual void Set(int index, Mq4Double value)
{
_properties[index] = value;
}
public Mq4Double Get(int index)
{
return _properties.ContainsKey(index) ? _properties[index] : new Mq4Double(0);
}
private readonly List<string> _addedAlgoChartObjects = new List<string>();
protected void DrawText(string objectName, string text, int index, double yValue, VerticalAlignment verticalAlignment = VerticalAlignment.Center, HorizontalAlignment horizontalAlignment = HorizontalAlignment.Center, Colors? color = null)
{
_addedAlgoChartObjects.Add(objectName);
_chartObjects.DrawText(objectName, text, index, yValue, verticalAlignment, horizontalAlignment, color);
}
protected void DrawText(string objectName, string text, StaticPosition position, Colors? color = null)
{
_addedAlgoChartObjects.Add(objectName);
_chartObjects.DrawText(objectName, text, position, color);
}
protected void DrawLine(string objectName, int index1, double y1, int index2, double y2, Colors color, double thickness = 1.0, cAlgo.API.LineStyle style = cAlgo.API.LineStyle.Solid)
{
_addedAlgoChartObjects.Add(objectName);
_chartObjects.DrawLine(objectName, index1, y1, index2, y2, color, thickness, style);
}
protected void DrawLine(string objectName, DateTime date1, double y1, DateTime date2, double y2, Colors color, double thickness = 1.0, cAlgo.API.LineStyle style = cAlgo.API.LineStyle.Solid)
{
_addedAlgoChartObjects.Add(objectName);
_chartObjects.DrawLine(objectName, date1, y1, date2, y2, color, thickness, style);
}
protected void DrawVerticalLine(string objectName, DateTime date, Colors color, double thickness = 1.0, cAlgo.API.LineStyle style = cAlgo.API.LineStyle.Solid)
{
_addedAlgoChartObjects.Add(objectName);
_chartObjects.DrawVerticalLine(objectName, date, color, thickness, style);
}
protected void DrawVerticalLine(string objectName, int index, Colors color, double thickness = 1.0, cAlgo.API.LineStyle style = cAlgo.API.LineStyle.Solid)
{
_addedAlgoChartObjects.Add(objectName);
_chartObjects.DrawVerticalLine(objectName, index, color, thickness, style);
}
protected void DrawHorizontalLine(string objectName, double y, Colors color, double thickness = 1.0, cAlgo.API.LineStyle style = cAlgo.API.LineStyle.Solid)
{
_addedAlgoChartObjects.Add(objectName);
_chartObjects.DrawHorizontalLine(objectName, y, color, thickness, style);
}
public void Dispose()
{
foreach (var name in _addedAlgoChartObjects)
{
_chartObjects.RemoveObject(name);
}
}
}
class Mq4Arrow : Mq4Object
{
private readonly TimeSeries _timeSeries;
private int _index;
public Mq4Arrow(string name, int type, ChartObjects chartObjects, TimeSeries timeSeries)
: base(name, type, chartObjects)
{
_timeSeries = timeSeries;
}
public override void Set(int index, Mq4Double value)
{
base.Set(index, value);
switch (index)
{
case OBJPROP_TIME1:
_index = _timeSeries.GetIndexByTime(Time1);
break;
}
}
private int ArrowCode
{
get
{
return Get(OBJPROP_ARROWCODE);
}
}
public override void Draw()
{
string arrowString;
HorizontalAlignment horizontalAlignment;
switch (ArrowCode)
{
case SYMBOL_RIGHTPRICE:
horizontalAlignment = HorizontalAlignment.Right;
arrowString = Price1.ToString();
break;
case SYMBOL_LEFTPRICE:
horizontalAlignment = HorizontalAlignment.Left;
arrowString = Price1.ToString();
break;
default:
arrowString = ConvertedIndicator.GetArrowByCode(ArrowCode);
horizontalAlignment = HorizontalAlignment.Center;
break;
}
DrawText(Name, arrowString, _index, Price1, VerticalAlignment.Center, horizontalAlignment, Color);
}
}
class Mq4MarketDataSeries : IMq4Array<Mq4Double>
{
private DataSeries _dataSeries;
public Mq4MarketDataSeries(DataSeries dataSeries)
{
_dataSeries = dataSeries;
}
public Mq4Double this[int index]
{
get { return _dataSeries.FromEnd(index); }
set { }
}
public int Length
{
get { return _dataSeries.Count; }
}
}
class Mq4TimeSeries
{
private readonly TimeSeries _timeSeries;
private static readonly DateTime StartDateTime = new DateTime(1970, 1, 1);
public Mq4TimeSeries(TimeSeries timeSeries)
{
_timeSeries = timeSeries;
}
public static int ToInteger(DateTime dateTime)
{
return (int)(dateTime - StartDateTime).TotalSeconds;
}
public static DateTime ToDateTime(int seconds)
{
return StartDateTime.AddSeconds(seconds);
}
public int this[int index]
{
get
{
if (index < 0 || index >= _timeSeries.Count)
return 0;
DateTime dateTime = _timeSeries[_timeSeries.Count - 1 - index];
return ToInteger(dateTime);
}
}
}
interface IMq4Array<T>
{
T this[int index] { get; set; }
int Length { get; }
}
class Mq4Array<T> : IMq4Array<T>, IEnumerable
{
private List<T> _data = new List<T>();
private readonly T _defaultValue;
public Mq4Array(int size = 0)
{
_defaultValue = (T)DefaultValues.GetDefaultValue<T>();
}
public IEnumerator GetEnumerator()
{
return _data.GetEnumerator();
}
private bool _isInverted;
public bool IsInverted
{
get { return _isInverted; }
set { _isInverted = value; }
}
public void Add(T value)
{
_data.Add(value);
}
private void EnsureCountIsEnough(int index)
{
while (_data.Count <= index)
_data.Add(_defaultValue);
}
public int Length
{
get { return _data.Count; }
}
public void Resize(int newSize)
{
while (newSize < _data.Count)
_data.RemoveAt(_data.Count - 1);
while (newSize > _data.Count)
_data.Add(_defaultValue);
}
public T this[int index]
{
get
{
if (index < 0)
return _defaultValue;
EnsureCountIsEnough(index);
return _data[index];
}
set
{
if (index < 0)
return;
EnsureCountIsEnough(index);
_data[index] = value;
Changed.Raise(index, value);
}
}
public event Action<int, T> Changed;
}
static class DefaultValues
{
public static object GetDefaultValue<T>()
{
if (typeof(T) == typeof(Mq4Double))
return new Mq4Double(0);
if (typeof(T) == typeof(string))
return string.Empty;
if (typeof(T) == typeof(Mq4String))
return new Mq4String(string.Empty);
return default(T);
}
}
class Mq4ArrayToDataSeriesConverter
{
private readonly Mq4Array<Mq4Double> _mq4Array;
private readonly IndicatorDataSeries _dataSeries;
public Mq4ArrayToDataSeriesConverter(Mq4Array<Mq4Double> mq4Array, IndicatorDataSeries dataSeries)
{
_mq4Array = mq4Array;
_dataSeries = dataSeries;
_mq4Array.Changed += OnValueChanged;
CopyAllValues();
}
private void CopyAllValues()
{
for (var i = 0; i < _mq4Array.Length; i++)
{
if (_mq4Array.IsInverted)
_dataSeries[_mq4Array.Length - i] = _mq4Array[i];
else
_dataSeries[i] = _mq4Array[i];
}
}
private void OnValueChanged(int index, Mq4Double value)
{
int indexToSet;
if (_mq4Array.IsInverted)
indexToSet = _mq4Array.Length - index;
else
indexToSet = index;
if (indexToSet < 0)
return;
_dataSeries[indexToSet] = value;
}
}
class Mq4ArrayToDataSeriesConverterFactory
{
private readonly Dictionary<Mq4Array<Mq4Double>, IndicatorDataSeries> _cachedAdapters = new Dictionary<Mq4Array<Mq4Double>, IndicatorDataSeries>();
private Func<IndicatorDataSeries> _dataSeriesFactory;
public Mq4ArrayToDataSeriesConverterFactory(Func<IndicatorDataSeries> dataSeriesFactory)
{
_dataSeriesFactory = dataSeriesFactory;
}
public DataSeries Create(Mq4Array<Mq4Double> mq4Array)
{
IndicatorDataSeries dataSeries;
if (_cachedAdapters.TryGetValue(mq4Array, out dataSeries))
return dataSeries;
dataSeries = _dataSeriesFactory();
new Mq4ArrayToDataSeriesConverter(mq4Array, dataSeries);
_cachedAdapters[mq4Array] = dataSeries;
return dataSeries;
}
}
}
//Custom Indicators Place Holder
struct Mq4Double : IComparable, IComparable<Mq4Double>
{
private readonly double _value;
public Mq4Double(double value)
{
_value = value;
}
public static implicit operator double(Mq4Double property)
{
return property._value;
}
public static implicit operator int(Mq4Double property)
{
return (int)property._value;
}
public static implicit operator bool(Mq4Double property)
{
return (int)property._value != 0;
}
public static implicit operator Mq4Double(double value)
{
return new Mq4Double(value);
}
public static implicit operator Mq4Double(int value)
{
return new Mq4Double(value);
}
public static implicit operator Mq4Double(bool value)
{
return new Mq4Double(value ? 1 : 0);
}
public static Mq4Double operator +(Mq4Double d1, Mq4Double d2)
{
return new Mq4Double(d1._value + d2._value);
}
public static Mq4Double operator -(Mq4Double d1, Mq4Double d2)
{
return new Mq4Double(d1._value - d2._value);
}
public static Mq4Double operator -(Mq4Double d)
{
return new Mq4Double(-d._value);
}
public static Mq4Double operator +(Mq4Double d)
{
return new Mq4Double(+d._value);
}
public static Mq4Double operator *(Mq4Double d1, Mq4Double d2)
{
return new Mq4Double(d1._value * d2._value);
}
public static Mq4Double operator /(Mq4Double d1, Mq4Double d2)
{
return new Mq4Double(d1._value / d2._value);
}
public static bool operator ==(Mq4Double d1, Mq4Double d2)
{
return d1._value == d2._value;
}
public static bool operator >(Mq4Double d1, Mq4Double d2)
{
return d1._value > d2._value;
}
public static bool operator >=(Mq4Double d1, Mq4Double d2)
{
return d1._value >= d2._value;
}
public static bool operator <(Mq4Double d1, Mq4Double d2)
{
return d1._value < d2._value;
}
public static bool operator <=(Mq4Double d1, Mq4Double d2)
{
return d1._value <= d2._value;
}
public static bool operator !=(Mq4Double d1, Mq4Double d2)
{
return d1._value != d2._value;
}
public override string ToString()
{
return _value.ToString();
}
public int CompareTo(object obj)
{
return _value.CompareTo(obj);
}
public int CompareTo(Mq4Double obj)
{
return _value.CompareTo(obj);
}
}
class Mq4DoubleComparer : IComparer<Mq4Double>
{
public int Compare(Mq4Double x, Mq4Double y)
{
return x.CompareTo(y);
}
}
class Mq4String
{
private readonly string _value;
public Mq4String(string value)
{
_value = value;
}
public static implicit operator Mq4String(string value)
{
return new Mq4String(value);
}
public static implicit operator Mq4String(int value)
{
return new Mq4String(value.ToString());
}
public static implicit operator Mq4String(Mq4Null mq4Null)
{
return new Mq4String(null);
}
public static implicit operator string(Mq4String mq4String)
{
return mq4String._value;
}
public static implicit operator Mq4String(Mq4Double mq4Double)
{
return new Mq4String(mq4Double.ToString());
}
public static bool operator <(Mq4String x, Mq4String y)
{
return string.Compare(x._value, y._value) == -1;
}
public static bool operator >(Mq4String x, Mq4String y)
{
return string.Compare(x._value, y._value) == 1;
}
public static bool operator <(Mq4String x, string y)
{
return string.Compare(x._value, y) == -1;
}
public static bool operator >(Mq4String x, string y)
{
return string.Compare(x._value, y) == 1;
}
public static bool operator <=(Mq4String x, Mq4String y)
{
return string.Compare(x._value, y._value) <= 0;
}
public static bool operator >=(Mq4String x, Mq4String y)
{
return string.Compare(x._value, y._value) >= 0;
}
public static bool operator <=(Mq4String x, string y)
{
return string.Compare(x._value, y) <= 0;
}
public static bool operator >=(Mq4String x, string y)
{
return string.Compare(x._value, y) >= 0;
}
public static bool operator ==(Mq4String x, Mq4String y)
{
return string.Compare(x._value, y._value) == 0;
}
public static bool operator !=(Mq4String x, Mq4String y)
{
return string.Compare(x._value, y._value) != 0;
}
public static bool operator ==(Mq4String x, string y)
{
return string.Compare(x._value, y) == 0;
}
public static bool operator !=(Mq4String x, string y)
{
return string.Compare(x._value, y) != 0;
}
public override string ToString()
{
return _value.ToString();
}
public static readonly Mq4String Empty = new Mq4String(string.Empty);
}
struct Mq4Null
{
public static implicit operator string(Mq4Null mq4Null)
{
return (string)null;
}
public static implicit operator int(Mq4Null mq4Null)
{
return 0;
}
public static implicit operator double(Mq4Null mq4Null)
{
return 0;
}
}
static class Comparers
{
public static IComparer<T> GetComparer<T>()
{
if (typeof(T) == typeof(Mq4Double))
return (IComparer<T>)new Mq4DoubleComparer();
return Comparer<T>.Default;
}
}
static class DataSeriesExtensions
{
public static Mq4Double FromEnd(this DataSeries dataSeries, int index)
{
if (index >= 0 && index < dataSeries.Count)
return dataSeries[dataSeries.InvertIndex(index)];
return 0;
}
public static int InvertIndex(this DataSeries dataSeries, int index)
{
return dataSeries.Count - 1 - index;
}
}
static class TimeSeriesExtensions
{
public static DateTime FromEnd(this TimeSeries timeSeries, int index)
{
return timeSeries[timeSeries.InvertIndex(index)];
}
public static int InvertIndex(this TimeSeries timeSeries, int index)
{
return timeSeries.Count - 1 - index;
}
public static int GetIndexByTime(this TimeSeries timeSeries, DateTime time)
{
var index = timeSeries.Count - 1;
for (var i = timeSeries.Count - 1; i >= 0; i--)
{
if (timeSeries[i] < time)
{
index = i + 1;
break;
}
}
return index;
}
}
static class Mq4Colors
{
public static Colors GetColorByInteger(int integer)
{
switch (integer)
{
case 16777215: return Colors.White; case 16448255: return Colors.Snow; case 16449525: return Colors.MintCream; case 16118015: return Colors.LavenderBlush; case 16775408: return Colors.AliceBlue; case 15794160: return Colors.Honeydew; case 15794175: return Colors.Ivory; case 16119285: return Colors.WhiteSmoke; case 15136253: return Colors.OldLace; case 14804223: return Colors.MistyRose; case 16443110: return Colors.Lavender; case 15134970: return Colors.Linen; case 16777184: return Colors.LightCyan; case 14745599: return Colors.LightYellow; case 14481663: return Colors.Cornsilk; case 14020607: return Colors.PapayaWhip; case 14150650: return Colors.AntiqueWhite; case 14480885: return Colors.Beige; case 13499135: return Colors.LemonChiffon; case 13495295: return Colors.BlanchedAlmond; case 12903679: return Colors.Bisque; case 13353215: return Colors.Pink; case 12180223: return Colors.PeachPuff; case 14474460: return Colors.Gainsboro; case 12695295: return Colors.LightPink; case 11920639: return Colors.Moccasin; case 11394815: return Colors.NavajoWhite; case 11788021: return Colors.Wheat; case 13882323: return Colors.LightGray; case 15658671: return Colors.PaleTurquoise; case 11200750: return Colors.PaleGoldenrod; case 15130800: return Colors.PowderBlue; case 14204888: return Colors.Thistle; case 10025880: return Colors.PaleGreen; case 15128749: return Colors.LightBlue; case 14599344: return Colors.LightSteelBlue; case 16436871: return Colors.LightSkyBlue; case 12632256: return Colors.Silver; case 13959039: return Colors.Aquamarine; case 9498256: return Colors.LightGreen; case 9234160: return Colors.Khaki; case 14524637: return Colors.Plum; case 8036607: return Colors.LightSalmon; case 15453831: return Colors.SkyBlue; case 8421616: return Colors.LightCoral; case 15631086: return Colors.Violet; case 7504122: return Colors.Salmon; case 11823615: return Colors.HotPink; case 8894686: return Colors.BurlyWood; case 8034025: return Colors.DarkSalmon; case 9221330: return Colors.Tan; case 15624315: return Colors.MediumSlateBlue; case 6333684: return Colors.SandyBrown; case 11119017: return Colors.DarkGray; case 15570276: return Colors.CornflowerBlue; case 5275647: return Colors.Coral; case 9662683: return Colors.PaleVioletRed; case 14381203: return Colors.MediumPurple; case 14053594: return Colors.Orchid; case 9408444: return Colors.RosyBrown; case 4678655: return Colors.Tomato; case 9419919: return Colors.DarkSeaGreen; case 11193702: return Colors.MediumAquamarine; case 3145645: return Colors.GreenYellow; case 13850042: return Colors.MediumOrchid; case 6053069: return Colors.IndianRed; case 7059389: return Colors.DarkKhaki; case 13458026: return Colors.SlateBlue; case 14772545: return Colors.RoyalBlue; case 13688896: return Colors.Turquoise; case 16748574: return Colors.DodgerBlue; case 13422920: return Colors.MediumTurquoise; case 9639167: return Colors.DeepPink; case 10061943: return Colors.LightSlateGray; case 14822282: return Colors.BlueViolet; case 4163021: return Colors.Peru; case 9470064: return Colors.SlateGray; case 8421504: return Colors.Gray; case 255: return Colors.Red; case 16711935: return Colors.Magenta; case 16711680: return Colors.Blue; case 16760576: return Colors.DeepSkyBlue; case 16776960: return Colors.Aqua; case 8388352: return Colors.SpringGreen; case 65280: return Colors.Lime; case 65407: return Colors.Chartreuse; case 65535: return Colors.Yellow; case 55295: return Colors.Gold; case 42495: return Colors.Orange; case 36095: return Colors.DarkOrange; case 17919: return Colors.OrangeRed; case 3329330: return Colors.LimeGreen; case 3329434: return Colors.YellowGreen; case 13382297: return Colors.DarkOrchid; case 10526303: return Colors.CadetBlue; case 64636: return Colors.LawnGreen; case 10156544: return Colors.MediumSpringGreen; case 2139610: return Colors.Goldenrod; case 11829830: return Colors.SteelBlue; case 3937500: return Colors.Crimson; case 1993170: return Colors.Chocolate; case 7451452: return Colors.MediumSeaGreen; case 8721863: return Colors.MediumVioletRed; case 13828244: return Colors.DarkViolet; case 11186720: return Colors.LightSeaGreen; case 6908265: return Colors.DimGray; case 13749760: return Colors.DarkTurquoise; case 2763429: return Colors.Brown; case 13434880: return Colors.MediumBlue; case 2970272: return Colors.Sienna; case 9125192: return Colors.DarkSlateBlue; case 755384: return Colors.DarkGoldenrod; case 5737262: return Colors.SeaGreen; case 2330219: return Colors.OliveDrab; case 2263842: return Colors.ForestGreen; case 1262987: return Colors.SaddleBrown; case 3107669: return Colors.DarkOliveGreen; case 9109504: return Colors.DarkBlue; case 7346457: return Colors.MidnightBlue; case 8519755: return Colors.Indigo; case 128: return Colors.Maroon; case 8388736: return Colors.Purple; case 8388608: return Colors.Navy; case 8421376: return Colors.Teal; case 32768: return Colors.Green; case 32896: return Colors.Olive; case 5197615: return Colors.DarkSlateGray; case 25600: return Colors.DarkGreen; case 0:
default:
return Colors.Black;
}
}
}
static class EventExtensions
{
public static void Raise<T1, T2>(this Action<T1, T2> action, T1 arg1, T2 arg2)
{
if (action != null)
action(arg1, arg2);
}
}
static class Mq4LineStyles
{
public static LineStyle ToLineStyle(int style)
{
switch (style)
{
case 1:
return LineStyle.Lines;
case 2:
return LineStyle.Dots;
case 3:
case 4:
return LineStyle.LinesDots;
default:
return LineStyle.Solid;
}
}
}
}
@facestockvn

Forex19
27 Oct 2013, 10:22 ( Updated at: 21 Dec 2023, 09:20 )
RE:
facestockvn said:
If I remember correctly, here I saw this indicator but can not find it.
Did you solve?
@Forex19