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

 
Sergey Likho :

거래 마진 계산 방법을 알려주실 수 있나요?


두 가지 접근 방식 시도

(0.1 * Ask*MarketInfo(Symbol(),MODE_LOTSIZE))/AccountInfoInteger(ACCOUNT_LEVERAGE)


그리고 이렇게

FreeMarginCheck=AccountFreeMarginCheck(Symbol(),OP_BUY,0.1);

 double val=AccountFreeMargin()-FreeMarginCheck;



첫 번째는 예금 통화 가 USD인 경우 EURJPY에 이상한 결과를 제공합니다. 수식에 뭔가를 추가해야 합니까?

두 번째 것도 두 번째로 작동하고 올바른 값을 제공한 다음 약간의 말도 안되는 값을 제공합니다(예금에 따라 다름)

두 번째 옵션은 마진을 계산하는 올바른 방법입니다. 아니면 주문 후 val 변수에서 여유 마진 값을 가져 오고 FreeMarginCheck 변수에는 마진 자체 값 이 포함됩니다.

 
Igor Makanu :

두 번째 옵션은 마진을 계산하는 올바른 방법입니다. 아니면 주문 후 val 변수에서 여유 마진 값을 가져 오고 FreeMarginCheck 변수에는 마진 자체 값 이 포함됩니다.

확신하는?

AccountFreeMarginCheck

현재 계정의 현재 가격으로 지정된 주문을 연 후 남아 있는 무료 마진 금액을 반환합니다.


뉘앙스가 있습니다.

카운터 거래가 열려 있는 경우, 즉 계정에 전체 또는 불완전한 잠금이 있는 경우 함수가 잘못된 값을 제공할 수 있습니다.


 
Sergey Likho :

확신하는?

예, 정확히 다음과 같이 맞습니다.

현재 계정의 현재 가격으로 지정된 주문을 연 후 남아 있는 무료 마진 금액을 반환 합니다.

미결 거래에 대해 확인해야 합니다. 기억은 나지 않지만 대부분 터미널에서 작성하는 내용이 계산된 데이터와 수렴되어야 합니다. 모든 기호에 대한 각 거래 방향(구매/판매)의 총 로트 수 각 기호

AccountFreeMarginCheck()를 각 방향으로 많이 전달하고 이 결과를 합산합니다.

오늘날 시장이 작동하고 있으며 다음과 같이 확인하는 것이 어렵지 않습니다.

 #property strict
//+------------------------------------------------------------------+
void OnStart ()
  {
   int i,ot,k= OrdersTotal ();
   double lot_buy= 0.0 ,lot_sell= 0.0 ;
   string sy= Symbol ();
   for (i= 0 ; i<k; i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
        {
         ot= OrderType ();
         if ( OrderSymbol ()==sy)
           {
             if (ot== OP_BUY )  lot_buy+= OrderLots ();
             if (ot== OP_SELL ) lot_sell+= OrderLots ();
           }
        }
     }
   double MarginBUY  = AccountFreeMargin ()- AccountFreeMarginCheck (sy, OP_BUY ,lot_buy);
   double MarginSELL = AccountFreeMargin ()- AccountFreeMarginCheck (sy, OP_SELL ,lot_sell);
   double MarginALL = MarginBUY+MarginSELL;
   Print ( "Залог BUY = " ,MarginBUY);
   Print ( "Залог SELL = " ,MarginSELL);
   Print ( "Залог ALL = " ,MarginALL);
  }
 

안녕하십니까, 기능에 무엇이 문제인지 말씀해 주십시오. 이 기능은 일시 중지 시작 및 일시 중지 종료 매개변수에서 시간별로 거래 일시 중지를 수행합니다.
어떤 이유로 함수는 TimeCurrent 가 지정되어 있음에도 불구하고 브로커의 서버가 아닌 컴퓨터에서 시간을 읽습니다. 일반적으로 트랜잭션은 일시 중지, 즉 기능이 작동하지 않는 동안 닫힙니다.

 input  bool        p                 = true;    // Trading pause on/off
input  string      TimeStart         = "23:59"; // Start pause
input  string      TimeEnd           = "06:15"; // End of pause


