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

 
Roman Sharanov :
말해봐, Expert Advisor가 열었던 모든 주문을 기호로 닫는 기능이 올바르게 구현되어 있습니까?

아키텍처 자체가 맞습니다. 수표 부재 및 일부 기능 사용 시 오류:

 bool OrderCloseAll()
{
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
   {
         if (! OrderSelect (i, SELECT_BY_POS , MODE_TRADES )
             continue ;

         if ( OrderSymbol () != Symbol () || OrderMagicNumber () != Magic)
             continue ;
         
         if (! OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), slippage, clrWhite ))
             return false ;
   }

   return true ;
}

  1. 귀하의 경우 첫 번째 반복이 실패합니다. OrdersTotal() 인덱스가 있는 주문이 존재하지 않습니다.
  2. OrderSelect 함수의 결과에 대한 검사는 없습니다.
  3. OrderClose 함수의 결과를 확인하지 않습니다. 주문 마감에 실패한 경우 마감이 실패한 이유를 확인해야 하므로 동일한 기능을 유지할 수 없습니다. 이렇게 하려면 false 결과로 함수를 종료하고 함수 외부에서 다음에 수행할 작업을 결정합니다.
  4. 모든 주문에 동일한 종가를 적용할 수는 없습니다. 첫째, 주문의 유형이 다를 수 있으며, 둘째, 이전 주문(종료)을 실행하는 동안 가격이 변경되었을 가능성이 큽니다. 어떤 가격을 사용할지 추측하지 않기 위해 MT4 기능을 사용할 수 있습니다. 시장 주문이 마감되는 순간까지 OrderClosePrice() 값은 주문 유형에 따라 Bid 또는 Ask 가격입니다.
 
Ihor Herasko :

아키텍처 자체가 맞습니다. 수표 부재 및 일부 기능 사용 시 오류:

  1. 귀하의 경우 첫 번째 반복이 실패합니다. OrdersTotal() 인덱스가 있는 주문이 존재하지 않습니다.
  2. OrderSelect 함수의 결과에 대한 검사는 없습니다.
  3. OrderClose 함수의 결과를 확인하지 않습니다. 주문 마감에 실패한 경우 마감이 실패한 이유를 확인해야 하므로 동일한 기능을 유지할 수 없습니다. 이렇게 하려면 false 결과로 함수를 종료하고 함수 외부에서 다음에 수행할 작업을 결정합니다.
  4. 모든 주문에 동일한 종가를 적용할 수는 없습니다. 첫째, 주문의 유형이 다를 수 있으며, 둘째, 이전 주문(종료)을 실행하는 동안 가격이 변경되었을 가능성이 큽니다. 어떤 가격을 사용할지 추측하지 않기 위해 MT4 기능을 사용할 수 있습니다. 시장 주문이 마감되는 순간까지 OrderClosePrice() 값은 주문 유형에 따라 Bid 또는 Ask 가격입니다.

고마워요, 주된 문제는 아마도 같은 가격의 응용 프로그램이었을 것입니다.

 

OrderSelect에 대한 도움말에서 " SELECT_BY_POS 매개변수를 사용 하여 주문을 순차적으로 선택할 때 정보는 거래 서버에서 가져온 순서대로 제공됩니다. 수신된 주문 목록의 정렬은 보장되지 않습니다."

이 문구가 인증서에 헛되이 삽입되었다고 생각하면 모든 것이 정상입니다. 헛된 것이 아니라고 생각되면 주문 목록을 순환하는 동안이 목록을 변경해서는 안됩니다. 주문 중 하나가 서버에서 삭제되고 OrdersTotal이 더 작은 새로운 최신 목록이 도착한 후 주문이 어떻게 주문될지는 알 수 없습니다. 삭제하지 않고 목록의 변경되지 않은 동일한 사본을 실행하고 삭제할 거래 티켓의 모든 수를 (배열로) 수집하는 것이 더 안정적입니다. 그런 다음 이 목록을 잊어버리고 티켓으로 선택하여 거래를 삭제하십시오.

