Предлагаю сразу постить в "правильном виде"
double WHistory() { //--- request trade history HistorySelect(0,TimeCurrent()); //--- create objects string name; uint total=HistoryDealsTotal(); ulong ticket=0; double price; double profit; datetime time; string symbol; long type; long entry; //--- for all deals double Profit_PP=0; Print(total); for(uint i=total-1;i>=0;i--) { { ticket=HistoryDealGetTicket(i); price =HistoryDealGetDouble(ticket,DEAL_PRICE); time =(datetime)HistoryDealGetInteger(ticket,DEAL_TIME); symbol=HistoryDealGetString(ticket,DEAL_SYMBOL); type =HistoryDealGetInteger(ticket,DEAL_TYPE); entry =HistoryDealGetInteger(ticket,DEAL_ENTRY); profit=HistoryDealGetDouble(ticket,DEAL_PROFIT); //--- only for current symbol if(price && time && symbol==Symbol()) { //--- create price object name="TradeHistory_Deal_"+string(ticket); if(entry) { //ObjectCreate(0,name,OBJ_ARROW_RIGHT_PRICE,0,time,price,0,0); //получить id позиции long id=HistoryDealGetInteger(ticket,DEAL_POSITION_ID); for(uint k=i-1;k>=0;k--) { ticket=HistoryDealGetTicket(k); entry =HistoryDealGetInteger(ticket,DEAL_ENTRY); if(id ==HistoryDealGetInteger(ticket,DEAL_POSITION_ID)&&entry==0) { type =HistoryDealGetInteger(ticket,DEAL_TYPE); if(type==DEAL_TYPE_BUY) { Profit_PP=Profit_PP+(price-HistoryDealGetDouble(ticket,DEAL_PRICE)); break; } else { Profit_PP=Profit_PP+(HistoryDealGetDouble(ticket,DEAL_PRICE)-price); break; } } } //найти закрывающую сделку с таким же id } /*else ObjectCreate(0,name,OBJ_ARROW_LEFT_PRICE,0,time,price,0,0); //--- set object properties ObjectSetInteger(0,name,OBJPROP_SELECTABLE,0); ObjectSetInteger(0,name,OBJPROP_BACK,0); ObjectSetInteger(0,name,OBJPROP_COLOR,type?BuyColor:SellColor); if(profit!=0) ObjectSetString(0,name,OBJPROP_TEXT,"Profit: "+string(profit)); */ } } } return(Profit_PP); }
Ошибка.
for(uint k=i-1;k>=0;k--)
for(uint i=total-1;i>=0;i--)
Это каноны C/C++ как нельзя делать)
if(price && time && symbol==Symbol())
зачем каждый раз получать текущий символ?
if(type==DEAL_TYPE_BUY) { Profit_PP=Profit_PP+(price-HistoryDealGetDouble(ticket,DEAL_PRICE)); break; } else { Profit_PP=Profit_PP+(HistoryDealGetDouble(ticket,DEAL_PRICE)-price); break; }
почему бы break не вынести вниз?
PS. Вы еще можете ускорить цикл, если вынесете получение этих вещей внутри if:
type =HistoryDealGetInteger(ticket,DEAL_TYPE); entry =HistoryDealGetInteger(ticket,DEAL_ENTRY); profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Предлагаю сюда постить куски кода с логическими ошибками.
Бывает ошибку сложно отловить по разным причинам.
как на пример вот в этом куске кода. Не сразу понял почему скрипт виснет. )