├── .gitignore ├── .vs ├── FIX API Sample │ └── v14 │ │ └── .suo └── config │ └── applicationhost.config ├── App.config ├── FIX API Sample.Designer.cs ├── FIX API Sample.cs ├── FIX API Sample.csproj ├── FIX API Sample.resx ├── FIX API Sample.sln ├── MessageConstructor.cs ├── Program.cs ├── Properties ├── AssemblyInfo.cs ├── Resources.Designer.cs ├── Resources.resx ├── Settings.Designer.cs └── Settings.settings ├── bin └── Debug │ ├── FIX API Library.dll │ ├── FIX API Library.pdb │ ├── FIX API Sample.exe │ ├── FIX API Sample.exe.config │ ├── FIX API Sample.pdb │ ├── FIX API Sample.vshost.exe │ └── FIX API Sample.vshost.exe.config └── obj ├── Debug ├── DesignTimeResolveAssemblyReferences.cache ├── DesignTimeResolveAssemblyReferencesInput.cache ├── FIX API Sample.csproj.FileListAbsolute.txt ├── FIX API Sample.csproj.GenerateResource.Cache ├── FIX API Sample.csprojResolveAssemblyReference.cache ├── FIX API Sample.exe ├── FIX API Sample.pdb ├── FIX_API_Sample.Properties.Resources.resources ├── FIX_API_Sample.frmFIXAPISample.resources ├── TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs ├── TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs └── TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs └── Release ├── DesignTimeResolveAssemblyReferences.cache └── DesignTimeResolveAssemblyReferencesInput.cache /.gitignore: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # This .gitignore file was automatically created by Microsoft(R) Visual Studio. 3 | ################################################################################ 4 | 5 | /FIX API Sample.VC.VC.opendb 6 | /FIX API Sample.VC.db 7 | -------------------------------------------------------------------------------- /.vs/FIX API Sample/v14/.suo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spotware/FIX-API-Sample/4bcbaa67384e79324d8e4cb959a6639df857dfc8/.vs/FIX API Sample/v14/.suo -------------------------------------------------------------------------------- /.vs/config/applicationhost.config: -------------------------------------------------------------------------------- 1 | 2 | 20 | 21 | 22 | 23 | 50 | 51 | 52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 | 61 | 62 | 63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 | 82 |
83 |
84 | 85 |
86 |
87 |
88 |
89 |
90 |
91 | 92 |
93 |
94 |
95 |
96 |
97 | 98 |
99 |
100 |
101 | 102 |
103 |
104 | 105 |
106 |
107 | 108 |
109 |
110 |
111 | 112 | 113 |
114 |
115 |
116 |
117 |
118 |
119 | 120 |
121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | 843 | 844 | 845 | 846 | 847 | 848 | 849 | 850 | 851 | 852 | 853 | 854 | 855 | 856 | 857 | 858 | 859 | 860 | 861 | 862 | 863 | 864 | 865 | 866 | 867 | 868 | 869 | 870 | 871 | 872 | 873 | 874 | 875 | 876 | 877 | 878 | 879 | 880 | 881 | 882 | 883 | 884 | 885 | 886 | 887 | 888 | 889 | 890 | 891 | 892 | 895 | 896 | 897 | 898 | 899 | 900 | 901 | 902 | 903 | 904 | 905 | 906 | 907 | 910 | 911 | 912 | 913 | 914 | 915 | 916 | 917 | 918 | 919 | 920 | 921 | 922 | 923 | 924 | 925 | 926 | 927 | 928 | 929 | 930 | 931 | 932 | 933 | 934 | 935 | 936 | 937 | 938 | 939 | 940 | 941 | 942 | 943 | 944 | 945 | 946 | 947 | 948 | 949 | 950 | 951 | 952 | 953 | 954 | 955 | 956 | 957 | 958 | 959 | 960 | 961 | 962 | 963 | 964 | 965 | 966 | 967 | 968 | 969 | 970 | 971 | 972 | 973 | 974 | 975 | 976 | 977 | 978 | 979 | 980 | 981 | 982 | 983 | 984 | 985 | 986 | 987 | 988 | 989 | 990 | 991 | 992 | 993 | 994 | 995 | 996 | 997 | 998 | 999 | 1000 | 1001 | 1002 | 1003 | 1004 | 1005 | 1006 | 1007 | 1008 | 1009 | 1010 | 1011 | 1012 | 1013 | 1014 | 1015 | 1016 | 1017 | 1018 | 1019 | 1020 | 1021 | 1022 | 1023 | 1024 | 1025 | 1026 | 1027 | 1028 | -------------------------------------------------------------------------------- /App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /FIX API Sample.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace FIX_API_Sample 2 | { 3 | partial class frmFIXAPISample 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.btnLogonP = new System.Windows.Forms.Button(); 32 | this.btnTestRequestP = new System.Windows.Forms.Button(); 33 | this.lblHeartbeatMessage = new System.Windows.Forms.Label(); 34 | this.btnLogoutP = new System.Windows.Forms.Button(); 35 | this.btnDepthMarketDataRequest = new System.Windows.Forms.Button(); 36 | this.txtMessageSend = new System.Windows.Forms.TextBox(); 37 | this.lblMessageSend = new System.Windows.Forms.Label(); 38 | this.lblMessageReceived = new System.Windows.Forms.Label(); 39 | this.txtMessageReceived = new System.Windows.Forms.TextBox(); 40 | this.btnHeartbeatP = new System.Windows.Forms.Button(); 41 | this.btnResendRequestP = new System.Windows.Forms.Button(); 42 | this.btnReject = new System.Windows.Forms.Button(); 43 | this.btnSequenceReset = new System.Windows.Forms.Button(); 44 | this.btnNewOrderSingle = new System.Windows.Forms.Button(); 45 | this.btnOrderStatusRequest = new System.Windows.Forms.Button(); 46 | this.btnRequestForPositions = new System.Windows.Forms.Button(); 47 | this.gbPriceStream = new System.Windows.Forms.GroupBox(); 48 | this.btnSpotMarketData = new System.Windows.Forms.Button(); 49 | this.gbTradeStream = new System.Windows.Forms.GroupBox(); 50 | this.btnResendRequestT = new System.Windows.Forms.Button(); 51 | this.btnLogoutT = new System.Windows.Forms.Button(); 52 | this.btnLogonT = new System.Windows.Forms.Button(); 53 | this.btnHeartbeatT = new System.Windows.Forms.Button(); 54 | this.btnTestRequestT = new System.Windows.Forms.Button(); 55 | this.btnLimitOrder = new System.Windows.Forms.Button(); 56 | this.btnStopOrder = new System.Windows.Forms.Button(); 57 | this.gbPriceStream.SuspendLayout(); 58 | this.gbTradeStream.SuspendLayout(); 59 | this.SuspendLayout(); 60 | // 61 | // btnLogonP 62 | // 63 | this.btnLogonP.Location = new System.Drawing.Point(6, 19); 64 | this.btnLogonP.Name = "btnLogonP"; 65 | this.btnLogonP.Size = new System.Drawing.Size(160, 23); 66 | this.btnLogonP.TabIndex = 0; 67 | this.btnLogonP.Text = "Logon"; 68 | this.btnLogonP.UseVisualStyleBackColor = true; 69 | this.btnLogonP.Click += new System.EventHandler(this.btnLogon_Click); 70 | // 71 | // btnTestRequestP 72 | // 73 | this.btnTestRequestP.Location = new System.Drawing.Point(6, 77); 74 | this.btnTestRequestP.Name = "btnTestRequestP"; 75 | this.btnTestRequestP.Size = new System.Drawing.Size(160, 23); 76 | this.btnTestRequestP.TabIndex = 2; 77 | this.btnTestRequestP.Text = "Send Test Request"; 78 | this.btnTestRequestP.UseVisualStyleBackColor = true; 79 | this.btnTestRequestP.Click += new System.EventHandler(this.btnTestRequest_Click); 80 | // 81 | // lblHeartbeatMessage 82 | // 83 | this.lblHeartbeatMessage.AutoSize = true; 84 | this.lblHeartbeatMessage.Location = new System.Drawing.Point(12, 33); 85 | this.lblHeartbeatMessage.Name = "lblHeartbeatMessage"; 86 | this.lblHeartbeatMessage.Size = new System.Drawing.Size(0, 13); 87 | this.lblHeartbeatMessage.TabIndex = 3; 88 | // 89 | // btnLogoutP 90 | // 91 | this.btnLogoutP.Location = new System.Drawing.Point(6, 251); 92 | this.btnLogoutP.Name = "btnLogoutP"; 93 | this.btnLogoutP.Size = new System.Drawing.Size(160, 23); 94 | this.btnLogoutP.TabIndex = 4; 95 | this.btnLogoutP.Text = "Logout"; 96 | this.btnLogoutP.UseVisualStyleBackColor = true; 97 | this.btnLogoutP.Click += new System.EventHandler(this.btnLogout_Click); 98 | // 99 | // btnDepthMarketDataRequest 100 | // 101 | this.btnDepthMarketDataRequest.Location = new System.Drawing.Point(6, 135); 102 | this.btnDepthMarketDataRequest.Name = "btnDepthMarketDataRequest"; 103 | this.btnDepthMarketDataRequest.Size = new System.Drawing.Size(160, 23); 104 | this.btnDepthMarketDataRequest.TabIndex = 5; 105 | this.btnDepthMarketDataRequest.TabStop = false; 106 | this.btnDepthMarketDataRequest.Text = "Depth Market Data Request"; 107 | this.btnDepthMarketDataRequest.UseVisualStyleBackColor = true; 108 | this.btnDepthMarketDataRequest.Click += new System.EventHandler(this.btnMarketDataRequest_Click); 109 | // 110 | // txtMessageSend 111 | // 112 | this.txtMessageSend.Location = new System.Drawing.Point(145, 331); 113 | this.txtMessageSend.Name = "txtMessageSend"; 114 | this.txtMessageSend.Size = new System.Drawing.Size(711, 20); 115 | this.txtMessageSend.TabIndex = 6; 116 | // 117 | // lblMessageSend 118 | // 119 | this.lblMessageSend.AutoSize = true; 120 | this.lblMessageSend.Location = new System.Drawing.Point(18, 334); 121 | this.lblMessageSend.Name = "lblMessageSend"; 122 | this.lblMessageSend.Size = new System.Drawing.Size(100, 13); 123 | this.lblMessageSend.TabIndex = 7; 124 | this.lblMessageSend.Text = "FIX Message Send:"; 125 | // 126 | // lblMessageReceived 127 | // 128 | this.lblMessageReceived.AutoSize = true; 129 | this.lblMessageReceived.Location = new System.Drawing.Point(18, 361); 130 | this.lblMessageReceived.Name = "lblMessageReceived"; 131 | this.lblMessageReceived.Size = new System.Drawing.Size(121, 13); 132 | this.lblMessageReceived.TabIndex = 9; 133 | this.lblMessageReceived.Text = "FIX Message Received:"; 134 | // 135 | // txtMessageReceived 136 | // 137 | this.txtMessageReceived.Location = new System.Drawing.Point(145, 358); 138 | this.txtMessageReceived.Name = "txtMessageReceived"; 139 | this.txtMessageReceived.Size = new System.Drawing.Size(711, 20); 140 | this.txtMessageReceived.TabIndex = 8; 141 | // 142 | // btnHeartbeatP 143 | // 144 | this.btnHeartbeatP.Location = new System.Drawing.Point(6, 48); 145 | this.btnHeartbeatP.Name = "btnHeartbeatP"; 146 | this.btnHeartbeatP.Size = new System.Drawing.Size(160, 23); 147 | this.btnHeartbeatP.TabIndex = 10; 148 | this.btnHeartbeatP.Text = "Send Heartbeat"; 149 | this.btnHeartbeatP.UseVisualStyleBackColor = true; 150 | this.btnHeartbeatP.Click += new System.EventHandler(this.btnHeartbeat_Click); 151 | // 152 | // btnResendRequestP 153 | // 154 | this.btnResendRequestP.Location = new System.Drawing.Point(6, 164); 155 | this.btnResendRequestP.Name = "btnResendRequestP"; 156 | this.btnResendRequestP.Size = new System.Drawing.Size(160, 23); 157 | this.btnResendRequestP.TabIndex = 11; 158 | this.btnResendRequestP.Text = "Resend Request"; 159 | this.btnResendRequestP.UseVisualStyleBackColor = true; 160 | this.btnResendRequestP.Click += new System.EventHandler(this.btnResendRequest_Click); 161 | // 162 | // btnReject 163 | // 164 | this.btnReject.Location = new System.Drawing.Point(6, 222); 165 | this.btnReject.Name = "btnReject"; 166 | this.btnReject.Size = new System.Drawing.Size(160, 23); 167 | this.btnReject.TabIndex = 12; 168 | this.btnReject.Text = "Reject"; 169 | this.btnReject.UseVisualStyleBackColor = true; 170 | this.btnReject.Click += new System.EventHandler(this.btnReject_Click); 171 | // 172 | // btnSequenceReset 173 | // 174 | this.btnSequenceReset.Location = new System.Drawing.Point(6, 193); 175 | this.btnSequenceReset.Name = "btnSequenceReset"; 176 | this.btnSequenceReset.Size = new System.Drawing.Size(160, 23); 177 | this.btnSequenceReset.TabIndex = 13; 178 | this.btnSequenceReset.Text = "Sequence Reset"; 179 | this.btnSequenceReset.UseVisualStyleBackColor = true; 180 | this.btnSequenceReset.Click += new System.EventHandler(this.btnSequenceReset_Click); 181 | // 182 | // btnNewOrderSingle 183 | // 184 | this.btnNewOrderSingle.Location = new System.Drawing.Point(6, 106); 185 | this.btnNewOrderSingle.Name = "btnNewOrderSingle"; 186 | this.btnNewOrderSingle.Size = new System.Drawing.Size(160, 23); 187 | this.btnNewOrderSingle.TabIndex = 14; 188 | this.btnNewOrderSingle.Text = "New Market Order Single"; 189 | this.btnNewOrderSingle.UseVisualStyleBackColor = true; 190 | this.btnNewOrderSingle.Click += new System.EventHandler(this.btnNewOrderSingle_Click); 191 | // 192 | // btnOrderStatusRequest 193 | // 194 | this.btnOrderStatusRequest.Location = new System.Drawing.Point(6, 193); 195 | this.btnOrderStatusRequest.Name = "btnOrderStatusRequest"; 196 | this.btnOrderStatusRequest.Size = new System.Drawing.Size(160, 23); 197 | this.btnOrderStatusRequest.TabIndex = 15; 198 | this.btnOrderStatusRequest.Text = "Order Status Request"; 199 | this.btnOrderStatusRequest.UseVisualStyleBackColor = true; 200 | this.btnOrderStatusRequest.Click += new System.EventHandler(this.btnOrderStatusRequest_Click); 201 | // 202 | // btnRequestForPositions 203 | // 204 | this.btnRequestForPositions.Location = new System.Drawing.Point(6, 222); 205 | this.btnRequestForPositions.Name = "btnRequestForPositions"; 206 | this.btnRequestForPositions.Size = new System.Drawing.Size(160, 23); 207 | this.btnRequestForPositions.TabIndex = 16; 208 | this.btnRequestForPositions.Text = "Request for Positions"; 209 | this.btnRequestForPositions.UseVisualStyleBackColor = true; 210 | this.btnRequestForPositions.Click += new System.EventHandler(this.btnRequestForPositions_Click); 211 | // 212 | // gbPriceStream 213 | // 214 | this.gbPriceStream.Controls.Add(this.btnSpotMarketData); 215 | this.gbPriceStream.Controls.Add(this.btnLogonP); 216 | this.gbPriceStream.Controls.Add(this.btnHeartbeatP); 217 | this.gbPriceStream.Controls.Add(this.btnTestRequestP); 218 | this.gbPriceStream.Controls.Add(this.btnLogoutP); 219 | this.gbPriceStream.Controls.Add(this.btnReject); 220 | this.gbPriceStream.Controls.Add(this.btnSequenceReset); 221 | this.gbPriceStream.Controls.Add(this.btnDepthMarketDataRequest); 222 | this.gbPriceStream.Controls.Add(this.btnResendRequestP); 223 | this.gbPriceStream.Location = new System.Drawing.Point(15, 14); 224 | this.gbPriceStream.Name = "gbPriceStream"; 225 | this.gbPriceStream.Size = new System.Drawing.Size(181, 293); 226 | this.gbPriceStream.TabIndex = 17; 227 | this.gbPriceStream.TabStop = false; 228 | this.gbPriceStream.Text = "Price Stream"; 229 | // 230 | // btnSpotMarketData 231 | // 232 | this.btnSpotMarketData.Location = new System.Drawing.Point(6, 106); 233 | this.btnSpotMarketData.Name = "btnSpotMarketData"; 234 | this.btnSpotMarketData.Size = new System.Drawing.Size(160, 23); 235 | this.btnSpotMarketData.TabIndex = 14; 236 | this.btnSpotMarketData.Text = "Spot Market Data Request"; 237 | this.btnSpotMarketData.UseVisualStyleBackColor = true; 238 | this.btnSpotMarketData.Click += new System.EventHandler(this.btnSpotMarketData_Click); 239 | // 240 | // gbTradeStream 241 | // 242 | this.gbTradeStream.Controls.Add(this.btnStopOrder); 243 | this.gbTradeStream.Controls.Add(this.btnLimitOrder); 244 | this.gbTradeStream.Controls.Add(this.btnResendRequestT); 245 | this.gbTradeStream.Controls.Add(this.btnLogoutT); 246 | this.gbTradeStream.Controls.Add(this.btnLogonT); 247 | this.gbTradeStream.Controls.Add(this.btnHeartbeatT); 248 | this.gbTradeStream.Controls.Add(this.btnRequestForPositions); 249 | this.gbTradeStream.Controls.Add(this.btnTestRequestT); 250 | this.gbTradeStream.Controls.Add(this.btnOrderStatusRequest); 251 | this.gbTradeStream.Controls.Add(this.btnNewOrderSingle); 252 | this.gbTradeStream.Location = new System.Drawing.Point(202, 14); 253 | this.gbTradeStream.Name = "gbTradeStream"; 254 | this.gbTradeStream.Size = new System.Drawing.Size(176, 311); 255 | this.gbTradeStream.TabIndex = 18; 256 | this.gbTradeStream.TabStop = false; 257 | this.gbTradeStream.Text = "Trade Stream"; 258 | // 259 | // btnResendRequestT 260 | // 261 | this.btnResendRequestT.Location = new System.Drawing.Point(6, 251); 262 | this.btnResendRequestT.Name = "btnResendRequestT"; 263 | this.btnResendRequestT.Size = new System.Drawing.Size(160, 23); 264 | this.btnResendRequestT.TabIndex = 14; 265 | this.btnResendRequestT.Text = "Resend Request"; 266 | this.btnResendRequestT.UseVisualStyleBackColor = true; 267 | this.btnResendRequestT.Click += new System.EventHandler(this.btnResendRequestT_Click); 268 | // 269 | // btnLogoutT 270 | // 271 | this.btnLogoutT.Location = new System.Drawing.Point(6, 280); 272 | this.btnLogoutT.Name = "btnLogoutT"; 273 | this.btnLogoutT.Size = new System.Drawing.Size(160, 23); 274 | this.btnLogoutT.TabIndex = 17; 275 | this.btnLogoutT.Text = "Logout"; 276 | this.btnLogoutT.UseVisualStyleBackColor = true; 277 | this.btnLogoutT.Click += new System.EventHandler(this.btnLogoutT_Click); 278 | // 279 | // btnLogonT 280 | // 281 | this.btnLogonT.Location = new System.Drawing.Point(6, 19); 282 | this.btnLogonT.Name = "btnLogonT"; 283 | this.btnLogonT.Size = new System.Drawing.Size(160, 23); 284 | this.btnLogonT.TabIndex = 14; 285 | this.btnLogonT.Text = "Logon"; 286 | this.btnLogonT.UseVisualStyleBackColor = true; 287 | this.btnLogonT.Click += new System.EventHandler(this.btnLogonT_Click); 288 | // 289 | // btnHeartbeatT 290 | // 291 | this.btnHeartbeatT.Location = new System.Drawing.Point(6, 48); 292 | this.btnHeartbeatT.Name = "btnHeartbeatT"; 293 | this.btnHeartbeatT.Size = new System.Drawing.Size(160, 23); 294 | this.btnHeartbeatT.TabIndex = 16; 295 | this.btnHeartbeatT.Text = "Send Heartbeat"; 296 | this.btnHeartbeatT.UseVisualStyleBackColor = true; 297 | this.btnHeartbeatT.Click += new System.EventHandler(this.btnHeartbeatT_Click); 298 | // 299 | // btnTestRequestT 300 | // 301 | this.btnTestRequestT.Location = new System.Drawing.Point(6, 77); 302 | this.btnTestRequestT.Name = "btnTestRequestT"; 303 | this.btnTestRequestT.Size = new System.Drawing.Size(160, 23); 304 | this.btnTestRequestT.TabIndex = 15; 305 | this.btnTestRequestT.Text = "Send Test Request"; 306 | this.btnTestRequestT.UseVisualStyleBackColor = true; 307 | this.btnTestRequestT.Click += new System.EventHandler(this.btnTestRequestT_Click); 308 | // 309 | // btnLimitOrder 310 | // 311 | this.btnLimitOrder.Location = new System.Drawing.Point(6, 135); 312 | this.btnLimitOrder.Name = "btnLimitOrder"; 313 | this.btnLimitOrder.Size = new System.Drawing.Size(160, 23); 314 | this.btnLimitOrder.TabIndex = 18; 315 | this.btnLimitOrder.Text = "New Limit Order Single"; 316 | this.btnLimitOrder.UseVisualStyleBackColor = true; 317 | this.btnLimitOrder.Click += new System.EventHandler(this.btnLimitOrder_Click); 318 | // 319 | // btnStopOrder 320 | // 321 | this.btnStopOrder.Location = new System.Drawing.Point(6, 164); 322 | this.btnStopOrder.Name = "btnStopOrder"; 323 | this.btnStopOrder.Size = new System.Drawing.Size(160, 23); 324 | this.btnStopOrder.TabIndex = 19; 325 | this.btnStopOrder.Text = "New Stop Order Single"; 326 | this.btnStopOrder.UseVisualStyleBackColor = true; 327 | this.btnStopOrder.Click += new System.EventHandler(this.btnStopOrder_Click); 328 | // 329 | // frmFIXAPISample 330 | // 331 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 332 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 333 | this.ClientSize = new System.Drawing.Size(877, 388); 334 | this.Controls.Add(this.gbTradeStream); 335 | this.Controls.Add(this.gbPriceStream); 336 | this.Controls.Add(this.lblMessageReceived); 337 | this.Controls.Add(this.txtMessageReceived); 338 | this.Controls.Add(this.lblMessageSend); 339 | this.Controls.Add(this.txtMessageSend); 340 | this.Controls.Add(this.lblHeartbeatMessage); 341 | this.Name = "frmFIXAPISample"; 342 | this.ShowIcon = false; 343 | this.Text = "Fix API Sample"; 344 | this.gbPriceStream.ResumeLayout(false); 345 | this.gbTradeStream.ResumeLayout(false); 346 | this.ResumeLayout(false); 347 | this.PerformLayout(); 348 | 349 | } 350 | 351 | #endregion 352 | 353 | private System.Windows.Forms.Button btnLogonP; 354 | private System.Windows.Forms.Button btnTestRequestP; 355 | private System.Windows.Forms.Label lblHeartbeatMessage; 356 | private System.Windows.Forms.Button btnLogoutP; 357 | private System.Windows.Forms.Button btnDepthMarketDataRequest; 358 | private System.Windows.Forms.TextBox txtMessageSend; 359 | private System.Windows.Forms.Label lblMessageSend; 360 | private System.Windows.Forms.Label lblMessageReceived; 361 | private System.Windows.Forms.TextBox txtMessageReceived; 362 | private System.Windows.Forms.Button btnHeartbeatP; 363 | private System.Windows.Forms.Button btnResendRequestP; 364 | private System.Windows.Forms.Button btnReject; 365 | private System.Windows.Forms.Button btnSequenceReset; 366 | private System.Windows.Forms.Button btnNewOrderSingle; 367 | private System.Windows.Forms.Button btnOrderStatusRequest; 368 | private System.Windows.Forms.Button btnRequestForPositions; 369 | private System.Windows.Forms.GroupBox gbPriceStream; 370 | private System.Windows.Forms.GroupBox gbTradeStream; 371 | private System.Windows.Forms.Button btnLogoutT; 372 | private System.Windows.Forms.Button btnLogonT; 373 | private System.Windows.Forms.Button btnHeartbeatT; 374 | private System.Windows.Forms.Button btnTestRequestT; 375 | private System.Windows.Forms.Button btnResendRequestT; 376 | private System.Windows.Forms.Button btnSpotMarketData; 377 | private System.Windows.Forms.Button btnStopOrder; 378 | private System.Windows.Forms.Button btnLimitOrder; 379 | } 380 | } 381 | 382 | -------------------------------------------------------------------------------- /FIX API Sample.cs: -------------------------------------------------------------------------------- 1 | using FIX_API_Library; 2 | using System; 3 | using System.Net.Security; 4 | using System.Net.Sockets; 5 | using System.Security.Cryptography.X509Certificates; 6 | using System.Text; 7 | using System.Threading; 8 | using System.Windows.Forms; 9 | 10 | namespace FIX_API_Sample 11 | { 12 | public partial class frmFIXAPISample : Form 13 | { 14 | private int _pricePort = 5211; 15 | private int _tradePort = 5212; 16 | 17 | private string _host = "h28.p.ctrader.com"; 18 | private string _username = "3006156"; 19 | private string _password = "sp0tw@re"; 20 | private string _senderCompID = "sales.3006156"; 21 | private string _senderSubID = "3006156"; 22 | 23 | private string _targetCompID = "CSERVER"; 24 | 25 | private int _messageSequenceNumber = 1; 26 | private int _testRequestID = 1; 27 | private TcpClient _priceClient; 28 | private SslStream _priceStreamSSL; 29 | private TcpClient _tradeClient; 30 | private SslStream _tradeStreamSSL; 31 | private MessageConstructor _messageConstructor; 32 | 33 | public frmFIXAPISample() 34 | { 35 | InitializeComponent(); 36 | _priceClient = new TcpClient(_host, _pricePort); 37 | _priceStreamSSL = new SslStream(_priceClient.GetStream(), false, 38 | new RemoteCertificateValidationCallback(ValidateServerCertificate), null); 39 | _priceStreamSSL.AuthenticateAsClient(_host); 40 | _tradeClient = new TcpClient(_host, _tradePort); 41 | _tradeStreamSSL = new SslStream(_tradeClient.GetStream(), false, 42 | new RemoteCertificateValidationCallback(ValidateServerCertificate), null); 43 | _tradeStreamSSL.AuthenticateAsClient(_host); 44 | _messageConstructor = new MessageConstructor(_host, _username, 45 | _password, _senderCompID, _senderSubID, _targetCompID); 46 | } 47 | 48 | private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 49 | { 50 | if (sslPolicyErrors == SslPolicyErrors.None) 51 | return true; 52 | Console.WriteLine("Certificate error: {0}", sslPolicyErrors); 53 | return false; 54 | } 55 | 56 | private void ClearText() 57 | { 58 | txtMessageSend.Text = ""; 59 | txtMessageReceived.Text = ""; 60 | } 61 | 62 | private string SendPriceMessage(string message, bool readResponse = true) 63 | { 64 | return SendMessage(message, _priceStreamSSL, readResponse); 65 | } 66 | 67 | private string SendTradeMessage(string message, bool readResponse = true) 68 | { 69 | return SendMessage(message, _tradeStreamSSL, readResponse); 70 | } 71 | 72 | private string SendMessage(string message, SslStream stream, bool readResponse = true) 73 | { 74 | var byteArray = Encoding.ASCII.GetBytes(message); 75 | stream.Write(byteArray, 0, byteArray.Length); 76 | var buffer = new byte[1024]; 77 | if (readResponse) 78 | { 79 | Thread.Sleep(100); 80 | stream.Read(buffer, 0, 1024); 81 | } 82 | _messageSequenceNumber++; 83 | var returnMessage = Encoding.ASCII.GetString(buffer); 84 | return returnMessage; 85 | } 86 | 87 | private void btnLogon_Click(object sender, EventArgs e) 88 | { 89 | ClearText(); 90 | var message = _messageConstructor.LogonMessage(MessageConstructor.SessionQualifier.QUOTE, _messageSequenceNumber, 30, false); 91 | txtMessageSend.Text = message; 92 | txtMessageReceived.Text = SendPriceMessage(message); 93 | } 94 | 95 | private void btnTestRequest_Click(object sender, EventArgs e) 96 | { 97 | ClearText(); 98 | var message = _messageConstructor.TestRequestMessage(MessageConstructor.SessionQualifier.QUOTE, _messageSequenceNumber, _testRequestID); 99 | _testRequestID++; 100 | txtMessageSend.Text = message; 101 | txtMessageReceived.Text = SendPriceMessage(message); 102 | } 103 | 104 | private void btnLogout_Click(object sender, EventArgs e) 105 | { 106 | ClearText(); 107 | var message = _messageConstructor.LogoutMessage(MessageConstructor.SessionQualifier.QUOTE, _messageSequenceNumber); 108 | txtMessageSend.Text = message; 109 | txtMessageReceived.Text = SendPriceMessage(message); 110 | _messageSequenceNumber = 1; 111 | } 112 | 113 | private void btnMarketDataRequest_Click(object sender, EventArgs e) 114 | { 115 | ClearText(); 116 | var message = _messageConstructor.MarketDataRequestMessage(MessageConstructor.SessionQualifier.QUOTE, _messageSequenceNumber, "EURUSD:WDqsoT", 1, 0, 0, 1, 1); 117 | txtMessageSend.Text = message; 118 | txtMessageReceived.Text = SendPriceMessage(message); 119 | } 120 | 121 | private void btnHeartbeat_Click(object sender, EventArgs e) 122 | { 123 | ClearText(); 124 | var message = _messageConstructor.HeartbeatMessage(MessageConstructor.SessionQualifier.QUOTE, _messageSequenceNumber); 125 | txtMessageSend.Text = message; 126 | txtMessageReceived.Text = SendPriceMessage(message,false); 127 | } 128 | 129 | private void btnResendRequest_Click(object sender, EventArgs e) 130 | { 131 | ClearText(); 132 | var message = _messageConstructor.ResendMessage(MessageConstructor.SessionQualifier.QUOTE, _messageSequenceNumber, _messageSequenceNumber - 1); 133 | _testRequestID++; 134 | txtMessageSend.Text = message; 135 | txtMessageReceived.Text = SendPriceMessage(message); 136 | } 137 | 138 | private void btnReject_Click(object sender, EventArgs e) 139 | { 140 | ClearText(); 141 | var message = _messageConstructor.RejectMessage(MessageConstructor.SessionQualifier.QUOTE, _messageSequenceNumber, 0); 142 | _testRequestID++; 143 | txtMessageSend.Text = message; 144 | txtMessageReceived.Text = SendPriceMessage(message); 145 | } 146 | 147 | private void btnSequenceReset_Click(object sender, EventArgs e) 148 | { 149 | ClearText(); 150 | var message = _messageConstructor.SequenceResetMessage(MessageConstructor.SessionQualifier.QUOTE, _messageSequenceNumber, 0); 151 | _testRequestID++; 152 | txtMessageSend.Text = message; 153 | txtMessageReceived.Text = SendPriceMessage(message); 154 | } 155 | 156 | private void btnNewOrderSingle_Click(object sender, EventArgs e) 157 | { 158 | ClearText(); 159 | var message = _messageConstructor.NewOrderSingleMessage(MessageConstructor.SessionQualifier.TRADE, _messageSequenceNumber, "1408471", 1, 1, DateTime.UtcNow.ToString("yyyyMMdd-HH:mm:ss"), 1000, 1, "1"); 160 | _testRequestID++; 161 | txtMessageSend.Text = message; 162 | txtMessageReceived.Text = SendTradeMessage(message); 163 | } 164 | 165 | private void btnOrderStatusRequest_Click(object sender, EventArgs e) 166 | { 167 | ClearText(); 168 | var message = _messageConstructor.OrderStatusRequest(MessageConstructor.SessionQualifier.TRADE, _messageSequenceNumber, "1408471"); 169 | _testRequestID++; 170 | txtMessageSend.Text = message; 171 | txtMessageReceived.Text = SendTradeMessage(message); 172 | } 173 | 174 | private string Timestamp() 175 | { 176 | return (DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds.ToString(); 177 | } 178 | 179 | private void btnRequestForPositions_Click(object sender, EventArgs e) 180 | { 181 | ClearText(); 182 | var message = _messageConstructor.RequestForPositions(MessageConstructor.SessionQualifier.TRADE, _messageSequenceNumber, "1408471"); 183 | _testRequestID++; 184 | txtMessageSend.Text = message; 185 | txtMessageReceived.Text = SendTradeMessage(message); 186 | } 187 | 188 | private void btnLogonT_Click(object sender, EventArgs e) 189 | { 190 | ClearText(); 191 | var message = _messageConstructor.LogonMessage(MessageConstructor.SessionQualifier.TRADE, _messageSequenceNumber, 30, false); 192 | txtMessageSend.Text = message; 193 | txtMessageReceived.Text = SendTradeMessage(message); 194 | } 195 | 196 | private void btnHeartbeatT_Click(object sender, EventArgs e) 197 | { 198 | ClearText(); 199 | var message = _messageConstructor.HeartbeatMessage(MessageConstructor.SessionQualifier.TRADE, _messageSequenceNumber); 200 | txtMessageSend.Text = message; 201 | txtMessageReceived.Text = SendTradeMessage(message, false); 202 | } 203 | 204 | private void btnTestRequestT_Click(object sender, EventArgs e) 205 | { 206 | ClearText(); 207 | var message = _messageConstructor.TestRequestMessage(MessageConstructor.SessionQualifier.TRADE, _messageSequenceNumber, _testRequestID); 208 | _testRequestID++; 209 | txtMessageSend.Text = message; 210 | txtMessageReceived.Text = SendTradeMessage(message); 211 | } 212 | 213 | private void btnLogoutT_Click(object sender, EventArgs e) 214 | { 215 | ClearText(); 216 | var message = _messageConstructor.LogoutMessage(MessageConstructor.SessionQualifier.TRADE, _messageSequenceNumber); 217 | txtMessageSend.Text = message; 218 | txtMessageReceived.Text = SendTradeMessage(message); 219 | _messageSequenceNumber = 1; 220 | } 221 | 222 | private void btnResendRequestT_Click(object sender, EventArgs e) 223 | { 224 | ClearText(); 225 | var message = _messageConstructor.ResendMessage(MessageConstructor.SessionQualifier.TRADE, _messageSequenceNumber, _messageSequenceNumber - 1); 226 | _testRequestID++; 227 | txtMessageSend.Text = message; 228 | txtMessageReceived.Text = SendTradeMessage(message); 229 | } 230 | 231 | private void btnSpotMarketData_Click(object sender, EventArgs e) 232 | { 233 | ClearText(); 234 | var message = _messageConstructor.MarketDataRequestMessage(MessageConstructor.SessionQualifier.QUOTE, _messageSequenceNumber, "EURUSD:WDqsoT", 1, 1, 0, 1, 1); 235 | txtMessageSend.Text = message; 236 | txtMessageReceived.Text = SendPriceMessage(message); 237 | } 238 | 239 | private void btnStopOrder_Click(object sender, EventArgs e) 240 | { 241 | ClearText(); 242 | var message = _messageConstructor.NewOrderSingleMessage(MessageConstructor.SessionQualifier.TRADE, _messageSequenceNumber, "10", 1, 1, DateTime.UtcNow.ToString("yyyyMMdd-HH:mm:ss"), 1000, 3, "3", 0, (decimal)1.08); 243 | _testRequestID++; 244 | txtMessageSend.Text = message; 245 | txtMessageReceived.Text = SendTradeMessage(message); 246 | } 247 | 248 | private void btnLimitOrder_Click(object sender, EventArgs e) 249 | { 250 | ClearText(); 251 | var message = _messageConstructor.NewOrderSingleMessage(MessageConstructor.SessionQualifier.TRADE, _messageSequenceNumber, "10", 1, 1, DateTime.UtcNow.ToString("yyyyMMdd-HH:mm:ss"), 1000, 2, "3", (decimal)1.08); 252 | _testRequestID++; 253 | txtMessageSend.Text = message; 254 | txtMessageReceived.Text = SendTradeMessage(message); 255 | } 256 | } 257 | } -------------------------------------------------------------------------------- /FIX API Sample.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {C92958C3-0DE1-4EDA-BBB1-B5FA8D8E8B9C} 8 | WinExe 9 | Properties 10 | FIX_API_Sample 11 | FIX API Sample 12 | v4.5.2 13 | 512 14 | true 15 | 16 | 17 | AnyCPU 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | DEBUG;TRACE 23 | prompt 24 | 4 25 | 26 | 27 | AnyCPU 28 | pdbonly 29 | true 30 | bin\Release\ 31 | TRACE 32 | prompt 33 | 4 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | Form 51 | 52 | 53 | FIX API Sample.cs 54 | 55 | 56 | 57 | 58 | 59 | FIX API Sample.cs 60 | 61 | 62 | ResXFileCodeGenerator 63 | Resources.Designer.cs 64 | Designer 65 | 66 | 67 | True 68 | Resources.resx 69 | 70 | 71 | SettingsSingleFileGenerator 72 | Settings.Designer.cs 73 | 74 | 75 | True 76 | Settings.settings 77 | True 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | {97D50F0F-C3C5-49CE-ABEA-5A3C7A5832B2} 86 | FIX API Library 87 | 88 | 89 | 90 | 97 | -------------------------------------------------------------------------------- /FIX API Sample.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /FIX API Sample.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 14 4 | VisualStudioVersion = 14.0.25420.1 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FIX API Sample", "FIX API Sample.csproj", "{C92958C3-0DE1-4EDA-BBB1-B5FA8D8E8B9C}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {C92958C3-0DE1-4EDA-BBB1-B5FA8D8E8B9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {C92958C3-0DE1-4EDA-BBB1-B5FA8D8E8B9C}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {C92958C3-0DE1-4EDA-BBB1-B5FA8D8E8B9C}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {C92958C3-0DE1-4EDA-BBB1-B5FA8D8E8B9C}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | EndGlobal 23 | -------------------------------------------------------------------------------- /MessageConstructor.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Text; 3 | 4 | namespace FIX_API_Library 5 | { 6 | public class MessageConstructor 7 | { 8 | public enum SessionMessageType 9 | { 10 | Logon, 11 | Logout, 12 | Heartbeat, 13 | TestRequest, 14 | Resend, 15 | Reject, 16 | SequenceReset 17 | } 18 | 19 | public enum ApplicationMessageType 20 | { 21 | MarketDataRequest, 22 | MarketDataIncrementalRefresh, 23 | NewOrderSingle, 24 | OrderStatusRequest, 25 | ExecutionReport, 26 | BusinessMessageReject, 27 | RequestForPosition, 28 | PositionReport 29 | } 30 | 31 | public enum SessionQualifier 32 | { 33 | QUOTE, 34 | TRADE 35 | } 36 | 37 | private string _host; 38 | private string _username; 39 | private string _password; 40 | private string _senderCompID; 41 | private string _senderSubID; 42 | private string _targetCompID; 43 | 44 | public MessageConstructor(string host, string username, string password, string senderCompID, string senderSubID, string targetCompID) 45 | { 46 | _host = host; 47 | _username = username; 48 | _password = password; 49 | _senderCompID = senderCompID; 50 | _senderSubID = senderSubID; 51 | _targetCompID = targetCompID; 52 | } 53 | 54 | /// 55 | /// Logons the message. 56 | /// 57 | /// The session qualifier. 58 | /// The message sequence number. 59 | /// The heart beat seconds. 60 | /// All sides of FIX session should have sequence numbers reset. Valid value 61 | ///is "Y" = Yes(reset).. 62 | /// 63 | public string LogonMessage(SessionQualifier qualifier, int messageSequenceNumber, 64 | int heartBeatSeconds, bool resetSeqNum) 65 | { 66 | var body = new StringBuilder(); 67 | //Defines a message encryption scheme.Currently, only transportlevel security 68 | //is supported.Valid value is "0"(zero) = NONE_OTHER (encryption is not used). 69 | body.Append("98=0|"); 70 | //Heartbeat interval in seconds. 71 | //Value is set in the 'config.properties' file (client side) as 'SERVER.POLLING.INTERVAL'. 72 | //30 seconds is default interval value. If HeartBtInt is set to 0, no heart beat message 73 | //is required. 74 | body.Append("108=" + heartBeatSeconds + "|"); 75 | // All sides of FIX session should have 76 | //sequence numbers reset. Valid value 77 | //is "Y" = Yes(reset). 78 | if (resetSeqNum) 79 | body.Append("141=Y|"); 80 | //The numeric User ID. User is linked to SenderCompID (#49) value (the 81 | //user’s organization). 82 | body.Append("553=" + _username + "|"); 83 | //USer Password 84 | body.Append("554=" + _password + "|"); 85 | 86 | var header = ConstructHeader(qualifier, SessionMessageCode(SessionMessageType.Logon), 87 | messageSequenceNumber, body.ToString()); 88 | var headerAndBody = header + body; 89 | var trailer = ConstructTrailer(headerAndBody); 90 | var headerAndMessageAndTrailer = header + body + trailer; 91 | return headerAndMessageAndTrailer.Replace("|", "\u0001"); 92 | } 93 | 94 | public string HeartbeatMessage(SessionQualifier qualifier, int messageSequenceNumber) 95 | { 96 | var header = ConstructHeader(qualifier, SessionMessageCode(SessionMessageType.Heartbeat), messageSequenceNumber, string.Empty); 97 | var trailer = ConstructTrailer(header); 98 | var headerAndMessageAndTrailer = header + trailer; 99 | return headerAndMessageAndTrailer.Replace("|", "\u0001"); 100 | } 101 | 102 | public string TestRequestMessage(SessionQualifier qualifier, int messageSequenceNumber, int testRequestID) 103 | { 104 | var body = new StringBuilder(); 105 | //Heartbeat message ID. TestReqID should be incremental. 106 | body.Append("112=" + testRequestID + "|"); 107 | var header = ConstructHeader(qualifier, SessionMessageCode(SessionMessageType.TestRequest), messageSequenceNumber, body.ToString()); 108 | var headerAndBody = header + body; 109 | var trailer = ConstructTrailer(headerAndBody); 110 | var headerAndMessageAndTrailer = header + body + trailer; 111 | return headerAndMessageAndTrailer.Replace("|", "\u0001"); 112 | } 113 | 114 | public string LogoutMessage(SessionQualifier qualifier, int messageSequenceNumber) 115 | { 116 | var header = ConstructHeader(qualifier, SessionMessageCode(SessionMessageType.Logout), messageSequenceNumber, string.Empty); 117 | var trailer = ConstructTrailer(header); 118 | var headerAndMessageAndTrailer = header + trailer; 119 | return headerAndMessageAndTrailer.Replace("|", "\u0001"); 120 | } 121 | 122 | /// 123 | /// Resends the message. 124 | /// 125 | /// The session qualifier. 126 | /// Message sequence number of last record in range to be resent. 127 | /// The end sequence no. 128 | /// 129 | public string ResendMessage(SessionQualifier qualifier, int messageSequenceNumber, int endSequenceNo) 130 | { 131 | var body = new StringBuilder(); 132 | //Message sequence number of last record in range to be resent. 133 | body.Append("16=" + endSequenceNo + "|"); 134 | var header = ConstructHeader(qualifier, SessionMessageCode(SessionMessageType.Resend), messageSequenceNumber, body.ToString()); 135 | var headerAndBody = header + body; 136 | var trailer = ConstructTrailer(headerAndBody); 137 | var headerAndMessageAndTrailer = header + body + trailer; 138 | return headerAndMessageAndTrailer.Replace("|", "\u0001"); 139 | } 140 | 141 | public string RejectMessage(SessionQualifier qualifier, int messageSequenceNumber, int rejectSequenceNumber) 142 | { 143 | var body = new StringBuilder(); 144 | //Referenced message sequence number. 145 | body.Append("45=" + rejectSequenceNumber + "|"); 146 | var header = ConstructHeader(qualifier, SessionMessageCode(SessionMessageType.Reject), messageSequenceNumber, string.Empty); 147 | var headerAndBody = header + body; 148 | var trailer = ConstructTrailer(headerAndBody); 149 | var headerAndMessageAndTrailer = header + body + trailer; 150 | return headerAndMessageAndTrailer.Replace("|", "\u0001"); 151 | } 152 | 153 | public string SequenceResetMessage(SessionQualifier qualifier, int messageSequenceNumber, int rejectSequenceNumber) 154 | { 155 | var body = new StringBuilder(); 156 | //New Sequence Number 157 | body.Append("36=" + rejectSequenceNumber + "|"); 158 | var header = ConstructHeader(qualifier, SessionMessageCode(SessionMessageType.SequenceReset), messageSequenceNumber, string.Empty); 159 | var headerAndBody = header + body; 160 | var trailer = ConstructTrailer(headerAndBody); 161 | var headerAndMessageAndTrailer = header + body + trailer; 162 | return headerAndMessageAndTrailer.Replace("|", "\u0001"); 163 | } 164 | 165 | /// 166 | /// Constructs a message for requesting market data. 167 | /// 168 | /// The session qualifier. 169 | /// The message sequence number. 170 | /// Unique quote request id. New ID for a new subscription, same one as previously used for subscription removal. 171 | /// 1 = Snapshot plus updates (subscribe) 2 = Disable previous snapshot plus update request (unsubscribe). 172 | /// Full book will be provided, 0 = Depth subscription, 1 = Spot subscription. 173 | /// Always set to 2 (both bid and ask will be sent). 174 | /// Number of symbols requested. 175 | /// Instrument identificators are provided by Spotware. 176 | /// 177 | public string MarketDataRequestMessage(SessionQualifier qualifier, int messageSequenceNumber, string marketDataRequestID, int subscriptionRequestType, int marketDepth, int marketDataEntryType, int noRelatedSymbol, long symbol = 0) 178 | { 179 | var body = new StringBuilder(); 180 | //Unique quote request id. New ID for a new subscription, same one as previously used for subscription removal. 181 | body.Append("262=" + marketDataRequestID + "|"); 182 | //1 = Snapshot plus updates (subscribe) 2 = Disable previous snapshot plus update request (unsubscribe) 183 | body.Append("263=" + subscriptionRequestType + "|"); 184 | //Full book will be provided, 0 = Depth subscription, 1 = Spot subscription 185 | body.Append("264=" + marketDepth + "|"); 186 | //Only Incremental refresh is supported. 187 | body.Append("265=1|"); 188 | //Always set to 2 (both bid and ask will be sent). 189 | body.Append("267=2|"); 190 | //Always set to 2 (both bid and ask will be sent). 191 | body.Append("269=0|269=1|"); 192 | //Number of symbols requested. 193 | body.Append("146=" + noRelatedSymbol + "|"); 194 | //Instrument identificators are provided by Spotware. 195 | body.Append("55=" + symbol + "|"); 196 | var header = ConstructHeader(qualifier, ApplicationMessageCode(ApplicationMessageType.MarketDataRequest), messageSequenceNumber, body.ToString()); 197 | var headerAndBody = header + body; 198 | var trailer = ConstructTrailer(headerAndBody); 199 | var headerAndMessageAndTrailer = header + body + trailer; 200 | return headerAndMessageAndTrailer.Replace("|", "\u0001"); 201 | } 202 | 203 | /// 204 | /// Constructs a message for requesting market data snapshot. 205 | /// 206 | /// The session qualifier. 207 | /// The message sequence number. 208 | /// Instrument identificators are provided by Spotware. 209 | /// Number of entries following. 210 | /// Valid values are: 0 = BID, 1 = OFFER. 211 | /// Price of Market Data Entry. 212 | /// Unique quote request id. New ID for a new subscription, same one as previously used for subscription removal. 213 | /// 214 | public string MarketDataSnapshotMessage(SessionQualifier qualifier, int messageSequenceNumber, long symbol, string noMarketDataEntries, int entryType, decimal entryPrice, string marketDataRequestID = "") 215 | { 216 | var body = new StringBuilder(); 217 | //Unique quote request id. New ID for a new subscription, same one as previously used for subscription removal. 218 | body.Append("262=" + marketDataRequestID + "|"); 219 | //Instrument identificators are provided by Spotware. 220 | body.Append("55=" + symbol + "|"); 221 | //Number of entries following. 222 | body.Append("268=" + noMarketDataEntries + "|"); 223 | //Valid values are: 0 = BID, 1 = OFFER. 224 | body.Append("269=" + entryType + "|"); 225 | //Price of Market Data Entry. 226 | body.Append("270=" + entryPrice + "|"); 227 | var header = ConstructHeader(qualifier, ApplicationMessageCode(ApplicationMessageType.MarketDataRequest), messageSequenceNumber, body.ToString()); 228 | var headerAndBody = header + body; 229 | var trailer = ConstructTrailer(headerAndBody); 230 | var headerAndMessageAndTrailer = header + body + trailer; 231 | return headerAndMessageAndTrailer.Replace("|", "\u0001"); 232 | } 233 | 234 | /// 235 | /// Markets the data incremental refresh message. 236 | /// 237 | /// The session qualifier. 238 | /// The message sequence number. 239 | /// Unique quote request id. New ID for a new subscription, same one as previously used for subscription removal. 240 | /// Number of entries following. This repeating group contains a list of all types of Market Data Entries the requester wants to receive. 241 | /// Type of Market Data update action. Valid values: 0 = NEW, 2 = DELETE. 242 | /// Valid values are: 0 = BID, 1 = OFFER. 243 | /// ID of Market Data Entry. 244 | /// The no related symbol. 245 | /// Conditionally required when MDUpdateAction <279> = New(0). 246 | /// Conditionally required when MDUpdateAction <279> = New(0). 247 | /// /Instrument identificators are provided by Spotware. 248 | /// 249 | public string MarketDataIncrementalRefreshMessage(SessionQualifier qualifier, int messageSequenceNumber, string marketDataRequestID, int noMarketDataEntries, int marketDataUpdateAction, int marketDataEntryType, string marketDataEntryID, int noRelatedSymbol, decimal marketDataEntryPrice = 0, double marketDataEntrySize = 0, long symbol = 0) 250 | { 251 | var body = new StringBuilder(); 252 | //Unique quote request id. New ID for a new subscription, same one as previously used for subscription removal. 253 | body.Append("262=" + marketDataRequestID + "|"); 254 | //Number of entries following. This repeating group contains a list of all types of Market Data Entries the requester wants to receive 255 | body.Append("268=" + noMarketDataEntries + "|"); 256 | //Type of Market Data update action. Valid values: 0 = NEW, 2 = DELETE 257 | body.Append("279=" + marketDataUpdateAction + "|"); 258 | //Valid values are: 0 = BID, 1 = OFFER 259 | body.Append("269=" + marketDataEntryType + "|"); 260 | //ID of Market Data Entry. 261 | body.Append("278=" + marketDataEntryID + "|"); 262 | //Instrument identificators are provided by Spotware 263 | body.Append("55=" + symbol + "|"); 264 | if (marketDataEntryPrice > 0) 265 | { 266 | //Conditionally required when MDUpdateAction <279> = New(0) 267 | body.Append("270=" + marketDataEntryPrice + "|"); 268 | } 269 | if (marketDataEntrySize > 0) 270 | { 271 | //Conditionally required when MDUpdateAction <279> = New(0) 272 | body.Append("271=" + marketDataEntrySize + "|"); 273 | } 274 | var header = ConstructHeader(qualifier, ApplicationMessageCode(ApplicationMessageType.MarketDataIncrementalRefresh), messageSequenceNumber, string.Empty); 275 | var headerAndBody = header + body; 276 | var trailer = ConstructTrailer(headerAndBody); 277 | var headerAndMessageAndTrailer = header + body + trailer; 278 | return headerAndMessageAndTrailer.Replace("|", "\u0001"); 279 | return headerAndMessageAndTrailer; 280 | } 281 | 282 | /// 283 | /// News the order single message. 284 | /// 285 | /// The session qualifier. 286 | /// The message sequence number. 287 | /// Unique identifier for the order, allocated by the client. 288 | /// The symbol. 289 | /// 1= Buy, 2 = Sell. 290 | /// Client generated request time. 291 | /// The fixed currency amount. 292 | /// 1 = Market, the Order will be processed by 'Immediate Or Cancel'scheme(see TimeInForce(59): IOC); 293 | /// 2 = Limit, the Order will be processed by 'Good Till Cancel' scheme(see TimeInForce(59): GTC). 294 | /// 1 = Good Till Cancel (GTC), it will be active only for Limit Orders (see OrdType(40)) ; 295 | /// 3 = Immediate Or Cancel (IOC), it will be active only for Market Orders(see OrdType(40)); 296 | /// 6 = Good Till Date(GTD), it will be active only if ExpireTime is defined (see ExpireTime(126)). 297 | /// GTD has a high priority, so if ExpireTime is defined, GTD will be used for the Order processing. 298 | /// The worst client price that the client will accept. 299 | /// Required when OrdType = 2, in which case the order will notfill unless this price can be met. 300 | /// /// Reserved for future use 301 | /// Expire Time in YYYYMMDDHH:MM:SS format.If is assigned then the Order will be processed by 'Good Till Date' scheme 302 | /// (see TimeInForce: GTD). 303 | /// Position ID, where this order should be placed. If not set, new position will be created, it’s id will be returned in ExecutionReport(8) message. 304 | /// 305 | public string NewOrderSingleMessage(SessionQualifier qualifier, int messageSequenceNumber, string orderID, long symbol, int side, string transactTime, int orderQuantity, int orderType, string timeInForce, decimal price = 0, decimal stopPrice = 0, string expireTime = "", string positionID = "") 306 | { 307 | var body = new StringBuilder(); 308 | //Unique identifier for the order, allocated by the client. 309 | body.Append("11=" + orderID + "|"); 310 | //Instrument identificators are provided by Spotware. 311 | body.Append("55=" + symbol + "|"); 312 | //1= Buy, 2 = Sell 313 | body.Append("54=" + side + "|"); 314 | // Client generated request time. 315 | body.Append("60=" + transactTime + "|"); 316 | //The fixed currency amount. 317 | body.Append("38=" + orderQuantity + "|"); 318 | //1 = Market, the Order will be processed by 'Immediate Or Cancel'scheme(see TimeInForce(59): IOC); 319 | //2 = Limit, the Order will be processed by 'Good Till Cancel' scheme(see TimeInForce(59): GTC). 320 | body.Append("40=" + orderType + "|"); 321 | if (price != 0) 322 | { 323 | //Reserved for future use. 324 | body.Append("44=" + price + "|"); 325 | } 326 | if (stopPrice != 0) 327 | { 328 | //The worst client price that the client will accept. 329 | //Required when OrdType = 2, in which case the order will notfill unless this price can be met. 330 | body.Append("99=" + stopPrice + "|"); 331 | } 332 | // 1 = Good Till Cancel (GTC), it will be active only for Limit Orders (see OrdType(40)) ; 333 | // 3 = Immediate Or Cancel (IOC), it will be active only for Market Orders(see OrdType(40)); 334 | // 6 = Good Till Date(GTD), it will be active only if ExpireTime is defined (see ExpireTime(126)). 335 | // GTD has a high priority, so if ExpireTime is defined, GTD will be used for the Order processing. 336 | body.Append("59=" + timeInForce + "|"); 337 | if (expireTime != string.Empty) 338 | { 339 | // Expire Time in YYYYMMDDHH:MM:SS format.If is assigned then the Order will be processed by 'Good Till Date' scheme 340 | // (see TimeInForce: GTD). 341 | body.Append("126=" + expireTime + "|"); 342 | } 343 | if (positionID != string.Empty) 344 | { 345 | // Position ID, where this order should be placed. If not set, new position will be created, it’s id will be returned in ExecutionReport(8) message. 346 | body.Append("721=" + positionID + "|"); 347 | } 348 | var header = ConstructHeader(qualifier, ApplicationMessageCode(ApplicationMessageType.NewOrderSingle), messageSequenceNumber, body.ToString()); 349 | var headerAndBody = header + body; 350 | var trailer = ConstructTrailer(headerAndBody); 351 | var headerAndMessageAndTrailer = header + body + trailer; 352 | return headerAndMessageAndTrailer.Replace("|", "\u0001"); 353 | } 354 | 355 | /// 356 | /// Orders the status request. 357 | /// 358 | /// The session qualifier. 359 | /// The message sequence number. 360 | /// Unique identifier for the order, allocated by the client. 361 | /// 362 | public string OrderStatusRequest(SessionQualifier qualifier, int messageSequenceNumber, string orderID) 363 | { 364 | var body = new StringBuilder(); 365 | // Unique identifier for the order, allocated by the client. 366 | body.Append("11=" + orderID + "|"); 367 | // 1 = Buy; 2 = Sell. There is for the FIX compatibility only, so it will be ignored. 368 | body.Append("54=1|"); 369 | var header = ConstructHeader(qualifier, ApplicationMessageCode(ApplicationMessageType.OrderStatusRequest), messageSequenceNumber, body.ToString()); 370 | var headerAndBody = header + body; 371 | var trailer = ConstructTrailer(headerAndBody); 372 | var headerAndMessageAndTrailer = header + body + trailer; 373 | return headerAndMessageAndTrailer.Replace("|", "\u0001"); 374 | } 375 | 376 | /// 377 | /// Executions the report. 378 | /// 379 | /// The session qualifier. 380 | /// The message sequence number. 381 | /// cTrader order id.. 382 | /// 0 = New; 1 = Partially filled; 2 = Filled; 8 = Rejected; 4 = Cancelled(When an order is partially filled, "Cancelled" is 383 | /// returned signifying Tag 151: LeavesQty is cancelled and will not be subsequently filled); C = Expired. 384 | /// Time the transaction represented by this ExecutionReport occurred message(in UTC). 385 | /// Instrument identificators are provided by Spotware.. 386 | /// 1 = Buy; 2 = Sell. 387 | /// The price at which the deal was filled.For an IOC or GTD order, this is the VWAP(Volume Weighted Average Price) of the filled order. 388 | /// The fixed currency amount. 389 | /// The amount of the order still to be filled.This is a value between 0 (fully filled) and OrderQty (partially filled). 390 | /// The total amount of the order which has been filled. 391 | /// Unique identifier for the order, allocated by the client. 392 | /// 1 = Market; 2 = Limit. 393 | /// If supplied in the NewOrderSingle, it is echoed back in this ExecutionReport. 394 | /// If supplied in the NewOrderSingle, it is echoed back in this ExecutionReport. 395 | /// U1 = Good Till Cancel (GTC); 3 = Immediate Or Cancel (IOC); 6 = Good Till Date (GTD). 396 | /// If supplied in the NewOrderSingle, it is echoed back in this ExecutionReport. 397 | /// Where possible, message to explain execution report. 398 | /// 0 = OrdRejReason.BROKER_EXCHANGE_OPTION 399 | /// Position ID. 400 | /// 401 | public string ExecutionReport(SessionQualifier qualifier, int messageSequenceNumber, string cTraderOrderID, string orderStatus, string transactTime, long symbol = 0, int side = 1, 402 | int averagePrice = 0, int orderQuantity = 0, int leavesQuantity = 0, int cumQuantity = 0, string orderID = "", string orderType = "", int price = 0, int stopPrice = 0, 403 | string timeInForce = "", string expireTime = "", string text = "", int orderRejectionReason = -1, string positionID = "") 404 | { 405 | var body = new StringBuilder(); 406 | // cTrader order id. 407 | body.Append("37=" + cTraderOrderID + "|"); 408 | // Unique identifier for the order, allocated by the client. 409 | body.Append("11=" + orderID + "|"); 410 | // Execution Type. 411 | body.Append("150=F|"); 412 | // 0 = New; 1 = Partially filled; 2 = Filled; 8 = Rejected; 4 = Cancelled(When an order is partially filled, "Cancelled" is 413 | // returned signifying Tag 151: LeavesQty is cancelled and will not be subsequently filled); C = Expired. 414 | body.Append("39=" + orderStatus + "|"); 415 | // Instrument identificators are provided by Spotware. 416 | body.Append("55=" + symbol + "|"); 417 | // 1 = Buy; 2 = Sell. 418 | body.Append("54=" + side + "|"); 419 | // Time the transaction represented by this ExecutionReport occurred message(in UTC). 420 | body.Append("60=" + transactTime + "|"); 421 | if (averagePrice > 0) 422 | { 423 | // The price at which the deal was filled.For an IOC or GTD order, this is the VWAP(Volume Weighted Average Price) of the filled order. 424 | body.Append("6=" + averagePrice + "|"); 425 | } 426 | if (orderQuantity > 0) 427 | { 428 | // The fixed currency amount. 429 | body.Append("38=" + orderQuantity + "|"); 430 | } 431 | if (leavesQuantity > 0) 432 | { 433 | // The amount of the order still to be filled.This is a value between 0 (fully filled) and OrderQty (partially filled). 434 | body.Append("151=" + leavesQuantity + "|"); 435 | } 436 | if (cumQuantity > 0) 437 | { 438 | // The total amount of the order which has been filled. 439 | body.Append("14=" + cumQuantity + "|"); 440 | } 441 | if (orderType != string.Empty) 442 | { 443 | // 1 = Market; 2 = Limit. 444 | body.Append("40=" + orderType + "|"); 445 | } 446 | if (price > 0) 447 | { 448 | // If supplied in the NewOrderSingle, it is echoed back in this ExecutionReport. 449 | body.Append("44=" + price + "|"); 450 | } 451 | if (stopPrice > 0) 452 | { 453 | // If supplied in the NewOrderSingle, it is echoed back in this ExecutionReport. 454 | body.Append("99=" + stopPrice + "|"); 455 | } 456 | if (timeInForce != string.Empty) 457 | { 458 | // U1 = Good Till Cancel (GTC); 3 = Immediate Or Cancel (IOC); 6 = Good Till Date (GTD). 459 | body.Append("59=" + timeInForce + "|"); 460 | } 461 | if (expireTime != string.Empty) 462 | { 463 | // If supplied in the NewOrderSingle, it is echoed back in this ExecutionReport. 464 | body.Append("126=" + expireTime + "|"); 465 | } 466 | if (text != string.Empty) 467 | { 468 | // Where possible, message to explain execution report. 469 | body.Append("58=" + text + "|"); 470 | } 471 | if (orderRejectionReason != -1) 472 | { 473 | // 0 = OrdRejReason.BROKER_EXCHANGE_OPTION 474 | body.Append("103=" + orderRejectionReason + "|"); 475 | } 476 | if (positionID != string.Empty) 477 | { 478 | // Position ID. 479 | body.Append("721=" + positionID + "|"); 480 | } 481 | 482 | var header = ConstructHeader(qualifier, ApplicationMessageCode(ApplicationMessageType.OrderStatusRequest), messageSequenceNumber, body.ToString()); 483 | var headerAndBody = header + body; 484 | var trailer = ConstructTrailer(headerAndBody); 485 | var headerAndMessageAndTrailer = header + body + trailer; 486 | return headerAndMessageAndTrailer.Replace("|", "\u0001"); 487 | } 488 | 489 | /// 490 | /// Businesses the message reject. 491 | /// 492 | /// The session qualifier. 493 | /// The message sequence number. 494 | /// MsgSeqNum<34> of rejected message. 495 | /// TThe MsgType<35> of the FIX message being referenced. 496 | /// The value of the business-level 'ID' field on the message being referenced.Required unless the corresponding ID field was not specified. 497 | /// Where possible, message to explain reason for rejection. 498 | /// Where possible, message to explain reason for rejection. 499 | /// 500 | public string BusinessMessageReject(SessionQualifier qualifier, int messageSequenceNumber, int referenceSequenceNum = 0, string referenceMessageType = "", string businessRejectRefID = "", int businessRejectReason = -1, string text = "") 501 | { 502 | var body = new StringBuilder(); 503 | if (referenceSequenceNum != 0) 504 | { 505 | // MsgSeqNum<34> of rejected message. 506 | body.Append("45=" + referenceSequenceNum + "|"); 507 | } 508 | if (referenceMessageType != string.Empty) 509 | { 510 | // The MsgType<35> of the FIX message being referenced. 511 | body.Append("372=" + referenceMessageType + "|"); 512 | } 513 | if (businessRejectRefID != string.Empty) 514 | { 515 | // The value of the business-level 'ID' field on the message being referenced.Required unless the corresponding ID field was not specified. 516 | body.Append("379=" + businessRejectRefID + "|"); 517 | } 518 | if (businessRejectReason != -1) 519 | { 520 | // Code to identify reason for a Business Message Reject message. 0 = OTHER. 521 | body.Append("380=" + businessRejectReason + "|"); 522 | } 523 | if (text != string.Empty) 524 | { 525 | // Where possible, message to explain reason for rejection. 526 | body.Append("58=" + text + "|"); 527 | } 528 | var header = ConstructHeader(qualifier, ApplicationMessageCode(ApplicationMessageType.BusinessMessageReject), messageSequenceNumber, body.ToString()); 529 | var headerAndBody = header + body; 530 | var trailer = ConstructTrailer(headerAndBody); 531 | var headerAndMessageAndTrailer = header + body + trailer; 532 | return headerAndMessageAndTrailer.Replace("|", "\u0001"); 533 | } 534 | 535 | /// 536 | /// Requests for positions. 537 | /// 538 | /// The session qualifier. 539 | /// The message sequence number. 540 | /// Unique request ID (set by client). 541 | /// Position ID to request. If not set, all open positions will be returned. 542 | /// 543 | public string RequestForPositions(SessionQualifier qualifier, int messageSequenceNumber, string requestID, string positionRequestID = "") 544 | { 545 | var body = new StringBuilder(); 546 | // Unique request ID (set by client). 547 | body.Append("710=" + requestID + "|"); 548 | if (positionRequestID != string.Empty) 549 | { 550 | // Position ID to request. If not set, all open positions will be returned. 551 | body.Append("721=" + positionRequestID + "|"); 552 | } 553 | var header = ConstructHeader(qualifier, ApplicationMessageCode(ApplicationMessageType.RequestForPosition), messageSequenceNumber, body.ToString()); 554 | var headerAndBody = header + body; 555 | var trailer = ConstructTrailer(headerAndBody); 556 | var headerAndMessageAndTrailer = header + body + trailer; 557 | return headerAndMessageAndTrailer.Replace("|", "\u0001"); 558 | } 559 | 560 | /// 561 | /// Gets the position of reporting. 562 | /// 563 | /// The session qualifier. 564 | /// The message sequence number. 565 | /// Id of RequestForPositions. 566 | /// Total count of PositionReport’s in sequence when PosReqResult(728) is VALID_REQUEST, otherwise = 0. 567 | /// 0 = Valid Request; 2 = No open positions found that match criteria. 568 | /// Position ID (is not set if PosReqResult(728) is not VALID_REQUEST). 569 | /// The symbol for which the current Position Report is prepared. (is not set if PosReqResult(728) is not VALID_REQUEST). 570 | /// 1 when PosReqResult(728) is VALID_REQUEST, otherwise not set. 571 | /// Position’s open volume in case of BUY trade side, = 0 in case of SELL trade side, is not set if PosReqResult(728) is not VALID_REQUEST. 572 | /// Position’s open volume in case of SELL trade side, = 0 in case of BUY trade side, is not set if PosReqResult(728) is not VALID_REQUEST. 573 | /// Average price of the opened volume in the current PositionReport. 574 | /// 575 | public string PositionReport(SessionQualifier qualifier, int messageSequenceNumber, string requestID, string totalNumberOfPositionReports, string positionRequestResult, 576 | string positionID = "", string symbol = "", string noOfPositions = "", string longQuantity = "", string shortQuantity = "", string settlementPrice = "") 577 | { 578 | var body = new StringBuilder(); 579 | // Id of RequestForPositions. 580 | body.Append("710=" + requestID + "|"); 581 | if (positionID != string.Empty) 582 | { 583 | // Position ID (is not set if PosReqResult(728) is not VALID_REQUEST). 584 | body.Append("721=" + positionID + "|"); 585 | } 586 | // Total count of PositionReport’s in sequence when PosReqResult(728) is VALID_REQUEST, otherwise = 0. 587 | body.Append("727=" + totalNumberOfPositionReports + "|"); 588 | // 0 = Valid Request; 2 = No open positions found that match criteria. 589 | body.Append("728=" + positionRequestResult + "|"); 590 | 591 | if (symbol != string.Empty) 592 | { 593 | // The symbol for which the current Position Report is prepared. (is not set if PosReqResult(728) is not VALID_REQUEST). 594 | body.Append("55=" + symbol + "|"); 595 | } 596 | if (noOfPositions != string.Empty) 597 | { 598 | // 1 when PosReqResult(728) is VALID_REQUEST, otherwise not set. 599 | body.Append("702=" + noOfPositions + "|"); 600 | } 601 | if (longQuantity != string.Empty) 602 | { 603 | // Position’s open volume in case of BUY trade side, = 0 in case of SELL trade side, is not set if PosReqResult(728) is not VALID_REQUEST. 604 | body.Append("704=" + requestID + "|"); 605 | } 606 | if (shortQuantity != string.Empty) 607 | { 608 | //Position’s open volume in case of SELL trade side, = 0 in case of BUY trade side, is not set if PosReqResult(728) is not VALID_REQUEST. 609 | body.Append("705=" + shortQuantity + "|"); 610 | } 611 | if (settlementPrice != string.Empty) 612 | { 613 | // Average price of the opened volume in the current PositionReport. 614 | body.Append("730=" + settlementPrice + "|"); 615 | } 616 | var header = ConstructHeader(qualifier, ApplicationMessageCode(ApplicationMessageType.PositionReport), messageSequenceNumber, string.Empty); 617 | var headerAndBody = header + body; 618 | var trailer = ConstructTrailer(headerAndBody); 619 | var headerAndMessageAndTrailer = header + body + trailer; 620 | return headerAndMessageAndTrailer.Replace("|", "\u0001"); 621 | } 622 | 623 | /// 624 | /// Constructs the message header. 625 | /// 626 | /// The session qualifier. 627 | /// The message type. 628 | /// The message sequence number. 629 | /// The body message. 630 | /// 631 | private string ConstructHeader(SessionQualifier qualifier, string type, 632 | int messageSequenceNumber, string bodyMessage) 633 | { 634 | var header = new StringBuilder(); 635 | // Protocol version. FIX.4.4 (Always unencrypted, must be first field 636 | // in message. 637 | header.Append("8=FIX.4.4|"); 638 | var message = new StringBuilder(); 639 | // Message type. Always unencrypted, must be third field in message. 640 | message.Append("35=" + type + "|"); 641 | // ID of the trading party in following format: . 642 | // where BrokerUID is provided by cTrader and Trader Login is numeric 643 | // identifier of the trader account. 644 | message.Append("49=" + _senderCompID + "|"); 645 | // Message target. Valid value is "CSERVER" 646 | message.Append("56=" + _targetCompID + "|"); 647 | // Additional session qualifier. Possible values are: "QUOTE", "TRADE". 648 | message.Append("57=" + qualifier.ToString() + "|"); 649 | // Assigned value used to identify specific message originator. 650 | message.Append("50=" + _senderSubID + "|"); 651 | // Message Sequence Number 652 | message.Append("34=" + messageSequenceNumber + "|"); 653 | // Time of message transmission (always expressed in UTC(Universal Time 654 | // Coordinated, also known as 'GMT'). 655 | message.Append("52=" + DateTime.UtcNow.ToString("yyyyMMdd-HH:mm:ss") + "|"); 656 | var length = message.Length + bodyMessage.Length; 657 | // Message body length. Always unencrypted, must be second field in message. 658 | header.Append("9=" + length + "|"); 659 | header.Append(message); 660 | return header.ToString(); 661 | } 662 | 663 | /// 664 | /// Constructs the message trailer. 665 | /// 666 | /// The message trailer. 667 | /// 668 | private string ConstructTrailer(string message) 669 | { 670 | //Three byte, simple checksum. Always last field in message; i.e. serves, 671 | //with the trailing, 672 | //as the end - of - message delimiter. Always defined as three characters 673 | //(and always unencrypted). 674 | var trailer = "10=" + CalculateChecksum(message.Replace("|", "\u0001").ToString()).ToString().PadLeft(3, '0') + "|"; 675 | return trailer; 676 | } 677 | 678 | /// 679 | /// Calculates the checksum. 680 | /// 681 | /// The data to calculate. 682 | /// 683 | private int CalculateChecksum(string dataToCalculate) 684 | { 685 | byte[] byteToCalculate = Encoding.ASCII.GetBytes(dataToCalculate); 686 | int checksum = 0; 687 | foreach (byte chData in byteToCalculate) 688 | { 689 | checksum += chData; 690 | } 691 | return checksum % 256; 692 | } 693 | 694 | /// 695 | /// Returns the session the message code. 696 | /// 697 | /// The session message type. 698 | /// 699 | private string SessionMessageCode(SessionMessageType type) 700 | { 701 | switch (type) 702 | { 703 | case SessionMessageType.Heartbeat: 704 | return "0"; 705 | break; 706 | 707 | case SessionMessageType.Logon: 708 | return "A"; 709 | break; 710 | 711 | case SessionMessageType.Logout: 712 | return "5"; 713 | break; 714 | 715 | case SessionMessageType.Reject: 716 | return "3"; 717 | break; 718 | 719 | case SessionMessageType.Resend: 720 | return "2"; 721 | break; 722 | 723 | case SessionMessageType.SequenceReset: 724 | return "4"; 725 | break; 726 | 727 | case SessionMessageType.TestRequest: 728 | return "1"; 729 | break; 730 | 731 | default: 732 | return "0"; 733 | } 734 | } 735 | 736 | /// 737 | /// Returns the application message code. 738 | /// 739 | /// The application message type. 740 | /// 741 | private string ApplicationMessageCode(ApplicationMessageType type) 742 | { 743 | switch (type) 744 | { 745 | case ApplicationMessageType.MarketDataRequest: 746 | return "V"; 747 | break; 748 | 749 | case ApplicationMessageType.MarketDataIncrementalRefresh: 750 | return "X"; 751 | break; 752 | 753 | case ApplicationMessageType.NewOrderSingle: 754 | return "D"; 755 | break; 756 | 757 | case ApplicationMessageType.OrderStatusRequest: 758 | return "H"; 759 | break; 760 | 761 | case ApplicationMessageType.ExecutionReport: 762 | return "8"; 763 | break; 764 | 765 | case ApplicationMessageType.BusinessMessageReject: 766 | return "j"; 767 | break; 768 | 769 | case ApplicationMessageType.RequestForPosition: 770 | return "AN"; 771 | break; 772 | 773 | case ApplicationMessageType.PositionReport: 774 | return "AP"; 775 | break; 776 | 777 | default: 778 | return "0"; 779 | } 780 | } 781 | } 782 | } -------------------------------------------------------------------------------- /Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms; 6 | 7 | namespace FIX_API_Sample 8 | { 9 | static class Program 10 | { 11 | /// 12 | /// The main entry point for the application. 13 | /// 14 | [STAThread] 15 | static void Main() 16 | { 17 | Application.EnableVisualStyles(); 18 | Application.SetCompatibleTextRenderingDefault(false); 19 | Application.Run(new frmFIXAPISample()); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("FIX API Sample")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("FIX API Sample")] 13 | [assembly: AssemblyCopyright("Copyright © 2017")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("c92958c3-0de1-4eda-bbb1-b5fa8d8e8b9c")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace FIX_API_Sample.Properties 12 | { 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources 26 | { 27 | 28 | private static global::System.Resources.ResourceManager resourceMan; 29 | 30 | private static global::System.Globalization.CultureInfo resourceCulture; 31 | 32 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 33 | internal Resources() 34 | { 35 | } 36 | 37 | /// 38 | /// Returns the cached ResourceManager instance used by this class. 39 | /// 40 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 41 | internal static global::System.Resources.ResourceManager ResourceManager 42 | { 43 | get 44 | { 45 | if ((resourceMan == null)) 46 | { 47 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("FIX_API_Sample.Properties.Resources", typeof(Resources).Assembly); 48 | resourceMan = temp; 49 | } 50 | return resourceMan; 51 | } 52 | } 53 | 54 | /// 55 | /// Overrides the current thread's CurrentUICulture property for all 56 | /// resource lookups using this strongly typed resource class. 57 | /// 58 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 59 | internal static global::System.Globalization.CultureInfo Culture 60 | { 61 | get 62 | { 63 | return resourceCulture; 64 | } 65 | set 66 | { 67 | resourceCulture = value; 68 | } 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | text/microsoft-resx 107 | 108 | 109 | 2.0 110 | 111 | 112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 113 | 114 | 115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | -------------------------------------------------------------------------------- /Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace FIX_API_Sample.Properties 12 | { 13 | 14 | 15 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 16 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] 17 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase 18 | { 19 | 20 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 21 | 22 | public static Settings Default 23 | { 24 | get 25 | { 26 | return defaultInstance; 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /bin/Debug/FIX API Library.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spotware/FIX-API-Sample/4bcbaa67384e79324d8e4cb959a6639df857dfc8/bin/Debug/FIX API Library.dll -------------------------------------------------------------------------------- /bin/Debug/FIX API Library.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spotware/FIX-API-Sample/4bcbaa67384e79324d8e4cb959a6639df857dfc8/bin/Debug/FIX API Library.pdb -------------------------------------------------------------------------------- /bin/Debug/FIX API Sample.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spotware/FIX-API-Sample/4bcbaa67384e79324d8e4cb959a6639df857dfc8/bin/Debug/FIX API Sample.exe -------------------------------------------------------------------------------- /bin/Debug/FIX API Sample.exe.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /bin/Debug/FIX API Sample.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spotware/FIX-API-Sample/4bcbaa67384e79324d8e4cb959a6639df857dfc8/bin/Debug/FIX API Sample.pdb -------------------------------------------------------------------------------- /bin/Debug/FIX API Sample.vshost.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spotware/FIX-API-Sample/4bcbaa67384e79324d8e4cb959a6639df857dfc8/bin/Debug/FIX API Sample.vshost.exe -------------------------------------------------------------------------------- /bin/Debug/FIX API Sample.vshost.exe.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /obj/Debug/DesignTimeResolveAssemblyReferences.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spotware/FIX-API-Sample/4bcbaa67384e79324d8e4cb959a6639df857dfc8/obj/Debug/DesignTimeResolveAssemblyReferences.cache -------------------------------------------------------------------------------- /obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spotware/FIX-API-Sample/4bcbaa67384e79324d8e4cb959a6639df857dfc8/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache -------------------------------------------------------------------------------- /obj/Debug/FIX API Sample.csproj.FileListAbsolute.txt: -------------------------------------------------------------------------------- 1 | c:\users\pcharalampous\documents\visual studio 2015\Projects\FIX API Sample\bin\Debug\FIX API Sample.exe.config 2 | c:\users\pcharalampous\documents\visual studio 2015\Projects\FIX API Sample\bin\Debug\FIX API Sample.exe 3 | c:\users\pcharalampous\documents\visual studio 2015\Projects\FIX API Sample\bin\Debug\FIX API Sample.pdb 4 | c:\users\pcharalampous\documents\visual studio 2015\Projects\FIX API Sample\bin\Debug\FIX API Library.dll 5 | c:\users\pcharalampous\documents\visual studio 2015\Projects\FIX API Sample\bin\Debug\FIX API Library.pdb 6 | c:\users\pcharalampous\documents\visual studio 2015\Projects\FIX API Sample\obj\Debug\FIX API Sample.csprojResolveAssemblyReference.cache 7 | c:\users\pcharalampous\documents\visual studio 2015\Projects\FIX API Sample\obj\Debug\FIX_API_Sample.frmFIXAPISample.resources 8 | c:\users\pcharalampous\documents\visual studio 2015\Projects\FIX API Sample\obj\Debug\FIX_API_Sample.Properties.Resources.resources 9 | c:\users\pcharalampous\documents\visual studio 2015\Projects\FIX API Sample\obj\Debug\FIX API Sample.csproj.GenerateResource.Cache 10 | c:\users\pcharalampous\documents\visual studio 2015\Projects\FIX API Sample\obj\Debug\FIX API Sample.exe 11 | c:\users\pcharalampous\documents\visual studio 2015\Projects\FIX API Sample\obj\Debug\FIX API Sample.pdb 12 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX API Sample\bin\Debug\FIX API Sample.exe.config 13 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX API Sample\obj\Debug\FIX API Sample.exe 14 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX API Sample\obj\Debug\FIX API Sample.pdb 15 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX API Sample\bin\Debug\FIX API Sample.exe 16 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX API Sample\bin\Debug\FIX API Sample.pdb 17 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX API Sample\bin\Debug\FIX API Library.dll 18 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX API Sample\bin\Debug\FIX API Library.pdb 19 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX API Sample\obj\Debug\FIX API Sample.csprojResolveAssemblyReference.cache 20 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX API Sample\obj\Debug\FIX_API_Sample.Properties.Resources.resources 21 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX API Sample\obj\Debug\FIX API Sample.csproj.GenerateResource.Cache 22 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX API Sample\obj\Debug\FIX_API_Sample.frmFIXAPISample.resources 23 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX-API-Sample\FIX API Sample\bin\Debug\FIX API Sample.exe.config 24 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX-API-Sample\FIX API Sample\obj\Debug\FIX API Sample.exe 25 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX-API-Sample\FIX API Sample\obj\Debug\FIX API Sample.pdb 26 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX-API-Sample\FIX API Sample\obj\Debug\FIX API Sample.csprojResolveAssemblyReference.cache 27 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX-API-Sample\FIX API Sample\obj\Debug\FIX_API_Sample.frmFIXAPISample.resources 28 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX-API-Sample\FIX API Sample\obj\Debug\FIX_API_Sample.Properties.Resources.resources 29 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX-API-Sample\FIX API Sample\obj\Debug\FIX API Sample.csproj.GenerateResource.Cache 30 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX-API-Sample\FIX API Sample\bin\Debug\FIX API Sample.exe 31 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX-API-Sample\FIX API Sample\bin\Debug\FIX API Sample.pdb 32 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX-API-Sample\FIX API Sample\bin\Debug\FIX API Library.dll 33 | C:\Users\pcharalampous\Google Drive\Spotware\Code Samples\FIX API Sample\FIX-API-Sample\FIX API Sample\bin\Debug\FIX API Library.pdb 34 | -------------------------------------------------------------------------------- /obj/Debug/FIX API Sample.csproj.GenerateResource.Cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spotware/FIX-API-Sample/4bcbaa67384e79324d8e4cb959a6639df857dfc8/obj/Debug/FIX API Sample.csproj.GenerateResource.Cache -------------------------------------------------------------------------------- /obj/Debug/FIX API Sample.csprojResolveAssemblyReference.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spotware/FIX-API-Sample/4bcbaa67384e79324d8e4cb959a6639df857dfc8/obj/Debug/FIX API Sample.csprojResolveAssemblyReference.cache -------------------------------------------------------------------------------- /obj/Debug/FIX API Sample.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spotware/FIX-API-Sample/4bcbaa67384e79324d8e4cb959a6639df857dfc8/obj/Debug/FIX API Sample.exe -------------------------------------------------------------------------------- /obj/Debug/FIX API Sample.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spotware/FIX-API-Sample/4bcbaa67384e79324d8e4cb959a6639df857dfc8/obj/Debug/FIX API Sample.pdb -------------------------------------------------------------------------------- /obj/Debug/FIX_API_Sample.Properties.Resources.resources: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spotware/FIX-API-Sample/4bcbaa67384e79324d8e4cb959a6639df857dfc8/obj/Debug/FIX_API_Sample.Properties.Resources.resources -------------------------------------------------------------------------------- /obj/Debug/FIX_API_Sample.frmFIXAPISample.resources: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spotware/FIX-API-Sample/4bcbaa67384e79324d8e4cb959a6639df857dfc8/obj/Debug/FIX_API_Sample.frmFIXAPISample.resources -------------------------------------------------------------------------------- /obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spotware/FIX-API-Sample/4bcbaa67384e79324d8e4cb959a6639df857dfc8/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs -------------------------------------------------------------------------------- /obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spotware/FIX-API-Sample/4bcbaa67384e79324d8e4cb959a6639df857dfc8/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs -------------------------------------------------------------------------------- /obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spotware/FIX-API-Sample/4bcbaa67384e79324d8e4cb959a6639df857dfc8/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs -------------------------------------------------------------------------------- /obj/Release/DesignTimeResolveAssemblyReferences.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spotware/FIX-API-Sample/4bcbaa67384e79324d8e4cb959a6639df857dfc8/obj/Release/DesignTimeResolveAssemblyReferences.cache -------------------------------------------------------------------------------- /obj/Release/DesignTimeResolveAssemblyReferencesInput.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spotware/FIX-API-Sample/4bcbaa67384e79324d8e4cb959a6639df857dfc8/obj/Release/DesignTimeResolveAssemblyReferencesInput.cache --------------------------------------------------------------------------------