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

 
WhooDoo22:

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

Раздел функции OrderClose() этого упражнения я считаю завершенным.

Раздел функции Print() этого упражнения я считаю завершенным.

Остался только третий раздел, функция OrderModify().

Спасибо.

Вы не устранили проблему, вы обошли ее, это типично, когда проблема не понята. Как я уже сказал, устраняйте причину, а не симптом....

Вы все еще не печатаете номер билета USDJPY, пожалуйста, проверьте исходное требование.

Ваши вызовы MarketInfo() неправильны, даже если они работают...

 

Саймон,

Функция OrderModify() выполняется без ошибок.

Функция OrderPrint() выполняется без ошибок.

Функция OrderClose() выполняется без ошибок.

Пожалуйста, опубликуйте ваш ответ.

Спасибо.

Файлы:
 
WhooDoo22:


Пожалуйста, опубликуйте свой ответ.


RaptorUK:

Вы не устранили проблему, вы обошли ее, это типично, когда проблема не понята. Как я уже говорил, устраняйте причину, а не симптом....

Вы все еще не печатаете номер билета USDJPY, пожалуйста, проверьте исходное требование.

Ваши вызовы MarketInfo() неправильные, даже если они работают....

И в дополнение...

если у вас та же ситуация, что и раньше, где нет ордера USDJPY, у вас будут неудачные вызовы OrderStopLoss(), OrderTakeProfit(), OrderSelect() и OrderType().

Что это должно сделать? Что вы ожидаете от этой строки кода? Пожалуйста, ответьте, не заглядывая в документацию.

GetLastError();

В последнем блоке кода, почему вы хотите выполнить эту строку кода. . . .

   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}

только если ...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       

но вы всегда будете выполнять эту строку кода и весь следующий за ней код, независимо от TP и SL?

   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);} 

Ваш вызов MarketInfo() все еще неправильный ... посмотрите в документации, чтобы узнать почему.

 

Саймон,


Вы не устранили проблему, вы ее обошли...

Какую проблему, по вашему мнению, я еще не исправил?


Вы все еще не печатаете номер билета USDJPY...

Номер заказанного билета.



Ваши вызовы MarketInfo() неправильны, даже если они работают ...

Пример функции MarketInfo() словаря MetaEditor:

Образец:

// MarketInfo() function example;

   double bid   =MarketInfo("EURUSD",MODE_BID);
   double ask   =MarketInfo("EURUSD",MODE_ASK);
   double point =MarketInfo("EURUSD",MODE_POINT);
   int    digits=MarketInfo("EURUSD",MODE_DIGITS);
   int    spread=MarketInfo("EURUSD",MODE_SPREAD);

Вот образец моего блока кода функции OrderClose():

// OrderClose() function code block example;

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

Что, по вашему мнению, не так с форматом образца кода моей функции OrderClose()? Он выглядит почти идентичным образцу 'MarketInfo()', предоставленному словарем MetaEditor.


И в дополнение ...


Что это должно делать? Что вы ожидаете от этой строки кода? Пожалуйста, ответьте, не заглядывая в документацию.

GetLastError();

Функция GetLastError() печатает ошибку на страницу 'Experts' во время выполнения тестов. Если функция не находит ошибки, печатается ноль (0). Обратите внимание на ноль, напечатанный на снимке, который я привел выше.


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

if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}

только если ...

if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))

но вы всегда будете выполнять эту строку кода и весь следующий за ней код, независимо от TP и SL?

if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}


Да, я рад, что вы об этом заговорили, потому что я собираюсь объяснить, почему я так поступаю.

Если все остальные блоки кода опущены из выполнения программы с помощью многострочных комментариев "/* - */" и в рамках функций Start() и Return(0) остаются только два блока кода...

   int i;
   double bid_ask,
          OM_Param_3,
          OM_Param_4;

// code block 1;   

while(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()!="USDJPY")
   
   i++;

// code block 2;

   if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))   
     {
      Print(OrderTicket());     
      GetLastError();
     }

второй блок кода - это вызов функции:

     {
      Print(OrderTicket());     
      GetLastError();
     }

Print() функция продолжает бесконечно печатать число на панель экспертов и продолжает печатать. Я полагал, что если я добавлю...

if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))

функция Print() будет выполняться только один раз, потому что после выполнения функции OrderModify(), расположенной непосредственно под ней, SL и TP больше не будут равны нулю, что приведет к остановке функции Print().

Теперь я понимаю, что это не так из-за того, как выполняется программа. Я понимаю, что программа выполняется сверху вниз, поэтому, когда программа завершила весь цикл в первый раз, она попыталась бы снова выполнить цикл сверху вниз и не смогла бы напечатать тикет на панели "Эксперты", потому что нет ордера на валютной паре USDJPY.


Спасибо.

 
WhooDoo22:

Саймон,


Вы не решили проблему, вы ее обошли...

Какую проблему, по вашему мнению, я еще не решил?

Основную проблему, которая вызвана тем, как вы закодировали ваш цикл while... проблему, которая вызывала Invalid ticket для функции OrderClose иUnknown ticket 2 для OrderModify, вы не устранили, потому что вы устранили симптом.

WhooDoo22:

Ваши вызовы MarketInfo() неправильны, даже если они работают ...

Пример функции MarketInfo() из словаря MetaEditor:


Извините, моя ошибка, вы исправили эту проблему ... Вы знаете, что это была за проблема, на которую я ссылался?

WhooDoo22:

Саймон,

Что это должно делать? Что вы ожидаете от этой строки кода? Пожалуйста, ответьте, не заглядывая в документацию.

Функция GetLastError() печатает ошибку на страницу 'Experts' во время выполнения тестов. Если функция не находит ошибки, печатается ноль (0). Обратите внимание на ноль, напечатанный на снимке, который я привел выше.


Нет, GetLastError() не печатает в журнал. Функция возвращает последнюю возникшую ошибку, после чего значение специальной переменной last_error, в которой хранится код последней ошибки, обнуляется. Таким образом, следующий вызов GetLastError() вернет 0".

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

Print(OrderCloseTime());

. . . и является ошибкой, так как заказ больше не выбран, поскольку он больше не находится в пуле заказов, так как он был закрыт и находится в пуле истории.

   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:

Функция Print() продолжает бесконечно печатать число на панели экспертов и продолжает печатать. Я полагал, что если я добавлю ...

if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))

функция Print() будет выполняться только один раз, потому что после выполнения функции OrderModify(), расположенной непосредственно под ней, SL и TP больше не будут равны нулю, что приведет к остановке функции Print().

Теперь я понимаю, что это не так из-за того, как выполняется программа. Я понимаю, что программа выполняется сверху вниз, поэтому, когда программа завершила весь цикл в первый раз, она попыталась бы снова выполнить цикл сверху вниз и не смогла бы напечатать тикет на панели "Эксперты", потому что нет ордера на валютной паре USDJPY.

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

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

Саймон,

Вы все еще не печатаете номер билета для USDJPY...


Требование было ... "печатать номер билета в журнал в форме "Номер билета для USDJPY = " ".

 

Саймон,


Основная проблема, вызванная тем, как вы закодировали ваш цикл while... проблема, которая вызывала Invalid ticket для функции OrderClose и Unknown ticket 2 для OrderModify, вы не устранили причину, вы устранили симптом.

Я хочу обсудить с вами этот вопрос в мелких деталях сам по себе, что позволит мне сосредоточить свои мысли на его решении, не отвлекаясь на другие моменты.


Извините, моя ошибка, вы исправили этот вопрос ... знаете ли вы, что это была за проблема, на которую я ссылался?

Да, спасибо, что подняли этот вопрос!


"Функция возвращает последнюю возникшую ошибку, после чего значение специальной переменной last_error, в которой хранится код последней ошибки, обнуляется. Таким образом, следующий вызов GetLastError() вернет 0".

Словарь MetaEditor гласит:

int GetLastError( )
Функция возвращает последнюю возникшую ошибку, после чего значение специальной переменной last_error, в которой хранится код последней ошибки, обнуляется. Таким образом, следующий вызов GetLastError() вернет 0.

Эта функция возвращает последнюю возникшую ошибку, после чего значение специальной переменной last error, в которой хранится код последней ошибки, обнуляется....

Зеленый цвет понятен, желтый - не понятен.


. . . добавьте эти две строки и попробуйте.

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

Будет сделано.


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

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

   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))

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


Требование было ... "вывести номер билета в журнал в форме "Номер билета для USDJPY = " ".

Это может быть сделано.


Спасибо.

 
WhooDoo22:


"Функция возвращает последнюю возникшую ошибку, после чего значение специальной переменной last_error, в которой хранится код последней ошибки, обнуляется. Таким образом, следующий вызов GetLastError() вернет 0".

Словарь MetaEditor гласит:

int GetLastError( )
Функция возвращает последнюю возникшую ошибку, после чего значение специальной переменной last_error, в которой хранится код последней ошибки, обнуляется. Таким образом, следующий вызов GetLastError() вернет 0.

Эта функция возвращает последнюю возникшую ошибку, после чего значение специальной переменной last error, в которой хранится код последней ошибки, обнуляется....

Зеленый цвет понятен, желтый - не понятен.

Итак, как видно из документации, GetLastError() ничего не печатает... она простовозвращает номер ошибки... Поэтому, чтобы использовать ее, нужно что-то с ней сделать. .

Print("The last error was error number: ", GetLastError());

//  or . . .

int ErrorNumber = GetLastError();

//  or . . .

if(GetLastError() == 130)

Когда вы вызываете GetLast Error(), она возвращает ошибку, а затем очищает до нуля переменную, которую она использовала для хранения последней ошибки ... так что если вы сделаете это ...

OrderDelete(-1);   //  should produce an error 4108 or 3

Print("Last error was number ", GetLastError());    //  should print - Last error was number 4108

Print("Last error was number ", GetLastError());    //  should print - Last error was number 0  the previous call cleared the GetlastError internal variable
 

то второй вызов GetLastError() вернет 0, так как первый вызов обнулил переменную, хранящую номер ошибки. ... также имейте в виду, что хранится только последняя ошибка.

 
WhooDoo22:


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

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

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

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

Но вы этого не сделали... Вы упустили это при проектировании, затем упустили это при кодировании, затем упустили это при чтении кода и проверке того, что он будет делать то, что вы задумали, затем упустили это при тестировании. ... скобки - это одна из тех фундаментальных вещей, которые вы должны знать как свои пять пальцев.

Вы должны понять, почему вы это упустили, и решить эту проблему... Никто другой не сможет сделать это за вас, если только вы не хотите заплатить им за то, чтобы они написали код за вас.

 

Саймон,


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

Print(OrderCloseTime());


Не-а-а! ;)

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

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

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


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

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

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

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

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


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


Основная проблема, которая вызвана тем, как вы закодировали ваш цикл while... проблема, которая вызывала Invalid ticket для функции OrderClose и Unknown ticket 2 для OrderModify, вы не устранили причину, вы устранили симптом.

Я хочу обсудить с вами этот вопрос в мелких деталях сам по себе, что позволит мне сосредоточить свои мысли на решении этого вопроса, не отвлекаясь на другие моменты.


Спасибо.

Файлы:
Причина обращения: