오류, 버그, 질문 - 페이지 2020

 
Kirill Belousov :

OrderCalcMargin 함수는 마진을 계산할 때 개시 가격을 고려하지 않습니다

이것은 버그입니까 아니면 이와 같아야합니까?

물론 버그입니다. SD에 씁니다.

 Print ( "price_1= " ,price_1, " margin_1= " , NormalizeDouble (margin_1, 8 ), " " ,TOSTRING( OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1)));

이 줄은 정상적으로 작동하지만 다음과 같은 이유로 확인해야 했습니다. 실행 순서를 추측해야 합니다. 이 점에 대한 논의는 여기에서 .

 
fxsaber :

물론 버그입니다. SD에 씁니다.

이 줄은 정상적으로 작동하지만 다음과 같은 이유로 확인해야 했습니다. 실행 순서를 추측해야 합니다. 이 점에 대한 논의는 여기에서 .

Print()에서 표현식이 평가되는 순서는 오른쪽에서 왼쪽입니다. 인것 같습니다... 일단은... 미리 확인도 해봤습니다 :)


MQL4/5 도움말에 직접적인 모순 이 있는지 확신하기 어렵습니다.

MQL5 참조 언어 기초 기능 매개변수 전달

메모

매개변수는 함수에 거꾸로 전달 된다는 점을 기억해야 합니다. 즉, 가장 최근의 매개변수가 먼저 계산되어 전달된 다음 끝에서 두 번째 매개변수가 전달되는 식 입니다. 여는 괄호 뒤에 오는 첫 번째 매개변수가 평가되고 차례로 마지막에 전달됩니다.


MQL5 참조 언어 기초 연산 및 표현식 기타 작업

x1, x2,..., xn 인수로 함수 호출

각 인수는 상수, 변수 또는 적절한 유형의 표현식일 수 있습니다. 전달된 인수는 쉼표로 구분되며 괄호 안에 있어야 합니다. 여는 괄호는 호출되는 함수의 이름 다음에 와야 합니다.

표현식의 값은 함수에서 반환된 값입니다. 함수의 반환 유형이 void인 경우 할당 작업의 오른쪽에 이러한 함수에 대한 호출을 배치할 수 없습니다. 표현식 x1,..., xn의 실행 순서는 보장 됩니다.


내가 거꾸로 매개변수 전송에 의해 안내되는 동안.

 
Kirill Belousov :

다음 스레드 https://www.mql5.com/ru/forum/216697/page3 에서 OrderCalcMargin에 대한 질문이 제기되었습니다.


테스트: 다른 개시 가격 으로 대체하여 마진을 계산하는 2가지 옵션을 확인해 보겠습니다.

다음은 로그입니다.

OrderCalcMargin 함수는 마진을 계산할 때 개시 가격을 고려하지 않습니다

이는 시세 및 시세에 대해 다시 계산해야 하는 호가 환율과 관련이 있는 것으로 보입니다.

견적 통화가 USD인 경우(계정 통화도 USD임), 계산된 마진은 개시 가격에 따라 변경됩니다.

GBPUSD에 대한 로그

이것은 버그입니까 아니면 이와 같아야합니까?

계산 시 특히 AUDJPY, AUDUSD 및 USDJPY가 관련되어 있기 때문에 아마도 그렇게 되어야 할 것입니다.

하지만 이 생각이 들게 하는군요... GBPUSD는 시장 개요의 MetaQuotes-Demo 계정에 있지만 계정에 robo가 없습니다...

 
Alexey Viktorov :

계산 시 특히 AUDJPY, AUDUSD 및 USDJPY가 관련되어 있기 때문에 아마도 그렇게 되어야 할 것입니다.

하지만 이 생각이 들게 하는군요... GBPUSD는 시장 개요의 MetaQuotes-Demo 계정에 있지만 계정에 robo가 없습니다...

버그가 있다는 것을 알려주고 싶었습니다.

OrderCalcMargin 을 계산할 때 Margin=0인 상황을 이미 재현했습니다.

아직 출판되지 않았을 뿐입니다.

 
Alexey Viktorov :

