diff --git a/MtApi/MtApi.csproj b/MtApi/MtApi.csproj
index 06b04942..91ff9c59 100755
--- a/MtApi/MtApi.csproj
+++ b/MtApi/MtApi.csproj
@@ -78,6 +78,7 @@
+
@@ -87,6 +88,7 @@
+
diff --git a/MtApi/MtApiClient.cs b/MtApi/MtApiClient.cs
index fc3826a0..a18d03dc 100755
--- a/MtApi/MtApiClient.cs
+++ b/MtApi/MtApiClient.cs
@@ -995,29 +995,54 @@ namespace MtApi
public double iCustom(string symbol, int timeframe, string name, int[] parameters, int mode, int shift)
{
- var commandParameters = new ArrayList { symbol, timeframe, name };
- int arraySize = parameters != null ? parameters.Length : 0;
- commandParameters.Add(arraySize);
- if (arraySize > 0)
+ var response = SendRequest(new ICustomRequest
{
- commandParameters.AddRange(parameters);
- }
- commandParameters.Add(mode);
- commandParameters.Add(shift);
-
- return SendCommand(MtCommandType.iCustom, commandParameters);
+ Symbol = symbol,
+ Timeframe = timeframe,
+ Name = name,
+ Mode = mode,
+ Shift = shift,
+ Params = new ArrayList(parameters),
+ ParamsType = ICustomRequest.ParametersType.Int
+ });
+ return response != null ? response.Value : double.NaN;
}
public double iCustom(string symbol, int timeframe, string name, double[] parameters, int mode, int shift)
{
- var commandParameters = new ArrayList { symbol, timeframe, name };
- int arraySize = parameters != null ? parameters.Length : 0;
- commandParameters.Add(arraySize);
- commandParameters.AddRange(parameters);
- commandParameters.Add(mode);
- commandParameters.Add(shift);
+ //var commandParameters = new ArrayList { symbol, timeframe, name };
+ //int arraySize = parameters != null ? parameters.Length : 0;
+ //commandParameters.Add(arraySize);
+ //commandParameters.AddRange(parameters);
+ //commandParameters.Add(mode);
+ //commandParameters.Add(shift);
- return SendCommand(MtCommandType.iCustom_d, commandParameters);
+ //return SendCommand(MtCommandType.iCustom_d, commandParameters);
+
+ var response = SendRequest(new ICustomRequest
+ {
+ Symbol = symbol,
+ Timeframe = timeframe,
+ Name = name,
+ Mode = mode,
+ Shift = shift,
+ Params = new ArrayList(parameters),
+ ParamsType = ICustomRequest.ParametersType.Double
+ });
+ return response != null ? response.Value : double.NaN;
+ }
+
+ public double iCustom(string symbol, int timeframe, string name, int mode, int shift)
+ {
+ var response = SendRequest(new ICustomRequest
+ {
+ Symbol = symbol,
+ Timeframe = timeframe,
+ Name = name,
+ Mode = mode,
+ Shift = shift
+ });
+ return response != null ? response.Value : double.NaN;
}
public double iDeMarker(string symbol, int timeframe, int period, int shift)
diff --git a/MtApi/Requests/ICustomRequest.cs b/MtApi/Requests/ICustomRequest.cs
new file mode 100644
index 00000000..f75d3d63
--- /dev/null
+++ b/MtApi/Requests/ICustomRequest.cs
@@ -0,0 +1,30 @@
+
+using System;
+using System.Collections;
+
+namespace MtApi.Requests
+{
+ public class ICustomRequest : RequestBase
+ {
+ public enum ParametersType
+ {
+ Int = 0,
+ Double = 1,
+ String = 2,
+ Boolean = 3
+ }
+
+ public string Symbol { get; set; }
+ public int Timeframe { get; set; }
+ public string Name { get; set; }
+ public int Mode { get; set; }
+ public int Shift { get; set; }
+ public ArrayList Params { get; set; }
+ public ParametersType ParamsType { get; set; }
+
+ public override RequestType RequestType
+ {
+ get { return RequestType.iCustom; }
+ }
+ }
+}
diff --git a/MtApi/Requests/RequestType.cs b/MtApi/Requests/RequestType.cs
index b91cbbdf..457b1293 100644
--- a/MtApi/Requests/RequestType.cs
+++ b/MtApi/Requests/RequestType.cs
@@ -9,6 +9,7 @@
OrderClose = 4,
OrderCloseBy = 5,
OrderDelete = 6,
- OrderModify = 7
+ OrderModify = 7,
+ iCustom = 8
}
}
\ No newline at end of file
diff --git a/MtApi/Responses/ICustomResponse.cs b/MtApi/Responses/ICustomResponse.cs
new file mode 100644
index 00000000..601eb5fd
--- /dev/null
+++ b/MtApi/Responses/ICustomResponse.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MtApi.Responses
+{
+ public class ICustomResponse: ResponseBase
+ {
+ public double Value { get; set; }
+ }
+}
diff --git a/TestClients/TestApiClientUI/Form1.Designer.cs b/TestClients/TestApiClientUI/Form1.Designer.cs
index ae0949e2..a2806c10 100644
--- a/TestClients/TestApiClientUI/Form1.Designer.cs
+++ b/TestClients/TestApiClientUI/Form1.Designer.cs
@@ -48,6 +48,11 @@
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPage2 = new System.Windows.Forms.TabPage();
+ this.button22 = new System.Windows.Forms.Button();
+ this.button21 = new System.Windows.Forms.Button();
+ this.label3 = new System.Windows.Forms.Label();
+ this.textBoxOppositeTicket = new System.Windows.Forms.TextBox();
+ this.button15 = new System.Windows.Forms.Button();
this.checkBox1 = new System.Windows.Forms.CheckBox();
this.button20 = new System.Windows.Forms.Button();
this.button17 = new System.Windows.Forms.Button();
@@ -109,7 +114,6 @@
this.button5 = new System.Windows.Forms.Button();
this.listBoxMarketInfo = new System.Windows.Forms.ListBox();
this.tabPage5 = new System.Windows.Forms.TabPage();
- this.iCustomBtn = new System.Windows.Forms.Button();
this.button12 = new System.Windows.Forms.Button();
this.button11 = new System.Windows.Forms.Button();
this.button10 = new System.Windows.Forms.Button();
@@ -124,11 +128,9 @@
this.tabPage6 = new System.Windows.Forms.TabPage();
this.button14 = new System.Windows.Forms.Button();
this.button13 = new System.Windows.Forms.Button();
- this.button15 = new System.Windows.Forms.Button();
- this.textBoxOppositeTicket = new System.Windows.Forms.TextBox();
- this.label3 = new System.Windows.Forms.Label();
- this.button21 = new System.Windows.Forms.Button();
- this.button22 = new System.Windows.Forms.Button();
+ this.tabPage7 = new System.Windows.Forms.TabPage();
+ this.iCustomBtn = new System.Windows.Forms.Button();
+ this.button23 = new System.Windows.Forms.Button();
this.groupBox1.SuspendLayout();
this.statusStrip1.SuspendLayout();
this.groupBox2.SuspendLayout();
@@ -141,6 +143,7 @@
this.tabPage4.SuspendLayout();
this.tabPage5.SuspendLayout();
this.tabPage6.SuspendLayout();
+ this.tabPage7.SuspendLayout();
this.SuspendLayout();
//
// textBoxServerName
@@ -301,6 +304,7 @@
this.tabControl1.Controls.Add(this.tabPage4);
this.tabControl1.Controls.Add(this.tabPage5);
this.tabControl1.Controls.Add(this.tabPage6);
+ this.tabControl1.Controls.Add(this.tabPage7);
this.tabControl1.Location = new System.Drawing.Point(12, 147);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
@@ -337,6 +341,53 @@
this.tabPage2.Text = "Trade Operations";
this.tabPage2.UseVisualStyleBackColor = true;
//
+ // button22
+ //
+ this.button22.Location = new System.Drawing.Point(216, 293);
+ this.button22.Name = "button22";
+ this.button22.Size = new System.Drawing.Size(75, 23);
+ this.button22.TabIndex = 19;
+ this.button22.Text = "OrderModify";
+ this.button22.UseVisualStyleBackColor = true;
+ this.button22.Click += new System.EventHandler(this.button22_Click);
+ //
+ // button21
+ //
+ this.button21.Location = new System.Drawing.Point(216, 264);
+ this.button21.Name = "button21";
+ this.button21.Size = new System.Drawing.Size(75, 23);
+ this.button21.TabIndex = 18;
+ this.button21.Text = "OrderDelete";
+ this.button21.UseVisualStyleBackColor = true;
+ this.button21.Click += new System.EventHandler(this.button21_Click);
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(219, 242);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(78, 13);
+ this.label3.TabIndex = 17;
+ this.label3.Text = "Opposite ticket";
+ //
+ // textBoxOppositeTicket
+ //
+ this.textBoxOppositeTicket.Location = new System.Drawing.Point(303, 239);
+ this.textBoxOppositeTicket.Name = "textBoxOppositeTicket";
+ this.textBoxOppositeTicket.Size = new System.Drawing.Size(100, 20);
+ this.textBoxOppositeTicket.TabIndex = 16;
+ this.textBoxOppositeTicket.Text = "0";
+ //
+ // button15
+ //
+ this.button15.Location = new System.Drawing.Point(410, 237);
+ this.button15.Name = "button15";
+ this.button15.Size = new System.Drawing.Size(92, 23);
+ this.button15.TabIndex = 15;
+ this.button15.Text = "OrderCloseBy";
+ this.button15.UseVisualStyleBackColor = true;
+ this.button15.Click += new System.EventHandler(this.button15_Click);
+ //
// checkBox1
//
this.checkBox1.AutoSize = true;
@@ -1030,7 +1081,6 @@
//
// tabPage5
//
- this.tabPage5.Controls.Add(this.iCustomBtn);
this.tabPage5.Controls.Add(this.button12);
this.tabPage5.Controls.Add(this.button11);
this.tabPage5.Controls.Add(this.button10);
@@ -1050,16 +1100,6 @@
this.tabPage5.Text = "Timeframes";
this.tabPage5.UseVisualStyleBackColor = true;
//
- // iCustomBtn
- //
- this.iCustomBtn.Location = new System.Drawing.Point(341, 215);
- this.iCustomBtn.Name = "iCustomBtn";
- this.iCustomBtn.Size = new System.Drawing.Size(75, 23);
- this.iCustomBtn.TabIndex = 14;
- this.iCustomBtn.Text = "ICustom";
- this.iCustomBtn.UseVisualStyleBackColor = true;
- this.iCustomBtn.Click += new System.EventHandler(this.iCustomBtn_Click);
- //
// button12
//
this.button12.Location = new System.Drawing.Point(141, 201);
@@ -1193,52 +1233,37 @@
this.button13.UseVisualStyleBackColor = true;
this.button13.Click += new System.EventHandler(this.button13_Click);
//
- // button15
+ // tabPage7
//
- this.button15.Location = new System.Drawing.Point(410, 237);
- this.button15.Name = "button15";
- this.button15.Size = new System.Drawing.Size(92, 23);
- this.button15.TabIndex = 15;
- this.button15.Text = "OrderCloseBy";
- this.button15.UseVisualStyleBackColor = true;
- this.button15.Click += new System.EventHandler(this.button15_Click);
+ this.tabPage7.Controls.Add(this.button23);
+ this.tabPage7.Controls.Add(this.iCustomBtn);
+ this.tabPage7.Location = new System.Drawing.Point(4, 22);
+ this.tabPage7.Name = "tabPage7";
+ this.tabPage7.Padding = new System.Windows.Forms.Padding(3);
+ this.tabPage7.Size = new System.Drawing.Size(682, 377);
+ this.tabPage7.TabIndex = 7;
+ this.tabPage7.Text = "Technical Indicators";
+ this.tabPage7.UseVisualStyleBackColor = true;
//
- // textBoxOppositeTicket
+ // iCustomBtn
//
- this.textBoxOppositeTicket.Location = new System.Drawing.Point(303, 239);
- this.textBoxOppositeTicket.Name = "textBoxOppositeTicket";
- this.textBoxOppositeTicket.Size = new System.Drawing.Size(100, 20);
- this.textBoxOppositeTicket.TabIndex = 16;
- this.textBoxOppositeTicket.Text = "0";
+ this.iCustomBtn.Location = new System.Drawing.Point(6, 6);
+ this.iCustomBtn.Name = "iCustomBtn";
+ this.iCustomBtn.Size = new System.Drawing.Size(107, 23);
+ this.iCustomBtn.TabIndex = 15;
+ this.iCustomBtn.Text = "iCustom (ZigZag)";
+ this.iCustomBtn.UseVisualStyleBackColor = true;
+ this.iCustomBtn.Click += new System.EventHandler(this.iCustomBtn_Click);
//
- // label3
+ // button23
//
- this.label3.AutoSize = true;
- this.label3.Location = new System.Drawing.Point(219, 242);
- this.label3.Name = "label3";
- this.label3.Size = new System.Drawing.Size(78, 13);
- this.label3.TabIndex = 17;
- this.label3.Text = "Opposite ticket";
- //
- // button21
- //
- this.button21.Location = new System.Drawing.Point(216, 264);
- this.button21.Name = "button21";
- this.button21.Size = new System.Drawing.Size(75, 23);
- this.button21.TabIndex = 18;
- this.button21.Text = "OrderDelete";
- this.button21.UseVisualStyleBackColor = true;
- this.button21.Click += new System.EventHandler(this.button21_Click);
- //
- // button22
- //
- this.button22.Location = new System.Drawing.Point(216, 293);
- this.button22.Name = "button22";
- this.button22.Size = new System.Drawing.Size(75, 23);
- this.button22.TabIndex = 19;
- this.button22.Text = "OrderModify";
- this.button22.UseVisualStyleBackColor = true;
- this.button22.Click += new System.EventHandler(this.button22_Click);
+ this.button23.Location = new System.Drawing.Point(6, 35);
+ this.button23.Name = "button23";
+ this.button23.Size = new System.Drawing.Size(107, 23);
+ this.button23.TabIndex = 16;
+ this.button23.Text = "iCustom (Parabolic)";
+ this.button23.UseVisualStyleBackColor = true;
+ this.button23.Click += new System.EventHandler(this.button23_Click);
//
// Form1
//
@@ -1274,6 +1299,7 @@
this.tabPage5.ResumeLayout(false);
this.tabPage5.PerformLayout();
this.tabPage6.ResumeLayout(false);
+ this.tabPage7.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
@@ -1362,7 +1388,6 @@
private System.Windows.Forms.Button button11;
private System.Windows.Forms.Button button12;
private System.Windows.Forms.ColumnHeader colFeedCount;
- private System.Windows.Forms.Button iCustomBtn;
private System.Windows.Forms.TabPage tabPage6;
private System.Windows.Forms.Button button13;
private System.Windows.Forms.Button button14;
@@ -1381,6 +1406,9 @@
private System.Windows.Forms.Button button15;
private System.Windows.Forms.Button button21;
private System.Windows.Forms.Button button22;
+ private System.Windows.Forms.TabPage tabPage7;
+ private System.Windows.Forms.Button iCustomBtn;
+ private System.Windows.Forms.Button button23;
}
}
diff --git a/TestClients/TestApiClientUI/Form1.cs b/TestClients/TestApiClientUI/Form1.cs
index dd120cc6..a848c28b 100644
--- a/TestClients/TestApiClientUI/Form1.cs
+++ b/TestClients/TestApiClientUI/Form1.cs
@@ -4,6 +4,7 @@ using System.Drawing;
using System.Windows.Forms;
using MtApi;
using System.Threading.Tasks;
+using System.Collections;
namespace TestApiClientUI
{
@@ -765,14 +766,6 @@ namespace TestApiClientUI
listBoxProceHistory.DataSource = items;
}
- private void iCustomBtn_Click(object sender, EventArgs e)
- {
- string symbol = textBoxSelectedSymbol.Text;
- int[] param = {11, 12, 13};
- var retVal = _apiClient.iCustom(symbol, (int)ChartPeriod.PERIOD_H1, "Zigzag", param, 1, 0);
- AddToLog(string.Format("ICustom result: {0}", retVal));
- }
-
private void button13_Click(object sender, EventArgs e)
{
var retVal = _apiClient.TimeCurrent();
@@ -1002,5 +995,30 @@ namespace TestApiClientUI
AddToLog(string.Format("Modify order result: {0}, ticket = {1}", modified, ticket));
}
+
+ //iCustom
+ private async void iCustomBtn_Click(object sender, EventArgs e)
+ {
+ string symbol = "EURUSD";
+ var timeframe = ChartPeriod.PERIOD_H1;
+ string name = "ZigZag";
+ int[] parameters = { 12, 5, 4 };
+ int mode = 0;
+ int shift = 0;
+ var retVal = await Execute(() => _apiClient.iCustom(symbol, (int)timeframe, name, parameters, mode, shift));
+ AddToLog(string.Format("ICustom result: {0}", retVal));
+ }
+
+ private async void button23_Click(object sender, EventArgs e)
+ {
+ string symbol = "EURUSD";
+ var timeframe = ChartPeriod.PERIOD_H1;
+ string name = "Parabolic";
+ double[] parameters = { 0.02, 0.2 };
+ int mode = 0;
+ int shift = 1;
+ var retVal = await Execute(() => _apiClient.iCustom(symbol, (int)timeframe, name, parameters, mode, shift));
+ AddToLog(string.Format("ICustom result: {0}", retVal));
+ }
}
}
diff --git a/mq4/MtApi.ex4 b/mq4/MtApi.ex4
index 77779ef4..4020d1c1 100755
Binary files a/mq4/MtApi.ex4 and b/mq4/MtApi.ex4 differ
diff --git a/mq4/MtApi.mq4 b/mq4/MtApi.mq4
index 564aa3db..6845c03a 100755
--- a/mq4/MtApi.mq4
+++ b/mq4/MtApi.mq4
@@ -3408,25 +3408,28 @@ string OnRequest(string json)
switch(requestType)
{
case 1: //GetOrder
- response = ExecuteRequestGetOrder(jo);
+ response = ExecuteRequest_GetOrder(jo);
break;
case 2: //GetOrders
- response = ExecuteRequestGetOrders(jo);
+ response = ExecuteRequest_GetOrders(jo);
break;
case 3: //OrderSend
- response = ExecuteRequestOrderSend(jo);
+ response = ExecuteRequest_OrderSend(jo);
break;
case 4: //OrderClose
- response = ExecuteRequestOrderClose(jo);
+ response = ExecuteRequest_OrderClose(jo);
break;
case 5: //OrderCloseBy
- response = ExecuteRequestOrderCloseBy(jo);
+ response = ExecuteRequest_OrderCloseBy(jo);
break;
case 6: //OrderDelete
- response = ExecuteRequestOrderDelete(jo);
+ response = ExecuteRequest_OrderDelete(jo);
break;
case 7: //OrderModify
- response = ExecuteRequestOrderModify(jo);
+ response = ExecuteRequest_OrderModify(jo);
+ break;
+ case 8: //iCustom
+ response = ExecuteRequest_iCustom(jo);
break;
default:
Print("OnRequest [WARNING]: Unknown request type ", requestType);
@@ -3488,7 +3491,7 @@ JSONObject* GetOrderJson(int index, int select, int pool)
return joOrder;
}
-string ExecuteRequestGetOrder(JSONObject *jo)
+string ExecuteRequest_GetOrder(JSONObject *jo)
{
int index = jo.getInt("Index");
int select = jo.getInt("Select");
@@ -3502,7 +3505,7 @@ string ExecuteRequestGetOrder(JSONObject *jo)
return CreateSuccessResponse("Order", joOrder);
}
-string ExecuteRequestGetOrders(JSONObject *jo)
+string ExecuteRequest_GetOrders(JSONObject *jo)
{
int pool = jo.getInt("Pool");
@@ -3511,9 +3514,9 @@ string ExecuteRequestGetOrders(JSONObject *jo)
int total = (pool == MODE_HISTORY) ? OrdersHistoryTotal() : OrdersTotal();
JSONArray* joOrders = new JSONArray();
- for(int pos = 0; pos < total; pos++)
+ for(int pos = 0; pos < 10000; pos++)
{
- JSONObject* joOrder = GetOrderJson(pos, SELECT_BY_POS, pool);
+ JSONObject* joOrder = GetOrderJson(0, SELECT_BY_POS, pool);
if (joOrder == NULL)
return CreateErrorResponse(GetLastError(), "GetOrders failed");
joOrders.put(pos, joOrder);
@@ -3529,7 +3532,7 @@ bool isLongOperation(int operation)
return false;
}
-string ExecuteRequestOrderSend(JSONObject *jo)
+string ExecuteRequest_OrderSend(JSONObject *jo)
{
if (jo.getValue("Symbol") == NULL)
return CreateErrorResponse(-1, "Undefinded mandatory parameter Symbol");
@@ -3584,7 +3587,7 @@ string ExecuteRequestOrderSend(JSONObject *jo)
return CreateSuccessResponse("Ticket", jvTicket);
}
-string ExecuteRequestOrderClose(JSONObject *jo)
+string ExecuteRequest_OrderClose(JSONObject *jo)
{
if (jo.getValue("Ticket") == NULL)
return CreateErrorResponse(-1, "Undefinded mandatory parameter Ticket");
@@ -3640,7 +3643,7 @@ string ExecuteRequestOrderClose(JSONObject *jo)
return CreateSuccessResponse("", NULL);
}
-string ExecuteRequestOrderCloseBy(JSONObject *jo)
+string ExecuteRequest_OrderCloseBy(JSONObject *jo)
{
if (jo.getValue("Ticket") == NULL)
return CreateErrorResponse(-1, "Undefinded mandatory parameter Ticket");
@@ -3658,7 +3661,7 @@ string ExecuteRequestOrderCloseBy(JSONObject *jo)
return CreateSuccessResponse("", NULL);
}
-string ExecuteRequestOrderDelete(JSONObject *jo)
+string ExecuteRequest_OrderDelete(JSONObject *jo)
{
if (jo.getValue("Ticket") == NULL)
return CreateErrorResponse(-1, "Undefinded mandatory parameter Ticket");
@@ -3673,7 +3676,7 @@ string ExecuteRequestOrderDelete(JSONObject *jo)
return CreateSuccessResponse("", NULL);
}
-string ExecuteRequestOrderModify(JSONObject *jo)
+string ExecuteRequest_OrderModify(JSONObject *jo)
{
if (jo.getValue("Ticket") == NULL)
return CreateErrorResponse(-1, "Undefinded mandatory parameter Ticket");
@@ -3698,4 +3701,115 @@ string ExecuteRequestOrderModify(JSONObject *jo)
if (!OrderModify(ticket, price, stoploss, takeprofit, expiration, arrowcolor))
return CreateErrorResponse(GetLastError(), "OrderModify failed");
return CreateSuccessResponse("", NULL);
+}
+
+string ExecuteRequest_iCustom(JSONObject *jo)
+{
+ if (jo.getValue("Symbol") == NULL)
+ return CreateErrorResponse(-1, "Undefinded mandatory parameter Symbol");
+ if (jo.getValue("Timeframe") == NULL)
+ return CreateErrorResponse(-1, "Undefinded mandatory parameter Timeframe");
+ if (jo.getValue("Name") == NULL)
+ return CreateErrorResponse(-1, "Undefinded mandatory parameter Name");
+ if (jo.getValue("Mode") == NULL)
+ return CreateErrorResponse(-1, "Undefinded mandatory parameter Mode");
+ if (jo.getValue("Shift") == NULL)
+ return CreateErrorResponse(-1, "Undefinded mandatory parameter Shift");
+
+ string symbol = jo.getString("Symbol");
+ int timeframe = jo.getInt("Timeframe");
+ string name = jo.getString("Name");
+ int mode = jo.getInt("Mode");
+ int shift = jo.getInt("Shift");
+
+ if (jo.getValue("Params") == NULL)
+ {
+ result = iCustom(symbol, timeframe, name, mode, shift);
+ }
+ else
+ {
+ JSONArray *jaParams = jo.getArray("Params");
+ int size = jaParams.size();
+
+ if (size < 0 || size > 10)
+ return CreateErrorResponse(-1, "Parameter's count is out of range.");
+
+ if (jo.getValue("ParamsType") == NULL)
+ return CreateErrorResponse(-1, "Undefinded mandatory parameter ParamsType");
+
+ int paramsType = jo.getInt("ParamsType");
+ switch (paramsType)
+ {
+ case 0: //Int
+ {
+ int intParams[];
+ ArrayResize(intParams, size);
+ for (int i = 0; i < size; i++)
+ {
+ intParams[i] = jaParams.getInt(i);
+ }
+ result = iCustomT(symbol, timeframe, name, intParams, size, mode, shift);
+ }
+ break;
+ case 1: //Double
+ {
+ int doubleParams[];
+ ArrayResize(doubleParams, size);
+ result = iCustomT(symbol, timeframe, name, doubleParams, size, mode, shift);
+ }
+ break;
+ case 2: //String
+ {
+ string stringParams[];
+ ArrayResize(stringParams, size);
+ result = iCustomT(symbol, timeframe, name, stringParams, size, mode, shift);
+ }
+ break;
+ case 3: //Boolean
+ {
+ string boolParams[];
+ ArrayResize(boolParams, size);
+ result = iCustomT(symbol, timeframe, name, boolParams, size, mode, shift);
+ }
+ break;
+ default:
+ return CreateErrorResponse(-1, "Unsupported type of iCustom parameters.");
+ break;
+ }
+ }
+
+ return CreateSuccessResponse("Value", new JSONNumber(result));
+}
+
+template
+double iCustomT(string symbol, int timeframe, string name, T &p[], int count, int mode, int shift)
+{
+ switch(count)
+ {
+ case 0:
+ return iCustom(symbol, timeframe, name, mode, shift);
+ break;
+ case 1:
+ return iCustom(symbol, timeframe, name, p[0], mode, shift);
+ case 2:
+ return iCustom(symbol, timeframe, name, p[0], p[1], mode, shift);
+ case 3:
+ return iCustom(symbol, timeframe, name, p[0], p[1], p[2], mode, shift);
+ case 4:
+ return iCustom(symbol, timeframe, name, p[0], p[1], p[2], p[3], mode, shift);
+ case 5:
+ return iCustom(symbol, timeframe, name, p[0], p[1], p[2], p[3], p[4], mode, shift);
+ case 6:
+ return iCustom(symbol, timeframe, name, p[0], p[1], p[2], p[3], p[4], p[5], mode, shift);
+ case 7:
+ return iCustom(symbol, timeframe, name, p[0], p[1], p[2], p[3], p[4], p[5], p[6], mode, shift);
+ case 8:
+ return iCustom(symbol, timeframe, name, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], mode, shift);
+ case 9:
+ return iCustom(symbol, timeframe, name, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], mode, shift);
+ case 10:
+ return iCustom(symbol, timeframe, name, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], mode, shift);
+ default:
+ return 0;
+ }
}
\ No newline at end of file