我不太确定如何用C#术语提出我的问题,所以请忍受冗长的解释。
我正在编写股票交易算法。当算法开始时,它会检查它应用于哪种仪器(在这种情况下,无论是股票还是期货),然后根据工具,为“double x”赋值。
如果它是未来的工具,那么分配是一个简单,平坦的值(在这种情况下,“double x = 5;”。但是,如果它是一个股票,我希望将“x”分配给一个来自另一个对象的值 - 让我们调用对象“Algo2”和值“y”。所以,在我的脚本中,赋值如下:“double x = Algo2.y”(注意:这是编辑器中的惯例我是这个代码块在算法开始时只运行一次。
我在这里想要实现的是告诉我的算法在“公式”中使用“x”时使用“Alv2.y”的最新值,例如“EntryValue = Price + x”。然而,最新发生的是“x”在程序开始时被永久赋值为“Algo2.y”,并且由于该块永远不会再次运行,所以始终保持该值。
任何人都可以帮助使用语法,以便不是将值赋给“x”,而是指向获取“Algo2.y”的最新值吗?
谢谢!
答案 0 :(得分:2)
将'x'设为属性,以便每次请求x时都会获取值。
class StockInstrument
{
public double Value //x isn't a good name, I'll use "Value"
{
get
{
if(...) return 5.0;
else return Algo2.y;
}
}
}
答案 1 :(得分:1)
我会使用方法返回您的最新值
public double GetXValue()
{
if (AlgoType == Algos.Futures)
{
return 5.0;
}
else if (AlgoType == Algos.Stock)
{
return Algo2.y;
}
//else
throw new Exception("unknown algo type");
}
这是非常硬编码的,但它可以使用委托和算法封装来清理,但是在较低的级别 - 这就是想法。此外,有些人更喜欢使用属性 - 只是在get
具有修改影响时不使用属性
public double X
{
get
{
if (AlgoType == Algos.Futures)
{
return 5.0;
}
else if (AlgoType == Algos.Stock)
{
return Algo2.y;
}
//else
throw new Exception("unknown algo type");
}
}
答案 2 :(得分:1)
可以使用类似的内容:
double X {
get {
if(isStock())
return Algo2.y;
else
return 5;
}
}
答案 3 :(得分:1)
为它编写一个函数:
double getAlgo2YValue()
{
return Algo2.y; // or Algo2.getY(), another function if you can't access it
}
在您的主算法中,现在调用:
x = getAlgo2YValue();
更新X。
答案 4 :(得分:1)
Func<int> getX;
if(isFuture)
getX = () => 5;
else
getX = () => Algo.y;
// using getX() will always return the current value of Algo.y,
// in case it's a stock.
int xval = getX();
答案 5 :(得分:0)
给Algo2一个Algo的引用,这样就没有&#39;加倍X&#39;需要复制。然后,Algo可以随时取消引用Algo2中的实际值(线程安全问题?)。
答案 6 :(得分:0)
值数据类型(例如 int )总是按值复制,而不是作为引用复制。但是,您可以做的是以不同的方式构建您的解决方案,然后它将提供正确的价值。例如:
public class ValueContainer
{
protected Algo2 _reference = null;
protected double _staticValue = 0;
public double CurrentValue
{
get
{
if(_reference == null)
return _staticValue;
return _reference.y;
}
}
public ValueContainer(Algo2 reference)
{
_reference = reference;
}
public ValueContainer(double value)
{
_staticValue = value;
}
}
然后,您将x
替换为ValueContainer
实例,并使用CurrentValue
属性获取值。然后使用不同的构造函数创建每个版本:
ValueContainer container = null;
if(stock)
container = new ValueContainer(5);
else
container = new ValueContainer(Algo2);
答案 7 :(得分:0)
您需要的是x
的属性包装器,以根据工具类型控制返回的值。这是一个示例,需要对您的应用进行一些重要的调整。
public class Instrument
{
// an example enum holding types
public InstrumentType Type {get; set;}
// x is not a great name, but following your question's convention...
public double X
{
get
{
if(type == InstrumentType.Stock)
return Algo2.y();
// note that I changed this to be a method rather than a property
// Algo2.y() should be static so it can be called without an instance
else if(type == InstrumentType.Future)
return 5.0;
else
// return some default value here
}
}
}