GBPUSD는 시장 개요의 MetaQuotes-Demo 계정에 있지만 계정에 로봇이 없습니다...

Market Watch에 있을 가능성이 가장 높지만(일반 기호 목록과 혼동하지 말 것) 표시되지 않습니다.

 
Alexey Viktorov :

계산 시 특히 AUDJPY, AUDUSD 및 USDJPY가 관련되어 있기 때문에 아마도 그렇게 되어야 할 것입니다.

하지만 이 생각이 들게 하는군요... GBPUSD는 시장 개요의 MetaQuotes-Demo 계정에 있지만 계정에 robo가 없습니다...

테스트는 다음과 같습니다.

 #define TOSTRING(A) #A+ " = " +(string)(A)
void OnStart ()
  {
   double margin_1= 999 ,price_1;

   Print (TOSTRING(price_1= SymbolInfoDouble ( Symbol (), SYMBOL_ASK )));
   Print ( "price_1= " ,price_1, " margin_1= " , NormalizeDouble (margin_1, 8 ), " " ,TOSTRING( OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1)));
   Print ( "price_1= " ,price_1, " margin_1= " , NormalizeDouble (margin_1, 8 ), " " ,TOSTRING(MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1)));
   Print (TOSTRING(price_1= SymbolInfoDouble ( Symbol (), SYMBOL_BID )));
   Print ( "price_1= " ,price_1, " margin_1= " , NormalizeDouble (margin_1, 8 ), " " ,TOSTRING( OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1)));
   Print ( "price_1= " ,price_1, " margin_1= " , NormalizeDouble (margin_1, 8 ), " " ,TOSTRING(MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1)));
   Print (TOSTRING(price_1= 10.0 ));
   Print ( "price_1= " ,price_1, " margin_1= " , NormalizeDouble (margin_1, 8 ), " " ,TOSTRING( OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1)));
   Print ( "price_1= " ,price_1, " margin_1= " , NormalizeDouble (margin_1, 8 ), " " ,TOSTRING(MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1)));
   Print (TOSTRING(price_1= 1.0 ));
   Print ( "price_1= " ,price_1, " margin_1= " , NormalizeDouble (margin_1, 8 ), " " ,TOSTRING( OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1)));
   Print ( "price_1= " ,price_1, " margin_1= " , NormalizeDouble (margin_1, 8 ), " " ,TOSTRING(MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1)));
//выведем признак выбранности мажоров
   Print (TOSTRING( SymbolInfoInteger ( "GBPUSD" , SYMBOL_SELECT )));
   Print (TOSTRING( SymbolInfoInteger ( "USDJPY" , SYMBOL_SELECT )));
   Print (TOSTRING( SymbolInfoInteger ( "USDCAD" , SYMBOL_SELECT )));
   Print (TOSTRING( SymbolInfoInteger ( "AUDUSD" , SYMBOL_SELECT )));
   Print (TOSTRING( SymbolInfoInteger ( "NZDUSD" , SYMBOL_SELECT )));
   Print (TOSTRING( SymbolInfoInteger ( "USDCHF" , SYMBOL_SELECT )));
   Print (TOSTRING( SymbolInfoInteger ( "EURUSD" , SYMBOL_SELECT )));
   for ( int i= SymbolsTotal ( false )-1;i>= 0 ;i--)
     {
       //проверим для каждого символа брокера ситуацию, когда OrderCalcMargin()==true, а маржа=0
       if ( OrderCalcMargin ( ORDER_TYPE_BUY , SymbolName (i, false ), 0.1 , SymbolInfoDouble ( SymbolName (i, false ), SYMBOL_ASK ),margin_1)== true && margin_1== 0 )
        {
         Print (TOSTRING( SymbolName (i, false )), " " ,TOSTRING(margin_1), " " );
        }
     }
  }

