在结构中存储值

Store values in struct

我正在尝试将订单的 OrderProfit、HighestProfit、LowestProfit 保存在结构中

我是这样定义的,作为一个全局变量

struct OrderStats {
  string ThisOrderTicket;
  double CurrentProfit;
  double HighestProfit;
  double LowestProfit; 
};

在我的方法中,我像这样实例化我的结构

// insert order stats into struct
string OrderTicketStatsName = StringConcatenate("OrderTicketStats-", OrderTicket());
string OrderTicketStats = OrderTicketStatsName;

OrderStats OrderTicketStats={};
OrderTicketStats.ThisOrderTicket = OrderTicketStatsName

然后我用

检查我之前保存的数据
// current profit
if(DEBUG) {
    Print("CheckForClose ",OrderTicket(), ":", OrderTypeByName, " : Struct Name is: ", OrderTicketStats.ThisOrderTicket);
    Print("CheckForClose ",OrderTicket(), ":", OrderTypeByName, " : Previous OrderProfit is: ", OrderTicketStats.CurrentProfit);
    Print("CheckForClose ",OrderTicket(), ":", OrderTypeByName, " : Previous OrderProfit is: ", OrderTicketStats.HighestProfit);
    Print("CheckForClose ",OrderTicket(), ":", OrderTypeByName, " : Previous OrderProfit is: ", OrderTicketStats.LowestProfit);
    Print("===================================================");
}

最后,我这样设置我的数据

if(OrderTicketStats.ThisOrderTicket == OrderTicket()) {
    OrderTicketStats.CurrentProfit=OrderProfit();

    // highest profit
    if(OrderProfit() > OrderTicketStats.HighestProfit) {
        OrderTicketStats.HighestProfit = OrderProfit();
    }

    // lowest profit
    if(OrderProfit() < OrderTicketStats.LowestProfit) {
       OrderTicketStats.LowestProfit = OrderProfit();
    }
}

这总是会产生,

CheckForClose 2:SELL : Struct Name is: OrderTicketStats-2
CheckForClose 2:SELL : Previous CurrentProfit is: 0
CheckForClose 2:SELL : Previous HighestProfit is: 0
CheckForClose 2:SELL : Previous LowestProfit is: 0
===================================================
CheckForClose 2:SELL : CurrentProfit is: -0.24
CheckForClose 2:SELL : HighestProfit is: 0
CheckForClose 2:SELL : LowestProfit is: -0.24
===================================================

看看它是如何重置以前的值的?我怎样才能保留我以前的数据?

更新

我已经编辑了我的代码,现在有了这个:

OrderTicketStats = OrderTicket();
OrderStats OrderTicketStats;

if(OrderProfit() > OrderTicketStats.HighestProfit) {
                    OrderTicketStats.HighestProfit = OrderProfit();
                }
if(OrderProfit() < OrderTicketStats.LowestProfit) {
                    OrderTicketStats.LowestProfit = OrderProfit();
                }

我遇到的问题是: 我想保存一个交易 LowProfit,HighProfit 以了解利润极值和订单通过。我同时打开多个订单,然后查看我的日志以查看其影响。

目前,我看到这个:

EURUSD,M15: ===================================================
EURUSD,M15: CheckForClose 1:BUY : OrderTicketStats for: 1
EURUSD,M15: CheckForClose 1:BUY : OrderProfit is: -5.54
EURUSD,M15: CheckForClose 1:BUY : OrderProfit High is: 0
EURUSD,M15: CheckForClose 1:BUY : OrderProfit Low is: -5.54
EURUSD,M15: ===================================================
EURUSD,M15: CheckForClose 3:SELL : OrderTicketStats for: 3
EURUSD,M15: CheckForClose 3:SELL : OrderProfit is: 1.3
EURUSD,M15: CheckForClose 3:SELL : OrderProfit High is: 1.3
EURUSD,M15: CheckForClose 3:SELL : OrderProfit Low is: -5.54

请注意交易 3 的 OrderProfit Low 与交易 1 的相同。这是我的问题

首先,请记住结构可以保持float(double), long(int,short), enum 和其他 struct 同类。如果你有 string 作为你的 struct 的一个字段,你不能通过引用传递它,你不能复制它,你也可能会遇到意想不到的问题。它可能无法编译,它可能编译但不工作,它可能工作但不正确。 如果还不算太晚,将 struct 更改为 class 并且您对它没有任何限制(实例可能是 POINTER_INVALIDNULL,当然,所以了解类 是必需的)。而且,你不需要开发数组来存储一些实例,CArrayObj 已经存在了。另外,您可以通过传递所需的参数来创建一个新实例。

第二点是逻辑。您能否解释一下您希望这条线如何工作
if(OrderTicketStats.ThisOrderTicket == OrderTicket()) {
在我看来,ThisOrderTicket是一个string,在ticketId之前有一些字符,OrderTicket()是一个整数ticketId。所以你写的条件永远不会是真的。我建议在 struct 中声明 int orderTicket,删除无用的 string 字段,并通过
初始化 structInstance.orderTicket=OrderTicket()