├── .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
--------------------------------------------------------------------------------