int lastclosetime=-1;
int lastcloseticket=-1;
int lastdealtype=0;
for (int i=0; i<OrdersHistoryTotal(); i++)
{
if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
if (OrderSymbol()==symbol || OrderMagicNumber()==magic)
{
if (lastclosetime<OrderCloseTime())
{
lastclosetime=OrderCloseTime();
lastcloseticket=OrderTicket();
}
}
}
if (OrderSelect(lastcloseticket, SELECT_BY_TICKET, MODE_HISTORY))
{
if (OrderType()==OP_BUY) lastdealtype=1;
if (OrderType()==OP_SELL) lastdealtype=-1;
}
int GetTypeLastClosePos(int symbol, int magic) // Функция возвращает 0 если последний закрытый Бай, 1 - если Селл и -1 при ошибке
{
int i, lastclosetime=0,
lastdealtype=-1;
for (i=0; i<OrdersHistoryTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Если выбрали ордер в историиif (OrderSymbol()!=symbol) continue; // Если его символ не равен переданному в функцию - идём к следующемуif (OrderMagicNumber()!=magic) continue; // Если его магик не равен переданному в функцию - идём к следующемуif (OrderType()>1) continue; // Если ищем только Бай и Селл, значит если больше единицы - к следующему// ... теперь выбранный ордер соответствует критериям поиска по символу, магику и типуif (lastclosetime<OrderCloseTime()) { // Посмотрим время его закрытия и если оно больше предыдущего, то...
lastclosetime=OrderCloseTime(); // ... запишем его как предыдущее
lastdealtype=OrderType(); // Тип текущего закрытого ордера: 0 для Бай, 1 для Селл
}
}
elseif (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Иначе, если не удалось выбрать ордер в историиPrint ("Func: GetTypeLastClosePos, Ошибка выбора ордера - ",GetLastError()); // Посмотрим номер ошибкиbreak; // Выходим из цикла перебора ордеров
}
}
return(lastdealtype);
}
int LastPoseType=GetTypeLastClosePos(Symbol(), Magic);
if (LastPoseType==OP_BUY) {
// ... код, если последний закрытый Buy ...
}
if (LastPoseType==OP_SELL) {
// ... код, если последний закрытый Sell ...
}
else {// ... код обработки ошибки ... }
elseif (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Иначе, если не удалось выбрать ордер в истории
err=GetLastError(); // Посмотрим номер ошибкиPrint ("Func: GetTypeLastClosePos, Ошибка выбора ордера - ",err); // Сообщим об ошибке и в какой ф-ции она произошлаbreak; // Выходим из цикла перебора ордеров
}
然后在调用函数后处理错误 ...
GetTypeLastClosePos(Symbol(), Magic);
...和错误发生,其数字将被存储在变量err 中,在处理块中,这个数字将被处理。
else {
if (err==???) {
// обработка этой ошибки
}
if (err==???) {
// обработка этой ошибки
}
// ... и т.д. ...
}
我有一个关于拖网的问题,谁能告诉我。这似乎是正确的拖网,以实现收支平衡,但它并不奏效。
这里有一个拖网:https://www.mql5.com/ru/forum/131859
要在文本中插入代码,请按文本输入栏上方的SRC 按钮。
这里有一个拖网:https://www.mql5.com/ru/forum/131859
要在文本中插入代码,请按文本输入栏上方的SRC 按钮。
谢谢你。
我有一个关于拖网的问题,谁能告诉我。它似乎是正确的拖网到收支平衡,但它不工作。
按重要性降序排列的原因清单。
1.电脑没有开机
2.Metatrader没有开机。
3.图表上的脚本没有安装
4.未启用专家顾问系统
5.没有什么可拖累的。
6.代码中有些地方出了问题。
按重要性从高到低的顺序列出原因。
1.电脑没有开机
2.Metatrader没有开机。
3.图表上的脚本没有安装
4.未启用专家顾问系统
5.没有什么可拖累的。
6.代码中有些地方出了问题。
使用OrderOpenTime() 对于--那我们为什么需要它?
所以,是的,但我得到的订单号相当短,但对于OrderOpenTime,我不明白该怎么做,我需要把开放时间 放在某个地方,与列表中的下一个订单进行比较,如果时间更长,就重写变量,等等。我还不了解这个算法。
很好的回答,罗杰,但是电脑是启用的,MetaTrader也是启用的,EA是附在图表上的,EA是启用的,交易是打开的,因此有东西可以拖动!但是,代码有什么问题呢,这就是问题所在。
起初没有代码,你后来附上了。
可能是因为你在开单功能中加入了尾音,也就是说,开单的条件确实出现了,订单被打开了,但它可能没有得到任何进一步发展。
所以,是的,但通过订单号我得到了相当短的时间,但对于OrderOpenTime,我不明白该怎么做,我需要把开放时间放在某个地方,与列表中的下一个订单进行比较,如果时间更长,就重写这个变量,等等。我还不了解这个算法。
序列号是不可靠的,这个编号没有任何保证,只是为了测试者。在前面的几页,我写了搜索最后一个关闭订单的代码。这很简单,我们已经看完了票,然后我们根据票选择了订单 或位置,就这样了。
订单号是不可靠的,在这个编号中没有人保证任何东西,只是对测试者而言。在前面几页,我写了代码来寻找最后一个关闭的订单,对开放的订单也是如此。一切都很简单,我们已经通过它,记住了这个票,然后通过这个票选择了一个订单或一个位置,就是这样。
起初没有代码,你后来加了。
可能是因为你在开单功能中加了尾音,也就是说,开单的条件确实发生了,订单被打开了,但它可能不会有任何进展。
订单号是不可靠的,在这个编号中没有人保证任何东西,只是对测试者而言。在前面几页,我写了代码来寻找最后一个关闭的订单,对开放的订单也是如此。这很简单,我们已经看完了票据,然后我们通过票据选择了一个订单或一个位置,就这样。
代码是错误的。
首先,这里是这样的。
如果命令符号等于符号 变量中的给定符号或 ,则命令魔法等于魔法。因此,如果任何带有符号 的订单被选中,而魔力不同或缺失,条件将被满足。因为不是 这样就是 那样。相应地,我们应该用 or 来代替e,或者,最好是把检查分成独立的字符串--循环会更快,这对优化至关重要。
进一步...按票选:水池 参数被忽略,也就是说,在这里写它没有意义。
当订单被票据成功选中后,我们应该检查它是从哪个订单列表中被选中的--市场订单还是封闭订单。要做到这一点,我们需要检查订单关闭的时间,如果它高于零,那么该订单肯定已经关闭。对于未结头寸,该参数总是等于零。IMHO,在选择了最后一个订单后,我们应该立即检查它的类型,并将其写入变量中。
现在,该函数将看起来像这样。
现在,如果我们想只检查当前图表中的买入或卖出,以及其中哪一个是最后的关闭,我们应该这样调用这个函数。
对于错误处理,原则上我们可以创建一个全局变量,例如int err;并在函数本身的主体中把错误号码存储在这个变量中。
然后在调用函数后处理错误 ...
GetTypeLastClosePos(Symbol(), Magic);
...和错误发生,其数字将被存储在变量err 中,在处理块中,这个数字将被处理。
更好的是,使用开关