MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 504

 

안녕하세요!

나는 반나절을 보냈습니다. 왜 간단한 조건이 충족되지 않는지 이해할 수 없습니다. 이해하도록 도와주세요.

      macd1 = iMACD ( _Symbol , PERIOD_CURRENT , 5 , 34 , 5 , 0 , 1 , 0 );
      macd2 = iMACD ( _Symbol , PERIOD_CURRENT , 5 , 34 , 5 , 0 , 1 , 1 );
      highprice1 = High [ 0 ];
      highprice2 = High [ 1 ];
      lowprice1 = Low [ 0 ];
      lowprice2 = Low [ 1 ];
               if (macd1 > 0 && macd1 > macd2 && highprice1 > highprice2) 
                 {
                 maxprice1 = highprice1;
                 macdMAXSell = macd1;
                 Print ( "maxprice1 = highprice1" ,maxprice1);
                 }
               if (macd1 < 0 && macd1 < macd2 && lowprice1 < lowprice2)
                 {
                 minprice1 = lowprice1;
                 macdMAXBuy = macd1;
                 Print ( "minprice1 = lowprice1" ,minprice1);
          	 } 

나는 과거 데이터를 실행하고 값은 macd1,2, lowprice, highprice 변수에 할당되지만 조건이 충족되기를 원하지 않고 머리가 깨져 어디를 파야하는지 이해할 수 없습니다 ... (((

 
Nikolay Gaylis :

아마도 1과 1?/즉. 참 및 오류 코드 1

ERR_NO_RESULT 하나 오류는 없지만 결과를 알 수 없음

당신이하고있는 일에 대한 완전한 혼란과 오해 ...

 bool takelimit;   // Здесь переменная равна false

//--- Здесь вот что: сначала выбирается ордер по тикету (MODE_TRADES здесь не нужно от слова "совсем", что говорит о том, что вы не представляете что вы делаете), 
//--- далее переменной takelimit присваивается результат работы функции выбора ордера, 
//--- и если ордер есть с таким тикетом, или был когда-то, то функция вернёт true, и takelimit будет присвоено true, соответственно, будет выведен код последней ошибки,
//--- что вовсе не говорит, что ошибка здесь была при выборе ордера по тикету - вы же переменную, хранящую код последней ошибки, не сбросили при помощи ResetLastError()
//--- И далее вообще не понятно к чему у вас фигурные скобки - они висят в пустоте, а это составной оператор, который должен после условия идти.

if (takelimit= OrderSelect (ticket, SELECT_BY_TICKET , MODE_TRADES ))
   Print ( string (takelimit)+ "   :" , GetLastError ()); //здесь возвращает число 11, получается ошибка код 11, но не нашел расшифровку нигде?
  {
   if ( iBarShift ( Symbol (), 0 , OrderOpenTime ())== 1 )
      deletelimit= OrderDelete (ticket);
   if (!deletelimit)
       Comment ( GetLastError ());
  }
//+------------------------------------------------------------------+
//--- А нужно примерно так (фигурные скобки специально оставил для понимания где какой блок кода):
   ResetLastError ();
   if ( OrderSelect (ticket, SELECT_BY_TICKET ) && OrderCloseTime ()== 0 )
     {
       if ( iBarShift ( Symbol (), PERIOD_CURRENT , OrderOpenTime ())== 1 )
        {
         if (! OrderDelete (ticket))
             Print ( "Ошибка удаления ордера #" ,( string )ticket, ": " , GetLastError ());
        }
     }
   else
     {
       Print ( "Ошибка выбора ордера #" ,( string )ticket, ": " , GetLastError ());
     }
 
Вадим Мотеюнас :

첫 번째 변수가 bool 유형이고 GetLastError가 필요하지 않기 때문에 Print (takelimit, GetLastError ())라는 문구는 두 개의 값을 반환합니다. 쉼표가 있습니까? GetLastError는 GetLastError가 호출되었을 때 코드의 마지막 오류를 반환합니까?

예 .. 두 가지 값이 있습니다. 인쇄 .....

작성하신 내용과 거의 동일합니다.

 int ticket;

void Fn()
  {
   ResetLastError (); //Сбрасываем код предыдущей ошибки
   if (! OrderSelect (ticket, SELECT_BY_TICKET , MODE_TRADES )){ Print ( GetLastError ());} //Если не выбран ордер по указанному тикету-принтим код ошибки
   else //иначе(если ордер нашёлся)
     {
       if ( iBarShift ( Symbol (), 0 , OrderOpenTime ())== 1 && ! OrderDelete (ticket)){ Comment ( GetLastError ());} //Если выбранный ордер открылся на предыдущем баре и не удалось его удалить(надеюсь Вы работаете с отложенниками)-тогда выводим комент ошибки
     }
  }
 
Nikolay Gaylis :

예 .. 두 가지 값이 있습니다. 인쇄 .....

작성하신 내용과 거의 동일합니다.

그리고 당신은 거기에 있습니다 ...
주문이 이미 삭제된 경우에는 어떻게 됩니까?
 
Artyom Trishkin :

당신이하고있는 일에 대한 완전한 혼란과 오해 ...

사실 나는 아무 것도 하지 않지만 사람이 11이 아니라 1과 1)))을 출력한다고 가정했다.

그리고 그냥 뭔가...

 
Artyom Trishkin :

당신이하고있는 일에 대한 완전한 혼란과 오해 ...

아..그렇게 틀린말을 하시네요...분명히)

 
Nikolay Gaylis :

사실 나는 아무 것도 하지 않지만 사람이 11이 아니라 1과 1)))을 출력한다고 가정했다.

이 줄처럼:

 Print ( string (takelimit)+ "   :" , GetLastError ());

"11"을 인쇄할 수 있습니까?

그런 다음 "1:1"을 인쇄합니다.

이 경우 오류 코드 1은 오류가 아니지만 결과를 알 수 없습니다.

 
Artyom Trishkin :

이 줄처럼:

"11"을 인쇄할 수 있습니까?

그런 다음 "1:1"을 인쇄합니다.

이 경우 오류 코드 1은 오류가 아니지만 결과를 알 수 없습니다.

예, 이미 다시 작성했습니다!-위를 읽으십시오 ...

 
Nikolay Gaylis :

아..그렇게 틀린말을 하시네요...분명히)

글쎄요, 나는 당신이 대답한 사람에게 거기에 대답했습니다. 그러나 당신은 그에게 모든 것을 올바르게 말하지 않았습니다. MODE_TRADES가 필요할 때와 필요하지 않을 때 읽으십시오. 그리고 티켓 으로 주문을 선택하는 방법.

 
Artyom Trishkin :

네, 당신이 대답했던 그 사람에게도 나는 거기에서 대답했습니다. 그러나 당신은 그에게 모든 것을 올바르게 말하지 않았습니다. MODE_TRADES가 필요할 때와 필요하지 않을 때 읽으십시오. 그리고 티켓 으로 주문을 선택하는 방법.

MODE_TRADES는 아직 그를 보지 않고 11이 인쇄 한 조각 만 ...