Compare commits

...

75 Commits

Author SHA1 Message Date
Viacheslav Demydiuk 93bfe8e56f removed redundant old projects from repo 2020-02-20 17:33:30 +02:00
Viacheslav Demydiuk bb27b4e50d #187: removed reference to Newtonsoft.Json in project TestApiClientUI 2020-02-20 17:29:06 +02:00
vdemydiuk 0f809cd60a MtApi [MT5] version 1.0.21 2019-11-11 12:52:28 +02:00
vdemydiuk f22a6c21f0 Updated gitignore file: added .vs folder 2019-11-07 15:45:19 +02:00
vdemydiuk 625753d83a Issue #142: removed old solution of VS 2015. Updated readme file related to VS 2017 2019-11-07 15:12:26 +02:00
vdemydiuk d621312a8b Merged fix of issue #175 from master 2019-11-06 11:59:41 +02:00
Vyacheslav Demidyuk a4df4bbf1e Merge pull request #177 from vlariono/master
#175 Fix null reference exception
2019-11-06 11:46:18 +02:00
vdemydiuk 43ef628c69 Issue #142: added support VS 2017 2019-11-05 17:03:58 +02:00
vdemydiuk 688149bd67 Merge branch 'master' into dev 2019-11-05 17:01:37 +02:00
Vyacheslav Demidyuk c33a5ed6f5 Merge pull request #174 from HengzheLi/fix-#173
#173 update IF checking
2019-11-05 15:39:28 +02:00
Vasily Larionov 828c1185b3 Position modify 2019-09-24 18:52:56 +03:00
Vasily Larionov 4b384d9da2 Fix null reference exception 2019-09-21 17:20:31 +03:00
hectorli 26de553443 #173 update IF checking 2019-08-27 22:15:59 +08:00
vdemydiuk ee81cfe012 Issue #143: Added function TesterStop [MT5] 2019-05-04 10:36:46 +03:00
vdemydiuk 5f4ae3cd9e Issue #74: Updated package Newtonsoft.Json from 8.0.3 to 12.0.2 2019-04-30 11:09:12 +03:00
vdemydiuk 13b8aa9644 Disable debug loging in MtApi.ex5 2019-04-30 11:07:47 +03:00
vdemydiuk e364b313c3 MtApi5: Set version 1.0.20 2019-04-26 13:07:34 +03:00
vdemydiuk 68f2a7ae07 Issue #147: added non-documented types of trade operations: balance, credit, rebate 2019-04-24 17:47:06 +03:00
vdemydiuk 42a1da3356 Issue #136: Added new properties to the ENUM_SYMBOL_INFO_DOUBLE enumeration: SYMBOL_VOLUME_REAL, SYMBOL_VOLUMEHIGH_REAL, SYMBOL_VOLUMELOW_REAL 2019-03-18 18:26:17 +02:00
vdemydiuk 44fab4dae1 Issue #136: Updated structures MqlTick, MqlBook with new field volume_real. Remove redundant code from MtApiService. 2019-03-18 17:31:54 +02:00
Vyacheslav Demidyuk d1387148df Merge pull request #148 from flognity/master
ObjectCreate can now take up to 30 anchor points
2019-03-18 16:11:48 +02:00
Florian Wilhelm bb4ac426cd Modified the ObjectCreate such that it can take up to 30 anchor points (maximum amount of anchor points in mql5). The MtApi5.mq5 has been updated to cope with the added parameters. The MtApi5.ex5 has been rebuilt. 2019-03-07 20:35:23 +01:00
vdemydiuk 34b4e33cc9 Issue #138: removed rudiment value POSITION_COMMISION from enum ENUM_POSITION_PROPERTY_DOUBLE 2019-02-20 13:12:29 +02:00
vdemydiuk f01ec01a5f Disable debug loging in MtApi.ex5 2018-06-06 15:11:56 +03:00
vdemydiuk 0c38d37559 Issue #107: Added function PositionCloseAll 2018-06-06 14:24:39 +03:00
vdemydiuk 897892dc89 Issue #122: Added event OnLockTicksEvent (MT5) 2018-06-06 12:46:24 +03:00
vdemydiuk 1a5882b75a Issue #122: Implemented UnlockTicks function in MtApi (MT5) 2018-06-05 19:19:35 +03:00
vdemydiuk 0f717f1cb7 Issue #119: Added out parameter MqlTradeResult to function PositionClose 2018-06-04 17:48:14 +03:00
vdemydiuk 5d78ad5067 Issue #120: set field 'Symbol' as optional in MqlTradeRequest (MT5) 2018-06-04 15:36:35 +03:00
vdemydiuk 6c45f28a05 Issue #121: Added original MtTime field to MqlRates (MT5) 2018-06-04 15:04:12 +03:00
vdemydiuk ca3c0e735f Issue #110: Implemented function for working with global variables (MT5) 2018-06-04 13:53:55 +03:00
vdemydiuk f71151104b Issue #111: Added enum value SYMBOL_VISIBLE 2018-05-08 19:07:52 +03:00
vdemydiuk 28816a75ac Issue #113: Changed extension of logging files to *.log 2018-05-08 16:44:57 +03:00
vdemydiuk 6023bffed6 Issue #106: Extended structure Mt5Quote with fields from MqlTick (volume, last, time) 2018-05-08 14:53:31 +03:00
vdemydiuk fd34f009cd Started version 1.0.19 (MT5) 2018-05-08 14:50:25 +03:00
Vyacheslav Demidyuk 1bb2b65cdf Merge pull request #115 from CVasquezG/master
Updated README
2018-04-02 16:27:58 +03:00
CVasquezG 37e8275465 Updated README
Changes made to the README file to be more formal.
I am doing this as a university assignment where I am required to improve documentation in the open source community.  I hope changes suggested in this commit are useful for your project.
2018-03-31 14:08:20 -07:00
vdemydiuk 52ca4fae1e MtApi5.ex5: Update version to 1.5. Disable debug logging 2018-03-27 11:25:22 +03:00
vdemydiuk 6b327e017a Removed unnecessary Windows Operations from MtApi5 code (MT5) 2018-03-27 11:11:33 +03:00
vdemydiuk 10a758bd93 Updated test application (MT5) to perform testing functions ChartIndicatorAdd, ChartIndicatorGet 2018-03-27 10:22:16 +03:00
vdemydiuk 4a9642b60c Issue #109: Fixed typo 'Magic' to 'Order' in MQL function JsonToMqlTradeRequest 2018-03-26 18:06:39 +03:00
vdemydiuk 6ba6496e46 Implemented functions ChartIndicatorAdd and ChartIndicatorGet 2018-03-24 21:45:35 +02:00
vdemydiuk 1ffbba5ee3 Updated test application (MT5) to perform testing functions ChartNavigate, ChartIndicatorDelete, ChartIndicatorName, ChartIndicatorsTotal, ChartWindowOnDropped, ChartPriceOnDropped, ChartTimeOnDropped, ChartXOnDropped, ChartYOnDropped, ChartSetSymbolPeriod, ChartScreenShot 2018-03-24 19:08:40 +02:00
vdemydiuk 8cdfd6fb91 Updated test application (MT5) to perform testing function ChartGetDouble and ChartGetInteger 2018-03-19 19:10:51 +02:00
vdemydiuk 7c3ddbabac Updated test application (MT5) to perform testing function ChartSetInteger and ChartSetString 2018-03-19 18:58:12 +02:00
vdemydiuk 83e0145a3a Updated test application (MT5) to perform testing function ChartPeriod and ChartSetDouble 2018-03-19 18:39:15 +02:00
vdemydiuk f17c7cd554 Updated test application (MT5) to perform testing function ChartWindowFind and ChartClose 2018-03-19 17:23:16 +02:00
vdemydiuk 4aefdd554b Updated test application (MT5) to perform testing function ChartId and ChartRedraw 2018-03-19 16:23:55 +02:00
vdemydiuk 820ed9a631 Refactored UI test client (MT5) 2018-03-19 15:10:09 +02:00
vdemydiuk 95c55e90be Added field ExpertHandle into class Mt5Quote 2018-03-19 15:09:02 +02:00
vdemydiuk 486a1979a6 Implemented functions ChartIndicatorName, ChartIndicatorsTotal, ChartWindowOnDropped, ChartPriceOnDropped, ChartTimeOnDropped, ChartXOnDropped, ChartYOnDropped, ChartSetSymbolPeriod, ChartScreenShot (MT5) 2018-03-15 17:44:53 +02:00
vdemydiuk faef5f7d18 Implemented function ChartIndicatorDelete (MT5) 2018-03-15 13:15:50 +02:00
vdemydiuk bd45c45fa1 Implemented function ChartNavigate (MT5) 2018-03-15 12:55:46 +02:00
vdemydiuk 29be184136 Implemented functions ChartGetDouble, ChartGetInteger (MT5) 2018-03-15 11:20:20 +02:00
vdemydiuk 9bfda95cf7 Implemented functions ChartSetDouble, ChartSetInteger, ChartSetString (MT5) 2018-03-14 19:53:53 +02:00
vdemydiuk 24b881d8a0 Implemented function ChartPeriod (MT5) 2018-03-14 19:16:29 +02:00
vdemydiuk 07dd83f890 Implemented functions ChartId, ChartRedraw, ChartWindowFind, ChartClose (MT5) 2018-03-14 18:10:44 +02:00
vdemydiuk 9afd30e463 Implemented function Alert (MT5) 2018-03-13 18:24:40 +02:00
vdemydiuk 16f454ca61 Implemented functions ChartTimePriceToXY, ChartXYToTimePrice (MT5) 2018-03-13 17:28:21 +02:00
vdemydiuk f3a3a582fd Issue #100: update test application for testing function SymbolInfoString (MT5) 2018-03-13 11:40:16 +02:00
vdemydiuk 93aaae86ed Issue #100: implemented second function SymbolInfoString (MT5) 2018-03-13 11:20:55 +02:00
Vyacheslav Demidyuk bce68fd168 Merge pull request #104 from Janderson/master
TerminalInfo Commands and ChartTemplate Commands
2018-03-13 10:54:16 +02:00
Janderson 0812229538 Chart Commands:
- ChartSaveTemplate Implemented
2018-03-12 23:08:04 -03:00
Janderson d0fa4af1d0 - Bug fix - when click in chartApplyTemplateButton, store template file in right place 2018-03-12 22:44:08 -03:00
Janderson 8eb4bcfabe Commands to handle with Terminal:
- TerminalInfoDoublePropertyId
- TerminalInfoIntegerPropertyId
- TerminalInfoStringPropertyId
2018-03-12 22:37:06 -03:00
Vyacheslav Demidyuk 9ea58354be Merge pull request #103 from Janderson/master
Missing function to mql5
2018-03-12 16:49:21 +02:00
Janderson FFerreira 02774d7328 Merge branch 'mt5_1_0_18' into master 2018-03-12 11:34:00 -03:00
Janderson FFerreira cbff71f8d0 - Correction of Test Client
- Missing codes in mtapi5.mq5
2018-03-12 11:17:12 -03:00
Janderson FFerreira 951a91976c - missing mql5 file 2018-03-11 19:56:28 -03:00
Janderson FFerreira 6a37826486 - Add some commands to handle with Chart to MT5 api
- Add some commands to handle with windows to MT5 api
2018-03-11 19:26:25 -03:00
vdemydiuk cab2de6d24 Issue #100: implemented functions GetLastError, ResetLastError() in MtApi (MT5) 2018-03-09 19:18:54 +02:00
vdemydiuk ec6c71607b Issue #96: Implemented function PositionGetTicket in MtApi (MT5) 2018-03-08 17:45:22 +02:00
vdemydiuk 0a39b69b15 Issue #95: Added default constructors to classes MqlBookInfo, MqlTradeCheckResult 2018-03-08 16:22:37 +02:00
vdemydiuk fe94ec21de Issue #102: fixed long type of result in function SeriesInfoInteger 2018-03-08 15:31:02 +02:00
vdemydiuk 34c78c73c0 Started version 1.0.18 (MT5) 2018-03-08 15:26:29 +02:00
79 changed files with 4124 additions and 2613 deletions
+3
View File
@@ -18,6 +18,9 @@ bld/
[Bb]in/
[Oo]bj/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Roslyn cache directories
*.ide/
-30
View File
@@ -1,30 +0,0 @@
<Window x:Class="ConnectionsManager.AboutWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="About" Height="130" Width="300"
WindowStyle="ToolWindow"
WindowStartupLocation="CenterOwner">
<Window.Resources>
<BitmapImage x:Key="MtApiIcon" UriSource="pack://application:,,,/ConnectionsManager;component/favicon.ico"/>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Image Source="{StaticResource MtApiIcon}" Width="50" Height="50" HorizontalAlignment="Left" Margin="5"/>
<TextBlock Grid.Column="1" Text="Connection manager for MtApi" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
<Button Grid.Row="1" Content="OK" Margin="5"
Width="70" IsDefault="True" IsCancel="True"
DockPanel.Dock="Bottom"
VerticalAlignment="Center"/>
</Grid>
</Window>
-28
View File
@@ -1,28 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace ConnectionsManager
{
/// <summary>
/// Interaction logic for AboutWindow.xaml
/// </summary>
public partial class AboutWindow : Window
{
public AboutWindow(Window owner)
{
InitializeComponent();
this.Owner = owner;
}
}
}
-43
View File
@@ -1,43 +0,0 @@
<Window x:Class="ConnectionsManager.AddProfileDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Add new connection profile" Height="180" Width="300"
WindowStyle="ToolWindow"
WindowStartupLocation="CenterOwner">
<Grid x:Name="_MainLayout">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="Profile name" Margin="5"/>
<TextBox Grid.Row="0" Grid.Column="1" Margin="5"
Text="{Binding Path=ProfileName, UpdateSourceTrigger=PropertyChanged}"
TextChanged="TextBox_TextChanged"/>
<TextBlock Grid.Row="1" Grid.Column="0" Text="Host" Margin="5"/>
<ComboBox Grid.Row="1" Grid.Column="1" Margin="5"
ItemsSource="{Binding HostList}"
SelectedItem="{Binding Host}"/>
<TextBlock Grid.Row="2" Grid.Column="0" Text="Port" Margin="5"/>
<TextBox Grid.Row="2" Grid.Column="1" Margin="5"
Text="{Binding Path=Port, UpdateSourceTrigger=PropertyChanged}"
PreviewTextInput="TextBox_PreviewTextInput"
TextChanged="TextBox_TextChanged"/>
<StackPanel Grid.Row="3" Grid.ColumnSpan="2" Margin="0,10,0,0"
Orientation="Horizontal"
HorizontalAlignment="Center"
VerticalAlignment="Bottom">
<Button Content="OK" Width="70" Margin="4" IsDefault="True" Command="{Binding OkCommand}"/>
<Button Content="Cancel" Width="70" Margin="4" IsCancel="True"/>
</StackPanel>
</Grid>
</Window>
@@ -1,97 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Text.RegularExpressions;
using System.Net;
namespace ConnectionsManager
{
/// <summary>
/// Interaction logic for AddProfileDialog.xaml
/// </summary>
public partial class AddProfileDialog : Window
{
// private const string PIPE_SERVER_NAME = "localhost(pipe)";
private const string LOCALHOST_NAME = "localhost";
public string ProfileName { get; set; }
public static readonly DependencyProperty HostProperty = DependencyProperty.Register("Host", typeof(string), typeof(AddProfileDialog));
public string Host
{
get { return (string)this.GetValue(HostProperty); }
set { this.SetValue(HostProperty, value); }
}
public string Port { get; set; }
public DelegateCommand OkCommand { get; set; }
public List<string> HostList { get; set; }
public AddProfileDialog(Window owner)
{
InitializeComponent();
this.Owner = owner;
OkCommand = new DelegateCommand(ExecuteOk, CanExecuteOk);
_MainLayout.DataContext = this;
Loaded += (sender, e) => MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
IPHostEntry ips = Dns.GetHostEntry(Dns.GetHostName());
HostList = new List<string>();
HostList.Add(string.Empty);
HostList.Add(LOCALHOST_NAME);
if (ips != null)
{
foreach (IPAddress ipAddress in ips.AddressList)
{
HostList.Add(ipAddress.ToString());
}
}
Host = HostList.First();
}
private bool CanExecuteOk(object o)
{
return string.IsNullOrEmpty(ProfileName) == false
&& string.IsNullOrEmpty(Port) == false;
}
private void ExecuteOk(object o)
{
this.DialogResult = true;
Close();
}
private static bool IsTextAllowed(string text)
{
Regex regex = new Regex("[^0-9]+");
return !regex.IsMatch(text);
}
private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
e.Handled = !IsTextAllowed(e.Text);
}
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
OkCommand.RaiseCanExecuteChanged();
}
}
}
-8
View File
@@ -1,8 +0,0 @@
<Application x:Class="ConnectionsManager.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>
-16
View File
@@ -1,16 +0,0 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;
namespace ConnectionsManager
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
}
}
@@ -1,168 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{C8751BA1-6A85-468C-87BD-758F37B8C0DD}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ConnectionsManager</RootNamespace>
<AssemblyName>ConnectionsManager</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>
</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<CodeAnalysisLogFile>bin\Debug\ConnectionsManager.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
<CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
<CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
<CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
<CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
<CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<CodeAnalysisLogFile>bin\Release\ConnectionsManager.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
<CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
<CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
<CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
<CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
<CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>favicon.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Compile Include="AboutWindow.xaml.cs">
<DependentUpon>AboutWindow.xaml</DependentUpon>
</Compile>
<Compile Include="AddProfileDialog.xaml.cs">
<DependentUpon>AddProfileDialog.xaml</DependentUpon>
</Compile>
<Compile Include="DelegateCommand.cs" />
<Compile Include="ViewModel.cs" />
<Page Include="AboutWindow.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="AddProfileDialog.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="MainWindow.xaml.cs">
<DependentUpon>MainWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="app.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<AppDesigner Include="Properties\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\MTApiService\MTApiService.csproj">
<Project>{DE76D5C7-B99C-4467-8408-78173BDD84E0}</Project>
<Name>MTApiService</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Resource Include="favicon.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>copy $(TargetPath) $(SolutionDir)Release\</PostBuildEvent>
</PropertyGroup>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
-51
View File
@@ -1,51 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Input;
namespace ConnectionsManager
{
public class DelegateCommand : ICommand
{
private readonly Predicate<object> _canExecute;
private readonly Action<object> _execute;
public event EventHandler CanExecuteChanged;
public DelegateCommand(Action<object> execute)
: this(execute, null)
{
}
public DelegateCommand(Action<object> execute,
Predicate<object> canExecute)
{
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
if (_canExecute == null)
{
return true;
}
return _canExecute(parameter);
}
public void Execute(object parameter)
{
_execute(parameter);
}
public void RaiseCanExecuteChanged()
{
if (CanExecuteChanged != null)
{
CanExecuteChanged(this, EventArgs.Empty);
}
}
}
}
-35
View File
@@ -1,35 +0,0 @@
<Window x:Class="ConnectionsManager.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MtApi Connections Manager" Height="300" Width="440"
Loaded="Window_Loaded">
<Grid x:Name="_MainLayout">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Menu>
<MenuItem Header="Edit">
<MenuItem Header="Add Profile..." Command="{Binding AddProfileCommand}"/>
<MenuItem Header="Delete Profile" Command="{Binding DeleteProfileCommand}"/>
</MenuItem>
<MenuItem Header="Help">
<MenuItem Header="About" Command="{Binding ShowAboutCommand}"/>
</MenuItem>
</Menu>
<ListView Grid.Row="1"
ItemsSource="{Binding ConnectionProfiles}"
SelectionMode="Single"
SelectedItem="{Binding SelectedProfile}">
<ListView.View>
<GridView>
<GridViewColumn Width="140" Header="Profile" DisplayMemberBinding="{Binding Name}" />
<GridViewColumn Width="180" Header="Host" DisplayMemberBinding="{Binding Host}" />
<GridViewColumn Width="80" Header="Port" DisplayMemberBinding="{Binding Port}" />
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>
-37
View File
@@ -1,37 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace ConnectionsManager
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private ViewModel _vm;
public MainWindow()
{
InitializeComponent();
_vm = new ViewModel();
_MainLayout.DataContext = _vm;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
_vm.Initialize();
}
}
}
@@ -1,55 +0,0 @@
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("ConnectionsManager")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ConnectionsManager")]
[assembly: AssemblyCopyright("Copyright © 2013")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
//In order to begin building localizable applications, set
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
//inside a <PropertyGroup>. For example, if you are using US english
//in your source files, set the <UICulture> to en-US. Then uncomment
//the NeutralResourceLanguage attribute below. Update the "en-US" in
//the line below to match the UICulture setting in the project file.
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.1.0")]
[assembly: AssemblyFileVersion("1.0.1.0")]
-63
View File
@@ -1,63 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.18034
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ConnectionsManager.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ConnectionsManager.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}
@@ -1,117 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
-26
View File
@@ -1,26 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.18034
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ConnectionsManager.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}
@@ -1,7 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>
-114
View File
@@ -1,114 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using MTApiService;
using System.ComponentModel;
using System.Windows;
namespace ConnectionsManager
{
class ViewModel : INotifyPropertyChanged
{
#region Properties
private ObservableCollection<MtConnectionProfile> _ConnectionProfiles = new ObservableCollection<MtConnectionProfile>();
public ObservableCollection<MtConnectionProfile> ConnectionProfiles
{
get { return _ConnectionProfiles; }
}
public DelegateCommand AddProfileCommand { get; private set; }
public DelegateCommand DeleteProfileCommand { get; private set; }
public DelegateCommand ShowAboutCommand { get; private set; }
private MtConnectionProfile _SelectedProfile;
public MtConnectionProfile SelectedProfile
{
get { return _SelectedProfile; }
set
{
_SelectedProfile = value;
OnPropertyChanged("SelectedProfile");
DeleteProfileCommand.RaiseCanExecuteChanged();
}
}
#endregion
#region Public Methods
public ViewModel()
{
AddProfileCommand = new DelegateCommand(ExecuteAddProfile);
DeleteProfileCommand = new DelegateCommand(ExecuteDeleteProfile, CanExecuteDeleteProfile);
ShowAboutCommand = new DelegateCommand(ExecuteShowAbout);
}
public void Initialize()
{
var profiles = MtRegistryManager.LoadConnectionProfiles();
if (profiles != null)
{
foreach(var prof in profiles)
{
ConnectionProfiles.Add(prof);
}
}
}
#endregion
#region Private Methods
private void ExecuteAddProfile(object o)
{
var dlg = new AddProfileDialog(App.Current.MainWindow);
var result = dlg.ShowDialog();
if (result == true)
{
var profile = new MtConnectionProfile(dlg.ProfileName);
profile.Host = dlg.Host;
profile.Port = int.Parse(dlg.Port);
MtRegistryManager.AddConnectionProfile(profile);
ConnectionProfiles.Add(profile);
}
}
private bool CanExecuteDeleteProfile(object o)
{
return SelectedProfile != null;
}
private void ExecuteDeleteProfile(object o)
{
var result = MessageBox.Show("Do you want to delete connection profile '" + SelectedProfile.Name + "' ?"
, "Question", MessageBoxButton.YesNo, MessageBoxImage.Question);
if (result == MessageBoxResult.Yes)
{
MtRegistryManager.RemoveConnectionProfile(SelectedProfile.Name);
ConnectionProfiles.Remove(SelectedProfile);
}
}
private void ExecuteShowAbout(object o)
{
var dlg = new AboutWindow(App.Current.MainWindow);
dlg.ShowDialog();
}
#endregion
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
#region Fields
#endregion
}
}
-3
View File
@@ -1,3 +0,0 @@
<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 894 B