물론, 수정된 목록의 순서가 유지된다고 믿고 싶습니다. 적어도 이 경우에는 순서가 지정되지 않은 목록의 끝에서 여러 주문을 삭제하지만 개발자는 반대합니다. 이제 작동하지만 새로운 빌드가 릴리스됩니다 - "경고했습니다."

 
Vladimir :

OrderSelect에 대한 도움말에서 " SELECT_BY_POS 매개변수를 사용 하여 주문을 순차적으로 선택할 때 정보는 거래 서버에서 가져온 순서대로 제공됩니다. 수신된 주문 목록의 정렬은 보장되지 않습니다."

이 문구가 인증서에 헛되이 삽입되었다고 가정하면 모든 것이 정상입니다. 헛된 것이 아니라고 생각되면 주문 목록을 순환하는 동안이 목록을 변경해서는 안됩니다. 주문 중 하나가 서버에서 삭제되고 OrdersTotal이 더 작은 새로운 최신 목록이 도착한 후 주문이 어떻게 주문될지는 알 수 없습니다. 삭제하지 않고 동일한 변경되지 않은 목록 인스턴스를 실행하고 삭제할 모든 수의 거래 티켓을 (배열로) 수집하는 것이 더 안정적입니다. 그런 다음 이 목록을 잊어버리고 티켓으로 선택하여 거래를 삭제하십시오.

물론, 수정된 목록의 순서가 유지된다고 믿고 싶습니다. 적어도 이 경우에는 순서가 지정되지 않은 목록의 끝에서 여러 주문을 삭제하지만 개발자는 반대합니다. 이제 작동하지만 새로운 빌드가 릴리스됩니다 - "경고했습니다."

이 "America"는 이미 300 년 동안 열려 있습니다 :)

 
Artyom Trishkin :

이 "America"는 이미 300 년 동안 열려 있습니다 :)

나는 초보자를 대신하여 여기에 질문하는 사람들이 이미 그것을 스스로 발견했다고 생각하지 않습니다. 그러므로 나는 글을 쓰고 있다. 중재자를 위한 것이 아니라 질문을 하기 위한 것입니다. 스레드가 무엇인지 확인하십시오.

추신, 그런 관심을 보았다. https://www.mql5.com/en/forum/215783/page8 "Organization of the order search cycle" 분기에서 밝혀졌습니다. 2017년 10월, 이 300년은 아직 끝나지 않았고 여전히 새로움이 있다는 것이 밝혀졌습니다.

Организация цикла перебора ордеров
Организация цикла перебора ордеров
  • 2017.09.16
  • www.mql5.com
MQL4 и MetaTrader 4: Организация цикла перебора ордеров
 
Vladimir :

나는 초보자를 대신하여 여기에 질문하는 사람들이 이미 그것을 스스로 발견했다고 생각하지 않습니다. 그러므로 나는 글을 쓰고 있다. 중재자를 위한 것이 아니라 질문을 하기 위한 것입니다. 스레드의 이름을 확인하십시오.

추신, 그런 관심을 보았다. https://www.mql5.com/en/forum/215783/page8 "Organization of the order search cycle" 분기에서 밝혀졌습니다. 2017년 10월, 이 300년은 아직 끝나지 않았고 여전히 새로움이 있다는 것이 밝혀졌습니다.

그들은 다시 추측하지 않았습니다. :) mql4.com에서 300년이 시작되었습니다. 거기에서 활발하게 논의되던 때가 있었습니다. 그리고 "이제 작동하지만 새 빌드가 릴리스될 것입니다."에서 설명한 순간도 있었습니다. "우리는 경고했습니다." 경고 없이, 그래서 여러 번만 - 의존적이며 정렬에 의존하지 않습니다 ...

그리고 예, 그러한 답변에 대한 특별한 주제가 있습니다.

Особенности языка mql4, тонкости и приёмы работы
Особенности языка mql4, тонкости и приёмы работы
  • 2017.02.24
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql4, примеры решения тех, или иных задач...
 
Vladimir :

OrderSelect에 대한 도움말에서 " SELECT_BY_POS 매개변수를 사용 하여 주문을 순차적으로 선택할 때 정보는 거래 서버에서 가져온 순서대로 제공됩니다. 수신된 주문 목록의 정렬은 보장되지 않습니다."

