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

 
jaffer wilson :

@ Artyom Trishkin @ Vladimir Pastushak

제 경우에는 작동하지 않습니다. 나는 새로운 직위를 요구하는 것이 아니다. 한 가지 유형의 거래에 대한 마진을 계산하고 반환한다는 것을 알고 있습니다. 그러나 거래가 이미 열려 있고 특정 기호의 한 거래에 의해 소비되는 마진을 알고 싶습니다.

도와주시겠어요? 제 상황이 이해가 안 되시면 알려주세요.

간단한 스크립트 설명:

도구 상자에 다음 필드가 표시됩니다.

이것은 AUDJPY, EURUSD 및 EURTRY 기호의 마진입니다.

AccountInfoDouble(ACCOUNT_MARGIN)을 사용하여 이 값을 얻을 수 있다는 것을 알고 있습니다. 하지만 특정 캐릭터의 값을 얻을 수 없습니다. 예를 들어 EURUSD가 얼마나 마진을 소비하는지 알고 싶습니다. 어떤 기능도 수행할 수 없다는 것입니다. 따라서 이를 어떻게 계산할 수 있는지 알고 싶습니다.

이 설명이 충분히 이해되기를 바랍니다.

 //+------------------------------------------------------------------+
#include <Trade\PositionInfo.mqh> CPositionInfo     m_position;
//+------------------------------------------------------------------+
struct str__
  {
   string             symbol;
   double             margin;
  };
str__ symb[];
//+------------------------------------------------------------------+
void OnTick ()
  {

   int total = PositionsTotal (), c = 0 ;

   ArrayResize (symb, total);

   for ( int k = total - 1 ; k >= 0 ; k--)
       if (m_position.SelectByIndex(k))
        {
         symb[c].symbol = m_position. Symbol ();

         if (m_position.PositionType() == POSITION_TYPE_BUY )
            symb[c].margin = SymbolMargin(symb[c].symbol, ORDER_TYPE_BUY , m_position.Volume());

         if (m_position.PositionType() == POSITION_TYPE_SELL )
            symb[c].margin = SymbolMargin(symb[c].symbol, ORDER_TYPE_SELL , m_position.Volume());

         c++;
        }
        
         ArrayPrint (symb, 2 );
  }
//+------------------------------------------------------------------+
double   SymbolMargin( string aSymbol, ENUM_ORDER_TYPE aType, double aLot = 1.0 )
  {

   double margin = 0 ;

   MqlTick m_tick;
   if ( SymbolInfoTick (aSymbol, m_tick))
     {
       if (m_tick.ask != 0.0 )
         if ( OrderCalcMargin (aType, aSymbol, aLot, m_tick.ask, margin))
             return (margin * aLot);
       if (m_tick.bid != 0.0 )
         if ( OrderCalcMargin (aType, aSymbol, aLot, m_tick.bid, margin))
             return (margin * aLot);
     }

   return - 1 ;
  }
//+------------------------------------------------------------------+
 
Vladimir Pastushak :

@Vladimir Pastushak 시도하겠습니다. 그러나 이것은 실행 가능한 솔루션이 아님을 알려드립니다. OrderCalcMargin() 함수로 설정한 값은 매번 변경됩니다. 그러나 마진은 변경되지 않습니다. 거래를 성사하면 마진은 거래를 열었을 때와 동일합니다. 그러나 OrderCalcMargin()을 사용할 때 값이 변경되고 원본과 전혀 같지 않습니다.

측면에서도 이것을 시도했다면 알려주십시오. 나는 그것이 작동하지 않을 것이라는 것을 알고 있습니다. 그러나 나는 당신이 주장하는대로 그것을 사용할 것입니다.

 
Vladimir Pastushak :

EURUSD에서 로트 크기 50으로 거래를 열었습니다. 귀하의 기능을 사용한 후 얻은 것을 보십시오.