-61
View File
@@ -1,61 +0,0 @@
using System;
using System.Security.Cryptography;
using System.Text;
using System.Security;
namespace Licensing
{
public class DigitalSignatureHelper
{
public static String GeneratePrivateKey()
{
DSACryptoServiceProvider dsa = new DSACryptoServiceProvider();
return dsa.ToXmlString(true);
}
public static String GetPublicKey(String privateKey)
{
DSACryptoServiceProvider dsa = new DSACryptoServiceProvider();
dsa.FromXmlString(privateKey);
return dsa.ToXmlString(false);
}
public static string CreateSignature(string inputData, String privateKey)
{
// create the crypto-service provider:
DSACryptoServiceProvider dsa = new DSACryptoServiceProvider();
// setup the dsa from the private key:
dsa.FromXmlString(privateKey);
byte[] data = UTF8Encoding.ASCII.GetBytes(inputData);
// get the signature:
byte[] signature = dsa.SignData(data);
return Convert.ToBase64String(signature);
}
public static bool VerifySignature(string inputData, string signature, string publicKey)
{
// create the crypto-service provider:
DSACryptoServiceProvider dsa = new DSACryptoServiceProvider();
// setup the provider from the public key:
dsa.FromXmlString(publicKey);
// get the license terms data:
//byte[] data = Convert.FromBase64String(inputData);
byte[] data = UTF8Encoding.ASCII.GetBytes(inputData);
// get the signature data:
byte[] signatureData = Convert.FromBase64String(signature);
// verify that the license-terms match the signature data
if (dsa.VerifyData(data, signatureData) == false)
throw new SecurityException("Signature Not Verified!");
return true;
}
}
}
-77
View File
@@ -1,77 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{21FA6E21-EE5D-4A84-B0ED-E1D8876B41FB}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Licensing</RootNamespace>
<AssemblyName>Licensing</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<StartupObject />
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="DigitalSignatureHelper.cs" />
<Compile Include="MainForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="MainForm.Designer.cs">
<DependentUpon>MainForm.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="MainForm.resx">
<DependentUpon>MainForm.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\MTApiService\MTApiService.csproj">
<Project>{DE76D5C7-B99C-4467-8408-78173BDD84E0}</Project>
<Name>MTApiService</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
-326
View File
@@ -1,326 +0,0 @@
namespace Licensing
{
partial class MainForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.textBoxPublicKey = new System.Windows.Forms.TextBox();
this.buttonGenerateKey = new System.Windows.Forms.Button();
this.buttonLoadKey = new System.Windows.Forms.Button();
this.buttonSaveKey = new System.Windows.Forms.Button();
this.textBoxPrivateKey = new System.Windows.Forms.TextBox();
this.label4 = new System.Windows.Forms.Label();
this.textBoxAccountName = new System.Windows.Forms.TextBox();
this.textBoxAccountNumber = new System.Windows.Forms.TextBox();
this.buttonSign = new System.Windows.Forms.Button();
this.textBoxSignature = new System.Windows.Forms.TextBox();
this.buttonGetPublicKey = new System.Windows.Forms.Button();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.clipboardCopyBtn = new System.Windows.Forms.Button();
this.buttonExportPublicKey = new System.Windows.Forms.Button();
this.groupBox3 = new System.Windows.Forms.GroupBox();
this.label3 = new System.Windows.Forms.Label();
this.groupBox4 = new System.Windows.Forms.GroupBox();
this.saveToRegBtn = new System.Windows.Forms.Button();
this.buttonVerify = new System.Windows.Forms.Button();
this.buttonExportSignature = new System.Windows.Forms.Button();
this.readRegBtn = new System.Windows.Forms.Button();
this.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout();
this.groupBox3.SuspendLayout();
this.groupBox4.SuspendLayout();
this.SuspendLayout();
//
// textBoxPublicKey
//
this.textBoxPublicKey.Location = new System.Drawing.Point(6, 19);
this.textBoxPublicKey.Name = "textBoxPublicKey";
this.textBoxPublicKey.ReadOnly = true;
this.textBoxPublicKey.Size = new System.Drawing.Size(620, 20);
this.textBoxPublicKey.TabIndex = 0;
//
// buttonGenerateKey
//
this.buttonGenerateKey.Location = new System.Drawing.Point(6, 45);
this.buttonGenerateKey.Name = "buttonGenerateKey";
this.buttonGenerateKey.Size = new System.Drawing.Size(75, 23);
this.buttonGenerateKey.TabIndex = 2;
this.buttonGenerateKey.Text = "Generate";
this.buttonGenerateKey.UseVisualStyleBackColor = true;
this.buttonGenerateKey.Click += new System.EventHandler(this.buttonGenerateKey_Click);
//
// buttonLoadKey
//
this.buttonLoadKey.Location = new System.Drawing.Point(168, 45);
this.buttonLoadKey.Name = "buttonLoadKey";
this.buttonLoadKey.Size = new System.Drawing.Size(75, 23);
this.buttonLoadKey.TabIndex = 3;
this.buttonLoadKey.Text = "Load";
this.buttonLoadKey.UseVisualStyleBackColor = true;
this.buttonLoadKey.Click += new System.EventHandler(this.buttonLoadKey_Click);
//
// buttonSaveKey
//
this.buttonSaveKey.Location = new System.Drawing.Point(87, 45);
this.buttonSaveKey.Name = "buttonSaveKey";
this.buttonSaveKey.Size = new System.Drawing.Size(75, 23);
this.buttonSaveKey.TabIndex = 4;
this.buttonSaveKey.Text = "Save";
this.buttonSaveKey.UseVisualStyleBackColor = true;
this.buttonSaveKey.Click += new System.EventHandler(this.buttonSaveKey_Click);
//
// textBoxPrivateKey
//
this.textBoxPrivateKey.Location = new System.Drawing.Point(6, 19);
this.textBoxPrivateKey.Name = "textBoxPrivateKey";
this.textBoxPrivateKey.ReadOnly = true;
this.textBoxPrivateKey.Size = new System.Drawing.Size(620, 20);
this.textBoxPrivateKey.TabIndex = 0;
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(8, 48);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(47, 13);
this.label4.TabIndex = 6;
this.label4.Text = "Number:";
//
// textBoxAccountName
//
this.textBoxAccountName.Location = new System.Drawing.Point(67, 19);
this.textBoxAccountName.Name = "textBoxAccountName";
this.textBoxAccountName.Size = new System.Drawing.Size(559, 20);
this.textBoxAccountName.TabIndex = 7;
//
// textBoxAccountNumber
//
this.textBoxAccountNumber.Location = new System.Drawing.Point(67, 45);
this.textBoxAccountNumber.Name = "textBoxAccountNumber";
this.textBoxAccountNumber.Size = new System.Drawing.Size(559, 20);
this.textBoxAccountNumber.TabIndex = 7;
//
// buttonSign
//
this.buttonSign.Location = new System.Drawing.Point(10, 45);
this.buttonSign.Name = "buttonSign";
this.buttonSign.Size = new System.Drawing.Size(75, 23);
this.buttonSign.TabIndex = 8;
this.buttonSign.Text = "Sign";
this.buttonSign.UseVisualStyleBackColor = true;
this.buttonSign.Click += new System.EventHandler(this.buttonSign_Click);
//
// textBoxSignature
//
this.textBoxSignature.Location = new System.Drawing.Point(10, 19);
this.textBoxSignature.Name = "textBoxSignature";
this.textBoxSignature.Size = new System.Drawing.Size(615, 20);
this.textBoxSignature.TabIndex = 10;
//
// buttonGetPublicKey
//
this.buttonGetPublicKey.Location = new System.Drawing.Point(6, 45);
this.buttonGetPublicKey.Name = "buttonGetPublicKey";
this.buttonGetPublicKey.Size = new System.Drawing.Size(75, 23);
this.buttonGetPublicKey.TabIndex = 11;
this.buttonGetPublicKey.Text = "Get Key";
this.buttonGetPublicKey.UseVisualStyleBackColor = true;
this.buttonGetPublicKey.Click += new System.EventHandler(this.buttonGetPublicKey_Click);
//
// groupBox1
//
this.groupBox1.Controls.Add(this.textBoxPrivateKey);
this.groupBox1.Controls.Add(this.buttonGenerateKey);
this.groupBox1.Controls.Add(this.buttonLoadKey);
this.groupBox1.Controls.Add(this.buttonSaveKey);
this.groupBox1.Location = new System.Drawing.Point(12, 12);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(632, 78);
this.groupBox1.TabIndex = 12;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Private Key";
//
// groupBox2
//
this.groupBox2.Controls.Add(this.clipboardCopyBtn);
this.groupBox2.Controls.Add(this.buttonExportPublicKey);
this.groupBox2.Controls.Add(this.textBoxPublicKey);
this.groupBox2.Controls.Add(this.buttonGetPublicKey);
this.groupBox2.Location = new System.Drawing.Point(12, 96);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(632, 77);
this.groupBox2.TabIndex = 13;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "Public Key";
//
// clipboardCopyBtn
//
this.clipboardCopyBtn.Location = new System.Drawing.Point(169, 46);
this.clipboardCopyBtn.Name = "clipboardCopyBtn";
this.clipboardCopyBtn.Size = new System.Drawing.Size(113, 23);
this.clipboardCopyBtn.TabIndex = 13;
this.clipboardCopyBtn.Text = "Copy to Clipboard";
this.clipboardCopyBtn.UseVisualStyleBackColor = true;
this.clipboardCopyBtn.Click += new System.EventHandler(this.clipboardCopyBtn_Click);
//
// buttonExportPublicKey
//
this.buttonExportPublicKey.Location = new System.Drawing.Point(88, 46);
this.buttonExportPublicKey.Name = "buttonExportPublicKey";
this.buttonExportPublicKey.Size = new System.Drawing.Size(75, 23);
this.buttonExportPublicKey.TabIndex = 12;
this.buttonExportPublicKey.Text = "Export";
this.buttonExportPublicKey.UseVisualStyleBackColor = true;
this.buttonExportPublicKey.Click += new System.EventHandler(this.buttonExportPublicKey_Click);
//
// groupBox3
//
this.groupBox3.Controls.Add(this.textBoxAccountName);
this.groupBox3.Controls.Add(this.label3);
this.groupBox3.Controls.Add(this.textBoxAccountNumber);
this.groupBox3.Controls.Add(this.label4);
this.groupBox3.Location = new System.Drawing.Point(12, 180);
this.groupBox3.Name = "groupBox3";
this.groupBox3.Size = new System.Drawing.Size(635, 81);
this.groupBox3.TabIndex = 14;
this.groupBox3.TabStop = false;
this.groupBox3.Text = "Account";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(8, 22);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(38, 13);
this.label3.TabIndex = 5;
this.label3.Text = "Name:";
//
// groupBox4
//
this.groupBox4.Controls.Add(this.readRegBtn);
this.groupBox4.Controls.Add(this.saveToRegBtn);
this.groupBox4.Controls.Add(this.buttonVerify);
this.groupBox4.Controls.Add(this.buttonExportSignature);
this.groupBox4.Controls.Add(this.textBoxSignature);
this.groupBox4.Controls.Add(this.buttonSign);
this.groupBox4.Location = new System.Drawing.Point(13, 268);
this.groupBox4.Name = "groupBox4";
this.groupBox4.Size = new System.Drawing.Size(631, 76);
this.groupBox4.TabIndex = 15;
this.groupBox4.TabStop = false;
this.groupBox4.Text = "Signature";
//
// saveToRegBtn
//
this.saveToRegBtn.Location = new System.Drawing.Point(172, 45);
this.saveToRegBtn.Name = "saveToRegBtn";
this.saveToRegBtn.Size = new System.Drawing.Size(101, 23);
this.saveToRegBtn.TabIndex = 13;
this.saveToRegBtn.Text = "Save To Reg";
this.saveToRegBtn.UseVisualStyleBackColor = true;
this.saveToRegBtn.Click += new System.EventHandler(this.saveToRegBtn_Click);
//
// buttonVerify
//
this.buttonVerify.Location = new System.Drawing.Point(550, 45);
this.buttonVerify.Name = "buttonVerify";
this.buttonVerify.Size = new System.Drawing.Size(75, 23);
this.buttonVerify.TabIndex = 12;
this.buttonVerify.Text = "Verify";
this.buttonVerify.UseVisualStyleBackColor = true;
this.buttonVerify.Click += new System.EventHandler(this.buttonVerify_Click);
//
// buttonExportSignature
//
this.buttonExportSignature.Location = new System.Drawing.Point(91, 45);
this.buttonExportSignature.Name = "buttonExportSignature";
this.buttonExportSignature.Size = new System.Drawing.Size(75, 23);
this.buttonExportSignature.TabIndex = 11;
this.buttonExportSignature.Text = "Export";
this.buttonExportSignature.UseVisualStyleBackColor = true;
this.buttonExportSignature.Click += new System.EventHandler(this.buttonExportSignature_Click);
//
// readRegBtn
//
this.readRegBtn.Location = new System.Drawing.Point(279, 45);
this.readRegBtn.Name = "readRegBtn";
this.readRegBtn.Size = new System.Drawing.Size(132, 23);
this.readRegBtn.TabIndex = 14;
this.readRegBtn.Text = "Read from Registry";
this.readRegBtn.UseVisualStyleBackColor = true;
this.readRegBtn.Click += new System.EventHandler(this.readRegBtn_Click);
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(659, 351);
this.Controls.Add(this.groupBox4);
this.Controls.Add(this.groupBox3);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.groupBox1);
this.Name = "MainForm";
this.Text = "Liccensing";
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
this.groupBox3.ResumeLayout(false);
this.groupBox3.PerformLayout();
this.groupBox4.ResumeLayout(false);
this.groupBox4.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TextBox textBoxPublicKey;
private System.Windows.Forms.Button buttonGenerateKey;
private System.Windows.Forms.Button buttonLoadKey;
private System.Windows.Forms.Button buttonSaveKey;
private System.Windows.Forms.TextBox textBoxPrivateKey;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.TextBox textBoxAccountName;
private System.Windows.Forms.TextBox textBoxAccountNumber;
private System.Windows.Forms.Button buttonSign;
private System.Windows.Forms.TextBox textBoxSignature;
private System.Windows.Forms.Button buttonGetPublicKey;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.GroupBox groupBox3;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Button buttonExportPublicKey;
private System.Windows.Forms.GroupBox groupBox4;
private System.Windows.Forms.Button buttonExportSignature;
private System.Windows.Forms.Button buttonVerify;
private System.Windows.Forms.Button clipboardCopyBtn;
private System.Windows.Forms.Button saveToRegBtn;
private System.Windows.Forms.Button readRegBtn;
}
}
-352
View File
@@ -1,352 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Security;
using MTApiService;
namespace Licensing
{
public partial class MainForm : Form
{
private bool mIsSaved = true;
public MainForm()
{
InitializeComponent();
}
private void buttonGenerateKey_Click(object sender, EventArgs e)
{
textBoxPrivateKey.Text = DigitalSignatureHelper.GeneratePrivateKey();
mIsSaved = false;
}
private void buttonGetPublicKey_Click(object sender, EventArgs e)
{
string privateKey = textBoxPrivateKey.Text;
if (string.IsNullOrEmpty(privateKey) == false)
{
textBoxPublicKey.Text = DigitalSignatureHelper.GetPublicKey(privateKey);
}
else
{
MessageBox.Show("Private Key is empty!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
private void buttonSaveKey_Click(object sender, EventArgs e)
{
string privateKey = textBoxPrivateKey.Text;
if (string.IsNullOrEmpty(privateKey) == false)
{
SaveFileDialog dlg = new SaveFileDialog();
dlg.Filter = "MetaTraderApi Key Files (*.mtk)|*.mtk";
dlg.Title = "Save MetaTraderApi Key File";
if (dlg.ShowDialog() == DialogResult.OK)
{
try
{
using (TextWriter file = new StreamWriter(dlg.FileName, true))
{
file.WriteLine(privateKey);
}
mIsSaved = true;
}
catch (Exception ex)
{
var errorMsg = string.Format("Saving failed!\n{0}", ex.Message);
MessageBox.Show(errorMsg, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
else
{
MessageBox.Show("Private Key is empty!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
private void buttonLoadKey_Click(object sender, EventArgs e)
{
if (mIsSaved == false)
{
if (MessageBox.Show("Private Key is not saved. Continue?", "Private Key", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK)
return;
}
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = "MetaTraderApi Key Files (*.mtk)|*.mtk";
dlg.Title = "Load MetaTraderApi Key File";
if (dlg.ShowDialog() == DialogResult.OK)
{
textBoxPrivateKey.Text = string.Empty;
textBoxPublicKey.Text = string.Empty;
try
{
using (TextReader file = new StreamReader(dlg.FileName))
{
textBoxPrivateKey.Text = file.ReadLine();
}
mIsSaved = true;
}
catch (Exception ex)
{
var errorMsg = string.Format("Saving failed!\n{0}", ex.Message);
MessageBox.Show(errorMsg, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void buttonSign_Click(object sender, EventArgs e)
{
string privateKey = textBoxPrivateKey.Text;
if (string.IsNullOrEmpty(privateKey) == false)
{
string accountName = textBoxAccountName.Text;
string accountNumber = textBoxAccountNumber.Text;
if (string.IsNullOrEmpty(accountName) == false)
{
if (string.IsNullOrEmpty(accountNumber) == false)
{
string inputData = accountName + accountNumber;
textBoxSignature.Text = DigitalSignatureHelper.CreateSignature(inputData, privateKey);
}
else
{
MessageBox.Show("AccountNumber is empty!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
else
{
MessageBox.Show("AccountName is empty!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
else
{
MessageBox.Show("Private Key is empty!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
private void buttonExportPublicKey_Click(object sender, EventArgs e)
{
string publicKey = textBoxPublicKey.Text;
if (string.IsNullOrEmpty(publicKey) == false)
{
SaveFileDialog dlg = new SaveFileDialog();
dlg.Filter = "MetaTraderApi Key Files (*.mtk)|*.mtk";
dlg.Title = "Export MetaTraderApi Key File";
if (dlg.ShowDialog() == DialogResult.OK)
{
try
{
using (TextWriter file = new StreamWriter(dlg.FileName, true))
{
file.WriteLine(publicKey);
}
mIsSaved = true;
}
catch (Exception ex)
{
var errorMsg = string.Format("Export failed!\n{0}", ex.Message);
MessageBox.Show(errorMsg, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
else
{
MessageBox.Show("Public Key is empty!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
private void buttonExportSignature_Click(object sender, EventArgs e)
{
string signature = textBoxSignature.Text;
if (string.IsNullOrEmpty(signature) == false)
{
SaveFileDialog dlg = new SaveFileDialog();
dlg.Filter = "MetaTraderApi Key (*.mta)|*.mta";
dlg.Title = "Export MetaTraderApi Key";
if (dlg.ShowDialog() == DialogResult.OK)
{
try
{
using (TextWriter file = new StreamWriter(dlg.FileName))
{
file.WriteLine(signature);
}
mIsSaved = true;
}
catch (Exception ex)
{
var errorMsg = string.Format("Export failed!\n{0}", ex.Message);
MessageBox.Show(errorMsg, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
else
{
MessageBox.Show("Signature is empty!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
private void buttonVerify_Click(object sender, EventArgs e)
{
string publicKey = textBoxPublicKey.Text;
if (string.IsNullOrEmpty(publicKey) == false)
{
string signature = textBoxSignature.Text;
if (string.IsNullOrEmpty(signature) == false)
{
string accountName = textBoxAccountName.Text;
string accountNumber = textBoxAccountNumber.Text;
if (string.IsNullOrEmpty(accountName) == false)
{
if (string.IsNullOrEmpty(accountNumber) == false)
{
string inputData = accountName + accountNumber;
var verifyResult = false;
try
{
verifyResult = DigitalSignatureHelper.VerifySignature(inputData, signature, publicKey);
}
catch (SecurityException ex)
{
MessageBox.Show(ex.Message, "Verify", MessageBoxButtons.OK, MessageBoxIcon.Warning);
verifyResult = false;
}
catch (Exception ex)
{
string errorMsg = string.Format("Verify process failed!\n{0}", ex.Message);
MessageBox.Show(errorMsg, "Verify", MessageBoxButtons.OK, MessageBoxIcon.Error);
verifyResult = false;
}
if (verifyResult == true)
{
MessageBox.Show("Signature good", "Verify", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
else
{
MessageBox.Show("AccountNumber is empty!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
else
{
MessageBox.Show("AccountName is empty!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
else
{
MessageBox.Show("Signature is empty!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
else
{
MessageBox.Show("Public Key is empty!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
private void clipboardCopyBtn_Click(object sender, EventArgs e)
{
Clipboard.SetText(textBoxPublicKey.Text);
}
private void saveToRegBtn_Click(object sender, EventArgs e)
{
string signature = textBoxSignature.Text;
string accountName = textBoxAccountName.Text;
string accountNumber = textBoxAccountNumber.Text;
if (string.IsNullOrEmpty(signature))
{
MessageBox.Show("Signature is empty!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
if (string.IsNullOrEmpty(accountName))
{
MessageBox.Show("AccountName is empty!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
if (string.IsNullOrEmpty(accountNumber))
{
MessageBox.Show("AccountNumber is empty!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
SaveFileDialog dlg = new SaveFileDialog();
dlg.Filter = "Registry files (*.reg)|*.reg";
dlg.Title = "Registry files";
if (dlg.ShowDialog() == DialogResult.OK)
{
string key = MtRegistryManager.SaveSignatureKey(accountName, accountNumber, signature);
bool exported = MtRegistryManager.ExportKey(key, dlg.FileName);
if (exported)
{
MessageBox.Show("Export successed.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.None);
}
else
{
MessageBox.Show("Export failed!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void readRegBtn_Click(object sender, EventArgs e)
{
string accountName = textBoxAccountName.Text;
string accountNumber = textBoxAccountNumber.Text;
if (string.IsNullOrEmpty(accountName))
{
MessageBox.Show("AccountName is empty!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
if (string.IsNullOrEmpty(accountNumber))
{
MessageBox.Show("AccountNumber is empty!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
string signature = MtRegistryManager.ReadSignatureKey(accountName, accountNumber);
textBoxSignature.Text = signature;
}
}
}
-120
View File
@@ -1,120 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
-21
View File
@@ -1,21 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace Licensing
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
}
-36
View File
@@ -1,36 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Licensing")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("DW")]
[assembly: AssemblyProduct("Licensing")]
[assembly: AssemblyCopyright("Copyright © DW 2012")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("2c3df81b-2285-44ff-a152-0111e25d9b1a")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
+1 -48
View File
@@ -31,22 +31,6 @@ public struct CMqlRates
int spread; // Spread
__int64 real_volume; // Trade volume
};
public struct CMqlTick
{
__int64 time; // Time of the last prices update
double bid; // Current Bid price
double ask; // Current Ask price
double last; // Price of the last deal (Last)
unsigned __int64 volume; // Volume for the current Last price
};
public struct CMqlBookInfo
{
int type; // Order type from ENUM_BOOK_TYPE enumeration
double price; // Price
__int64 volume; // Volume
};
#pragma pack(pop)
void convertSystemString(wchar_t* dest, String^ src)
@@ -164,7 +148,7 @@ _DLLAPI int _stdcall sendStringResponse(int expertHandle, wchar_t* response, wch
_DLLAPI int _stdcall sendVoidResponse(int expertHandle, wchar_t* err)
{
return Execute<int>([&expertHandle]() {
MtAdapter::GetInstance()->SendResponse(expertHandle, nullptr);
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseObject(nullptr));
return 1;
}, err, 0);
}
@@ -224,37 +208,6 @@ _DLLAPI int _stdcall sendMqlRatesArrayResponse(int expertHandle, CMqlRates value
}, err, 0);
}
_DLLAPI int _stdcall sendMqlTickResponse(int expertHandle, CMqlTick* response, wchar_t* err)
{
return Execute<int>([&expertHandle, response]() {
MtMqlTick^ mtResponse = gcnew MtMqlTick();
mtResponse->time = response->time;
mtResponse->bid = response->bid;
mtResponse->ask = response->ask;
mtResponse->last = response->last;
mtResponse->volume = response->volume;
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlTick(mtResponse));
return 1;
}, err, 0);
}
_DLLAPI int _stdcall sendMqlBookInfoArrayResponse(int expertHandle, CMqlBookInfo values[], int size, wchar_t* err)
{
return Execute<int>([&expertHandle, values, &size]() {
array<MtMqlBookInfo^>^ list = gcnew array<MtMqlBookInfo^>(size);
for (int i = 0; i < size; i++)
{
MtMqlBookInfo^ info = gcnew MtMqlBookInfo();
info->type = values[i].type;
info->price = values[i].price;
info->volume = values[i].volume;
list[i] = info;
}
MtAdapter::GetInstance()->SendResponse(expertHandle, gcnew MtResponseMqlBookInfoArray(list));
return 1;
}, err, 0);
}
//----------- get values -------------------------------
_DLLAPI int _stdcall getCommandType(int expertHandle, int* res, wchar_t* err)
+6 -5
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
@@ -23,6 +23,7 @@
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<Keyword>ManagedCProj</Keyword>
<RootNamespace>MT5Connector</RootNamespace>
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
@@ -30,28 +31,28 @@
<UseDebugLibraries>true</UseDebugLibraries>
<CLRSupport>true</CLRSupport>
<CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CLRSupport>true</CLRSupport>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<CLRSupport>true</CLRSupport>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<CLRSupport>true</CLRSupport>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
+1 -1
View File
@@ -54,7 +54,7 @@ namespace MTApiService
public class LogConfigurator
{
private const string LogFileNameExtension = "txt";
private const string LogFileNameExtension = "log";
public static void Setup(string profileName)
{
-2
View File
@@ -72,9 +72,7 @@
<Compile Include="MtClient.cs" />
<Compile Include="MtCommandTask.cs" />
<Compile Include="MtEvent.cs" />
<Compile Include="MtMqlBookInfo.cs" />
<Compile Include="MtMqlRates.cs" />
<Compile Include="MtMqlTick.cs" />
<Compile Include="MtMqlTradeRequest.cs" />
<Compile Include="MtRegistryManager.cs" />
<Compile Include="MtConnectionProfile.cs" />
+41 -12
View File
@@ -4,35 +4,51 @@ namespace MTApiService
{
public class Mt5Expert : MtExpert
{
private static readonly ILog Log = LogManager.GetLogger(typeof(MtExpert));
private static readonly ILog Log = LogManager.GetLogger(typeof(Mt5Expert));
private const int StopExpertInterval = 2000; // 2 sec for testing mode
private readonly System.Timers.Timer _stopTimer = new System.Timers.Timer();
private System.Timers.Timer _stopTimer;
public Mt5Expert(int handle, string symbol, double bid, double ask, IMetaTraderHandler mtHandler, bool isTestMode) :
base(handle, symbol, bid, ask, mtHandler)
{
IsTestMode = isTestMode;
_stopTimer.Interval = StopExpertInterval;
_stopTimer.Elapsed += _stopTimer_Elapsed;
}
public bool IsTestMode { get; }
public override void UpdateQuote(MtQuote quote)
public override int GetCommandType()
{
Log.Debug("UpdateQuote: begin.");
base.UpdateQuote(quote);
Log.Debug("GetCommandType: called.");
if (IsTestMode)
{
//reset timer
_stopTimer.Stop();
_stopTimer.Start();
ResetTestModeTimer();
}
Log.Debug("UpdateQuote: end.");
return base.GetCommandType();
}
public override void SendEvent(MtEvent mtEvent)
{
Log.DebugFormat("SendEvent: begin. event = {0}", mtEvent);
if (IsTestMode)
{
if (_stopTimer == null)
{
_stopTimer = new System.Timers.Timer
{
Interval = StopExpertInterval,
AutoReset = false
};
_stopTimer.Elapsed += _stopTimer_Elapsed;
}
}
base.SendEvent(mtEvent);
Log.Debug("SendEvent: end.");
}
private void _stopTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
@@ -42,7 +58,20 @@ namespace MTApiService
Log.Warn("Mt5Expert has received new tick during 2 sec in testing mode. The possible cause: user has stopped the tester manually in MetaTrader 5.");
Deinit();
_stopTimer.Elapsed -= _stopTimer_Elapsed;
_stopTimer = null;
Log.Debug("_stopTimer_Elapsed: end.");
}
private void ResetTestModeTimer()
{
if (_stopTimer == null)
return;
//reset timer
_stopTimer.Stop();
_stopTimer.Start();
}
}
}
+26 -1
View File
@@ -66,6 +66,7 @@ namespace MTApiService
}
server.AddExpert(expert);
expert.Deinited += ExpertOnDeinited;
Log.Info("AddExpert: end");
}
@@ -81,7 +82,6 @@ namespace MTApiService
if (_experts.ContainsKey(expertHandle))
{
expert = _experts[expertHandle];
_experts.Remove(expertHandle);
}
}
@@ -270,6 +270,31 @@ namespace MTApiService
}
}
}
private void ExpertOnDeinited(object sender, EventArgs eventArgs)
{
Log.Debug("ExpertOnDeinited: begin.");
var expert = sender as MtExpert;
if (expert == null)
{
Log.Warn("expert_Deinited: end. Expert is not defined.");
return;
}
lock (_experts)
{
if (_experts.ContainsKey(expert.Handle))
{
_experts.Remove(expert.Handle);
}
}
Log.DebugFormat("ExpertOnDeinited: removed expert {0}", expert.Handle);
Log.Debug("ExpertOnDeinited: end.");
}
#endregion
}
}
+3 -3
View File
@@ -48,7 +48,7 @@ namespace MTApiService
Log.Debug("SendResponse: end.");
}
public int GetCommandType()
public virtual int GetCommandType()
{
Log.Debug("GetCommandType: called.");
@@ -110,7 +110,7 @@ namespace MTApiService
return command.NamedParams.ContainsKey(name);
}
public void SendEvent(MtEvent mtEvent)
public virtual void SendEvent(MtEvent mtEvent)
{
Log.DebugFormat("SendEvent: begin. event = {0}", mtEvent);
@@ -119,7 +119,7 @@ namespace MTApiService
Log.Debug("SendEvent: end.");
}
public virtual void UpdateQuote(MtQuote quote)
public void UpdateQuote(MtQuote quote)
{
Log.DebugFormat("UpdateQuote: begin. quote = {0}", quote);
-17
View File
@@ -1,17 +0,0 @@
using System.Runtime.Serialization;
namespace MTApiService
{
[DataContract]
public class MtMqlBookInfo
{
[DataMember]
public int type { get; set; }
[DataMember]
public double price { get; set; }
[DataMember]
public long volume { get; set; }
}
}
-23
View File
@@ -1,23 +0,0 @@
using System.Runtime.Serialization;
namespace MTApiService
{
[DataContract]
public class MtMqlTick
{
[DataMember]
public long time { get; set; } // Time of the last prices update
[DataMember]
public double bid { get; set; } // Current Bid price
[DataMember]
public double ask { get; set; } // Current Ask price
[DataMember]
public double last { get; set; } // Price of the last deal (Last)
[DataMember]
public ulong volume { get; set; } // Volume for the current Last price
}
}
+2 -42
View File
@@ -17,9 +17,8 @@ namespace MTApiService
typeof(MtResponseString), typeof(MtResponseBool),
typeof(MtResponseLong), typeof(MtResponseULong),
typeof(MtResponseDoubleArray), typeof(MtResponseIntArray),
typeof(MtResponseLongArray), typeof(MtResponseMqlTick),
typeof(MtResponseArrayList), typeof(MtResponseMqlRatesArray),
typeof(MtResponseMqlBookInfoArray)};
typeof(MtResponseLongArray),
typeof(MtResponseArrayList), typeof(MtResponseMqlRatesArray)};
}
public abstract object GetValue();
@@ -255,43 +254,4 @@ namespace MTApiService
return Value.ToString();
}
}
[DataContract]
public class MtResponseMqlTick : MtResponse
{
public MtResponseMqlTick(MtMqlTick value)
{
Value = value;
}
[DataMember]
public MtMqlTick Value { get; private set; }
public override object GetValue() { return Value; }
public override string ToString()
{
return Value.ToString();
}
}
[DataContract]
public class MtResponseMqlBookInfoArray : MtResponse
{
public MtResponseMqlBookInfoArray(MtMqlBookInfo[] value)
{
Value = value;
}
[DataMember]
public MtMqlBookInfo[] Value { get; private set; }
public override object GetValue() { return Value; }
public override string ToString()
{
return Value.ToString();
}
}
}
+2 -2
View File
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.29.0")]
[assembly: AssemblyFileVersion("1.0.29.0")]
[assembly: AssemblyVersion("1.0.31.0")]
[assembly: AssemblyFileVersion("1.0.31.0")]
+6 -5
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
@@ -24,6 +24,7 @@
<Keyword>ManagedCProj</Keyword>
<RootNamespace>MTConnector</RootNamespace>
<ProjectName>MTConnector</ProjectName>
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
@@ -31,28 +32,28 @@
<UseDebugLibraries>true</UseDebugLibraries>
<CLRSupport>true</CLRSupport>
<CharacterSet>NotSet</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CLRSupport>true</CLRSupport>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<CLRSupport>true</CLRSupport>
<CharacterSet>NotSet</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<CLRSupport>true</CLRSupport>
<CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
+4 -1
View File
@@ -7,6 +7,9 @@
OP_BUYLIMIT = 2,
OP_SELLLIMIT = 3,
OP_BUYSTOP = 4,
OP_SELLSTOP = 5
OP_SELLSTOP = 5,
OP_BALANCE = 6,
OP_CREDIT = 7,
OP_REBATE = 8
}
}
+4 -1
View File
@@ -3,6 +3,9 @@
internal enum Mt5EventTypes
{
OnTradeTransaction = 1,
OnBookEvent = 2
OnBookEvent = 2,
OnTick = 3,
OnLastTimeBar = 4,
OnLockTicks = 5
}
}
+9
View File
@@ -0,0 +1,9 @@
namespace MtApi5.Events
{
public class OnLastTimeBarEvent
{
public MqlRates Rates { get; set; }
public string Instrument { get; set; }
public int ExpertHandle { get; set; }
}
}
+7
View File
@@ -0,0 +1,7 @@
namespace MtApi5.Events
{
internal class OnLockTicksEvent
{
public string Instrument { get; set; }
}
}
+9
View File
@@ -0,0 +1,9 @@
namespace MtApi5.Events
{
internal class OnTickEvent
{
public MqlTick Tick { get; set; }
public string Instrument { get; set; }
public int ExpertHandle { get; set; }
}
}
+8 -4
View File
@@ -10,13 +10,17 @@ namespace MtApi5
this.volume = volume;
}
public ENUM_BOOK_TYPE type { get; } // Order type from ENUM_BOOK_TYPE enumeration
public double price { get; } // Price
public long volume { get; } // Volume
public MqlBookInfo()
{ }
public ENUM_BOOK_TYPE type { get; set; } // Order type from ENUM_BOOK_TYPE enumeration
public double price { get; set; } // Price
public long volume { get; set; } // Volume
public double volume_real { get; set; } // Volume for the current Last price with greater accuracy
public override string ToString()
{
return $"{type}|{price}|{volume}";
return $"type = {type}; price = {price}; volume = {volume}";
}
}
}
+15 -2
View File
@@ -7,7 +7,19 @@ namespace MtApi5
{
public MqlRates(DateTime time, double open, double high, double low, double close, long tick_volume, int spread, long real_volume)
{
this.time = time;
mt_time = Mt5TimeConverter.ConvertToMtTime(time);
this.open = open;
this.high = high;
this.low = low;
this.close = close;
this.tick_volume = tick_volume;
this.spread = spread;
this.real_volume = real_volume;
}
internal MqlRates(long time, double open, double high, double low, double close, long tick_volume, int spread, long real_volume)
{
mt_time = time;
this.open = open;
this.high = high;
this.low = low;
@@ -21,7 +33,8 @@ namespace MtApi5
{
}
public DateTime time { get; set; } // Period start time
public DateTime time => Mt5TimeConverter.ConvertFromMtTime(mt_time); // Period start time
public long mt_time { get; set; } // Period start time (original MT time)
public double open { get; set; } // Open price
public double high { get; set; } // The highest price of the period
public double low { get; set; } // The lowest price of the period
+2 -1
View File
@@ -23,7 +23,8 @@ namespace MtApi5
public double bid { get; set; } // Current Bid price
public double ask { get; set; } // Current Ask price
public double last { get; set; } // Price of the last deal (Last)
public ulong volume { get; set; } // Volume for the current Last price
public ulong volume { get; set; } // Volume for the current Last price
public double volume_real { get; set; } // Volume for the current Last price with greater accuracy
public DateTime time => Mt5TimeConverter.ConvertFromMtTime(MtTime);
}
+11 -8
View File
@@ -4,14 +4,14 @@ namespace MtApi5
{
public class MqlTradeCheckResult
{
public uint Retcode { get; } // Reply code
public double Balance { get; } // Balance after the execution of the deal
public double Equity { get; } // Equity after the execution of the deal
public double Profit { get; } // Floating profit
public double Margin { get; } // Margin requirements
public double Margin_free { get; } // Free margin
public double Margin_level { get; } // Margin level
public string Comment { get; } // Comment to the reply code (description of the error)
public uint Retcode { get; set; } // Reply code
public double Balance { get; set; } // Balance after the execution of the deal
public double Equity { get; set; } // Equity after the execution of the deal
public double Profit { get; set; } // Floating profit
public double Margin { get; set; } // Margin requirements
public double Margin_free { get; set; } // Free margin
public double Margin_level { get; set; } // Margin level
public string Comment { get; set; } // Comment to the reply code (description of the error)
public MqlTradeCheckResult(uint retcode
, double balance
@@ -32,6 +32,9 @@ namespace MtApi5
Comment = comment;
}
public MqlTradeCheckResult()
{ }
public override string ToString()
{
return $"Retcode={Retcode}; Comment={Comment}; Balance={Balance}; Equity={Equity}; Profit={Profit}; Margin={Margin}; Margin_free={Margin_free}; Margin_level={Margin_level}";
+78 -4
View File
@@ -9,7 +9,6 @@ namespace MtApi5
//OrderSend = 1,
OrderCalcMargin = 2,
OrderCalcProfit = 3,
//OrderCheck = 4,
//OrderSendAsync = 5,
PositionsTotal = 6,
PositionGetSymbol = 7,
@@ -17,6 +16,7 @@ namespace MtApi5
PositionGetDouble = 9,
PositionGetInteger = 10,
PositionGetString = 11,
PositionGetTicket = 4,
OrdersTotal = 12,
OrderGetTicket = 13,
OrderSelect = 14,
@@ -101,14 +101,13 @@ namespace MtApi5
//CTrade
PositionClose = 64,
PositionOpen = 65,
PositionModify = 6066,
//PositionOpenWithResult = 1065,
//Backtesting
BacktestingReady = 66,
IsTesting = 67,
Print = 68,
//Requests
MtRequest = 155,
@@ -179,6 +178,81 @@ namespace MtApi5
TimeLocal = 129,
TimeGMT = 130,
IndicatorRelease = 131
IndicatorRelease = 131,
//Chart Operations
ChartId = 206,
ChartRedraw = 207,
ChartApplyTemplate = 236,
ChartSaveTemplate = 237,
ChartWindowFind = 238,
//ChartTimePriceToXY = 239,
//ChartXYToTimePrice = 240,
ChartOpen = 241,
ChartFirst = 242,
ChartNext = 243,
ChartClose = 244,
ChartSymbol = 245,
ChartPeriod = 246,
ChartSetDouble = 247,
ChartSetInteger = 248,
ChartSetString = 249,
ChartGetDouble = 250,
ChartGetInteger = 251,
ChartGetString = 252,
ChartNavigate = 253,
ChartIndicatorDelete = 254,
ChartIndicatorName = 255,
ChartIndicatorsTotal = 256,
ChartWindowOnDropped = 257,
ChartPriceOnDropped = 258,
ChartTimeOnDropped = 259,
ChartXOnDropped = 260,
ChartYOnDropped = 261,
ChartSetSymbolPeriod = 262,
ChartScreenShot = 263,
ChartIndicatorAdd = 280,
ChartIndicatorGet = 281,
// Terminal Operations
TerminalCompany = 68,
TerminalName = 69,
TerminalPath = 70,
//Checkup
GetLastError = 132,
TerminalInfoString = 153,
TerminalInfoInteger = 204,
TerminalInfoDouble = 205,
//Common Functions
Alert = 136,
Comment = 137, //TODO
GetTickCount = 138, //TODO
GetMicrosecondCount = 139, //TODO
MessageBox = 140, //TODO
PeriodSeconds = 141, //TODO
PlaySound = 142, //TODO
Print = 68,
ResetLastError = 143,
SendNotification = 144, //TODO
SendMail = 145, //TODO
//Global Variables
GlobalVariableCheck = 146,
GlobalVariableTime = 147,
GlobalVariableDel = 148,
GlobalVariableGet = 149,
GlobalVariableName = 150,
GlobalVariableSet = 151,
GlobalVariablesFlush = 152,
GlobalVariableTemp = 154,
GlobalVariableSetOnCondition = 156,
GlobalVariablesDeleteAll = 157,
GlobalVariablesTotal = 158,
UnlockTicks = 159,
PositionCloseAll = 160,
TesterStop = 161
}
}
+94 -3
View File
@@ -36,6 +36,96 @@ namespace MtApi5
#endregion //Chart Timeframes
#region Charts Properties
public enum ENUM_CHART_PROPERTY_DOUBLE
{
CHART_SHIFT_SIZE = 3,
CHART_FIXED_POSITION = 41,
CHART_FIXED_MAX = 8,
CHART_FIXED_MIN = 9,
CHART_POINTS_PER_BAR = 11,
CHART_PRICE_MIN = 108,
CHART_PRICE_MAX = 109
}
public enum ENUM_CHART_PROPERTY_INTEGER
{
CHART_SHOW = 46,
CHART_IS_OBJECT = 111,
CHART_BRING_TO_TOP = 35,
CHART_CONTEXT_MENU = 50,
CHART_CROSSHAIR_TOOL = 49,
CHART_MOUSE_SCROLL = 42,
CHART_EVENT_MOUSE_WHEEL = 48,
CHART_EVENT_MOUSE_MOVE = 40,
CHART_EVENT_OBJECT_CREATE = 38,
CHART_EVENT_OBJECT_DELETE = 39,
CHART_MODE = 0,
CHART_FOREGROUND = 1,
CHART_SHIFT = 2,
CHART_AUTOSCROLL = 4,
CHART_KEYBOARD_CONTROL = 47,
CHART_QUICK_NAVIGATION = 45,
CHART_SCALE = 5,
CHART_SCALEFIX = 6,
CHART_SCALEFIX_11 = 7,
CHART_SCALE_PT_PER_BAR = 10,
CHART_SHOW_OHLC = 12,
CHART_SHOW_BID_LINE = 13,
CHART_SHOW_ASK_LINE = 14,
CHART_SHOW_LAST_LINE = 15,
CHART_SHOW_PERIOD_SEP = 16,
CHART_SHOW_GRID = 17,
CHART_SHOW_VOLUMES = 18,
CHART_SHOW_OBJECT_DESCR = 19,
CHART_VISIBLE_BARS = 100,
CHART_WINDOWS_TOTAL = 101,
CHART_WINDOW_IS_VISIBLE = 102,
CHART_WINDOW_HANDLE = 103,
CHART_WINDOW_YDISTANCE = 110,
CHART_FIRST_VISIBLE_BAR = 104,
CHART_WIDTH_IN_BARS = 105,
CHART_WIDTH_IN_PIXELS = 106,
CHART_HEIGHT_IN_PIXELS = 107,
CHART_COLOR_BACKGROUND = 21,
CHART_COLOR_FOREGROUND = 22,
CHART_COLOR_GRID = 23,
CHART_COLOR_VOLUME = 24,
CHART_COLOR_CHART_UP = 25,
CHART_COLOR_CHART_DOWN = 26,
CHART_COLOR_CHART_LINE = 27,
CHART_COLOR_CANDLE_BULL = 28,
CHART_COLOR_CANDLE_BEAR = 29,
CHART_COLOR_BID = 30,
CHART_COLOR_ASK = 31,
CHART_COLOR_LAST = 32,
CHART_COLOR_STOP_LEVEL = 33,
CHART_SHOW_TRADE_LEVELS = 34,
CHART_DRAG_TRADE_LEVELS = 43,
CHART_SHOW_DATE_SCALE = 36,
CHART_SHOW_PRICE_SCALE = 37,
CHART_SHOW_ONE_CLICK = 44,
CHART_IS_MAXIMIZED = 115,
CHART_IS_MINIMIZED = 116
}
public enum ENUM_CHART_PROPERTY_STRING
{
CHART_COMMENT = 20,
CHART_EXPERT_NAME = 113,
CHART_SCRIPT_NAME = 114
}
public enum ENUM_CHART_POSITION
{
CHART_BEGIN = 0, // Chart beginning (the oldest prices)
CHART_CURRENT_POS = 1, // Current position
CHART_END = 2 // Chart end (the latest prices)
}
#endregion
// Environment State:
#region Client Terminal Properties
@@ -91,8 +181,7 @@ namespace MtApi5
SYMBOL_BACKGROUND_COLOR = 79,
SYMBOL_CHART_MODE = 80,
SYMBOL_SELECT = 0,
//FIXME: SYMBOL_VISIBLE not found in MQL5 environment!
//SYMBOL_VISIBLE = ?
SYMBOL_VISIBLE = 76,
SYMBOL_SESSION_DEALS = 56,
SYMBOL_SESSION_BUY_ORDERS = 60,
SYMBOL_SESSION_SELL_ORDERS = 62,
@@ -134,6 +223,9 @@ namespace MtApi5
SYMBOL_LAST = 7,
SYMBOL_LASTHIGH = 8,
SYMBOL_LASTLOW = 9,
SYMBOL_VOLUME_REAL = 10,
SYMBOL_VOLUMEHIGH_REAL = 11,
SYMBOL_VOLUMELOW_REAL = 12,
SYMBOL_OPTION_STRIKE = 72,
SYMBOL_POINT = 16,
SYMBOL_TRADE_TICK_VALUE = 26,
@@ -459,7 +551,6 @@ namespace MtApi5
POSITION_SL = 6, //Stop Loss level of opened position
POSITION_TP = 7, //Take Profit level of opened position
POSITION_PRICE_CURRENT = 5, //Current price of the position symbol
POSITION_COMMISSION = 8, //FIXME: Undocumented!
POSITION_SWAP = 9, //Cumulative swap
POSITION_PROFIT = 10 //Current profit
}
+14
View File
@@ -0,0 +1,14 @@
using System;
namespace MtApi5
{
public class Mt5LockTicksEventArgs : EventArgs
{
internal Mt5LockTicksEventArgs(string symbol)
{
Symbol = symbol;
}
public string Symbol { get; }
}
}
+17 -2
View File
@@ -1,16 +1,31 @@
namespace MtApi5
using System;
using MTApiService;
namespace MtApi5
{
public class Mt5Quote
{
public string Instrument { get; }
public double Bid { get; }
public double Ask { get; }
public int ExpertHandle { get; set; }
public DateTime Time { get; set; }
public double Last { get; set; }
public ulong Volume { get; set; }
// public long TimeMsc { get; set; }
// public uint Flags { get; set; }
public Mt5Quote(string instrument, double bid, double ask)
internal Mt5Quote(string instrument, double bid, double ask)
{
Instrument = instrument;
Bid = bid;
Ask = ask;
}
internal Mt5Quote(MtQuote quote)
:this(quote.Instrument, quote.Bid, quote.Ask)
{
ExpertHandle = quote.ExpertHandle;
}
}
}
+18
View File
@@ -0,0 +1,18 @@
using System;
namespace MtApi5
{
public class Mt5TimeBarArgs: EventArgs
{
internal Mt5TimeBarArgs(int expertHandle, string symbol, MqlRates rates)
{
ExpertHandle = expertHandle;
Rates = rates;
Symbol = symbol;
}
public int ExpertHandle { get; }
public string Symbol { get; }
public MqlRates Rates { get; }
}
}
+4 -3
View File
@@ -16,12 +16,13 @@ namespace MtApi5
return new DateTime(tmpTime.Ticks + (time * 0x989680L));
}
public static int ConvertToMtTime(DateTime time)
public static int ConvertToMtTime(DateTime? time)
{
var result = 0;
if (time == DateTime.MinValue) return result;
if (time == null || time == DateTime.MinValue)
return result;
var tmpTime = new DateTime(1970, 1, 1);
result = (int)((time.Ticks - tmpTime.Ticks) / 0x989680L);
result = (int)((time.Value.Ticks - tmpTime.Ticks) / 0x989680L);
return result;
}
}
+16 -3
View File
@@ -32,8 +32,8 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.8.0.3\lib\net40\Newtonsoft.Json.dll</HintPath>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net40\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System" />
@@ -49,7 +49,12 @@
<ItemGroup>
<Compile Include="CopyTicksFlag.cs" />
<Compile Include="Events\OnBookEvent.cs" />
<Compile Include="Events\OnLastTimeBarEvent.cs" />
<Compile Include="Events\OnLockTicksEvent.cs" />
<Compile Include="Events\OnTickEvent.cs" />
<Compile Include="Events\OnTradeTransactionEvent.cs" />
<Compile Include="Mt5LockTicksEventArgs.cs" />
<Compile Include="Mt5TimeBarArgs.cs" />
<Compile Include="MqlBookInfo.cs" />
<Compile Include="MqlParam.cs" />
<Compile Include="MqlRates.cs" />
@@ -73,6 +78,10 @@
<Compile Include="Events\Mt5EventTypes.cs" />
<Compile Include="Properties\AssemblyInfo.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\ICustomRequest.cs" />
<Compile Include="Requests\IndicatorCreateRequest.cs" />
@@ -80,11 +89,16 @@
<Compile Include="Requests\OrderCheckRequest.cs" />
<Compile Include="Requests\OrderCheckResult.cs" />
<Compile Include="Requests\OrderSendRequest.cs" />
<Compile Include="Requests\PositionCloseRequest.cs" />
<Compile Include="Requests\PositionCloseResult.cs" />
<Compile Include="Requests\PositionOpenRequest.cs" />
<Compile Include="Requests\RequestBase.cs" />
<Compile Include="Requests\RequestType.cs" />
<Compile Include="Requests\OrderSendResult.cs" />
<Compile Include="Requests\Response.cs" />
<Compile Include="Requests\SymbolInfoStringRequest.cs" />
<Compile Include="Requests\SymbolInfoStringResult.cs" />
<Compile Include="Requests\SymbolInfoTickRequest.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\MTApiService\MTApiService.csproj">
@@ -95,7 +109,6 @@
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
+842 -35
View File
File diff suppressed because it is too large Load Diff
-4
View File
@@ -9,10 +9,6 @@ namespace MtApi5
private static readonly MtLog Log = LogConfigurator.GetLogger(typeof(MtConverters));
#region Values Converters
public static Mt5Quote Convert(this MtQuote quote)
{
return quote != null ? new Mt5Quote(quote.Instrument, quote.Bid, quote.Ask) : null;
}
public static bool ParseResult(this string inputString, char separator, out double result)
{
+2 -2
View File
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.17")]
[assembly: AssemblyFileVersion("1.0.17")]
[assembly: AssemblyVersion("1.0.21")]
[assembly: AssemblyFileVersion("1.0.21")]
@@ -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; }
}
}
+10
View File
@@ -0,0 +1,10 @@
namespace MtApi5.Requests
{
internal class PositionCloseRequest : RequestBase
{
public override RequestType RequestType => RequestType.PositionClose;
public ulong Ticket { get; set; }
public ulong Deviation { get; set; }
}
}
+8
View File
@@ -0,0 +1,8 @@
namespace MtApi5.Requests
{
internal class PositionCloseResult
{
public bool RetVal { get; set; }
public MqlTradeResult TradeResult { get; set; }
}
}
+13 -8
View File
@@ -4,13 +4,18 @@ namespace MtApi5.Requests
{
internal enum RequestType
{
Unknown = 0,
CopyTicks = 1,
iCustom = 2,
OrderSend = 3,
PositionOpen = 4,
OrderCheck = 5,
MarketBookGet = 6,
IndicatorCreate = 7
Unknown = 0,
CopyTicks = 1,
iCustom = 2,
OrderSend = 3,
PositionOpen = 4,
OrderCheck = 5,
MarketBookGet = 6,
IndicatorCreate = 7,
SymbolInfoString = 8,
ChartTimePriceToXY = 9,
ChartXYToTimePrice = 10,
PositionClose = 11,
SymbolInfoTick = 12
}
}
@@ -0,0 +1,10 @@
namespace MtApi5.Requests
{
internal class SymbolInfoStringRequest : RequestBase
{
public override RequestType RequestType => RequestType.SymbolInfoString;
public string SymbolName { get; set; }
public ENUM_SYMBOL_INFO_STRING PropId { get; set; }
}
}
@@ -0,0 +1,8 @@
namespace MtApi5.Requests
{
internal class SymbolInfoStringResult
{
public bool RetVal { get; set; }
public string StringVar { get; set; }
}
}
+14
View File
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MtApi5.Requests
{
internal class SymbolInfoTickRequest : RequestBase
{
public override RequestType RequestType => RequestType.SymbolInfoTick;
public string SymbolName { get; set; }
}
}
+1 -1
View File
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="8.0.3" targetFramework="net40" />
<package id="Newtonsoft.Json" version="12.0.2" targetFramework="net40" />
</packages>
+14 -15
View File
@@ -1,24 +1,23 @@
# MtApi - .NET API for MetaTrader trading platform (MetaQuotes).
MtApi provides an .NET API interface to work with famous trading platfroms MetaTrader4 and MetaTrader5 (MetaQuotes).
The api is using directly connection to MetaTrader terminal and is working with MQL functions and the most functions of the api have MQL interface.
# MtApi - .NET API for MetaTrader Trading Platform (MetaQuotes).
MtApi provides a .NET API to work with famous trading platfroms MetaTrader4 and MetaTrader5 (MetaQuotes).
The API connects directly to the MetaTrader terminal and works with MQL functions. Most functions of the API have MQL interface.
The connection can be local or remote (by TCP).
# MtApi structure
# MtApi Structure
The project has two parts:
- client side (C#): MtApi and MtApi5;
- server side (C# and C++/CLI): MTApiService, MTConnector, MT5Connector, MQL experts.
Server side was designed with using WCF framework so it can be flaxible to setup connections but can be more slow compared with another connections types (for example, shared memory).
MTApiService is common engine communication project of the API for MT4 and MT5.
MTApiService library should be placed in Windows GAC (Global Assembly Cache). Installers in the project will copied it to GAC automatically.
Server side was designed using WCF framework with the intention of using flexibility to setup connections. One downside of using the WCF framework is the slower speed compared to other connection types (for example, shared memory).
MTApiService is a common engine communication project of the API for MT4 and MT5.
MTApiService library should be placed in Windows GAC (Global Assembly Cache). Installers in the project will be copied to GAC automatically.
# How to build solution
The project is supported by Visual Studio 2015.
It also requires WIX Tools (http://wixtoolset.org/).
# How to Build Solution
The project is supported by Visual Studio 2017 and requires WIX Tools (http://wixtoolset.org/).
To make api for MetaTrader4 use MtApiInstaller and for MetaTrader5 use MtApi5Installer.
All installers will be placed in folder "[root]\build\installers\" and all *.dll files will be placed in "[root]\build\products\".
MQL files have been build to ex4 and stored into folders "mq4" for MetaTrader and "mq5" for MetaTrader5. They are ready to using in terminals.
If you change source code of MQL expert you have to recompile it with MetaEditor. In this case you need to copy files "hash.mqh" and "json.mqh" to MetaEditor include folder.
To make an API for MetaTrader4 use MtApiInstaller and for MetaTrader5 use MtApi5Installer.
All installers will be placed in the folder "[root]\build\installers\" and all *.dll files will be placed in "[root]\build\products\".
MQL files have been build to ex4 and stored into folders "mq4" for MetaTrader and "mq5" for MetaTrader5. They are ready to be used in terminals.
Changing the source code of MQL expert requires recompilation with MetaEditor. Resulting in the need to copy files "hash.mqh" and "json.mqh" to the MetaEditor include folder.
# Home website
# Home Website
Please visit http://mtapi4.net
+505 -288
View File
@@ -4,7 +4,7 @@
xmlns:mtapi5="clr-namespace:MtApi5;assembly=MtApi5"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:mtApi5TestClient="clr-namespace:MtApi5TestClient"
Title="MainWindow" Height="700" Width="700"
Title="MainWindow" Height="700" Width="900"
Closing="Window_Closing">
<Window.Resources>
<DataTemplate x:Key="ConnectionTextBlockTemplate" DataType="{x:Type mtapi5:Mt5ConnectionState}">
@@ -78,6 +78,28 @@
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<ObjectDataProvider x:Key="ENUM_TERMINAL_INFO_INTEGER_Key" MethodName="GetValues"
ObjectType="{x:Type sys:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="mtapi5:ENUM_TERMINAL_INFO_INTEGER"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<ObjectDataProvider x:Key="ENUM_TERMINAL_INFO_STRING_Key" MethodName="GetValues"
ObjectType="{x:Type sys:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="mtapi5:ENUM_TERMINAL_INFO_STRING"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<ObjectDataProvider x:Key="ENUM_TERMINAL_INFO_DOUBLE_Key" MethodName="GetValues"
ObjectType="{x:Type sys:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="mtapi5:ENUM_TERMINAL_INFO_DOUBLE"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<ObjectDataProvider x:Key="ENUM_TIMEFRAMES_Key" MethodName="GetValues"
ObjectType="{x:Type sys:Enum}">
<ObjectDataProvider.MethodParameters>
@@ -95,9 +117,9 @@
<Grid x:Name="_MainLayout">
<Grid.RowDefinitions>
<RowDefinition Height="0.65*"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="0.35*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
@@ -107,336 +129,531 @@
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid Margin="10">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="150"/>
</Grid.ColumnDefinitions>
<Border Grid.Row="0" Margin="2" Visibility="Visible" BorderThickness="1" BorderBrush="DarkBlue">
<StackPanel>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="Host"/>
<TextBox Grid.Row="0" Grid.Column="1"
Margin="5,0,0,0"
Text="{Binding Host, UpdateSourceTrigger=PropertyChanged}"/>
<TextBlock Grid.Row="0" Grid.Column="0" Text="Host" Margin="5,2,2,2" VerticalAlignment="Center"/>
<TextBox Grid.Row="0" Grid.Column="1" Margin="2" Text="{Binding Host, UpdateSourceTrigger=PropertyChanged}"/>
<TextBlock Grid.Row="1" Grid.Column="0" Text="Port" Margin="5,2,2,2" VerticalAlignment="Center"/>
<TextBox Grid.Row="1" Grid.Column="1" Margin="2" Width="70" HorizontalAlignment="Left" Text="{Binding Port, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="30,5,0,10" >
<Button Content="Connect" Width="70" Command="{Binding ConnectCommand}" />
<Button Margin="10,0,0,0" Width="70" Content="Disconnect" Command="{Binding DisconnectCommand}" />
</StackPanel>
</StackPanel>
</Border>
<TextBlock Grid.Row="1" Grid.Column="0" Text="Port"/>
<TextBox Grid.Row="1" Grid.Column="1"
Margin="5,0,0,0"
Text="{Binding Port, UpdateSourceTrigger=PropertyChanged}"/>
<StackPanel Grid.Row="2" Grid.ColumnSpan="2" Margin="5" Orientation="Horizontal">
<Button Content="Connect" Width="70" Command="{Binding ConnectCommand}" />
<Button Margin="5,0,0,0" Width="70" Content="Disconnect" Command="{Binding DisconnectCommand}" />
</StackPanel>
<Border Grid.Row="3" Margin="2" Visibility="Visible" BorderThickness="1" BorderBrush="DarkBlue">
<Grid Margin="3">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Label Grid.Row="0" Content="Quotes" Background="LightYellow" />
<ListView Grid.Row="1" Margin="2"
ItemsSource="{Binding Quotes}"
SelectedItem="{Binding SelectedQuote}"
SelectionMode="Single">
<ListView.View>
<GridView>
<GridViewColumn Width="100" Header="Instrument" DisplayMemberBinding="{Binding Instrument}" />
<GridViewColumn Width="70" Header="Bid" DisplayMemberBinding="{Binding Bid}" />
<GridViewColumn Width="70" Header="Ask" DisplayMemberBinding="{Binding Ask}" />
<GridViewColumn Width="80" Header="ExpertHandle" DisplayMemberBinding="{Binding ExpertHandle}" />
</GridView>
</ListView.View>
</ListView>
</Grid>
</Border>
</Grid>
<ListView Grid.Row="0" Grid.Column="1"
ItemsSource="{Binding Quotes}"
SelectedItem="{Binding SelectedQuote}"
SelectionMode="Single">
<ListView.View>
<GridView>
<GridViewColumn Width="140" Header="Instrument" DisplayMemberBinding="{Binding Instrument}" />
<GridViewColumn Width="80" Header="Bid" DisplayMemberBinding="{Binding Bid}" />
<GridViewColumn Width="80" Header="Ask" DisplayMemberBinding="{Binding Ask}" />
<GridViewColumn Width="80" Header="Feeds Count" DisplayMemberBinding="{Binding FeedCount}" />
</GridView>
</ListView.View>
</ListView>
</Grid>
<TabControl Grid.Column="1" Margin="2">
<TabItem Header="Trade Functions">
<ScrollViewer>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TabControl Grid.Row="1" >
<TabItem Header="Trade Functions">
<ScrollViewer>
<Expander Header="MqlTradeRequest" Margin="10" IsExpanded="True">
<Grid Margin="0,10,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0" Text="Action"/>
<ComboBox Grid.Column="1" Grid.Row="0" ItemsSource="{Binding Source={StaticResource ENUM_TRADE_REQUEST_ACTIONS_Key}}"
SelectedItem="{Binding TradeRequest.Action}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="2" Grid.Row="0" Text="Magic" Margin="10,0,0,0"/>
<TextBox Grid.Column="3" Grid.Row="0" Text="{Binding TradeRequest.Magic}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="0" Grid.Row="1" Text="Order"/>
<TextBox Grid.Column="1" Grid.Row="1" Text="{Binding TradeRequest.Order}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="2" Grid.Row="1" Text="Symbol" Margin="10,0,0,0"/>
<TextBox Grid.Column="3" Grid.Row="1" Text="{Binding TradeRequest.Symbol}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="0" Grid.Row="2" Text="Volume"/>
<TextBox Grid.Column="1" Grid.Row="2" Text="{Binding TradeRequest.Volume}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="2" Grid.Row="2" Text="Price" Margin="10,0,0,0"/>
<TextBox Grid.Column="3" Grid.Row="2" Text="{Binding TradeRequest.Price}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="0" Grid.Row="3" Text="Stoplimit"/>
<TextBox Grid.Column="1" Grid.Row="3" Text="{Binding TradeRequest.Stoplimit}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="2" Grid.Row="3" Text="Sl" Margin="10,0,0,0"/>
<TextBox Grid.Column="3" Grid.Row="3" Text="{Binding TradeRequest.Sl}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="0" Grid.Row="4" Text="Tp"/>
<TextBox Grid.Column="1" Grid.Row="4" Text="{Binding TradeRequest.Tp}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="2" Grid.Row="4" Text="Deviation" Margin="10,0,0,0"/>
<TextBox Grid.Column="3" Grid.Row="4" Text="{Binding TradeRequest.Deviation}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="0" Grid.Row="5" Text="Type"/>
<ComboBox Grid.Column="1" Grid.Row="5" ItemsSource="{Binding Source={StaticResource ENUM_ORDER_TYPE_Key}}"
SelectedItem="{Binding TradeRequest.Type}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="2" Grid.Row="5" Text="Type_filling" Margin="10,0,0,0"/>
<ComboBox Grid.Column="3" Grid.Row="5" ItemsSource="{Binding Source={StaticResource ENUM_ORDER_TYPE_FILLING_Key}}"
SelectedItem="{Binding TradeRequest.Type_filling}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="0" Grid.Row="6" Text="Type_time"/>
<ComboBox Grid.Column="1" Grid.Row="6" ItemsSource="{Binding Source={StaticResource ENUM_ORDER_TYPE_TIME_Key}}"
SelectedItem="{Binding TradeRequest.Type_time}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="2" Grid.Row="6" Text="Expiration" Margin="10,0,0,0"/>
<TextBox Grid.Column="3" Grid.Row="6" Text="{Binding TradeRequest.Expiration}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="0" Grid.Row="7" Text="Comment"/>
<TextBox Grid.Column="1" Grid.Row="7" Grid.ColumnSpan="3" Text="{Binding TradeRequest.Comment}" Margin="5,0,0,0"/>
</Grid>
</Expander>
<StackPanel Grid.Row="1" Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<Button Content="OrderSend" Command="{Binding OrderSendCommand}" Width="100" Height="25" HorizontalAlignment="Left" Margin="4"/>
<Button Content="OrderCheck" Command="{Binding OrderCheckCommand}" Width="100" Height="25" HorizontalAlignment="Left" Margin="4"/>
<Button Content="PositionGetTicket" Command="{Binding PositionGetTicketCommand}" Width="100" Height="25" HorizontalAlignment="Left" Margin="4"/>
</StackPanel>
<WrapPanel>
<Button Content="HistoryDealGetDouble" Command="{Binding HistoryDealGetDoubleCommand}" Height="25" HorizontalAlignment="Left" Margin="4"/>
<Button Content="HistoryDealGetInteger" Command="{Binding HistoryDealGetIntegerCommand}" Height="25" HorizontalAlignment="Left" Margin="4"/>
<Button Content="HistoryDealGetString" Command="{Binding HistoryDealGetStringCommand}" Height="25" HorizontalAlignment="Left" Margin="4"/>
<Button Content="HistoryOrderGetInteger" Command="{Binding HistoryOrderGetIntegerCommand}" Height="25" HorizontalAlignment="Left" Margin="4"/>
<Button Content="HistoryDealMethods" Command="{Binding HistoryDealMethodsCommand}" Height="25" HorizontalAlignment="Left" Margin="4"/>
</WrapPanel>
</StackPanel>
</Grid>
</ScrollViewer>
</TabItem>
<TabItem Header="Account Information">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" Margin="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.4*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Expander Header="MqlTradeRequest" Margin="10">
<Grid Margin="0,10,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ComboBox Grid.Column="0" Grid.Row="0"
SelectedItem="{Binding AccountInfoDoublePropertyId}"
ItemsSource="{Binding Source={StaticResource ENUM_ACCOUNT_INFO_DOUBLE_Key}}"/>
<Button Grid.Column="1" Grid.Row="0" Margin="10,0,0,0"
Command="{Binding AccountInfoDoubleCommand}"
Content="AccountInfoDouble" HorizontalAlignment="Left" />
<ComboBox Grid.Column="0" Grid.Row="1"
SelectedItem="{Binding AccountInfoIntegerPropertyId}"
ItemsSource="{Binding Source={StaticResource ENUM_ACCOUNT_INFO_INTEGER_Key}}"/>
<Button Grid.Column="1" Grid.Row="1" Margin="10,0,0,0"
Command="{Binding AccountInfoIntegerCommand}"
Content="AccountInfoInteger" HorizontalAlignment="Left" />
<ComboBox Grid.Column="0" Grid.Row="2"
SelectedItem="{Binding AccountInfoStringPropertyId}"
ItemsSource="{Binding Source={StaticResource ENUM_ACCOUNT_INFO_STRING_Key}}"/>
<Button Grid.Column="1" Grid.Row="2" Margin="10,0,0,0"
Command="{Binding AccountInfoStringCommand}"
Content="AccountInfoString" HorizontalAlignment="Left" />
</Grid>
</Grid>
</TabItem>
<TabItem Header="Terminal Information">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" Margin="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.4*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<ComboBox Grid.Column="0" Grid.Row="0"
SelectedItem="{Binding TerminalInfoDoublePropertyId}"
ItemsSource="{Binding Source={StaticResource ENUM_TERMINAL_INFO_DOUBLE_Key}}"/>
<Button Grid.Column="1" Grid.Row="0" Margin="10,0,0,0"
Command="{Binding TerminalInfoDoubleCommand}"
Content="TerminalInfoDouble" HorizontalAlignment="Left" />
<ComboBox Grid.Column="0" Grid.Row="1"
SelectedItem="{Binding TerminalInfoIntegerPropertyId}"
ItemsSource="{Binding Source={StaticResource ENUM_TERMINAL_INFO_INTEGER_Key}}"/>
<Button Grid.Column="1" Grid.Row="1" Margin="10,0,0,0"
Command="{Binding TerminalInfoIntegerCommand}"
Content="TerminalInfoInteger" HorizontalAlignment="Left" />
<ComboBox Grid.Column="0" Grid.Row="2"
SelectedItem="{Binding TerminalInfoStringPropertyId}"
ItemsSource="{Binding Source={StaticResource ENUM_TERMINAL_INFO_STRING_Key}}"/>
<Button Grid.Column="1" Grid.Row="2" Margin="10,0,0,0"
Command="{Binding TerminalInfoStringCommand}"
Content="TerminalInfoString" HorizontalAlignment="Left" />
</Grid>
</Grid>
</TabItem>
<TabItem Header="Timeseries and Indicators Access">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid Grid.Column="1" Margin="2">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Text="Symbol Name" Margin="1"/>
<TextBlock Grid.Row="1" Grid.Column="0" Text="TimeFrame" Margin="1" HorizontalAlignment="Right"/>
<TextBlock Grid.Row="2" Grid.Column="0" Text="StartPos" Margin="1" HorizontalAlignment="Right"/>
<TextBlock Grid.Row="3" Grid.Column="0" Text="Count" Margin="1" HorizontalAlignment="Right"/>
<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding TimeSeriesValues.SymbolValue}" Margin="1"/>
<ComboBox Grid.Row="1" Grid.Column="1" Margin="1"
ItemsSource="{Binding Source={StaticResource ENUM_TIMEFRAMES_Key}}"
SelectedItem="{Binding TimeSeriesValues.TimeFrame}"/>
<TextBox Grid.Row="2" Grid.Column="1" Text="{Binding TimeSeriesValues.StartPos}" Margin="1"/>
<TextBox Grid.Row="3" Grid.Column="1" Text="{Binding TimeSeriesValues.Count}" Margin="1"/>
</Grid>
<WrapPanel Grid.Row="1" Grid.Column="0" Margin="5">
<Button Command="{Binding CopyRatesCommand}" Margin="1"
Content="CopyRates" HorizontalAlignment="Left" />
<Button Command="{Binding CopyTimesCommand}" Margin="1"
Content="CopyTimes" HorizontalAlignment="Left" />
<Button Command="{Binding CopyOpenCommand}" Margin="1"
Content="CopyOpen" HorizontalAlignment="Left" />
<Button Command="{Binding CopyHighCommand}" Margin="1"
Content="CopyHigh" HorizontalAlignment="Left" />
<Button Command="{Binding CopyLowCommand}" Margin="1"
Content="CopyLow" HorizontalAlignment="Left" />
<Button Command="{Binding CopyCloseCommand}" Margin="1"
Content="CopyClose" HorizontalAlignment="Left" />
<Button Command="{Binding CopyTickVolumeCommand}" Margin="1"
Content="CopyTickVolume" HorizontalAlignment="Left" />
<Button Command="{Binding CopyRealVolumeCommand}" Margin="1"
Content="CopyRealVolume" HorizontalAlignment="Left" />
<Button Command="{Binding CopySpreadCommand}" Margin="1"
Content="CopySpread" HorizontalAlignment="Left" />
<Button Command="{Binding CopyTicksCommand}" Margin="1"
Content="CopyTicks" HorizontalAlignment="Left" />
</WrapPanel>
<Grid Grid.Row="2">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0" Text="Action"/>
<ComboBox Grid.Column="1" Grid.Row="0" ItemsSource="{Binding Source={StaticResource ENUM_TRADE_REQUEST_ACTIONS_Key}}"
SelectedItem="{Binding TradeRequest.Action}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="2" Grid.Row="0" Text="Magic" Margin="10,0,0,0"/>
<TextBox Grid.Column="3" Grid.Row="0" Text="{Binding TradeRequest.Magic}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="0" Grid.Row="1" Text="Order"/>
<TextBox Grid.Column="1" Grid.Row="1" Text="{Binding TradeRequest.Order}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="2" Grid.Row="1" Text="Symbol" Margin="10,0,0,0"/>
<TextBox Grid.Column="3" Grid.Row="1" Text="{Binding TradeRequest.Symbol}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="0" Grid.Row="2" Text="Volume"/>
<TextBox Grid.Column="1" Grid.Row="2" Text="{Binding TradeRequest.Volume}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="2" Grid.Row="2" Text="Price" Margin="10,0,0,0"/>
<TextBox Grid.Column="3" Grid.Row="2" Text="{Binding TradeRequest.Price}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="0" Grid.Row="3" Text="Stoplimit"/>
<TextBox Grid.Column="1" Grid.Row="3" Text="{Binding TradeRequest.Stoplimit}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="2" Grid.Row="3" Text="Sl" Margin="10,0,0,0"/>
<TextBox Grid.Column="3" Grid.Row="3" Text="{Binding TradeRequest.Sl}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="0" Grid.Row="4" Text="Tp"/>
<TextBox Grid.Column="1" Grid.Row="4" Text="{Binding TradeRequest.Tp}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="2" Grid.Row="4" Text="Deviation" Margin="10,0,0,0"/>
<TextBox Grid.Column="3" Grid.Row="4" Text="{Binding TradeRequest.Deviation}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="0" Grid.Row="5" Text="Type"/>
<ComboBox Grid.Column="1" Grid.Row="5" ItemsSource="{Binding Source={StaticResource ENUM_ORDER_TYPE_Key}}"
SelectedItem="{Binding TradeRequest.Type}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="2" Grid.Row="5" Text="Type_filling" Margin="10,0,0,0"/>
<ComboBox Grid.Column="3" Grid.Row="5" ItemsSource="{Binding Source={StaticResource ENUM_ORDER_TYPE_FILLING_Key}}"
SelectedItem="{Binding TradeRequest.Type_filling}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="0" Grid.Row="6" Text="Type_time"/>
<ComboBox Grid.Column="1" Grid.Row="6" ItemsSource="{Binding Source={StaticResource ENUM_ORDER_TYPE_TIME_Key}}"
SelectedItem="{Binding TradeRequest.Type_time}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="2" Grid.Row="6" Text="Expiration" Margin="10,0,0,0"/>
<TextBox Grid.Column="3" Grid.Row="6" Text="{Binding TradeRequest.Expiration}" Margin="5,0,0,0"/>
<TextBlock Grid.Column="0" Grid.Row="7" Text="Comment"/>
<TextBox Grid.Column="1" Grid.Row="7" Grid.ColumnSpan="3" Text="{Binding TradeRequest.Comment}" Margin="5,0,0,0"/>
<DockPanel Grid.Row="0" LastChildFill="True">
<Button DockPanel.Dock="Right" Command="{Binding IndicatorCreateCommand}" Margin="2"
Content="IndicatorCreate" HorizontalAlignment="Left" />
<ComboBox Margin="2"
ItemsSource="{Binding Source={StaticResource ENUM_INDICATOR_Key}}"
SelectedItem="{Binding TimeSeriesValues.IndicatorType}"/>
</DockPanel>
<StackPanel Grid.Row="1" Orientation="Horizontal">
<Label Content="Indicator handle:" Margin="2"/>
<TextBox Margin="2" Width="60" PreviewTextInput="NumberValidationTextBox" Text="{Binding TimeSeriesValues.IndicatorHandle}"/>
<Button Command="{Binding IndicatorReleaseCommand}" Margin="2"
Content="IndicatorRelease" HorizontalAlignment="Left" />
</StackPanel>
</Grid>
</Expander>
</Grid>
<StackPanel Grid.Row="1" Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<Button Content="OrderSend" Command="{Binding OrderSendCommand}" Width="100" Height="25" HorizontalAlignment="Left" Margin="4"/>
<Button Content="OrderCheck" Command="{Binding OrderCheckCommand}" Width="100" Height="25" HorizontalAlignment="Left" Margin="4"/>
</StackPanel>
<ListBox Grid.Column="0" ItemsSource="{Binding TimeSeriesResults}" />
<WrapPanel>
<Button Content="HistoryDealGetDouble" Command="{Binding HistoryDealGetDoubleCommand}" Height="25" HorizontalAlignment="Left" Margin="4"/>
<Button Content="HistoryDealGetInteger" Command="{Binding HistoryDealGetIntegerCommand}" Height="25" HorizontalAlignment="Left" Margin="4"/>
<Button Content="HistoryDealGetString" Command="{Binding HistoryDealGetStringCommand}" Height="25" HorizontalAlignment="Left" Margin="4"/>
<Button Content="HistoryOrderGetInteger" Command="{Binding HistoryOrderGetIntegerCommand}" Height="25" HorizontalAlignment="Left" Margin="4"/>
<Button Content="HistoryDealMethods" Command="{Binding HistoryDealMethodsCommand}" Height="25" HorizontalAlignment="Left" Margin="4"/>
</WrapPanel>
</Grid>
</TabItem>
<TabItem Header="Market Info">
<WrapPanel VerticalAlignment="Top" Margin="5">
<Button Command="{Binding SymbolsTotalCommand}" Content="SymbolsTotal" Margin="2"/>
<Button Command="{Binding SymbolNameCommand}" Content="SymbolName" Margin="2"/>
<Button Command="{Binding SymbolSelectCommand}" Content="SymbolSelect" Margin="2"/>
<Button Command="{Binding SymbolIsSynchronizedCommand}" Content="SymbolIsSynchronized" Margin="2"/>
<Button Command="{Binding SymbolInfoDoubleCommand}" Content="SymbolInfoDouble" Margin="2"/>
<Button Command="{Binding SymbolInfoIntegerCommand}" Content="SymbolInfoInteger" Margin="2"/>
<Button Command="{Binding SymbolInfoStringCommand}" Content="SymbolInfoString" Margin="2"/>
<Button Command="{Binding SymbolInfoString2Command}" Content="SymbolInfoString-2" Margin="2"/>
<Button Command="{Binding SymbolInfoTickCommand}" Content="SymbolInfoTick" Margin="2"/>
<Button Command="{Binding SymbolInfoSessionQuoteCommand}" Content="SymbolInfoSessionQuote" Margin="2"/>
<Button Command="{Binding SymbolInfoSessionTradeCommand}" Content="SymbolInfoSessionTrade" Margin="2"/>
<Button Command="{Binding MarketBookAddCommand}" Content="MarketBookAdd" Margin="2"/>
<Button Command="{Binding MarketBookReleaseCommand}" Content="MarketBookRelease" Margin="2"/>
<Button Command="{Binding MarketBookGetCommand}" Content="MarketBookGet" Margin="2"/>
</WrapPanel>
</TabItem>
<TabItem Header="CTrade (Positions)">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Button Grid.Row="0" Command="{Binding PositionOpenCommand}" Content="PositionOpen" Margin="2" HorizontalAlignment="Left"/>
<StackPanel Grid.Row="1" Orientation="Horizontal" Margin="4">
<TextBlock Text="Ticket:" VerticalAlignment="Center"/>
<TextBox Text="{Binding PositionTicketValue}" Width="150" Margin="2"/>
<Button Command="{Binding PositionCloseCommand}" Content="PositionClose" Margin="2"/>
</StackPanel>
<Button Grid.Row="2" Command="{Binding PositionCloseAllCommand}" Content="PositionCloseAll" Margin="2" HorizontalAlignment="Left"/>
</Grid>
</TabItem>
<TabItem Header="Indicators">
<WrapPanel VerticalAlignment="Top" Margin="5">
<Button Command="{Binding iCustomCommand}" Content="iCustom" Margin="2"/>
</WrapPanel>
</TabItem>
<TabItem Header="Chart Functions">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</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>
</Grid>
</ScrollViewer>
</TabItem>
<TabItem Header="Account Information">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" Margin="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.4*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<ComboBox Grid.Column="0" Grid.Row="0"
SelectedItem="{Binding AccountInfoDoublePropertyId}"
ItemsSource="{Binding Source={StaticResource ENUM_ACCOUNT_INFO_DOUBLE_Key}}"/>
<Button Grid.Column="1" Grid.Row="0" Margin="10,0,0,0"
Command="{Binding AccountInfoDoubleCommand}"
Content="AccountInfoDouble" HorizontalAlignment="Left" />
<ComboBox Grid.Column="0" Grid.Row="1"
SelectedItem="{Binding AccountInfoIntegerPropertyId}"
ItemsSource="{Binding Source={StaticResource ENUM_ACCOUNT_INFO_INTEGER_Key}}"/>
<Button Grid.Column="1" Grid.Row="1" Margin="10,0,0,0"
Command="{Binding AccountInfoIntegerCommand}"
Content="AccountInfoInteger" HorizontalAlignment="Left" />
<ComboBox Grid.Column="0" Grid.Row="2"
SelectedItem="{Binding AccountInfoStringPropertyId}"
ItemsSource="{Binding Source={StaticResource ENUM_ACCOUNT_INFO_STRING_Key}}"/>
<Button Grid.Column="1" Grid.Row="2" Margin="10,0,0,0"
Command="{Binding AccountInfoStringCommand}"
Content="AccountInfoString" HorizontalAlignment="Left" />
</Grid>
<Grid Margin="10" Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0" Text="{Binding MessageText}" Margin="5"/>
<Button Grid.Column="1" Content="Print" Command="{Binding PrintCommand}" Margin="5"/>
</Grid>
</Grid>
</TabItem>
<TabItem Header="Timeseries and Indicators Access">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid Grid.Column="1" Margin="2">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Text="Symbol Name" Margin="1"/>
<TextBlock Grid.Row="1" Grid.Column="0" Text="TimeFrame" Margin="1" HorizontalAlignment="Right"/>
<TextBlock Grid.Row="2" Grid.Column="0" Text="StartPos" Margin="1" HorizontalAlignment="Right"/>
<TextBlock Grid.Row="3" Grid.Column="0" Text="Count" Margin="1" HorizontalAlignment="Right"/>
<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding TimeSeriesValues.SymbolValue}" Margin="1"/>
<ComboBox Grid.Row="1" Grid.Column="1" Margin="1"
ItemsSource="{Binding Source={StaticResource ENUM_TIMEFRAMES_Key}}"
SelectedItem="{Binding TimeSeriesValues.TimeFrame}"/>
<TextBox Grid.Row="2" Grid.Column="1" Text="{Binding TimeSeriesValues.StartPos}" Margin="1"/>
<TextBox Grid.Row="3" Grid.Column="1" Text="{Binding TimeSeriesValues.Count}" Margin="1"/>
</Grid>
<WrapPanel Grid.Row="1" Grid.Column="0" Margin="5">
<Button Command="{Binding CopyRatesCommand}" Margin="1"
Content="CopyRates" HorizontalAlignment="Left" />
<Button Command="{Binding CopyTimesCommand}" Margin="1"
Content="CopyTimes" HorizontalAlignment="Left" />
<Button Command="{Binding CopyOpenCommand}" Margin="1"
Content="CopyOpen" HorizontalAlignment="Left" />
<Button Command="{Binding CopyHighCommand}" Margin="1"
Content="CopyHigh" HorizontalAlignment="Left" />
<Button Command="{Binding CopyLowCommand}" Margin="1"
Content="CopyLow" HorizontalAlignment="Left" />
<Button Command="{Binding CopyCloseCommand}" Margin="1"
Content="CopyClose" HorizontalAlignment="Left" />
<Button Command="{Binding CopyTickVolumeCommand}" Margin="1"
Content="CopyTickVolume" HorizontalAlignment="Left" />
<Button Command="{Binding CopyRealVolumeCommand}" Margin="1"
Content="CopyRealVolume" HorizontalAlignment="Left" />
<Button Command="{Binding CopySpreadCommand}" Margin="1"
Content="CopySpread" HorizontalAlignment="Left" />
<Button Command="{Binding CopyTicksCommand}" Margin="1"
Content="CopyTicks" HorizontalAlignment="Left" />
<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>
<Grid Grid.Row="2">
<WrapPanel Grid.Row="3" VerticalAlignment="Top" Margin="5">
<Button Command="{Binding ChartApplyTemplateCommand}" Content="ChartApplyTemplate" Margin="2"/>
<Button Command="{Binding ChartSaveTemplateCommand}" Content="ChartSaveTemplate" Margin="2"/>
</WrapPanel>
<StackPanel Grid.Row="4" Orientation="Horizontal" Margin="5">
<Button Command="{Binding ChartIdCommand}" Content="ChartId" Margin="2"/>
<TextBlock Text="ChartID" VerticalAlignment="Center" Margin="20,2,2,2"/>
<TextBox Width="150" Text="{Binding ChartFunctionsChartIdValue}" Margin="2"/>
</StackPanel>
<WrapPanel Grid.Row="5" VerticalAlignment="Top" Margin="5">
<Button Command="{Binding ChartRedrawCommand}" Content="ChartRedraw" Margin="2"/>
<Button Command="{Binding ChartWindowFindCommand}" Content="ChartWindowFind" Margin="2"/>
<Button Command="{Binding ChartCloseCommand}" Content="ChartClose" Margin="2"/>
<Button Command="{Binding ChartPeriodCommand}" Content="ChartPeriod" Margin="2"/>
<Button Command="{Binding ChartSetDoubleCommand}" Content="ChartSetDouble" Margin="2"/>
<Button Command="{Binding ChartSetIntegerCommand}" Content="ChartSetInteger" Margin="2"/>
<Button Command="{Binding ChartSetStringCommand}" Content="ChartSetString" Margin="2"/>
<Button Command="{Binding ChartGetDoubleCommand}" Content="ChartGetDouble" Margin="2"/>
<Button Command="{Binding ChartGetIntegerCommand}" Content="ChartGetInteger" Margin="2"/>
<Button Command="{Binding ChartNavigateCommand}" Content="ChartNavigate" Margin="2"/>
<Button Command="{Binding ChartIndicatorAddCommand}" Content="ChartIndicatorAdd" Margin="2"/>
<Button Command="{Binding ChartIndicatorDeleteCommand}" Content="ChartIndicatorDelete" Margin="2"/>
<Button Command="{Binding ChartIndicatorGetCommand}" Content="ChartIndicatorGet" Margin="2"/>
<Button Command="{Binding ChartIndicatorNameCommand}" Content="ChartIndicatorName" Margin="2"/>
<Button Command="{Binding ChartIndicatorsTotalCommand}" Content="ChartIndicatorsTotal" Margin="2"/>
<Button Command="{Binding ChartWindowOnDroppedCommand}" Content="ChartWindowOnDropped" Margin="2"/>
<Button Command="{Binding ChartPriceOnDroppedCommand}" Content="ChartPriceOnDropped" Margin="2"/>
<Button Command="{Binding ChartTimeOnDroppedCommand}" Content="ChartTimeOnDropped" Margin="2"/>
<Button Command="{Binding ChartXOnDroppedCommand}" Content="ChartXOnDropped" Margin="2"/>
<Button Command="{Binding ChartYOnDroppedCommand}" Content="ChartYOnDropped" Margin="2"/>
<Button Command="{Binding ChartSetSymbolPeriodCommand}" Content="ChartSetSymbolPeriod" Margin="2"/>
<Button Command="{Binding ChartScreenShotCommand}" Content="ChartScreenShot" Margin="2"/>
</WrapPanel>
</Grid>
</TabItem>
<TabItem Header="Time and Date">
<WrapPanel VerticalAlignment="Top" Margin="5">
<Button Command="{Binding TimeCurrentCommand}" Content="TimeCurrent" Margin="2"/>
<Button Command="{Binding TimeTradeServerCommand}" Content="TimeTradeServer" Margin="2"/>
<Button Command="{Binding TimeLocalCommand}" Content="TimeLocal" Margin="2"/>
<Button Command="{Binding TimeGMTCommand}" Content="TimeGMT" Margin="2"/>
</WrapPanel>
</TabItem>
<TabItem Header="Checkup and Common Functions">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<WrapPanel VerticalAlignment="Top" Margin="5">
<Button Command="{Binding GetLastErrorCommand}" Content="GetLastError" Margin="2"/>
<Button Command="{Binding ResetLastErrorCommand}" Content="ResetLastError" Margin="2"/>
<Button Command="{Binding TesterStopCommand}" Content="TesterStop" Margin="2"/>
</WrapPanel>
<Button Grid.Row="1" Content="UnlockTicks" HorizontalAlignment="Left" Margin="5" Command="{Binding UnlockTicksCommand}"/>
<Grid Margin="10" Grid.Row="2">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBox Grid.Row="0" Text="{Binding MessageText}" Margin="2"/>
<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right">
<Button Command="{Binding PrintCommand}" Content="Print" Margin="2" />
<Button Command="{Binding AlertCommand}" Content="Alert" Margin="2" />
</StackPanel>
</Grid>
</Grid>
</TabItem>
<TabItem Header="Global Variables">
<Grid Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<ComboBox Grid.Row="0" Grid.Column="0"
ItemsSource="{Binding Source={StaticResource ENUM_INDICATOR_Key}}"
SelectedItem="{Binding TimeSeriesValues.IndicatorType}"/>
<Button Grid.Row="0" Grid.Column="1" Command="{Binding IndicatorCreateCommand}" Margin="2"
Content="IndicatorCreate" HorizontalAlignment="Left" />
<Label Grid.Row="1" Grid.Column="0" Content="Indicator handle:" Margin="2"/>
<TextBox Grid.Row="1" Grid.Column="0" Margin="2" Width="30" PreviewTextInput="NumberValidationTextBox" Text="{Binding TimeSeriesValues.IndicatorHandle}"></TextBox>
<Button Grid.Row="1" Grid.Column="1" Command="{Binding IndicatorReleaseCommand}" Margin="2"
Content="IndicatorRelease" HorizontalAlignment="Left" />
<TextBlock Grid.Column="0" Grid.Row="0" Text="Global Variable Name" Margin="2,0,0,0"/>
<TextBox Grid.Column="1" Grid.Row="0" Text="{Binding GlobalVarName}" Margin="4,0,0,0"/>
<TextBlock Grid.Column="0" Grid.Row="1" Text="Global Variable Value" Margin="2,2,0,0"/>
<TextBox Grid.Column="1" Grid.Row="1" Text="{Binding GlobalVarValue}" Margin="4,2,0,0"/>
</Grid>
<WrapPanel VerticalAlignment="Top" Grid.Row="1" Margin="0,5,0,0">
<Button Command="{Binding GlobalVariableCheckCommand}" Content="GlobalVariableCheck" Margin="2"/>
<Button Command="{Binding GlobalVariableTimeCommand}" Content="GlobalVariableTime" Margin="2"/>
<Button Command="{Binding GlobalVariableDelCommand}" Content="GlobalVariableDel" Margin="2"/>
<Button Command="{Binding GlobalVariableGetCommand}" Content="GlobalVariableGet" Margin="2"/>
<Button Command="{Binding GlobalVariableNameCommand}" Content="GlobalVariableName" Margin="2"/>
<Button Command="{Binding GlobalVariableSetCommand}" Content="GlobalVariableSet" Margin="2"/>
<Button Command="{Binding GlobalVariablesFlushCommand}" Content="GlobalVariablesFlush" Margin="2"/>
<Button Command="{Binding GlobalVariableTempCommand}" Content="GlobalVariableTemp" Margin="2"/>
<Button Command="{Binding GlobalVariableSetOnConditionCommand}" Content="GlobalVariableSetOnCondition" Margin="2"/>
<Button Command="{Binding GlobalVariablesDeleteAllCommand}" Content="GlobalVariablesDeleteAll" Margin="2"/>
<Button Command="{Binding GlobalVariablesTotalCommand}" Content="GlobalVariablesTotal" Margin="2"/>
</WrapPanel>
</Grid>
</TabItem>
</TabControl>
<ListBox Grid.Column="0" ItemsSource="{Binding TimeSeriesResults}" />
</Grid>
</Grid>
</TabItem>
<TabItem Header="Market Info">
<WrapPanel VerticalAlignment="Top" Margin="5">
<Button Command="{Binding SymbolsTotalCommand}" Content="SymbolsTotal" Margin="2"/>
<Button Command="{Binding SymbolNameCommand}" Content="SymbolName" Margin="2"/>
<Button Command="{Binding SymbolSelectCommand}" Content="SymbolSelect" Margin="2"/>
<Button Command="{Binding SymbolIsSynchronizedCommand}" Content="SymbolIsSynchronized" Margin="2"/>
<Button Command="{Binding SymbolInfoDoubleCommand}" Content="SymbolInfoDouble" Margin="2"/>
<Button Command="{Binding SymbolInfoIntegerCommand}" Content="SymbolInfoInteger" Margin="2"/>
<Button Command="{Binding SymbolInfoStringCommand}" Content="SymbolInfoString" Margin="2"/>
<Button Command="{Binding SymbolInfoTickCommand}" Content="SymbolInfoTick" Margin="2"/>
<Button Command="{Binding SymbolInfoSessionQuoteCommand}" Content="SymbolInfoSessionQuote" Margin="2"/>
<Button Command="{Binding SymbolInfoSessionTradeCommand}" Content="SymbolInfoSessionTrade" Margin="2"/>
<Button Command="{Binding MarketBookAddCommand}" Content="MarketBookAdd" Margin="2"/>
<Button Command="{Binding MarketBookReleaseCommand}" Content="MarketBookRelease" Margin="2"/>
<Button Command="{Binding MarketBookGetCommand}" Content="MarketBookGet" Margin="2"/>
</WrapPanel>
</TabItem>
<GridSplitter Grid.Row="1" Height="2" HorizontalAlignment="Stretch" />
<TabItem Header="CTrade">
<WrapPanel VerticalAlignment="Top" Margin="5">
<Button Command="{Binding PositionOpenCommand}" Content="PositionOpen" Margin="2"/>
</WrapPanel>
</TabItem>
<TabItem Header="Indicators">
<WrapPanel VerticalAlignment="Top" Margin="5">
<Button Command="{Binding iCustomCommand}" Content="iCustom" Margin="2"/>
</WrapPanel>
</TabItem>
<TabItem Header="Time and Date">
<WrapPanel VerticalAlignment="Top" Margin="5">
<Button Command="{Binding TimeCurrentCommand}" Content="TimeCurrent" Margin="2"/>
<Button Command="{Binding TimeTradeServerCommand}" Content="TimeTradeServer" Margin="2"/>
<Button Command="{Binding TimeLocalCommand}" Content="TimeLocal" Margin="2"/>
<Button Command="{Binding TimeGMTCommand}" Content="TimeGMT" Margin="2"/>
</WrapPanel>
</TabItem>
</TabControl>
<Expander Grid.Row="2" Header="Console" IsExpanded="True">
<ListBox mtApi5TestClient:ListBoxBehavior.ScrollOnNewItem="true" Height="180" ItemsSource="{Binding History}"/>
</Expander>
<Border Grid.Row="2" BorderThickness="1" BorderBrush="DarkBlue" Margin="2">
<Grid Margin="3">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Label Grid.Row="0" Content="Output Console" Background="LightYellow" />
<ListBox Grid.Row="1" ItemsSource="{Binding History}"
mtApi5TestClient:ListBoxBehavior.ScrollOnNewItem="true" />
</Grid>
</Border>
<StatusBar Grid.Row="3">
<StatusBarItem>
+14 -19
View File
@@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.ComponentModel;
namespace MtApi5TestClient
{
@@ -10,38 +6,38 @@ namespace MtApi5TestClient
{
#region Properties
public string Instrument { get; private set; }
public string Instrument { get; }
private double _Bid;
private double _bid;
public double Bid
{
get { return _Bid; }
get { return _bid; }
set
{
_Bid = value;
_bid = value;
OnPropertyChanged("Bid");
}
}
private double _Ask;
private double _ask;
public double Ask
{
get { return _Ask; }
get { return _ask; }
set
{
_Ask = value;
_ask = value;
OnPropertyChanged("Ask");
}
}
private int _FeedCount = 0;
public int FeedCount
private int _expertHandle;
public int ExpertHandle
{
get { return _FeedCount; }
get { return _expertHandle; }
set
{
_FeedCount = value;
OnPropertyChanged("FeedCount");
_expertHandle = value;
OnPropertyChanged("ExpertHandle");
}
}
@@ -59,8 +55,7 @@ namespace MtApi5TestClient
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
+710 -53
View File
@@ -7,6 +7,8 @@ using MtApi5;
using System.Collections.ObjectModel;
using System.Globalization;
using System.Threading.Tasks;
using System.IO;
using Microsoft.Win32;
namespace MtApi5TestClient
{
@@ -18,6 +20,7 @@ namespace MtApi5TestClient
public DelegateCommand OrderSendCommand { get; private set; }
public DelegateCommand OrderCheckCommand { get; private set; }
public DelegateCommand PositionGetTicketCommand { get; private set; }
public DelegateCommand HistoryOrderGetIntegerCommand { get; private set; }
public DelegateCommand HistoryDealGetDoubleCommand { get; private set; }
@@ -29,6 +32,10 @@ namespace MtApi5TestClient
public DelegateCommand AccountInfoIntegerCommand { get; private set; }
public DelegateCommand AccountInfoStringCommand { get; private set; }
public DelegateCommand TerminalInfoDoubleCommand { get; private set; }
public DelegateCommand TerminalInfoIntegerCommand { get; private set; }
public DelegateCommand TerminalInfoStringCommand { get; private set; }
public DelegateCommand CopyRatesCommand { get; private set; }
public DelegateCommand CopyTimesCommand { get; private set; }
public DelegateCommand CopyOpenCommand { get; private set; }
@@ -50,6 +57,7 @@ namespace MtApi5TestClient
public DelegateCommand SymbolInfoDoubleCommand { get; private set; }
public DelegateCommand SymbolInfoIntegerCommand { get; private set; }
public DelegateCommand SymbolInfoStringCommand { get; private set; }
public DelegateCommand SymbolInfoString2Command { get; private set; }
public DelegateCommand SymbolInfoTickCommand { get; private set; }
public DelegateCommand SymbolInfoSessionQuoteCommand { get; private set; }
public DelegateCommand SymbolInfoSessionTradeCommand { get; private set; }
@@ -58,15 +66,65 @@ namespace MtApi5TestClient
public DelegateCommand MarketBookGetCommand { get; private set; }
public DelegateCommand PositionOpenCommand { get; private set; }
public DelegateCommand PositionCloseCommand { get; private set; }
public DelegateCommand PositionCloseAllCommand { get; private set; }
public DelegateCommand GetLastErrorCommand { get; private set; }
public DelegateCommand ResetLastErrorCommand { get; private set; }
public DelegateCommand PrintCommand { get; private set; }
public DelegateCommand AlertCommand { get; private set; }
public DelegateCommand TesterStopCommand { get; private set; }
public DelegateCommand iCustomCommand { get; private set; }
public DelegateCommand TimeCurrentCommand { 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 ChartSaveTemplateCommand { get; private set; }
public DelegateCommand ChartIdCommand { get; private set; }
public DelegateCommand ChartRedrawCommand { get; private set; }
public DelegateCommand ChartWindowFindCommand { get; private set; }
public DelegateCommand ChartCloseCommand { get; private set; }
public DelegateCommand ChartPeriodCommand { get; private set; }
public DelegateCommand ChartSetDoubleCommand { get; private set; }
public DelegateCommand ChartSetIntegerCommand { get; private set; }
public DelegateCommand ChartSetStringCommand { get; private set; }
public DelegateCommand ChartGetDoubleCommand { get; private set; }
public DelegateCommand ChartGetIntegerCommand { get; private set; }
public DelegateCommand ChartNavigateCommand { get; private set; }
public DelegateCommand ChartIndicatorAddCommand { get; private set; }
public DelegateCommand ChartIndicatorDeleteCommand { get; private set; }
public DelegateCommand ChartIndicatorGetCommand { get; private set; }
public DelegateCommand ChartIndicatorNameCommand { get; private set; }
public DelegateCommand ChartIndicatorsTotalCommand { get; private set; }
public DelegateCommand ChartWindowOnDroppedCommand { get; private set; }
public DelegateCommand ChartPriceOnDroppedCommand { get; private set; }
public DelegateCommand ChartTimeOnDroppedCommand { get; private set; }
public DelegateCommand ChartXOnDroppedCommand { get; private set; }
public DelegateCommand ChartYOnDroppedCommand { get; private set; }
public DelegateCommand ChartSetSymbolPeriodCommand { get; private set; }
public DelegateCommand ChartScreenShotCommand { get; private set; }
public DelegateCommand TimeTradeServerCommand { get; private set; }
public DelegateCommand TimeLocalCommand { get; private set; }
public DelegateCommand TimeGMTCommand { get; private set; }
public DelegateCommand GlobalVariableCheckCommand { get; private set; }
public DelegateCommand GlobalVariableTimeCommand { get; private set; }
public DelegateCommand GlobalVariableDelCommand { get; private set; }
public DelegateCommand GlobalVariableGetCommand { get; private set; }
public DelegateCommand GlobalVariableNameCommand { get; private set; }
public DelegateCommand GlobalVariableSetCommand { get; private set; }
public DelegateCommand GlobalVariablesFlushCommand { get; private set; }
public DelegateCommand GlobalVariableTempCommand { get; private set; }
public DelegateCommand GlobalVariableSetOnConditionCommand { get; private set; }
public DelegateCommand GlobalVariablesDeleteAllCommand { get; private set; }
public DelegateCommand GlobalVariablesTotalCommand { get; private set; }
public DelegateCommand UnlockTicksCommand { get; private set; }
#endregion
#region Properties
@@ -147,6 +205,11 @@ namespace MtApi5TestClient
public ENUM_ACCOUNT_INFO_INTEGER AccountInfoIntegerPropertyId { get; set; }
public ENUM_ACCOUNT_INFO_STRING AccountInfoStringPropertyId { get; set; }
public ENUM_TERMINAL_INFO_DOUBLE TerminalInfoDoublePropertyId { get; set; }
public ENUM_TERMINAL_INFO_INTEGER TerminalInfoIntegerPropertyId { get; set; }
public ENUM_TERMINAL_INFO_STRING TerminalInfoStringPropertyId { get; set; }
public TimeSeriesValueViewModel TimeSeriesValues { get; set; }
public ObservableCollection<string> TimeSeriesResults { get; } = new ObservableCollection<string>();
@@ -162,6 +225,60 @@ namespace MtApi5TestClient
}
}
private string _chartFunctionsSymbolValue = "EURUSD";
public string ChartFunctionsSymbolValue
{
get { return _chartFunctionsSymbolValue; }
set
{
_chartFunctionsSymbolValue = value;
OnPropertyChanged("ChartFunctionsSymbolValue");
}
}
private long _chartFunctionsChartIdValue;
public long ChartFunctionsChartIdValue
{
get { return _chartFunctionsChartIdValue; }
set
{
_chartFunctionsChartIdValue = value;
OnPropertyChanged("ChartFunctionsChartIdValue");
}
}
private string _globalVarName;
public string GlobalVarName
{
get { return _globalVarName; }
set
{
_globalVarName = value;
OnPropertyChanged("GlobalVarName");
}
}
private double _globalVarValue;
public double GlobalVarValue
{
get { return _globalVarValue; }
set
{
_globalVarValue = value;
OnPropertyChanged("GlobalVarValue");
}
}
private ulong _positionTicketValue;
public ulong PositionTicketValue
{
get { return _positionTicketValue; }
set
{
_positionTicketValue = value;
OnPropertyChanged("PositionTicketValue");
}
}
#endregion
#region Public Methods
@@ -173,11 +290,11 @@ namespace MtApi5TestClient
_mtApiClient.ConnectionStateChanged += mMtApiClient_ConnectionStateChanged;
_mtApiClient.QuoteAdded += mMtApiClient_QuoteAdded;
_mtApiClient.QuoteRemoved += mMtApiClient_QuoteRemoved;
_mtApiClient.QuoteUpdated += mMtApiClient_QuoteUpdated;
_mtApiClient.QuoteUpdate += mMtApiClient_QuoteUpdate;
_mtApiClient.OnTradeTransaction += mMtApiClient_OnTradeTransaction;
_mtApiClient.OnBookEvent += _mtApiClient_OnBookEvent;
_quotesMap = new Dictionary<string, QuoteViewModel>();
_mtApiClient.OnLastTimeBar += _mtApiClient_OnLastTimeBar;
_mtApiClient.OnLockTicks += _mtApiClient_OnLockTicks;
ConnectionState = _mtApiClient.ConnectionState;
ConnectionMessage = "Disconnected";
@@ -213,6 +330,7 @@ namespace MtApi5TestClient
OrderSendCommand = new DelegateCommand(ExecuteOrderSend);
OrderCheckCommand = new DelegateCommand(ExecuteOrderCheck);
PositionGetTicketCommand = new DelegateCommand(ExecutePositionGetTicket);
HistoryOrderGetIntegerCommand = new DelegateCommand(ExecuteHistoryOrderGetInteger);
HistoryDealGetDoubleCommand = new DelegateCommand(ExecuteHistoryDealGetDouble);
@@ -224,6 +342,10 @@ namespace MtApi5TestClient
AccountInfoIntegerCommand = new DelegateCommand(ExecuteAccountInfoInteger);
AccountInfoStringCommand = new DelegateCommand(ExecuteAccountInfoString);
TerminalInfoDoubleCommand = new DelegateCommand(ExecuteTerminalInfoDouble);
TerminalInfoIntegerCommand = new DelegateCommand(ExecuteTerminalInfoInteger);
TerminalInfoStringCommand = new DelegateCommand(ExecuteTerminalInfoString);
CopyRatesCommand = new DelegateCommand(ExecuteCopyRates);
CopyTimesCommand = new DelegateCommand(ExecuteCopyTime);
CopyOpenCommand = new DelegateCommand(ExecuteCopyOpen);
@@ -245,6 +367,7 @@ namespace MtApi5TestClient
SymbolInfoDoubleCommand = new DelegateCommand(ExecuteSymbolInfoDouble);
SymbolInfoIntegerCommand = new DelegateCommand(ExecuteSymbolInfoInteger);
SymbolInfoStringCommand = new DelegateCommand(ExecuteSymbolInfoString);
SymbolInfoString2Command = new DelegateCommand(ExecuteSymbolInfoString2);
SymbolInfoTickCommand = new DelegateCommand(ExecuteSymbolInfoTick);
SymbolInfoSessionQuoteCommand = new DelegateCommand(ExecuteSymbolInfoSessionQuote);
SymbolInfoSessionTradeCommand = new DelegateCommand(ExecuteSymbolInfoSessionTrade);
@@ -253,15 +376,64 @@ namespace MtApi5TestClient
MarketBookGetCommand = new DelegateCommand(ExecuteMarketBookGet);
PositionOpenCommand = new DelegateCommand(ExecutePositionOpen);
PositionCloseCommand = new DelegateCommand(ExecutePositionClose);
PositionCloseAllCommand = new DelegateCommand(ExecutePositionCloseAll);
PrintCommand = new DelegateCommand(ExecutePrint);
AlertCommand = new DelegateCommand(ExecuteAlert);
GetLastErrorCommand = new DelegateCommand(ExecuteGetLastError);
ResetLastErrorCommand = new DelegateCommand(ExecuteResetLastError);
TesterStopCommand = new DelegateCommand(ExecuteTesterStop);
iCustomCommand = new DelegateCommand(ExecuteICustom);
ChartOpenCommand = new DelegateCommand(ExecuteChartOpen);
ChartTimePriceToXYCommand = new DelegateCommand(ExecuteChartTimePriceToXY);
ChartXYToTimePriceCommand = new DelegateCommand(ExecuteChartXYToTimePrice);
ChartApplyTemplateCommand = new DelegateCommand(ExecuteChartApplyTemplate);
ChartSaveTemplateCommand = new DelegateCommand(ExecuteChartSaveTemplate);
ChartIdCommand = new DelegateCommand(ExecuteChartId);
ChartRedrawCommand = new DelegateCommand(ExecuteChartRedraw);
ChartWindowFindCommand = new DelegateCommand(ExecuteChartWindowFind);
ChartCloseCommand = new DelegateCommand(ExecuteChartClose);
ChartPeriodCommand = new DelegateCommand(ExecuteChartPeriod);
ChartSetDoubleCommand = new DelegateCommand(ExecuteChartSetDouble);
ChartSetIntegerCommand = new DelegateCommand(ExecuteChartSetInteger);
ChartSetStringCommand = new DelegateCommand(ExecuteChartSetString);
ChartGetDoubleCommand = new DelegateCommand(ExecuteChartGetDouble);
ChartGetIntegerCommand = new DelegateCommand(ExecuteChartGetInteger);
ChartNavigateCommand = new DelegateCommand(ExecuteChartNavigate);
ChartIndicatorAddCommand = new DelegateCommand(ExecuteChartIndicatorAdd);
ChartIndicatorDeleteCommand = new DelegateCommand(ExecuteChartIndicatorDelete);
ChartIndicatorGetCommand = new DelegateCommand(ExecuteChartIndicatorGet);
ChartIndicatorNameCommand = new DelegateCommand(ExecuteChartIndicatorName);
ChartIndicatorsTotalCommand = new DelegateCommand(ExecuteChartIndicatorsTotal);
ChartWindowOnDroppedCommand = new DelegateCommand(ExecuteChartWindowOnDropped);
ChartPriceOnDroppedCommand = new DelegateCommand(ExecuteChartPriceOnDropped);
ChartTimeOnDroppedCommand = new DelegateCommand(ExecuteChartTimeOnDropped);
ChartXOnDroppedCommand = new DelegateCommand(ExecuteChartXOnDropped);
ChartYOnDroppedCommand = new DelegateCommand(ExecuteChartYOnDropped);
ChartSetSymbolPeriodCommand = new DelegateCommand(ExecuteChartSetSymbolPeriod);
ChartScreenShotCommand = new DelegateCommand(ExecuteChartScreenShot);
TimeCurrentCommand = new DelegateCommand(ExecuteTimeCurrent);
TimeTradeServerCommand = new DelegateCommand(ExecuteTimeTradeServer);
TimeLocalCommand = new DelegateCommand(ExecuteTimeLocal);
TimeGMTCommand = new DelegateCommand(ExecuteTimeGMT);
GlobalVariableCheckCommand = new DelegateCommand(ExecuteGlobalVariableCheck);
GlobalVariableTimeCommand = new DelegateCommand(ExecuteGlobalVariableTime);
GlobalVariableDelCommand = new DelegateCommand(ExecuteGlobalVariableDel);
GlobalVariableGetCommand = new DelegateCommand(ExecuteGlobalVariableGet);
GlobalVariableNameCommand = new DelegateCommand(ExecuteGlobalVariableName);
GlobalVariableSetCommand = new DelegateCommand(ExecuteGlobalVariableSet);
GlobalVariablesFlushCommand = new DelegateCommand(ExecuteGlobalVariablesFlush);
GlobalVariableTempCommand = new DelegateCommand(ExecuteGlobalVariableTemp);
GlobalVariableSetOnConditionCommand = new DelegateCommand(ExecuteGlobalVariableSetOnCondition);
GlobalVariablesDeleteAllCommand = new DelegateCommand(ExecuteGlobalVariablesDeleteAll);
GlobalVariablesTotalCommand = new DelegateCommand(ExecuteGlobalVariablesTotal);
UnlockTicksCommand = new DelegateCommand(ExecuteUnlockTicks);
}
private bool CanExecuteConnect(object o)
@@ -320,6 +492,19 @@ namespace MtApi5TestClient
AddLog(message);
}
private async void ExecutePositionGetTicket(object obj)
{
const int index = 0;
var retVal = await Execute(() =>
{
var ok = _mtApiClient.PositionGetTicket(index);
return ok;
});
var message = $"PositionGetTicket: result = {retVal}";
AddLog(message);
}
private async void ExecuteHistoryOrderGetInteger(object o)
{
const ulong ticket = 12345;
@@ -391,7 +576,7 @@ namespace MtApi5TestClient
{
var result = await Execute(() => _mtApiClient.AccountInfoInteger(AccountInfoIntegerPropertyId));
var message = $"AccountInfoInteger: property_id = {AccountInfoDoublePropertyId}; result = {result}";
var message = $"AccountInfoInteger: property_id = {AccountInfoIntegerPropertyId}; result = {result}";
AddLog(message);
}
@@ -399,10 +584,35 @@ namespace MtApi5TestClient
{
var result = await Execute(() => _mtApiClient.AccountInfoString(AccountInfoStringPropertyId));
var message = $"AccountInfoString: property_id = {AccountInfoDoublePropertyId}; result = {result}";
var message = $"AccountInfoString: property_id = {AccountInfoStringPropertyId}; result = {result}";
AddLog(message);
}
private async void ExecuteTerminalInfoDouble(object o)
{
var result = await Execute(() => _mtApiClient.TerminalInfoDouble(TerminalInfoDoublePropertyId));
var message = $"TerminalInfoDouble: property_id = {TerminalInfoDoublePropertyId}; result = {result}";
AddLog(message);
}
private async void ExecuteTerminalInfoInteger(object o)
{
var result = await Execute(() => _mtApiClient.TerminalInfoInteger(TerminalInfoIntegerPropertyId));
var message = $"TerminalInfoInteger: property_id = {TerminalInfoIntegerPropertyId}; result = {result}";
AddLog(message);
}
private async void ExecuteTerminalInfoString(object o)
{
var result = await Execute(() => _mtApiClient.TerminalInfoString(TerminalInfoStringPropertyId));
var message = $"TerminalInfoString: property_id = {TerminalInfoStringPropertyId}; result = {result}";
AddLog(message);
}
private async void ExecuteCopyTime(object o)
{
if (string.IsNullOrEmpty(TimeSeriesValues?.SymbolValue)) return;
@@ -620,7 +830,7 @@ namespace MtApi5TestClient
foreach (var rates in result)
{
TimeSeriesResults.Add(
$"time={rates.time}; open={rates.open}; high={rates.high}; low={rates.low}; close={rates.close}; tick_volume={rates.tick_volume}; spread={rates.spread}; real_volume={rates.tick_volume}");
$"time={rates.time}; mt_time={rates.mt_time}; open={rates.open}; high={rates.high}; low={rates.low}; close={rates.close}; tick_volume={rates.tick_volume}; spread={rates.spread}; real_volume={rates.tick_volume}");
}
});
@@ -784,6 +994,12 @@ namespace MtApi5TestClient
{
var retVal = await Execute(() => _mtApiClient.SymbolInfoDouble("EURUSD", ENUM_SYMBOL_INFO_DOUBLE.SYMBOL_BID));
AddLog($"SymbolInfoDouble(EURUSD, ENUM_SYMBOL_INFO_DOUBLE.SYMBOL_BID): result = {retVal}");
retVal = await Execute(() => _mtApiClient.SymbolInfoDouble("EURUSD", ENUM_SYMBOL_INFO_DOUBLE.SYMBOL_VOLUME_REAL));
AddLog($"SymbolInfoDouble(EURUSD, ENUM_SYMBOL_INFO_DOUBLE.SYMBOL_VOLUME_REAL): result = {retVal}");
retVal = await Execute(() => _mtApiClient.SymbolInfoDouble("EURUSD", ENUM_SYMBOL_INFO_DOUBLE.SYMBOL_VOLUMEHIGH_REAL));
AddLog($"SymbolInfoDouble(EURUSD, ENUM_SYMBOL_INFO_DOUBLE.SYMBOL_VOLUMEHIGH_REAL): result = {retVal}");
retVal = await Execute(() => _mtApiClient.SymbolInfoDouble("EURUSD", ENUM_SYMBOL_INFO_DOUBLE.SYMBOL_VOLUMELOW_REAL));
AddLog($"SymbolInfoDouble(EURUSD, ENUM_SYMBOL_INFO_DOUBLE.SYMBOL_VOLUMELOW_REAL): result = {retVal}");
}
private async void ExecuteSymbolInfoInteger(object o)
@@ -798,6 +1014,14 @@ namespace MtApi5TestClient
AddLog($"SymbolInfoString(EURUSD, ENUM_SYMBOL_INFO_STRING.SYMBOL_DESCRIPTION): result = {retVal}");
}
private async void ExecuteSymbolInfoString2(object o)
{
string stringVar = null;
var retVal = await Execute(() => _mtApiClient.SymbolInfoString("EURUSD", ENUM_SYMBOL_INFO_STRING.SYMBOL_DESCRIPTION, out stringVar));
AddLog($"SymbolInfoString-2 (EURUSD, ENUM_SYMBOL_INFO_STRING.SYMBOL_DESCRIPTION): result = {retVal}, stringVar = {stringVar}");
}
private async void ExecuteSymbolInfoTick(object o)
{
var result = await Execute(() =>
@@ -814,6 +1038,7 @@ namespace MtApi5TestClient
AddLog($"SymbolInfoTick(EURUSD) tick.ask = {result.ask}");
AddLog($"SymbolInfoTick(EURUSD) tick.last = {result.last}");
AddLog($"SymbolInfoTick(EURUSD) tick.volume = {result.volume}");
AddLog($"SymbolInfoTick(EURUSD) tick.volume_real = {result.volume_real}");
}
private async void ExecuteSymbolInfoSessionQuote(object o)
@@ -884,7 +1109,7 @@ namespace MtApi5TestClient
for (var i = 0; i < result.Length; i++)
{
AddLog($"MarketBookGet: [{i}] - {result[i].price} | {result[i].volume} | {result[i].type}");
AddLog($"MarketBookGet: [{i}] - {result[i].price} | {result[i].volume} | {result[i].type} | {result[i].volume_real}");
}
}
@@ -903,6 +1128,21 @@ namespace MtApi5TestClient
AddLog($"PositionOpen: symbol EURUSD retVal = {retVal}, result = {tradeResult}");
}
private async void ExecutePositionClose(object obj)
{
var ticket = PositionTicketValue;
MqlTradeResult tradeResult = null;
var retVal = await Execute(() => _mtApiClient.PositionClose(ticket, out tradeResult));
AddLog($"PositionClose: ticket {ticket} retVal = {retVal}, result = {tradeResult}");
}
private async void ExecutePositionCloseAll(object obj)
{
var retVal = await Execute(() => _mtApiClient.PositionCloseAll());
AddLog($"PositionCloseAll: count = {retVal}");
}
private async void ExecutePrint(object obj)
{
var message = MessageText;
@@ -911,6 +1151,32 @@ namespace MtApi5TestClient
AddLog($"Print: message print in MetaTrader - {retVal}");
}
private void ExecuteAlert(object obj)
{
var message = MessageText;
_mtApiClient.Alert(message);
AddLog($"Alert: send alert to MetaTrader - {message}.");
}
private async void ExecuteGetLastError(object obj)
{
var retVal = await Execute(() => _mtApiClient.GetLastError());
AddLog($"GetLastError: last error = {retVal}");
}
private void ExecuteResetLastError(object obj)
{
_mtApiClient.ResetLastError();
AddLog("ResetLastError: executed.");
}
private void ExecuteTesterStop(object obj)
{
_mtApiClient.TesterStop();
AddLog("TesterStop: executed.");
}
private async void ExecuteICustom(object o)
{
const string symbol = "EURUSD";
@@ -946,6 +1212,392 @@ namespace MtApi5TestClient
AddLog($"TimeGMT: {retVal}");
}
#region Global Variable Commands
private async void ExecuteGlobalVariableCheck(object obj)
{
var name = GlobalVarName;
var retVal = await Execute(() => _mtApiClient.GlobalVariableCheck(name));
AddLog($"GlobalVariableCheck: {retVal}");
}
private async void ExecuteGlobalVariableTime(object obj)
{
var name = GlobalVarName;
var retVal = await Execute(() => _mtApiClient.GlobalVariableTime(name));
AddLog($"GlobalVariableTime: {retVal}");
}
private async void ExecuteGlobalVariableDel(object obj)
{
var name = GlobalVarName;
var retVal = await Execute(() => _mtApiClient.GlobalVariableDel(name));
AddLog($"GlobalVariableDel: {retVal}");
}
private async void ExecuteGlobalVariableGet(object obj)
{
var name = GlobalVarName;
var retVal = await Execute(() => _mtApiClient.GlobalVariableGet(name));
GlobalVarValue = retVal;
AddLog($"GlobalVariableGet: {retVal}");
}
private async void ExecuteGlobalVariableName(object obj)
{
var retVal = await Execute(() => _mtApiClient.GlobalVariableName(0));
GlobalVarName = retVal;
AddLog($"GlobalVariableName: {retVal}");
}
private async void ExecuteGlobalVariableSet(object obj)
{
var name = GlobalVarName;
var value = GlobalVarValue;
var retVal = await Execute(() => _mtApiClient.GlobalVariableSet(name, value));
AddLog($"GlobalVariableSet: {retVal}");
}
private void ExecuteGlobalVariablesFlush(object obj)
{
_mtApiClient.GlobalVariablesFlush();
AddLog("GlobalVariablesFlush: executed.");
}
private async void ExecuteGlobalVariableTemp(object obj)
{
var name = GlobalVarName;
var retVal = await Execute(() => _mtApiClient.GlobalVariableTemp(name));
AddLog($"GlobalVariableTemp: {retVal}");
}
private async void ExecuteGlobalVariableSetOnCondition(object obj)
{
var name = GlobalVarName;
var value = GlobalVarValue;
const double checkValue = 2;
var retVal = await Execute(() => _mtApiClient.GlobalVariableSetOnCondition(name, value, checkValue));
AddLog($"GlobalVariableSetOnCondition: {retVal}");
}
private async void ExecuteGlobalVariablesDeleteAll(object obj)
{
var retVal = await Execute(() => _mtApiClient.GlobalVariablesDeleteAll());
AddLog($"GlobalVariablesDeleteAll: {retVal}");
}
private async void ExecuteGlobalVariablesTotal(object obj)
{
var retVal = await Execute(() => _mtApiClient.GlobalVariablesTotal());
AddLog($"GlobalVariablesTotal: {retVal}");
}
#endregion
#region Chart Commands
private async void ExecuteChartOpen(object o)
{
AddLog("Executed #1");
if (string.IsNullOrEmpty(ChartFunctionsSymbolValue))
{
AddLog("ChartOpen [ERROR]: Symbol is not defined!");
return;
}
AddLog($"Executed #2 s:{ChartFunctionsSymbolValue}");
var result = await Execute(() =>
{
var SymbolAddReturn = _mtApiClient.SymbolSelect(ChartFunctionsSymbolValue, true);
var ChartId = _mtApiClient.ChartOpen(ChartFunctionsSymbolValue, TimeSeriesValues.TimeFrame);
return ChartId;
});
if (result == -1)
{
AddLog("ChartOpen: result is null");
return;
}
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)
{
if (string.IsNullOrEmpty(TimeSeriesValues?.SymbolValue)) return;
AddLog($"ExecuteChartApplyTemplate #2 s:{TimeSeriesValues?.SymbolValue}");
var result = await Execute(() =>
{
var SymbolAddReturn = _mtApiClient.SymbolSelect(TimeSeriesValues?.SymbolValue, true);
var ChartId = _mtApiClient.ChartOpen(TimeSeriesValues?.SymbolValue, TimeSeriesValues.TimeFrame);
var MT5Path = _mtApiClient.TerminalInfoString(ENUM_TERMINAL_INFO_STRING.TERMINAL_DATA_PATH);
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Template File (*.tpl)|*.tpl|All files (*.*)|*.*";
if (openFileDialog.ShowDialog() == true)
{
var TemplateName = "\\Files\\mt5api_copy.tpl";
var TemplateStringContent = File.ReadAllLines(openFileDialog.FileName);
var DestPath = $"{MT5Path}\\MQL5{TemplateName}";
File.WriteAllLines($"{MT5Path}\\MQL5{TemplateName}", TemplateStringContent);
_mtApiClient.ChartApplyTemplate(ChartId, TemplateName);
}
return ChartId;
});
if (result == -1)
{
AddLog("ExecuteChartApplyTemplate: result is null");
return;
}
AddLog($"ExecuteChartApplyTemplate: success chartid=>{result}");
}
private async void ExecuteChartSaveTemplate(object o)
{
AddLog("ExecuteSaveApplyTemplate #1");
var result = await Execute(() =>
{
var MT5Path = _mtApiClient.TerminalInfoString(ENUM_TERMINAL_INFO_STRING.TERMINAL_DATA_PATH);
int ChartId = 0; // Actual Chart
var TemplateName = "\\Files\\exported.tpl";
_mtApiClient.ChartSaveTemplate(ChartId, TemplateName);
var DestPath = $"{MT5Path}\\MQL5{TemplateName}";
AddLog($"Destination: {TemplateName}");
return ChartId;
});
if (result == -1)
{
AddLog("ChartOpen: result is null");
return;
}
AddLog($"ChartOpen: success chartid=>{result}");
}
private async void ExecuteChartId(object o)
{
var result = await Execute(() => _mtApiClient.ChartId());
RunOnUiThread(() =>
{
ChartFunctionsChartIdValue = result;
});
AddLog($"ChartId: chartid = {result}");
}
private void ExecuteChartRedraw(object o)
{
var chartId = ChartFunctionsChartIdValue;
_mtApiClient.ChartRedraw(chartId);
AddLog($"ChartRedraw: executed for chartid = {chartId}");
}
private async void ExecuteChartWindowFind(object o)
{
const string shortname = "MACD(12,26,9)";
var chartId = ChartFunctionsChartIdValue;
var result = await Execute(() => _mtApiClient.ChartWindowFind(chartId, shortname));
AddLog($"ChartRedraw: result {result} for chartid {chartId}");
}
private async void ExecuteChartClose(object o)
{
var chartId = ChartFunctionsChartIdValue;
var result = await Execute(() => _mtApiClient.ChartClose(chartId));
AddLog($"ChartClose: result {result} for chartid {chartId}");
}
private async void ExecuteChartPeriod(object o)
{
var chartId = ChartFunctionsChartIdValue;
var result = await Execute(() => _mtApiClient.ChartPeriod(chartId));
AddLog($"ChartPeriod: result {result} for chartid {chartId}");
}
private async void ExecuteChartSetDouble(object o)
{
var chartId = ChartFunctionsChartIdValue;
var result = await Execute(() => _mtApiClient.ChartSetDouble(chartId, ENUM_CHART_PROPERTY_DOUBLE.CHART_PRICE_MAX, 1.13));
AddLog($"ChartSetDouble: result {result} for chartid {chartId}");
}
private async void ExecuteChartSetInteger(object o)
{
var chartId = ChartFunctionsChartIdValue;
var result = await Execute(() => _mtApiClient.ChartSetInteger(chartId, ENUM_CHART_PROPERTY_INTEGER.CHART_SHOW_GRID, 0));
AddLog($"ChartSetInteger: result {result} for chartid {chartId}");
}
private async void ExecuteChartSetString(object o)
{
var chartId = ChartFunctionsChartIdValue;
var result = await Execute(() => _mtApiClient.ChartSetString(chartId, ENUM_CHART_PROPERTY_STRING.CHART_COMMENT, "This is test comment from MtApi5"));
AddLog($"ChartSetString: result {result} for chartid {chartId}");
}
private async void ExecuteChartGetDouble(object o)
{
var chartId = ChartFunctionsChartIdValue;
var result = await Execute(() => _mtApiClient.ChartGetDouble(chartId, ENUM_CHART_PROPERTY_DOUBLE.CHART_PRICE_MAX, 0));
AddLog($"ChartGetDouble: result {result} for chartid {chartId}");
}
private async void ExecuteChartGetInteger(object o)
{
var chartId = ChartFunctionsChartIdValue;
var result = await Execute(() => _mtApiClient.ChartGetInteger(chartId, ENUM_CHART_PROPERTY_INTEGER.CHART_VISIBLE_BARS, 0));
AddLog($"ChartGetInteger: result {result} for chartid {chartId}");
}
private async void ExecuteChartNavigate(object o)
{
var chartId = ChartFunctionsChartIdValue;
var result = await Execute(() => _mtApiClient.ChartNavigate(chartId, ENUM_CHART_POSITION.CHART_BEGIN, 0));
AddLog($"ChartNavigate: result {result} for chartid {chartId}");
}
private async void ExecuteChartIndicatorAdd(object obj)
{
var chartId = ChartFunctionsChartIdValue;
var symbol = ChartFunctionsSymbolValue;
var indicatorHandle = await Execute(() => _mtApiClient.iMACD(symbol, ENUM_TIMEFRAMES.PERIOD_CURRENT, 12, 26, 9, ENUM_APPLIED_PRICE.PRICE_CLOSE));
var result = await Execute(() => _mtApiClient.ChartIndicatorAdd(chartId, 1, indicatorHandle));
AddLog($"ChartIndicatorAdd: result {result} for chartid {chartId} with indicator {indicatorHandle}");
}
private async void ExecuteChartIndicatorDelete(object o)
{
const string shortname = "MACD(12,26,9)";
var chartId = ChartFunctionsChartIdValue;
var result = await Execute(() => _mtApiClient.ChartIndicatorDelete(chartId, 1, shortname));
AddLog($"ChartIndicatorDelete: result {result} for chartid {chartId}");
}
private async void ExecuteChartIndicatorGet(object obj)
{
const string shortname = "MACD(12,26,9)";
var chartId = ChartFunctionsChartIdValue;
var result = await Execute(() => _mtApiClient.ChartIndicatorGet(chartId, 1, shortname));
AddLog($"hartIndicatorGet: result {result} for chartid {chartId}");
}
private async void ExecuteChartIndicatorName(object obj)
{
var chartId = ChartFunctionsChartIdValue;
var result = await Execute(() => _mtApiClient.ChartIndicatorName(chartId, 1, 0));
AddLog($"ChartIndicatorName: result {result} for chartid {chartId}");
}
private async void ExecuteChartIndicatorsTotal(object obj)
{
var chartId = ChartFunctionsChartIdValue;
var result = await Execute(() => _mtApiClient.ChartIndicatorsTotal(chartId, 1));
AddLog($"ChartIndicatorsTotal: result {result} for chartid {chartId}");
}
private async void ExecuteChartWindowOnDropped(object obj)
{
var result = await Execute(() => _mtApiClient.ChartWindowOnDropped());
AddLog($"ChartWindowOnDropped: result {result}");
}
private async void ExecuteChartPriceOnDropped(object obj)
{
var result = await Execute(() => _mtApiClient.ChartPriceOnDropped());
AddLog($"ChartPriceOnDropped: result {result}");
}
private async void ExecuteChartTimeOnDropped(object obj)
{
var result = await Execute(() => _mtApiClient.ChartTimeOnDropped());
AddLog($"ChartTimeOnDropped: result {result}");
}
private async void ExecuteChartXOnDropped(object obj)
{
var result = await Execute(() => _mtApiClient.ChartXOnDropped());
AddLog($"ChartXOnDropped: result {result}");
}
private async void ExecuteChartYOnDropped(object obj)
{
var result = await Execute(() => _mtApiClient.ChartYOnDropped());
AddLog($"ChartYOnDropped: result {result}");
}
private async void ExecuteChartSetSymbolPeriod(object obj)
{
var chartId = ChartFunctionsChartIdValue;
var symbol = ChartFunctionsSymbolValue;
var result = await Execute(() => _mtApiClient.ChartSetSymbolPeriod(chartId, symbol, ENUM_TIMEFRAMES.PERIOD_M5));
AddLog($"ChartSetSymbolPeriod: result {result} for chartid {chartId}");
}
private async void ExecuteChartScreenShot(object obj)
{
var chartId = ChartFunctionsChartIdValue;
var filename = "ChartScreenShot_TestMtApi.gif";
const int width = 800;
const int height = 600;
var result = await Execute(() => _mtApiClient.ChartScreenShot(chartId, filename, width, height));
AddLog($"ChartScreenShot: result {result} for chartid {chartId}. Filename {filename}");
}
#endregion
private void ExecuteUnlockTicks(object o)
{
_mtApiClient.UnlockTicks();
}
private static void RunOnUiThread(Action action)
{
Application.Current?.Dispatcher.Invoke(action);
@@ -956,27 +1608,29 @@ namespace MtApi5TestClient
Application.Current?.Dispatcher.Invoke(action, args);
}
private void mMtApiClient_QuoteUpdated(object sender, string symbol, double bid, double ask)
private void mMtApiClient_QuoteUpdate(object sender, Mt5QuoteEventArgs e)
{
if (string.IsNullOrEmpty(symbol) == false)
{
if (_quotesMap.ContainsKey(symbol))
{
var qvm = _quotesMap[symbol];
qvm.Bid = bid;
qvm.Ask = ask;
}
var q = e.Quote;
if (string.Equals(symbol, TradeRequest.Symbol))
Console.WriteLine(@"Quote: Symbol = {0}, Bid = {1}, Ask = {2}, Volume = {3}, Time = {4}, Last = {5}"
, q.Instrument, q.Bid, q.Ask, q.Volume, q.Time, q.Last);
if (_quotesMap.ContainsKey(e.Quote.ExpertHandle))
{
var qvm = _quotesMap[e.Quote.ExpertHandle];
qvm.Bid = e.Quote.Bid;
qvm.Ask = e.Quote.Ask;
}
if (string.Equals(e.Quote.Instrument, TradeRequest.Symbol))
{
if (TradeRequest.Type == ENUM_ORDER_TYPE.ORDER_TYPE_BUY)
{
if (TradeRequest.Type == ENUM_ORDER_TYPE.ORDER_TYPE_BUY)
{
TradeRequest.Price = ask;
}
else if (TradeRequest.Type == ENUM_ORDER_TYPE.ORDER_TYPE_SELL)
{
TradeRequest.Price = bid;
}
TradeRequest.Price = e.Quote.Ask;
}
else if (TradeRequest.Type == ENUM_ORDER_TYPE.ORDER_TYPE_SELL)
{
TradeRequest.Price = e.Quote.Bid;
}
}
}
@@ -1020,44 +1674,46 @@ namespace MtApi5TestClient
AddLog($"OnBookEvent: ExpertHandle = {e.ExpertHandle}, Symbol = {e.Symbol}");
}
private void _mtApiClient_OnLastTimeBar(object sender, Mt5TimeBarArgs e)
{
AddLog($"OnBookEvent: ExpertHandle = {e.ExpertHandle}, Symbol = {e.Symbol}, open = {e.Rates.open}, close = {e.Rates.close}, time = {e.Rates.time}, high = {e.Rates.high}, low = {e.Rates.low}");
}
private void _mtApiClient_OnLockTicks(object sender, Mt5LockTicksEventArgs e)
{
AddLog($"OnLockTicksEvent: Symbol = {e.Symbol}");
}
private void AddQuote(Mt5Quote quote)
{
if (quote == null)
if (_quotesMap.ContainsKey(quote.ExpertHandle))
{
AddLog($"AddQuote: Quote {quote.Instrument} with handle {quote.ExpertHandle} is present list. Skipped!");
return;
QuoteViewModel qvm;
if (_quotesMap.ContainsKey(quote.Instrument) == false)
{
qvm = new QuoteViewModel(quote.Instrument);
_quotesMap[quote.Instrument] = qvm;
Quotes.Add(qvm);
}
else
{
qvm = _quotesMap[quote.Instrument];
}
qvm.FeedCount++;
qvm.Bid = quote.Bid;
qvm.Ask = quote.Ask;
var qvm = new QuoteViewModel(quote.Instrument)
{
ExpertHandle = quote.ExpertHandle,
Bid = quote.Bid,
Ask = quote.Ask
};
_quotesMap[quote.ExpertHandle] = qvm;
Quotes.Add(qvm);
}
private void RemoveQuote(Mt5Quote quote)
{
if (quote == null) return;
if (_quotesMap.ContainsKey(quote.Instrument))
if (_quotesMap.ContainsKey(quote.ExpertHandle) == false)
{
var qvm = _quotesMap[quote.Instrument];
qvm.FeedCount--;
if (qvm.FeedCount <= 0)
{
_quotesMap.Remove(quote.Instrument);
Quotes.Remove(qvm);
}
AddLog($"RemoveQuote: Quote {quote.Instrument} with handle {quote.ExpertHandle} is NOT present list. Skipped!");
return;
}
var qvm = _quotesMap[quote.ExpertHandle];
_quotesMap.Remove(quote.ExpertHandle);
Quotes.Remove(qvm);
}
private void OnConnected()
@@ -1108,6 +1764,7 @@ namespace MtApi5TestClient
});
}
private void AddLog(string msg)
{
RunOnUiThread(() =>
@@ -1130,7 +1787,7 @@ namespace MtApi5TestClient
#region Private Fields
private readonly MtApi5Client _mtApiClient;
private readonly Dictionary<string, QuoteViewModel> _quotesMap;
private readonly Dictionary<int, QuoteViewModel> _quotesMap = new Dictionary<int, QuoteViewModel>();
#endregion
}
}
@@ -86,10 +86,6 @@
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>C:\Program Files (x86)\MtApi\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
BIN
View File
Binary file not shown.
Executable → Regular
BIN
View File
Binary file not shown.
Executable → Regular
+1520 -100
View File
File diff suppressed because it is too large Load Diff