Вопросы оператора цикла "для - страница 13

 

Саймон,

"Ваш цикл while не нашел ни одного билета ... . ."

Он не "возможно" нашел индекс билета в пуле истории, он нашел его, иначе не были бы выполнены следующие функции :)


" индекс пула != номер билета, разве мы не проходили это раньше?"

Позвольте мне пояснить,

Номер билета ордера - это уникальный номер билета, присвоенный ордеру после отправки заявки.

Номер позиции ордера - это позиция ордера в индексепула ордеров(важно понимать), подобно массиву.


"Почему вы ожидаете, что закрытый ордер USDJPY окажется на той же позиции в совершенно другом пуле, пуле History ?"

Не должен, потому что это отдельный пул.

В коде, который я представил -

   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}
   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {      
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);

      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)
      
      Print(OrderCloseTime());
     }

это, очевидно, выбор ордера из пула истории, верно? По крайней мере, это то, что я понял из документации. Также я недавно попробовал открыть около пяти ордеров на разных валютных парах, закрыл один, затем включил советника и он все равно выполнил все функции, включая Print(OrderCloseTime());.


Спасибо.

 
WhooDoo22:

Саймон,

"Ваш цикл while не нашел ни одного билета ... . ."

Он не "возможно" нашел индекс билета в пуле истории, он нашел его, иначе следующие функции не были бы выполнены. :)

Какие функции вы используете, которые используют номер билета? Ваши OrderSelects все SELECT_BY_POS ... POS означает POSition, поэтому я повторяю, ваш цикл while не находит билет, он находит индекс в пуле заказов.


То, что вы выбираете из пула истории - это ордер в позиции индексаi. Как вы узнаете, что ордер, который вы только что закрыли, находится в позицииi? Ответ - вы не знаете. . вы знаете, что значениеi - это место, где ордер USDJPY находился в пуле ордеров... . пулы полностью разделены и не связаны друг с другом ни в какой форме.
 

Саймон,

"Ваш цикл while не находит билет, он находит индекс в пуле заказов".

Да, я полагаю, что понимаю это. Это не должно быть проблемой.


"Пулы полностью разделены и не связаны друг с другом ни в какой форме."

Это понятно, но блок кода функции OrderClose(), похоже, работает так, как задумано. Я скорректирую блок кода для сохранения значения номера билета заказа, чтобы продолжить то, что вы хотите рассмотреть. Согласны?

ВПЕРВЫЕ, я задам такой вопрос: Почему номер позиции заказа в историческом пуле не должен быть таким же, как номер позиции в текущем пуле? Я считаю, что этот номер должен быть одинаковым.


Спасибо.

 
WhooDoo22:

Саймон,

"Ваш цикл while не находит билет, он находит индекс в пуле заказов".

Да, я полагаю, что понимаю это. Это не должно быть проблемой.


"Пулы полностью разделены и не связаны друг с другом ни в какой форме."

Это понятно, однако блок кода функции OrderClose(), похоже, работает так, как задумано.

Вызов OrderClose() не был изменен, поэтому он должен работать.


Однако это не работает так, как задумано, потому что концепция фатально ошибочна... пока вы не поймете, почему нет смысла продолжать...

 if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}
   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))


   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {      
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);

      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)
      
      Print(OrderCloseTime());
     }
 
WhooDoo22:


ВПЕРВЫЕ, я задам следующий вопрос: Почему бы номер позиции в историческом пуле заказа не совпадал с номером позиции в текущем пуле? Я считаю, что номер должен быть одинаковым.


Зайдите на свой демо-счет, на котором вы тестировали... сколько у вас открытых ордеров? сколько ордеров у вас в истории на вкладке "История счета"?
 

Саймон,

'История счета' содержит пятьдесят шесть.

'Торговля' (открытые ордера) содержит три.


Я жду, когда вы напишете: "Похоже, это действительно работает WhooDoo. :)"

Продолжайте, я проверил номер тикета возвращаемой функции Print(), и она вернула другой номер тикета, чем ордер USDJPY.

Не работает. Подтверждаю. Но я рад, что попробовал, этот урок стоил обсуждения.

Спасибо.

 
WhooDoo22:

Саймон,

'История счета' содержит пятьдесят шесть.

'Торговля' (открытые ордера) содержит три.

Если вы создадите новый ордер USDJPY и запустите ваш код, и он найдет этот новый ордер, i будет иметь значение 3, какую позицию в пуле истории займет ваш ордер USDJPY, когда вы его закроете? Их уже 56, так что позиция 3 уже занята, так же как и позиции 4, 5, 6, 7 ... . 55
 

Саймон,

57.

   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}
   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {      
      int usdjpy_ticket_number=OrderTicket();
      
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);

      if(OrderSelect(usdjpy_ticket_number,SELECT_BY_TICKET,MODE_TRADES)==true)
      
      Print("Ticket number for USDJPY = ",usdjpy_ticket_number);
      Print("Order close time = ",OrderCloseTime());
     }

Спасибо.

Файлы:
 
WhooDoo22:

Саймон,

57.

Спасибо.

i это 3, так как же при выборе ордера в позиции 3 в History Pool удастся получить ордер в позиции 57? ?
 

Саймон,

Не будет. Я недавно вновь открыл это для себя.

Спасибо.