在QuickFix中,如何使用Python从标签号中获取标签的名称?例如,对于OrdStatus,如何将标记号5转换为字符串“OrdStatus_CANCELED”?
解决方法:
.净:
如果您使用的是QuickFIX / N,则可以使用DataDictionary实例以及您想要的任何数据源(例如,FIX42.xml)来实现此目的.请注意,您可以分别使用Session的属性SessionDataDictionary和ApplicationDataDictionary来获取与给定Session或应用程序本身关联的DataDictionary实例.
考虑一下这个简单的C#程序:
namespace QuickFixTests
{
using System;
using QuickFix;
using QuickFix.DataDictionary;
using QuickFix.Fields;
class Program
{
static void Main(string[] args)
{
var qfm = new Message();
qfm.SetField(new OrdStatus('4'));
var ordStatus = qfm.GetField(Tags.OrdStatus);
var dd = new DataDictionary("FIX42.xml");
Console.WriteLine(dd.FieldsByTag[39].EnumDict[ordStatus]); // Prints CANCELED
}
}
}
C / Python:
C DataDictionary类有一个方法getValueName
:
bool getValueName( int field, const std::string& value, std::string& name ) const
{
ValueToName::const_iterator i = m_valueNames.find( std::make_pair(field, value) );
if(i == m_valueNames.end()) return false;
name = i->second;
return true;
}
来自Python DataDictionary unit tests之一的以下片段(添加了注释)显示了如何在给定DataDictionary实例的情况下使用getValueName.
# Create a DataDictionary
def setUp(self):
self.object = fix.DataDictionary()
# Add a dummy value
self.object.addValueName( 23, "BOO", "VALUE_23_BOO" )
# Test that the dummy value's name in the dictionary matches what was set
self.assertEquals( "VALUE_23_BOO", self.object.getValueName(23, "BOO", "")