将值存储在struct

时间:2018-03-22 21:04:51

标签: mql4

我正在尝试在结构中保存订单的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
===================================================

了解它如何重置Previous值?我如何才能获得以前的数据?

更新

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

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的相同之处<那是我的问题

1 个答案:

答案 0 :(得分:0)

首先,请注意结构可以保持floatdouble),longintshort),{{1和同类的其他enum。如果您将struct作为string的字段,则无法通过引用传递,您无法复制它,并且您也可能会遇到意外问题。它可能无法编译,它可能编译但不工作,它可能工作但不正确。 如果还不算太晚,请将struct更改为struct,您对此没有任何限制(当然,实例可能是classPOINTER_INVALID需要课程)。此外,您不需要开发数组来存储一些实例,NULL已经存在。此外,您可以通过传递所需参数来创建新实例。

第二点是关于逻辑。你能否解释一下你如何期待这条生产线的运作? CArrayObj
在我看来,if(OrderTicketStats.ThisOrderTicket == OrderTicket()) {ThisOrderTicket,在ticketId之前有一些字符,string是整数ticketId。所以你写的条件永远不会成真。我建议在OrderTicket()内声明int orderTicket,将struct字段删除为无效,并按以下方式初始化 string等。