이 문구가 인증서에 헛되이 삽입되었다고 생각하면 모든 것이 정상입니다. 헛된 것이 아니라고 생각되면 주문 목록을 순환하는 동안이 목록을 변경해서는 안됩니다. 주문 중 하나가 서버에서 삭제되고 OrdersTotal이 더 작은 새로운 최신 목록이 도착한 후 주문이 어떻게 주문될지는 알 수 없습니다. 삭제하지 않고 목록의 변경되지 않은 동일한 사본을 실행하고 삭제할 거래 티켓의 모든 수를 (배열로) 수집하는 것이 더 안정적입니다. 그런 다음 이 목록을 잊어버리고 티켓으로 선택하여 거래를 삭제하십시오.

물론, 수정된 목록의 순서가 유지된다고 믿고 싶습니다. 적어도 이 경우에는 순서가 지정되지 않은 목록의 끝에서 여러 주문을 삭제하지만 개발자는 반대합니다. 이제 작동하지만 새로운 빌드가 릴리스됩니다 - "경고했습니다."

좋은 측면에서(여러 명의 Expert Advisors + 거래자가 한 계정에서 병렬로 작업할 수 있다는 점을 감안할 때) 일반적으로 한 주기에서 거래 작업을 수행하는 것은 불가능합니다. 필요한 주문을 받고 작업을 수행하고 전체 OnTick()을 다시 수행했습니다(반드시 새 틱이 도착할 필요는 없음). 필요한 모든 작업이 완료될 때까지 계속됩니다.

따라서 주문을 삭제하기 위한 배열을 구성하는 것은 루프에서 주문을 삭제하는 것과 같습니다.

 

"중지" 버튼이 있습니다. 클릭한 후 텍스트를 "시작"으로 변경하려면 어떻게 해야 합니까?

 bool stop;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
//Closed at Profit
   ObjectCreate ( 0 , "Stop" , OBJ_BUTTON , 0 , 0 , 0 );
   ObjectSetInteger ( 0 , "Stop" , OBJPROP_XDISTANCE , 10 );
   ObjectSetInteger ( 0 , "Stop" , OBJPROP_YDISTANCE , 105 );
   ObjectSetInteger ( 0 , "Stop" , OBJPROP_XSIZE , 100 );
   ObjectSetInteger ( 0 , "Stop" , OBJPROP_YSIZE , 25 );

   ObjectSetString ( 0 , "Stop" , OBJPROP_TEXT , "Stop" );

   ObjectSetInteger ( 0 , "Stop" , OBJPROP_COLOR ,White);
   ObjectSetInteger ( 0 , "Stop" , OBJPROP_BGCOLOR ,Green);
   ObjectSetInteger ( 0 , "Stop" , OBJPROP_BORDER_COLOR ,Green);
   ObjectSetInteger ( 0 , "Stop" , OBJPROP_BORDER_TYPE , BORDER_FLAT );
   ObjectSetInteger ( 0 , "Stop" , OBJPROP_HIDDEN , true );
   ObjectSetInteger ( 0 , "Stop" , OBJPROP_STATE , false );
   ObjectSetInteger ( 0 , "Stop" , OBJPROP_FONTSIZE , 12 );
   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent ( const int id,
                   const long &lparam,
                   const double &dparam,
                   const string &sparam)
  {
if (sparam== "Stop" )
     {
       ObjectSetInteger ( 0 , "Stop" , OBJPROP_STATE , false );
      CloseAtProfit();
      stop= true ;
     }
     }
 
lil_lil : "중지" 버튼이 있습니다. 클릭한 후 텍스트를 "시작"으로 변경하려면 어떻게 해야 합니까?

내 전문가의 예 보기

파일:
ToFile.mq4  11 kb
 
STARIJ :

내 전문가의 예 보기

감사합니다. 필요한 것

위치가 없으면 오류가 있음을 아는 것이 유용할 수 있습니다. --- ToFile EURUSD,H1: 'ToFile.mq4'의 0 나누기(62.39)

/*62*/  Строка= DoubleToStr ( AccountEquity ()/ AccountMargin ()* 100 , 2 )+ "%" ; // Уровень=Средства/Залог
테스터에서 텍스트가 바뀌지 않는데, 그런 가능성은 없나요?