0
174
Неправильный код модификации сразу множества позиций:
if(PositionsTotal()>0) { if(PositionSelect(_Symbol)) { OP_double=double (PositionGetDouble(POSITION_PRICE_OPEN)); TP_double=double (PositionGetDouble(POSITION_TP)); P_type=int(PositionGetInteger(POSITION_TYPE)); P_opentime=int(PositionGetInteger(POSITION_TIME)); if(P_type==0 && Sar_array_base[1]>OP_double && Sar_array_base[1]<Low_base[1] && Sar_time_base[1]>P_opentime) { trade.PositionModify(_Symbol,Sar_array_base[1],TP_double); } if(P_type==1 && Sar_array_base[1]<OP_double && Sar_array_base[1]>High_base[1] && Sar_time_base[1]>P_opentime) { trade.PositionModify(_Symbol,Sar_array_base[1],TP_double); } } }
Предполагалось, что модифицироваться должны все позиции одновременно. В коде допустил две ошибки:
- Нет счетчика - перебора позиции (это по невнимательности);
- Выбор позиции по символу - это вообще неудачный вариант выбора позиций, так как это приводит к тому, что советник выбирает для работы только одну позицию из множества.
А теперь, на мой взгляд, наиболее правильный вариант:
double OP_double,TP_double; int P_type,P_opentime; string P_symbol; if(PositionsTotal()>0) { for(int i=PositionsTotal();i>=0;i--) { if(PositionGetTicket(i)) { OP_double=double (PositionGetDouble(POSITION_PRICE_OPEN)); TP_double=double (PositionGetDouble(POSITION_TP)); P_type=int(PositionGetInteger(POSITION_TYPE)); P_opentime=int(PositionGetInteger(POSITION_TIME)); P_symbol=string(PositionGetString(POSITION_SYMBOL)); if(P_symbol==Symbol()) { if(P_type==0 && Sar_array_base[1]>OP_double && Sar_array_base[1]<Low_base[1] && Sar_time_base[1]>P_opentime) { trade.PositionModify(PositionGetInteger(POSITION_TICKET),Sar_array_base[1],TP_double); } if(P_type==1 && Sar_array_base[1]<OP_double && Sar_array_base[1]>High_base[1] && Sar_time_base[1]>P_opentime) { trade.PositionModify(PositionGetInteger(POSITION_TICKET),Sar_array_base[1],TP_double); } } } } }
Таким образом, перебираются все позиции, далее в случае совпадения символа, модифицируются.