// Альтернатива OrderCalcMargin
bool MyOrderCalcMargin( const ENUM_ORDER_TYPE action, const string symbol, const double volume, const double price, double &margin)
  {
   double MarginInit,MarginMain;

   const bool Res= SymbolInfoMarginRate (symbol,action,MarginInit,MarginMain);

   margin=Res ? MarginInit*price*volume* SymbolInfoDouble (symbol, SYMBOL_TRADE_TICK_VALUE )/
          ( SymbolInfoDouble (symbol, SYMBOL_TRADE_TICK_SIZE )* AccountInfoInteger ( ACCOUNT_LEVERAGE )) : 0 ;

   return (Res);
  }

1. MarketWatch에서 십자가를 선택하고 USD로 모든 것을 숨깁니다.

2. DSHBTC 기호를 추가하고 차트를 엽니다.

3. 터미널 닫기

4. 터미널 열기

5. DSHBTC에서 테스트 실행

다음은 로그입니다.

JM       0        09 : 26 : 05.485     test (DSHBTC,H1)        price_1= SymbolInfoDouble ( Symbol (), SYMBOL_ASK ) = 0.07183
QK       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= 0.07183 margin_1= 0.0 OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
KO       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= 0.07183 margin_1= 0.0 MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
QN       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= SymbolInfoDouble ( Symbol (), SYMBOL_BID ) = 0.07079000000000001
NJ       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= 0.07079000000000001 margin_1= 0.0 OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
HO       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= 0.07079000000000001 margin_1= 0.0 MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
LL       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= 10.0 = 10.0
EE       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= 10.0 margin_1= 0.0 OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
QF       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= 10.0 margin_1= 0.0 MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
HD       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= 1.0 = 1.0
EN       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= 1.0 margin_1= 0.0 OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
OM       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= 1.0 margin_1= 0.0 MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
EN       0        09 : 26 : 05.487     test (DSHBTC,H1)         SymbolInfoInteger (GBPUSD, SYMBOL_SELECT ) = 0
GI       0        09 : 26 : 05.487     test (DSHBTC,H1)         SymbolInfoInteger (USDJPY, SYMBOL_SELECT ) = 0
DS       0        09 : 26 : 05.487     test (DSHBTC,H1)         SymbolInfoInteger (USDCAD, SYMBOL_SELECT ) = 0
JL       0        09 : 26 : 05.487     test (DSHBTC,H1)         SymbolInfoInteger (AUDUSD, SYMBOL_SELECT ) = 0
JF       0        09 : 26 : 05.487     test (DSHBTC,H1)         SymbolInfoInteger (NZDUSD, SYMBOL_SELECT ) = 0
MQ       0        09 : 26 : 05.487     test (DSHBTC,H1)         SymbolInfoInteger (USDCHF, SYMBOL_SELECT ) = 0
HK       0        09 : 26 : 05.487     test (DSHBTC,H1)         SymbolInfoInteger (EURUSD, SYMBOL_SELECT ) = 0
LH       0        09 : 26 : 05.488     test (DSHBTC,H1)         SymbolName (i, false ) = DSHBTC margin_1 = 0.0 
RS       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = NZDJPY margin_1 = 0.0 
FE       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = NZDCHF margin_1 = 0.0 
QO       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = NZDCAD margin_1 = 0.0 
RP       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = GBPNZD margin_1 = 0.0 
JD       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = GBPCAD margin_1 = 0.0 
CN       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = GBPJPY margin_1 = 0.0 
KP       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = GBPCHF margin_1 = 0.0 
JK       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = GBPAUD margin_1 = 0.0 
QL       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = EURNZD margin_1 = 0.0 
RG       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = EURJPY margin_1 = 0.0 
RH       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = EURGBP margin_1 = 0.0 
HS       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = EURCHF margin_1 = 0.0 
CD       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = EURCAD margin_1 = 0.0 
GO       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = EURAUD margin_1 = 0.0 
QP       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = CHFJPY margin_1 = 0.0 
JJ       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = CADJPY margin_1 = 0.0 
JL       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = CADCHF margin_1 = 0.0 
QF       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = AUDNZD margin_1 = 0.0 
NI       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = AUDJPY margin_1 = 0.0 
JS       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = AUDCHF margin_1 = 0.0 
EF       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = AUDCAD margin_1 = 0.0 

