如何解决当前虚拟追踪止损代码的解决方案/建议
想知道是否有人可以找出以下虚拟追踪止损的解决方案。提醒一下,我对编码也很陌生!
这里的想法是,当交易开始时,Ask 和 Bid 用于标记 OrderOpenTime 之后的最高价 (TicketHighLow[i][3]) 和最低价 (TicketHighLow[i][2])。一旦达到 TrailingStartGap,并且价格回撤到 TrailingStop,订单就会关闭。
要求虚拟跟踪止损应该能够根据 OrderTicket 跟踪每个同时打开的多个订单,而且还可以根据 OrderMagicNumber 进行过滤。
以下代码的问题在于,当打开多个订单时,我标记票证和调整数组大小的方式(我相信)会导致 OrderTicket 与数组中的 HighestHigh 和 LowestLow 不匹配。换句话说;
TicketHighLow[i][1],TicketHighLow[i][2],TicketHighLow[i][3]
变得像
TicketHighLow[h][1],TicketHighLow[i][3]
结果是交易立即开仓和平仓。
关于如何解决这个问题的任何想法将不胜感激!
double TicketHighLow[90][4]; // declare a two dimensional global array
int init()
{
for(int i=ArrayRange(TicketHighLow,0)-1; i >= 0; --i){ TicketHighLow[i][2]=1000; TicketHighLow[i][3]=0; } // initialize array by stamping a high value for LowestLow and low value for HighestHigh
}
// Expert start
int start()
{
OnEveryTick();
return (0);
}
void OnEveryTick()
{
VirtualTrailingStop();
}
void VirtualTrailingStop()
{
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() != 1) // OrderMagicNumber filter
{
continue;
}
ordticket[orders][0] = OrderOpenTime();
ordticket[orders][1] = OrderTicket();
TicketHighLow[orders][0] = OrderOpenTime();
TicketHighLow[orders][1] = OrderTicket(); // I think this is where the problem lays!!!
orders++;
}
if (orders > 1)
{
ArrayResize(ordticket,orders);
ArraySort(ordticket);
ArrayResize(TicketHighLow,orders);
ArraySort(TicketHighLow);
}
for (i = 0; i < orders; i++)
{
if (OrderSelect(ordticket[i][1],SELECT_BY_TICKET) == true)
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
{
if (TicketHighLow[i][1] == OrderTicket())
{
if (Ask > TicketHighLow[i][3])
{
TicketHighLow[i][3] = Ask; // stamping new HighestHigh
}
if (Bid < TicketHighLow[i][2])
{
TicketHighLow[i][2] = Bid; // stamping new LowestLow
}
if ((OrderType() == OP_BUY && TicketHighLow[i][3] - OrderOpenPrice() > TrailingStartGaP*PipValue*Point) ||
(OrderType() == OP_SELL && OrderOpenPrice() - TicketHighLow[i][2] > TrailingStartGaP*PipValue*Point)) // TrailingStartGap reached
{
if ((OrderType() == OP_BUY && TicketHighLow[i][3] - Ask > TrailingStoP*PipValue*Point) ||
(OrderType() == OP_SELL && Bid - TicketHighLow[i][2] > TrailingStoP*PipValue*Point)) // Stop loss reached
{
bool ret = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),4,Blue);
if (ret == true)
{
int error = GetLastError();
if (ret == false && error > 0)
Print("OrderClose() error - ",ErrorDescription(error));
}
}
}
}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。