bool Tr2MT::UpdOrder(int n) // Только если есть тикет или угадываем
{
string str;
int i;
bool flag=false;
MTOrder ord_tmp={0};
ulong ticket=Orders[n].Ticket;
if(ticket==0)
{
if(!GuessOrdTicket(n))returnfalse; // Если угадываем - он будет в Orders[n].Ticketelse ticket=Orders[n].Ticket;
}
switch(FindOrder(ticket,Orders[n].Time+100000))
{
case ORD_FOUND: //изменён или просто проверка//update (sync) orderif(Orders[n].Price==OrderGetDouble(ORDER_PRICE_OPEN)) // Цена не изменилась
{
if(Orders[n].State==(ENUM_ORDER_STATE)OrderGetInteger(ORDER_STATE)&&Orders[n].MTState!=ORD_NA)
{
if(Orders[n].Vol==OrderGetDouble(ORDER_VOLUME_CURRENT))
returntrue; // Не нужно сохранять состояние, можно сразу выйтиelse
Orders[n].Vol=OrderGetDouble(ORDER_VOLUME_CURRENT);
}
else
{
//Orders[n].State=(ENUM_ORDER_STATE)OrderGetInteger(ORDER_STATE);
SetOrdState(Orders[n],(ENUM_ORDER_STATE)OrderGetInteger(ORDER_STATE)); // Обнулит и TimeNotFoundif(Orders[n].Vol!=OrderGetDouble(ORDER_VOLUME_CURRENT))
Orders[n].Vol=OrderGetDouble(ORDER_VOLUME_CURRENT);
}
}
else// Цена изменилась
{
ord_tmp=Orders[n];
//ord_tmp.State=(ENUM_ORDER_STATE)OrderGetInteger(ORDER_STATE);
SetOrdState(ord_tmp,(ENUM_ORDER_STATE)OrderGetInteger(ORDER_STATE));
ord_tmp.Price=OrderGetDouble(ORDER_PRICE_OPEN);
ord_tmp.Vol=OrderGetDouble(ORDER_VOLUME_CURRENT);
switch(Orders[n].Type)
{
caseORDER_TYPE_BUY:
caseORDER_TYPE_BUY_LIMIT:
if(ord_tmp.Price>Orders[n].Price) // Цена ордера увеличилась, перемещаем вверх (по массиву - вниз)
{
for(i=n;i>=0;i--)
{
if(i==0// Конец массива ордеров
|| ord_tmp.Price<=Orders[i-1].Price) // Следующий - по большей цене, вставляем перед ним
{
Orders[i]=ord_tmp;
break;
}
else
{
Orders[i]=Orders[i-1]; // Сдвигаем следующий элемент
}
}
}
else// Цена ордера умньшилась, перемещаем вниз (по массиву - вверх)
{
for(i=n;i<ArraySize(Orders);i++)
{
if(i==ArraySize(Orders)-1// Конец массива ордеров
|| Orders[i+1].Ticket==0// Следующий элемент пустой
|| ord_tmp.Price>Orders[i+1].Price // Следующий - по меньшей цене, вставляем перед ним
|| Orders[i+1].Price>Orders[i].Price) // Следующий - ордер уже на продажу
{
Orders[i]=ord_tmp;
break;
}
else
{
Orders[i]=Orders[i+1]; // Сдвигаем следующий элемент
}
}
}
break;
caseORDER_TYPE_SELL:
caseORDER_TYPE_SELL_LIMIT:
if(ord_tmp.Price>Orders[n].Price) // Цена ордера увеличилась, перемещаем вверх (по массиву - вниз)
{
for(i=n;i>=0;i--)
{
if(i==0// Конец массива ордеров
|| Orders[i-1].Ticket==0// Следующий элемент пустой
|| ord_tmp.Price<Orders[i-1].Price // Следующий - по большей цене, вставляем перед ним
|| Orders[i-1].Price<Orders[i].Price) // Следующий - ордер уже на покупку
{
Orders[i]=ord_tmp;
break;
}
else
{
Orders[i]=Orders[i-1]; // Сдвигаем следующий элемент
}
}
}
else// Цена ордера умньшилась, перемещаем вниз (по массиву - вверх)
{
for(i=n;i<ArraySize(Orders);i++)
{
if(i==ArraySize(Orders)-1// Конец массива ордеров
|| ord_tmp.Price>Orders[i+1].Price) // Следующий - по меньшей цене, вставляем перед ним
{
Orders[i]=ord_tmp;
break;
}
else
{
Orders[i]=Orders[i+1]; // Сдвигаем следующий элемент
}
}
}
break;
default:
returnfalse;
break;
}
}
SaveState();
//str=OrdString();//Log(str);break;
case ORD_HIST_FOUND: //исполнен || снят//delete orderif(!DelOrder(n))
returnfalse;
SaveState();
str=OrdHistString(ticket); // Уточнить
Log(str);
break;
case ORD_NOT_FOUND: //отправлен в историю?if(Orders[n].MTState!=ORD_NA)
{
Orders[n].MTState=ORD_NA;
Orders[n].TimeNotFound=TimeCurrent();
SaveState();
printf(__FUNCTION__, "Order not found, ticket:",IntegerToString(Orders[n].Ticket)," TimeNF:",TimeToString(Orders[n].TimeNotFound,TIME_SECONDS));
}
else
{
if(TimeCurrent()-Orders[n].TimeNotFound>60) // > 60 секунд не найден
{
if(!DelOrder(n))
returnfalse;
SaveState();
str="Order not found >60s "+IntegerToString(ticket)+"\n";
Log(str);
}
}
break;
default:
returnfalse; //не тот ордерbreak;
}
returntrue;
}
在其结构或数组中存储所需的价格和门票,也许还有其他东西,如时间,并在添加后立即按价格排序。按资源来说,如果你不经常看,也是一样的,或者更贵一点,如果你经常看,最好能记住。当然,如果你没有100500个订单)那么它可能太贵了。一般来说,结构或多维数组中的排序只解决了第一个索引的问题,很遗憾。
有时我使用几个具有相同索引的一维数组,门票、时间、价格。并通过必要的财产索引进行搜索。例如,我们得到一个较小的时间或较大的价格的指数,并得到必要的订单的票。 当然,这是一个拐杖,但它的作用很明显。
在其结构或数组中存储所需的价格与门票,也许还有其他东西,如时间,并在添加后立即按价格排序。按资源来说,如果你不经常看,也是一样的,或者更贵一点,如果你经常看,最好能记住。当然,如果你没有100500个订单)那么它可能太贵了。一般来说,结构或多维数组中的排序问题只解决了第一个索引的不幸。
有时我使用几个具有相同索引的一维数组,门票、时间、价格。并通过必要的财产索引进行搜索。例如,如果我们得到一个较小的时间或较大的价格的指数,我们获得必要的订单的票。 当然,这是一个拐杖,但它非常好用。
我曾这样做过。
数组总是被排序的,一个新的订单被插入到所需的点上,并对其他订单进行移位,当一个订单被删除时,会有一个移位。
但这是在MT5中
我曾这样做过。
数组总是被排序的,一个新的订单被插入到正确的位置,其他的订单会被转移,当一个订单被删除时,会有一个转移。
但这是在MT5中。
如果能有在写、删和排序过程中进行移位的代码就更好了。对我来说,按字段对数组结构进行排序并不是一件简单的事情。是的,也有轮班)。
写入、删除和排序的移位代码就好了。对我来说,按字段对数组结构进行排序并不是一件简单的事情。还有轮班)。
可能也是最有趣的部分。
谢谢你。
不错。我不喜欢arrays)))),如果不在数组中进行调试,第一次就不会成功。)))特别是移位、复制、排序不规范)))谢谢你。
不错。我不喜欢arrays)))),如果不在数组中进行调试,第一次就不会成功。)))特别是移位、复制、排序不规范)))每个工具都有其自身的优点。
但是,阴险的逐个错误检查和重新检查))
这就是对你的旧代码进行重新审视的意义所在!
我看到两个相同的缺陷,是以前版本的残余。
一个明显的次优情况。
还有一个过时的设计。
寻找一个免费的MT5专家顾问,当达到设置中指定的盈利或亏损时,将全部关闭头寸,并立即按照设置中指定的方向开立新的头寸。谁能给我一个该主题的链接?
或者你知道有一种EA,如果它看到市场上没有开仓,就只开1个仓位,不关闭。
MT4 1353
日志中显示的是什么样的错误?
代码正常工作
MT4 1353
日志中显示的是什么样的错误?
该代码工作正常。
看起来有些通过 "new "创建的对象在退出时没有被销毁。