(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589500.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589505.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589495.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589490.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589485.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589490.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589485.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589480.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589475.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589470.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589465.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589455.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589460.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589465.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589460.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589455.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589440.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589440.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589440.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589445.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589450.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589460.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589465.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589460.00 

봐, 마진은 계속 변하고 있어. 그러나 이미 열린 거래의 가치는 변하지 않습니다. 지금 무엇을 해야 하는지 알려주세요?

 
jaffer wilson :

EURUSD에서 로트 크기 50으로 거래를 열었습니다. 귀하의 기능을 사용한 후 얻은 것을 보십시오.

봐, 마진은 계속 변하고 있어. 그러나 이미 열린 거래의 가치는 변하지 않습니다. 지금 무엇을 해야 하는지 알려주세요?

 //+------------------------------------------------------------------+
#include <Trade\PositionInfo.mqh> CPositionInfo     m_position;
//+------------------------------------------------------------------+
struct str__
  {
   string             symbol;
   double             margin;
  };
str__ symb[];
//+------------------------------------------------------------------+
void OnTick ()
  {

   int total = PositionsTotal (), c = 0 ;

   ArrayResize (symb, total);

   for ( int k = total - 1 ; k >= 0 ; k--)
       if (m_position.SelectByIndex(k))
        {
         symb[c].symbol = m_position. Symbol ();

         if (m_position.PositionType() == POSITION_TYPE_BUY )
            symb[c].margin = SymbolMargin(symb[c].symbol, ORDER_TYPE_BUY , m_position.Volume(), m_position.PriceOpen());

         if (m_position.PositionType() == POSITION_TYPE_SELL )
            symb[c].margin = SymbolMargin(symb[c].symbol, ORDER_TYPE_SELL , m_position.Volume(), m_position.PriceOpen());

         c++;
        }

   ArrayPrint (symb, 2 );
  }
//+------------------------------------------------------------------+
double   SymbolMargin( string aSymbol, ENUM_ORDER_TYPE aType, double aLot = 1.0 , double aOpenPrice = 0 )
  {

   double margin = 0 ;


   if (aOpenPrice != 0.0 )
       if ( OrderCalcMargin (aType, aSymbol, aLot, aOpenPrice, margin))
         return (margin * aLot);
   if (aOpenPrice != 0.0 )
       if ( OrderCalcMargin (aType, aSymbol, aLot, aOpenPrice, margin))
         return (margin * aLot);


   return - 1 ;
  }
//+------------------------------------------------------------------+
 
Vladimir Pastushak :

위의 코드를 시도했습니다.

나는 그것을 가지고있다 :

(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589100.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589100.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589100.00 
(EURUSD,M1)         [symbol]  [margin]
(EURUSD,M1)     [ 0 ] "EURUSD" 589100.00 

그러나 예상 값은 다음과 같습니다.


 
Vladimir Pastushak :

다른 기호 의 경우 여백 값 이 계속 변경됩니다. 따라서 OrderCalcMargin()은 솔루션이 아닙니다. 이해했나요. 먼저 옆에서 시도하십시오.

 
jaffer wilson :

다른 기호 의 경우 여백 값 이 계속 변경됩니다. 따라서 OrderCalcMargin()은 솔루션이 아닙니다. 이해했나요. 먼저 옆에서 시도하십시오.

2 오더 5891 * 2 = 11782 배열 문자를 문자로 처리해야 한다면... 문제가 되지 않습니다...

 
Vladimir Pastushak :

2 오더 5891 * 2 = 11782 배열 문자를 문자로 처리해야 한다면... 문제가 되지 않습니다...

하지만 EURUSD에서 한 번만 거래했습니다. 그리고 이 기능은 다른 캐릭터와 제대로 작동하지 않습니다.

 

말해봐, mql5 표시기에 대한 후크가 있습니까? 두 개의 표시 속성을 설정합니다.

 #property indicator_separate_window
#property indicator_chart_window

다른 출력을 각각 고유한 표시 속성에 바인딩하는 방법도 있습니다.

 
Roman :

말해봐, mql5 표시기에 대한 후크가 있습니까? 두 개의 표시 속성을 설정합니다.

다른 출력을 각각 고유한 표시 속성에 바인딩하는 방법도 있습니다.

그런 후크가 없습니다. 오른쪽도 왼쪽도 아닙니다. MQL5도 MQL4도 아닙니다.

서브 윈도우의 메인 차트에서 자신만의 구성을 사용하십시오.