모든 십자가에 대해 margin=0 및 MAJORS FOR CROSS ARE NOT ELECTED 가 표시 됩니다.

다시 한번 우리는 DSHBTC에 스크립트를 던질 것입니다

통나무

HF       0        09 : 29 : 07.268     test (DSHBTC,H1)        price_1= SymbolInfoDouble ( Symbol (), SYMBOL_ASK ) = 0.07185999999999999
IQ       0        09 : 29 : 07.268     test (DSHBTC,H1)        price_1= 0.07185999999999999 margin_1= 0.0 OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
KP       0        09 : 29 : 07.268     test (DSHBTC,H1)        price_1= 0.07185999999999999 margin_1= 0.0 MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
DE       0        09 : 29 : 07.269     test (DSHBTC,H1)        price_1= SymbolInfoDouble ( Symbol (), SYMBOL_BID ) = 0.07087
OQ       0        09 : 29 : 07.269     test (DSHBTC,H1)        price_1= 0.07087 margin_1= 0.0 OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
MQ       0        09 : 29 : 07.269     test (DSHBTC,H1)        price_1= 0.07087 margin_1= 0.0 MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
QP       0        09 : 29 : 07.269     test (DSHBTC,H1)        price_1= 10.0 = 10.0
HI       0        09 : 29 : 07.269     test (DSHBTC,H1)        price_1= 10.0 margin_1= 0.0 OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
LK       0        09 : 29 : 07.269     test (DSHBTC,H1)        price_1= 10.0 margin_1= 0.0 MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
MH       0        09 : 29 : 07.269     test (DSHBTC,H1)        price_1= 1.0 = 1.0
HR       0        09 : 29 : 07.269     test (DSHBTC,H1)        price_1= 1.0 margin_1= 0.0 OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
NP       0        09 : 29 : 07.269     test (DSHBTC,H1)        price_1= 1.0 margin_1= 0.0 MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
GR       0        09 : 29 : 07.269     test (DSHBTC,H1)         SymbolInfoInteger (GBPUSD, SYMBOL_SELECT ) = 1
FM       0        09 : 29 : 07.269     test (DSHBTC,H1)         SymbolInfoInteger (USDJPY, SYMBOL_SELECT ) = 0
JG       0        09 : 29 : 07.269     test (DSHBTC,H1)         SymbolInfoInteger (USDCAD, SYMBOL_SELECT ) = 1
DP       0        09 : 29 : 07.269     test (DSHBTC,H1)         SymbolInfoInteger (AUDUSD, SYMBOL_SELECT ) = 1
DJ       0        09 : 29 : 07.269     test (DSHBTC,H1)         SymbolInfoInteger (NZDUSD, SYMBOL_SELECT ) = 1
OE       0        09 : 29 : 07.269     test (DSHBTC,H1)         SymbolInfoInteger (USDCHF, SYMBOL_SELECT ) = 1
FO       0        09 : 29 : 07.269     test (DSHBTC,H1)         SymbolInfoInteger (EURUSD, SYMBOL_SELECT ) = 1
DD       0        09 : 29 : 07.269     test (DSHBTC,H1)         SymbolName (i, false ) = DSHBTC margin_1 = 0.0 

메이저가 나왔지만 USDJPY는 제외

모든 테스트는 MetaQuotes에서 수행되었습니다.


 
fxsaber :

Market Watch에 있을 가능성이 가장 높지만(일반 기호 목록과 혼동하지 말 것) 표시되지 않습니다.

우리는 어떻게 든 같은 것을 다른 방식으로 이야기합니다.


 
Alexey Viktorov :

우리는 어떻게 든 같은 것을 다른 방식으로 이야기합니다.

정확히. Market Watch에는 표시되지 않지만 존재 합니다.

 
Kirill Belousov :
 for ( int i= SymbolsTotal ( false ) - 1 ;i>= 0 ;i--)
옳은.
 
fxsaber :
옳은.

완료!

추신: 재고를 제거하는 것을 잊었습니다 :)