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

 
WhooDoo22:


Я думаю, вы не поняли мою мысль... если я добавлю несколько скобок, может быть, это будет понятнее. ...вы сделали это...

Я думаю, что я хотел сделать это...

Это потому, что я хотел, чтобы условие...

применялось к участку кода в скобках ("{ }").

Так почему же вы не внесли это изменение в последнюю версию вашего кода. ... если вы хотели это сделать, почему вы этого не сделали?

 
WhooDoo22:

Саймон,


0 на вашем изображении, вероятно, из ... .


Не-а-а! ;)

Давайте совершим путешествие по дорожке документации? Хахаха.

datetime OrderCloseTime( )
Возвращает время закрытия для текущего выбранного ордера. Если время закрытия ордера не равно 0, то выбранный ордер был закрыт и извлечен из истории счета. Время закрытия открытых и отложенных ордеров равно 0.

Примечание: Ордер должен быть предварительно выбран функцией OrderSelect().


Сначала давайте посмотрим на блок кода функции OrderClose(), который я недавно написал...

Далее давайте посмотрим на результат, показанный на снимке панели "Эксперты"...

Аааа, что у нас тут? :)

Я не уверен, какую мысль вы пытаетесь донести до нас, не могли бы вы объяснить, пожалуйста? Print(OrderCloseTime()) очевидно неверен, но он все еще присутствует в вашем коде, почему? Что произошло, когда вы добавили 2 строки кода, которые я предложил?
 

Саймон,

Почему же вы не внесли это изменение в последнюю версию вашего кода? ... если вы собирались это сделать, почему вы этого не сделали?

Дайте мне секунду, чтобы взглянуть, пожалуйста.

Я собирался сделать это раньше, но не собираюсь делать это в настоящее время. Нет причин для такого кодирования...

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

Когда я могу закодировать это вместо этого...

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

Все условия 'if' применяются к тому, что находится внутри скобок ("{}"). Добавление скобок к этому блоку кода (в том виде, в котором я хотел его закодировать) неэффективно и не имеет смысла.


Спасибо.

 

Саймон,


Я не совсем понимаю, какую мысль вы пытаетесь донести до нас, не могли бы вы объяснить, пожалуйста?

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

// replace above code block with...

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

Быстро запустите советника (без функции Print()) в терминале на демо-счете, затем нажмите на панель "Эксперты" и визуализируйте отсутствие нуля (0) среди остальных результатов на панели "Эксперты".

Заметьте, там нет 0. Хм, верно? ;)

Теперь попробуйте покрутить советник (с включенной функцией Print()).

Обратите внимание на 0 в панели "Эксперты".


Вы сделали обоснованное предположение о том, почему в результатах панели "Эксперты" ранее был ноль, и оказались правы (зачеркните "Не-е-е! ;)" в начале сообщения).

0 на вашем изображении, вероятно, от ... .

Print(OrderCloseTime());

Помните? Конечно, помните. :)


Print(OrderCloseTime()) очевидно неверен, но вы все еще держите его в коде, почему?

Пожалуйста, объясните, почему вы считаете его неправильным.

Я включил его в код, чтобы показать вам суть. Суть в следующем: Ноль появляется в панели "Эксперты" из-за того, что этот кусок кода находится в коде.


Что произошло, когда вы добавили 2 строки кода, которые я предложил?

В настоящее время я оперативно работаю над этим. :)


Спасибо

 
WhooDoo22:

Print(OrderCloseTime()), очевидно, неверно, но вы все еще используете его в своем коде, почему?

Пожалуйста, объясните, почему вы считаете его неправильным.

Я включил его в код, чтобы показать вам суть. Суть в следующем: Ноль появляется в панели "Эксперты" из-за того, что этот кусок кода находится в коде.


Последнее изображение, которое вы разместили, показывает, что ордер USDJPY был закрыт в 01:45:35 ... следующая строка кода, которая следует за строкой, закрывшей ордер, это Print(OrderCloseTime()); и это приводит к значению 0 ... . 0 как время даты - это полночь 1 января 1970 года, это не то время, когда вы закрыли ордер, как вы правильно заметили, возвращаемое значение 0 из OrderCloseTime() может также быть, когда ордер открыт или является отложенным ордером, ну, ваш ордер закрыт, вы знаете, что он закрыт, ваше последнее изображение это доказало. . так как же значение 0 может быть правильным? Ответ - оно не может быть правильным, значит, оно неправильное.

 

Саймон,

Я сейчас работаю над этим...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      int ClosedTicketNum = OrderTicket();   //  <---- add this line
      
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      
      OrderSelect(ClosedTicketNum, SELECT_BY_TICKET);   //  <---- add this line

      Print(OrderCloseTime());
      GetLastError();
     }

Спасибо.

 
WhooDoo22:

Саймон,

Почему же вы не внесли это изменение в последнюю версию вашего кода? ... если вы собирались это сделать, почему вы этого не сделали?

Дайте мне секунду, чтобы посмотреть, пожалуйста.

Я собирался сделать это раньше, но не собираюсь делать это в настоящее время. Нет причин для такого кодирования...

Когда я могу закодировать это вместо этого...

Все условия 'if' применяются к тому, что находится внутри скобок ("{}"). Добавление скобок к этому блоку кода (в том виде, в котором я хотел его написать) неэффективно и не служит никакой цели.

Хорошо, посмотрите на этот код. . . .

if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))                                  // 1.
if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}                   // 2.
if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}                  // 3.
if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))   // 4.
     {  
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);                   // 5.
      Print(OrderCloseTime());                                                    // 6.
     }

Я пронумеровал строки, чтобы было легче обсуждать.

Смотрим на строку 1. Какая из других пронумерованных строк кода будет выполнена, если OrderStopLoss() и OrderTakeProfit() равны0?

 

Саймон,

Исправлено, теперь работает как задумано.

if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}                   // 2.
if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}                  // 3.
if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))                                  // 1.
if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))   // 4.
     {  
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);                   // 5.
      Print(OrderCloseTime());                                                    // 6.
     }

Строки 2 и 3.

Спасибо.

 

Саймон,

   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 ClosedTicketNum=OrderTicket();
      
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);

      OrderSelect(ClosedTicketNum,SELECT_BY_TICKET);
      
      Print(OrderCloseTime());
     }

Результат:

Результат панели "Эксперты".

Почему время закрытия ордера представлено в таком виде (1357306061) ?

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

Спасибо.

 

Саймон,

Вот оно... БАМ!

   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());
     }

Еще лучше! Хахаха ;)

Спасибо.

Файлы: