变量不断重置为初始声明值
Variables keep resetting to initial declared values
想知道是否有人可以指出我在这里做错了什么。
仅作为背景知识,我对 MQL4 非常陌生(或根本不熟悉编码)
我编写了以下代码来充当虚拟追踪止损。
我正在尝试根据以下循环锁定 HH(最高价)和 LL(最低价)。然而,当我打印时,看起来 HH 和 LL 都在每次报价时都重置为 Bid 和 Ask,而不是“锁定”。
我有三个问题:
- 我做错了什么?!
- HH 和 LL 是否因为变量声明的位置而连续重置为零?
- 每个订单的 HH 和 LL 都是唯一的吗?如果没有,有没有办法设置它?
(~现在只是占位符 - 可以忽略,我会更正)
非常感谢!
double HH = 0;
double LL = 0;
int orderstotal = OrdersTotal();
int orders = 0;
int ordticket[90][2];
for (int i = 0; i < orderstotal; i++)
{
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderSymbol() != Symbol() || OrderMagicNumber() != ~OrderId~)
{
continue;
}
ordticket[orders][0] = OrderOpenTime();
ordticket[orders][1] = OrderTicket();
orders++;
}
if (orders > 1)
{
ArrayResize(ordticket,orders);
ArraySort(ordticket);
}
for (i = 0; i < orders; i++)
{
if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == ~OrderId~)
{
if (Ask > HH)
{
HH = Ask;
Print("Print(HH)=",HH);
}
if (Bid < LL)
{
LL = Bid;
Print("Print(LL)=",LL);
}
if ((OrderType() == OP_BUY && HH - OrderOpenPrice() > ~TrailingStartGap~*PipValue*Point) ||
(OrderType() == OP_SELL && OrderOpenPrice() - LL > ~TrailingStartGap~*PipValue*Point))
{
if ((OrderType() == OP_BUY && HH - Ask > ~TrailingStop~*PipValue*Point) ||
(OrderType() == OP_SELL && Bid - LL > ~TrailingStop~*PipValue*Point))
{
bool ret = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), ~Slippage~, ~Color~);
if (ret == true)
{
int error = GetLastError();
if (ret == false && error > 0)
Print("OrderClose() error - ", ErrorDescription(error));
}
}
}
}
}
}
tomgyn - 这确实是问题所在,它被放置在 OnTick() 中,因此变量在每个新的价格变动时被初始化。
这是菜鸟犯的错误,当时我不明白代码会 运行 放在那里时每个单笔报价从上到下。
问题已解决。感谢指点和编辑 - 非常感谢!
将 HH 和 LL 声明为全局变量,在 OnTick()
函数之外以避免在每次报价时重新初始化它们。
想知道是否有人可以指出我在这里做错了什么。
仅作为背景知识,我对 MQL4 非常陌生(或根本不熟悉编码)
我编写了以下代码来充当虚拟追踪止损。
我正在尝试根据以下循环锁定 HH(最高价)和 LL(最低价)。然而,当我打印时,看起来 HH 和 LL 都在每次报价时都重置为 Bid 和 Ask,而不是“锁定”。
我有三个问题:
- 我做错了什么?!
- HH 和 LL 是否因为变量声明的位置而连续重置为零?
- 每个订单的 HH 和 LL 都是唯一的吗?如果没有,有没有办法设置它?
(~现在只是占位符 - 可以忽略,我会更正)
非常感谢!
double HH = 0;
double LL = 0;
int orderstotal = OrdersTotal();
int orders = 0;
int ordticket[90][2];
for (int i = 0; i < orderstotal; i++)
{
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderSymbol() != Symbol() || OrderMagicNumber() != ~OrderId~)
{
continue;
}
ordticket[orders][0] = OrderOpenTime();
ordticket[orders][1] = OrderTicket();
orders++;
}
if (orders > 1)
{
ArrayResize(ordticket,orders);
ArraySort(ordticket);
}
for (i = 0; i < orders; i++)
{
if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == ~OrderId~)
{
if (Ask > HH)
{
HH = Ask;
Print("Print(HH)=",HH);
}
if (Bid < LL)
{
LL = Bid;
Print("Print(LL)=",LL);
}
if ((OrderType() == OP_BUY && HH - OrderOpenPrice() > ~TrailingStartGap~*PipValue*Point) ||
(OrderType() == OP_SELL && OrderOpenPrice() - LL > ~TrailingStartGap~*PipValue*Point))
{
if ((OrderType() == OP_BUY && HH - Ask > ~TrailingStop~*PipValue*Point) ||
(OrderType() == OP_SELL && Bid - LL > ~TrailingStop~*PipValue*Point))
{
bool ret = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), ~Slippage~, ~Color~);
if (ret == true)
{
int error = GetLastError();
if (ret == false && error > 0)
Print("OrderClose() error - ", ErrorDescription(error));
}
}
}
}
}
}
tomgyn - 这确实是问题所在,它被放置在 OnTick() 中,因此变量在每个新的价格变动时被初始化。
这是菜鸟犯的错误,当时我不明白代码会 运行 放在那里时每个单笔报价从上到下。
问题已解决。感谢指点和编辑 - 非常感谢!
将 HH 和 LL 声明为全局变量,在 OnTick()
函数之外以避免在每次报价时重新初始化它们。