int start() {

   //+----------------------------------------------------------------------------+
   datetime StartPause,EndPause;
   // ---
   StartPause = StrToTime (TimeStart);
   EndPause   = StrToTime (TimeEnd);
   // ---
   if ((p && StartPause > EndPause && ( TimeCurrent () > StartPause || TimeCurrent () < EndPause)))
   {
     Print ( " Pause the EA " );
     return ( 0 );
   }
   //+----------------------------------------------------------------------------+
 
Anatolij Anufriev :

안녕하십니까, 기능에 무엇이 문제인지 말씀해 주십시오. 이 기능은 일시 중지 시작 및 일시 중지 종료 매개변수에서 시간별로 거래 일시 중지를 수행합니다.
어떤 이유로 함수는 TimeCurrent가 지정되어 있음에도 불구하고 브로커의 서버가 아닌 컴퓨터에서 시간을 읽습니다. 일반적으로 트랜잭션은 일시 중지, 즉 기능이 작동하지 않는 동안 닫힙니다.

TimeStart 및 StrToTime (TimeStart)을 인쇄합니다.

그런 다음 TimeCurrent () 를 인쇄 취소합니다.

TimeStart 에 전체 날짜/시간 형식이 없습니다. 아니면 시간이 항상 현재 날짜, 월 및 연도가 어드바이저가 시작된 다음 변경됩니까?

글쎄, 전 세계적으로 ... 거래 시간 및 분을 결정하려면 시간 및 을 서버 시간 의 시간 및 분과 비교해야하며 서버 시간이 지정된 시간보다 크다는 사실 만 비교합니다

추신 : 혼동하지 않기 위해 datetime을 본질적으로 int로 상상할 수 있으며 2 datetime을 비교하면 2 int를 비교합니다.        

PSPS:

 if ((p && StartPause > EndPause && ( TimeCurrent () > StartPause || TimeCurrent () < EndPause)))

아마도 코드가 작동할 것입니다. 다음을 시도해야 합니다.

 if ((p && StartPause > EndPause && ( TimeCurrent () > StartPause && TimeCurrent () < EndPause)))


나는 보통 이렇게 생각한다.

int h = TimeHour(TimeCurrent());

int m = TimeMinute(TimeCurrent());

그런 다음 고문의 설정 과 비교하십시오.

 
Igor Makanu :

감사합니다. 알아내려고 노력하겠습니다. 저는 초보자일 뿐입니다.) || 대신 && 옵션을 사용합니다. 나는 아직 온라인으로 보려고 시도하지 않았지만이 코드는 테스터에서 작동하고 터미널에서 시간을 읽고 일시 중지 중에 주문을 마감하지 않지만 모든 것이 온라인에서 다릅니다.

 

안녕하세요! 터미널은 전략 테스터 에서 시작되지 않습니다. 예를 들어 날짜(2017.04.01 ~ 2018.05.29)를 설정하고 시작을 누르면 즉시 중지됩니다. 로그는 다음과 같이 말합니다.

TestGenerator: 2017.04.01부터 2018.05.29까지 기록 데이터 'EURUSD30'이 없습니다. 그리고 모든 세그먼트에서. 컴퓨터가 작동 중입니다. 조금 작동할 수 있다고 생각했습니다. 가정용 컴퓨터에서도 마찬가지로 재부팅이 도움이 되지 않지만 잠시 기다리면 시작됩니다. 시장에서 다운로드한 Advisor, 평가판. 이유를 아시는 분 계시면 알려주세요?


 
danil77783 :

안녕하세요! 터미널은 전략 테스터 에서 시작되지 않습니다. 예를 들어 날짜(2017.04.01 ~ 2018.05.29)를 설정하고 시작을 누르면 즉시 중지됩니다. 로그는 다음과 같이 말합니다.

TestGenerator: 2017.04.01부터 2018.05.29까지 기록 데이터 'EURUSD30'이 없습니다. 그리고 모든 세그먼트에서. 컴퓨터가 작동 중입니다. 조금 작동할 수 있다고 생각했습니다. 가정용 컴퓨터에서도 마찬가지로 재부팅이 도움이 되지 않지만 잠시 기다리면 시작됩니다. 시장에서 다운로드한 Advisor, 평가판. 이유를 아시는 분 계시면 알려주세요?


당신은 테스터 인 것 같으며 기록 데이터가 없다고 쓰고 F2 키를 누르고 기록을로드 한 다음 터미널을 다시 시작하십시오.

 
danil77783 :

안녕하세요! 터미널은 전략 테스터 에서 시작되지 않습니다. 예를 들어 날짜(2017.04.01 ~ 2018.05.29)를 설정하고 시작을 누르면 즉시 중지됩니다. 로그는 다음과 같이 말합니다.

TestGenerator: 2017.04.01부터 2018.05.29까지 기록 데이터 'EURUSD30'이 없습니다. 그리고 모든 세그먼트에서. 컴퓨터가 작동하고 있는데, 요원이 충분하지 않을 수 있다고 생각했습니다. 가정용 컴퓨터에서도 마찬가지로 재부팅이 도움이 되지 않지만 잠시 기다리면 시작됩니다. 시장에서 다운로드한 Advisor, 평가판. 이유를 아시는 분 계시면 알려주세요?


기록 데이터 가 아무것도 말하지 않습니까?

 
Igor Makanu :

당신은 테스터 인 것 같으며 기록 데이터가 없다고 쓰고 F2 키를 누르고 기록을로드 한 다음 터미널을 다시 시작하십시오.

고맙습니다! 노력하겠습니다. 터미널을 업데이트하면 어떻게 든 영향을 줄 수 있습니까? 갱신 여부는 본인이 직접 보고하지만......