помогите найти ошибку в советнике

 

советник работае но сть одна ошибка

он должен закрывать все ордера при срабатывание т.профит,

и он удаляет все ордера правильно при срабатывание ордеров на покупку

,а вот при продаже он закрывае неправитьно- он удаляет все ордера при срабатывание стопа

помогите пожалуста

спс

Файлы:
zedq2.mq4  5 kb
 
А собственно в чём проблема? Советник на каждой свече устанавливает и удаляет 14 ордеров. Код написан довольно бестолково. Можно сказать что этот код - весь - сплошная ошибка. Исходя из каких соображений программист мог бы его испарвить?
 
drknn >>:
Исходя из каких соображений программист мог бы его испарвить?
Денежное вознаграждение?
 

вамбы только на бабки разводить - а помоч видать слабо

 
zedsergei писал(а) >>

вамбы только на бабки разводить - а помоч видать слабо


А Вам зачем этот советник? Не бабки разводить?
 
zedsergei >>:

вамбы только на бабки разводить - а помоч видать слабо


    Одно дело помощь, другое - работа вместо кого-то забесплатно. Вы выкладываете чужой программный код. Чужой код - это прежде всего криптограмма, которую ещё нужно расшифровать. Благо, что Ваш код простой. Но всё равно, думаете, кому-то захочется копаться в нём, вникать в логику, исправлять ошибки и всё это за бесплатно? У вас там одна только функция OrderSend(), употребляемая в коде 14 раз чего стОит - ни обработки ошибок, ни нормализации цен. Класс? А генерация случайного магикнумбера, скажите, зачем в нём нужна? А почему отсутствуют проверки корректности введённых пользователем величин?
 
zedsergei >>:

советник работае но сть одна ошибка

он должен закрывать все ордера при срабатывание т.профит,

и он удаляет все ордера правильно при срабатывание ордеров на покупку

,а вот при продаже он закрывае неправитьно- он удаляет все ордера при срабатывание стопа

помогите пожалуста

спс

вместо этого
     for(i=OrdersTotal();i>=0;i--){
...
поставь так 

int total=OrdersTotal();
for (i=total; i>=0; i--){
 
Michelangelo >>:
вместо этого


Конструкция

int total=OrdersTotal();
for (i=total; i>=0; i--){}

не верна, так как захватывает позицию, на которой ордера нет. Если уже и вести обратный перебор ордеров, то от ордерстотал нужно отнять единицу:

for (int i=OrdersTotal()-1;i>=0;i--){}
 
drknn >>:


Конструкция

не верна, так как захватывает позицию, на которой ордера нет. Если уже и вести обратный перебор ордеров, то от ордерстотал нужно отнять единицу:

не знаю почему, но у меня на такой конструкции один ордер всегда оставался...

далее все одно идет проверка выбора - if (OrderSelect())... :)

 
Michelangelo >>:

не знаю почему, но у меня на такой конструкции один ордер всегда оставался...

далее все одно идет проверка выбора - if (OrderSelect())... :)


Список ордеров лежит в массиве. Поскольку первым элементом является тот, который в нулевой ячейке массива, то последний ордер ляжет в ячейку с номером = OrdersTotal()-1

Пусть в рынке три ордера. Первый лежит в нулевой ячейке массива, содержащего список ордеров, второй - в первой, третий - во второй. Таким образом, если от OrdersTotal() не отнять единицу, то счётчик цикла будет проверять ордер в ячейке с индексом = 3, так как OrdersTotal() вернёт число три.

Конструкция  if (OrderSelect())... тоже не желательна, так как не показывает причину, почему ордер нельзя выбрать, если такой глюк возникает. Правильнее была бы конструкция типа:

for(int i=OrdersTotal()-1;i>=0;i--){
  if(!OrderSelect(i,SELECT_BY_POS, MODE_TRADES)){
    Print("Ошибка № ",GetLastError()," при выборе ордера № ",i);
  }
  else{
    if(OrderType()==OP_SELL){
      // какие-то действия
    }
  }
}
 

огромное спасибо зделал и все работает правильно

спс

Причина обращения: