Implemented functions ChartTimePriceToXY, ChartXYToTimePrice (MT5)

This commit is contained in:
vdemydiuk
2018-03-13 17:28:21 +02:00
parent f3a3a582fd
commit 16f454ca61
12 changed files with 238 additions and 47 deletions
+2 -2
View File
@@ -187,8 +187,8 @@ namespace MtApi5
ChartApplyTemplate = 236, ChartApplyTemplate = 236,
ChartSaveTemplate = 237, ChartSaveTemplate = 237,
ChartWindowFind = 238, ChartWindowFind = 238,
ChartTimePriceToXY = 239, //ChartTimePriceToXY = 239,
ChartXYToTimePrice = 240, //ChartXYToTimePrice = 240,
ChartOpen = 241, ChartOpen = 241,
ChartFirst = 242, ChartFirst = 242,
ChartNext = 243, ChartNext = 243,
+4
View File
@@ -73,6 +73,10 @@
<Compile Include="Events\Mt5EventTypes.cs" /> <Compile Include="Events\Mt5EventTypes.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Mt5Quote.cs" /> <Compile Include="Mt5Quote.cs" />
<Compile Include="Requests\ChartTimePriceToXyRequest.cs" />
<Compile Include="Requests\ChartTimePriceToXyResult.cs" />
<Compile Include="Requests\ChartXyToTimePriceRequest.cs" />
<Compile Include="Requests\ChartXyToTimePriceResult.cs" />
<Compile Include="Requests\CopyTicksRequest.cs" /> <Compile Include="Requests\CopyTicksRequest.cs" />
<Compile Include="Requests\ICustomRequest.cs" /> <Compile Include="Requests\ICustomRequest.cs" />
<Compile Include="Requests\IndicatorCreateRequest.cs" /> <Compile Include="Requests\IndicatorCreateRequest.cs" />
+20 -34
View File
@@ -1578,22 +1578,17 @@ namespace MtApi5
///</returns> ///</returns>
public bool ChartTimePriceToXY(long chartId, int subWindow, DateTime? time, double price, out int x, out int y) public bool ChartTimePriceToXY(long chartId, int subWindow, DateTime? time, double price, out int x, out int y)
{ {
var commandParameters = new ArrayList { chartId, subWindow, Mt5TimeConverter.ConvertToMtTime(time), price }; var result = SendRequest<ChartTimePriceToXyResult>(new ChartTimePriceToXyRequest
var str = SendCommand<string>(Mt5CommandType.ChartTimePriceToXY, commandParameters);
var res = false;
x = 0;
y = 0;
if (!string.IsNullOrEmpty(str) && str.Contains(";"))
{
var values = str.Split(';');
if (values.Length > 1)
{ {
int.TryParse(values[0], out x); ChartId = chartId,
int.TryParse(values[1], out y); SubWindow = subWindow,
res = true; Time = time,
} Price = price
} });
return res;
x = result?.X ?? 0;
y = result?.Y ?? 0;
return result?.RetVal ?? false;
} }
///<summary> ///<summary>
@@ -1610,26 +1605,17 @@ namespace MtApi5
///</returns> ///</returns>
public bool ChartXYToTimePrice(long chartId, int x, int y, out int subWindow, out DateTime? time, out double price) public bool ChartXYToTimePrice(long chartId, int x, int y, out int subWindow, out DateTime? time, out double price)
{ {
var commandParameters = new ArrayList { chartId, x, y }; var result = SendRequest<ChartXyToTimePriceResult>(new ChartXyToTimePriceRequest
var str = SendCommand<string>(Mt5CommandType.ChartXYToTimePrice, commandParameters);
var res = false;
subWindow = 0;
time = null;
price = double.NaN;
if (!string.IsNullOrEmpty(str) && str.Contains(";"))
{ {
var values = str.Split(';'); ChartId = chartId,
if (values.Length > 2) X = x,
{ Y = y
int.TryParse(values[0], out subWindow); });
int mt4Time;
int.TryParse(values[1], out mt4Time); subWindow = result?.SubWindow ?? 0;
time = Mt5TimeConverter.ConvertFromMtTime(mt4Time); time = result?.Time;
double.TryParse(values[2], out price); price = result?.Price ?? double.NaN;
res = true; return result?.RetVal ?? false;
}
}
return res;
} }
///<summary> ///<summary>
@@ -0,0 +1,16 @@
using System;
namespace MtApi5.Requests
{
internal class ChartTimePriceToXyRequest : RequestBase
{
public override RequestType RequestType => RequestType.ChartTimePriceToXY;
public long ChartId { get; set; }
public int SubWindow { get; set; }
public DateTime? Time { get; set; }
public double Price { get; set; }
public int MtTime => Mt5TimeConverter.ConvertToMtTime(Time);
}
}
@@ -0,0 +1,9 @@
namespace MtApi5.Requests
{
internal class ChartTimePriceToXyResult
{
public bool RetVal { get; set; }
public int X { get; set; }
public int Y { get; set; }
}
}
@@ -0,0 +1,13 @@
using System;
namespace MtApi5.Requests
{
internal class ChartXyToTimePriceRequest : RequestBase
{
public override RequestType RequestType => RequestType.ChartXYToTimePrice;
public long ChartId { get; set; }
public int X { get; set; }
public int Y { get; set; }
}
}
@@ -0,0 +1,14 @@
using System;
namespace MtApi5.Requests
{
internal class ChartXyToTimePriceResult
{
public bool RetVal { get; set; }
public int SubWindow { get; set; }
public DateTime? Time => Mt5TimeConverter.ConvertFromMtTime(MtTime);
public double Price { get; set; }
public int MtTime { get; set; }
}
}
+3 -1
View File
@@ -12,6 +12,8 @@ namespace MtApi5.Requests
OrderCheck = 5, OrderCheck = 5,
MarketBookGet = 6, MarketBookGet = 6,
IndicatorCreate = 7, IndicatorCreate = 7,
SymbolInfoString = 8 SymbolInfoString = 8,
ChartTimePriceToXY = 9,
ChartXYToTimePrice = 10
} }
} }
+23 -6
View File
@@ -480,12 +480,29 @@
</WrapPanel> </WrapPanel>
</TabItem> </TabItem>
<TabItem Header="Chart Functions"> <TabItem Header="Chart Functions">
<WrapPanel VerticalAlignment="Top" Margin="5"> <Grid>
<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding TimeSeriesValues.SymbolValue}" Margin="1"/> <Grid.RowDefinitions>
<Button Command="{Binding ChartOpenCommand}" Content="ChartOpen"/> <RowDefinition Height="Auto"/>
<Button Command="{Binding ChartApplyTemplateCommand}" Content="ChartApplyTemplate"/> <RowDefinition Height="Auto"/>
<Button Command="{Binding ChartSaveTemplateCommand}" Content="ChartSaveTemplate"/> <RowDefinition Height="Auto"/>
</WrapPanel> </Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="5">
<TextBlock Text="Symbol" VerticalAlignment="Center" Margin="2"/>
<TextBox Width="100" Text="{Binding ChartFunctionsSymbolValue}" Margin="2"/>
</StackPanel>
<WrapPanel Grid.Row="1" Orientation="Horizontal" Margin="5">
<Button Command="{Binding ChartOpenCommand}" Content="ChartOpen" Margin="2"/>
<Button Command="{Binding ChartTimePriceToXYCommand}" Content="ChartTimePriceToXY" Margin="2"/>
<Button Command="{Binding ChartXYToTimePriceCommand}" Content="ChartXYToTimePrice" Margin="2"/>
</WrapPanel>
<WrapPanel Grid.Row="2" VerticalAlignment="Top" Margin="5">
<Button Command="{Binding ChartApplyTemplateCommand}" Content="ChartApplyTemplate" Margin="2"/>
<Button Command="{Binding ChartSaveTemplateCommand}" Content="ChartSaveTemplate" Margin="2"/>
</WrapPanel>
</Grid>
</TabItem> </TabItem>
<TabItem Header="Time and Date"> <TabItem Header="Time and Date">
<WrapPanel VerticalAlignment="Top" Margin="5"> <WrapPanel VerticalAlignment="Top" Margin="5">
+61 -4
View File
@@ -76,6 +76,8 @@ namespace MtApi5TestClient
public DelegateCommand TimeCurrentCommand { get; private set; } public DelegateCommand TimeCurrentCommand { get; private set; }
public DelegateCommand ChartOpenCommand { get; private set; } public DelegateCommand ChartOpenCommand { get; private set; }
public DelegateCommand ChartTimePriceToXYCommand { get; private set; }
public DelegateCommand ChartXYToTimePriceCommand { get; private set; }
public DelegateCommand ChartApplyTemplateCommand { get; private set; } public DelegateCommand ChartApplyTemplateCommand { get; private set; }
public DelegateCommand ChartSaveTemplateCommand { get; private set; } public DelegateCommand ChartSaveTemplateCommand { get; private set; }
@@ -88,15 +90,19 @@ namespace MtApi5TestClient
private async void ExecuteChartOpen(object o) private async void ExecuteChartOpen(object o)
{ {
AddLog("Executed #1"); AddLog("Executed #1");
if (string.IsNullOrEmpty(TimeSeriesValues?.SymbolValue)) return; if (string.IsNullOrEmpty(ChartFunctionsSymbolValue))
{
AddLog("ChartOpen [ERROR]: Symbol is not defined!");
return;
}
AddLog($"Executed #2 s:{TimeSeriesValues?.SymbolValue}"); AddLog($"Executed #2 s:{ChartFunctionsSymbolValue}");
var result = await Execute(() => var result = await Execute(() =>
{ {
var SymbolAddReturn = _mtApiClient.SymbolSelect(TimeSeriesValues?.SymbolValue, true); var SymbolAddReturn = _mtApiClient.SymbolSelect(ChartFunctionsSymbolValue, true);
var ChartId = _mtApiClient.ChartOpen(TimeSeriesValues?.SymbolValue, TimeSeriesValues.TimeFrame); var ChartId = _mtApiClient.ChartOpen(ChartFunctionsSymbolValue, TimeSeriesValues.TimeFrame);
return ChartId; return ChartId;
}); });
@@ -109,6 +115,45 @@ namespace MtApi5TestClient
AddLog($"ChartOpen: success chartid=>{result}"); AddLog($"ChartOpen: success chartid=>{result}");
} }
private async void ExecuteChartTimePriceToXY(object o)
{
const long chartId = 0;
const int subWindow = 0;
var time = DateTime.Now;
const double price = 1.131;
var x = 0;
var y = 0;
var result = await Execute(() => _mtApiClient.ChartTimePriceToXY(chartId, subWindow, time, price, out x, out y));
if (result == false)
{
AddLog("ChartTimePriceToXY: result is false");
return;
}
AddLog($"ChartTimePriceToXY: success. x = {x}; Y = {y}");
}
private async void ExecuteChartXYToTimePrice(object o)
{
const long chartId = 0;
const int x = 0;
const int y = 0;
var subWindow = 0;
DateTime? time = null;
double price = double.NaN;
var result = await Execute(() => _mtApiClient.ChartXYToTimePrice(chartId, x, y, out subWindow, out time, out price));
if (result == false)
{
AddLog("ChartXYToTimePrice: result is false");
return;
}
AddLog($"ChartXYToTimePrice: success. subWindow = {subWindow}; time = {time}; price = {price}");
}
private async void ExecuteChartApplyTemplate(object o) private async void ExecuteChartApplyTemplate(object o)
{ {
if (string.IsNullOrEmpty(TimeSeriesValues?.SymbolValue)) return; if (string.IsNullOrEmpty(TimeSeriesValues?.SymbolValue)) return;
@@ -271,6 +316,16 @@ namespace MtApi5TestClient
} }
} }
private string _chartFunctionsSymbolValue = "EURUSD";
public string ChartFunctionsSymbolValue
{
get { return _chartFunctionsSymbolValue; }
set
{
_chartFunctionsSymbolValue = value;
OnPropertyChanged("ChartFunctionsSymbolValue");
}
}
#endregion #endregion
#region Public Methods #region Public Methods
@@ -376,6 +431,8 @@ namespace MtApi5TestClient
iCustomCommand = new DelegateCommand(ExecuteICustom); iCustomCommand = new DelegateCommand(ExecuteICustom);
ChartOpenCommand = new DelegateCommand(ExecuteChartOpen); ChartOpenCommand = new DelegateCommand(ExecuteChartOpen);
ChartTimePriceToXYCommand = new DelegateCommand(ExecuteChartTimePriceToXY);
ChartXYToTimePriceCommand = new DelegateCommand(ExecuteChartXYToTimePrice);
ChartApplyTemplateCommand = new DelegateCommand(ExecuteChartApplyTemplate); ChartApplyTemplateCommand = new DelegateCommand(ExecuteChartApplyTemplate);
ChartSaveTemplateCommand = new DelegateCommand(ExecuteChartSaveTemplate); ChartSaveTemplateCommand = new DelegateCommand(ExecuteChartSaveTemplate);
BIN
View File
Binary file not shown.
+73
View File
@@ -5944,6 +5944,12 @@ string OnRequest(string json)
case 8: //SymbolInfoString case 8: //SymbolInfoString
response = ExecuteRequest_SymbolInfoString(jo); response = ExecuteRequest_SymbolInfoString(jo);
break; break;
case 9: //ChartTimePriceToXY
response = ExecuteRequest_ChartTimePriceToXY(jo);
break;
case 10: //ChartXYToTimePrice
response = ExecuteRequest_ChartXYToTimePrice(jo);
break;
default: default:
PrintFormat("%s [WARNING]: Unknown request type %d", __FUNCTION__, requestType); PrintFormat("%s [WARNING]: Unknown request type %d", __FUNCTION__, requestType);
response = CreateErrorResponse(-1, "Unknown request type"); response = CreateErrorResponse(-1, "Unknown request type");
@@ -6357,6 +6363,73 @@ string ExecuteRequest_SymbolInfoString(JSONObject *jo)
return CreateSuccessResponse("Value", result_value_jo); return CreateSuccessResponse("Value", result_value_jo);
} }
string ExecuteRequest_ChartTimePriceToXY(JSONObject *jo)
{
CHECK_JSON_VALUE(jo, "ChartId", CreateErrorResponse(-1, "Undefinded mandatory parameter ChartId"));
long chart_id = jo.getLong("ChartId");
CHECK_JSON_VALUE(jo, "SubWindow", CreateErrorResponse(-1, "Undefinded mandatory parameter SubWindow"));
int sub_window = jo.getInt("SubWindow");
CHECK_JSON_VALUE(jo, "MtTime", CreateErrorResponse(-1, "Undefinded mandatory parameter MtTime"));
datetime time = (datetime)jo.getInt("MtTime");
CHECK_JSON_VALUE(jo, "Price", CreateErrorResponse(-1, "Undefinded mandatory parameter Price"));
double price = jo.getDouble("Price");
#ifdef __DEBUG_LOG__
PrintFormat("%s: chart_id = %d, sub_window = %d, time = %s", __FUNCTION__, chart_id, sub_window, TimeToString(time));
#endif
int x,y;
bool ok = ChartTimePriceToXY(chart_id, sub_window, time, price, x, y);
#ifdef __DEBUG_LOG__
PrintFormat("%s: ok = %s, x = %d, y = %d", __FUNCTION__, BoolToString(ok), x, y);
#endif
JSONObject* result_value_jo = new JSONObject();
result_value_jo.put("RetVal", new JSONBool(ok));
result_value_jo.put("X", new JSONNumber(x));
result_value_jo.put("Y", new JSONNumber(y));
return CreateSuccessResponse("Value", result_value_jo);
}
string ExecuteRequest_ChartXYToTimePrice(JSONObject *jo)
{
CHECK_JSON_VALUE(jo, "ChartId", CreateErrorResponse(-1, "Undefinded mandatory parameter ChartId"));
long chart_id = jo.getLong("ChartId");
CHECK_JSON_VALUE(jo, "X", CreateErrorResponse(-1, "Undefinded mandatory parameter X"));
int x = jo.getInt("X");
CHECK_JSON_VALUE(jo, "Y", CreateErrorResponse(-1, "Undefinded mandatory parameter Y"));
int y = jo.getInt("Y");
#ifdef __DEBUG_LOG__
PrintFormat("%s: chart_id = %d, x = %d, y = %d", __FUNCTION__, chart_id, x, y);
#endif
int sub_window;
datetime time;
double price;
bool ok = ChartXYToTimePrice(chart_id, x, y, sub_window, time, price);
#ifdef __DEBUG_LOG__
PrintFormat("%s: ok = %s, sub_window = %d, time = %s, price = %f", __FUNCTION__, BoolToString(ok), sub_window, TimeToString(time), price);
#endif
JSONObject* result_value_jo = new JSONObject();
result_value_jo.put("RetVal", new JSONBool(ok));
result_value_jo.put("SubWindow", new JSONNumber(sub_window));
result_value_jo.put("MtTime", new JSONNumber((int)time));
result_value_jo.put("Price", new JSONNumber(price));
return CreateSuccessResponse("Value", result_value_jo);
}
//------------ Events ------------------------------------------------------- //------------ Events -------------------------------------------------------
enum MtEventTypes enum MtEventTypes