KimIV的有用功能 - 页 85

 

结果,在关闭块中添加了一个自定义的位置计数,结果是 "正确的 "关闭,但在日志中仍会弹出几次错误131

考虑到已经有一个订单的检查,这样在循环中插入一个订单数是否正常?

你能纠正代码以避免错误131吗?

非常感谢你。

附加的文件:
codz2.mq4  5 kb
 
hope писал(а)>>

能否请你调整一下代码,以避免错误131?

非常感谢你。

谁会在分割后为你规范地段大小?因此出现了错误。

 

亚历克斯,在将手数传给关闭函数之前,用NormalizeLot() 对其大小进行规范化处理。

 

谢谢伊戈尔、亚历山大。

事实上,我在函数SELLCLOSED_1=OrderClose( OrderTicket(), Lot/3, Ask, 0, Red )中用0.01替换了Lot/3(Lot/2, Lot)来检查手数,并避免了错误131。我们可以让它像这样(0.01),但是,首先,以Lot形式关闭更正确。第二,我以前从未遇到过用户函数及其在程序中的调用,结果发现这相当有趣。我似乎已经在代码中正确地附加了所有的东西,一切都在工作,但错误131仍然存在。请看一下代码。也许我在NormalizeLot的调用函数中搞砸了什么。

附加的文件:
cod3.mq4  6 kb
 

歉意。在原代码中,这一行

RefreshRates()。
BUYCLOSED_1=OrderClose( OrderTicket(), CloseLot, Bid, 0, Red ) 。

是正确的LotClose,符合条件。

Lot =OrderLots(); // NUMBER OF LOTS
LotClose =NormalizeLot(Lot); // NORMALIZED LOT的值被分配给CLOSED LOT。

发帖时的错误........

 
hope писал(а)>>

请看一下代码。也许你在NormalizeLot调用函数中弄错了什么。

尝试更换

  if ( ro) l=MathCeil( lo* k)/ k; else l=MathFloor( lo* k)/ k;

  if ( ro) l=NormalizeDouble(MathCeil( lo* k)/ k,2); else l=NormalizeDouble(MathFloor( lo* k)/ k,2);
 

早上好,亚历山大。

不幸的是,你的提示并没有帮助。我解析了日志,发现错误发生在两种情况下,当一个批次的一部分关闭时,几乎与另一部分的关闭重合。

在时间上没有重合的情况下,那么部分地段就会被关闭,不会出现错误。

我试图分别对收盘买入的手数和收盘卖出的手数进行标准化,但没有成功。


批量,//选定顺序中的批量数量
阄闭买。
LotCloseSell。

............................

Lot =OrderLots();
LotCloseBuy =NormalizeLot(Lot);

LotCloseSell =NormalizeLot(Lot);

............................

BUYCLOSED_3=OrderClose( OrderTicket(, LotCloseBuy, Bid, 0, Red )

...........................

SELLCLOSED_3=OrderClose( OrderTicket(), LotCloseSell, Ask, 0, Red ) 。

...................

伊戈尔的职能

NormalizeLot.........

你有什么想法吗?

 

我是什么羊啊!?Ugh - 这是令人厌恶的....

对订单循环中的批次进行规范化处理

//--------------------------------------------------------------- 4 --
//计算订单
Symb=Symbol(); //金融工具的名称。
BuyTotal=0; // 买入订单的数量
SellTotal=0; // 卖出订单的数量
for(int i=1; i<=OrdersTotal(); i++) // 订单循环
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // 如果如下
{ // 订单分析:
if (OrderSymbol()!=Symb)继续; // 不是我们的金融工具
if (OrderType()>1) // Pending
{
Alert("Pending order detected. Expert Advisor not working." );
return; // Exit start()
}
if (OrderType()==OP_BUY)
{
BuyTotal++; // 买入订单计数器
BuyOrdOpPrice=OrderOpenPrice(); // 打开买入价格
}
if (OrderType()==OP_SELL)
{
SellTotal++; // 卖出订单计数器
SellOrdOpPrice=OrderOpenPrice(); // 打开卖出价格
}
Ticket=OrderTicket(); // 选择的订单号码。
Tip =OrderType(); // 所选订单的类型。
Lot =OrderLots();

LotCloseBuy =NormalizeLot(Lot);

LotCloseSell =NormalizeLot(Lot);
}
}

....,我创建了一个单独的循环来核算未平仓的订单,在这里我不得不将手数正常化来平仓!!。

//--------------------------------------------------------------- 6 --

// 检查未结订单
int _GetLastError = 0, _OrdersTotal = OrdersTotal();
int z;


//---- 遍历所有未结头寸 for ( z = _OrdersTotal-1 ; z >=0; z -- ) { //循环 - 遍历所有未结订单 //---- 如果在选择头寸时发生错误,继续下一步 if ( !OrderSelect( z, SELECT_BY_POS ){ _GetLastError = GetLastError(); Print("OrderSelect( ", z, " , SELECT_BY_POS ) - Error #", _GetLastError ); continue; }//完成 //绑定货币和Majik //---- 如果当前工具没有开仓,跳过它 if ( OrderSymbol() != Symbol() continue; // ERROR //完成














//---- 如果MagicNumber不等于Expert_ID,跳过这个位置
if ( OrderMagicNumber() != Expert_ID ) continue; // ERROR
//Finished
if ( OrderType()==OP_BUY)
{
BuyClot=OrderLots();
}
如果(OrderType()==OP_SELL)
{
SellClLot=OrderLots();
}
OpenedLots=OrderLots();
LotCloseBuy =NormalizeLot(OpenedLots); // Number of lots
LotCloseSell =NormalizeLot(OpenedLots); // Number of lots

//检查是否有买入仓位。

........................................

谢谢你,伊戈尔,亚历山大。如果没有批量正常化功能,仍然会处于死锁状态....

 

晚上好。

而最开始出现的错误。

2009.07.08 21:05:45 TestGenerator: unmatched data error (volume limit 651 at 2009.07.08 19:00 exceeded)
is critical or is it just a tester error?

谢谢你。

 
伊戈尔--请看这里的"GAP指标"