초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 983

 

안녕 동료들.

문제는 mql4에서 위치 수 를 계산하기 위해 다음과 같은 함수를 작성할 수 있다는 것입니다.

 //+------------------------------------------------------------------+
// Счетчик ордеров
//+------------------------------------------------------------------+
int OrderCount( int type)
{
   int count = 0 ;
   for ( int trade = OrdersTotal () - 1 ; trade >= 0 ; trade--)
  {
     if ( OrderSelect (trade, SELECT_BY_POS , MODE_TRADES ))
    {
       if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic && OrderType () == type)
      count++;
    }
  }
   return (count);
}

이 비즈니스는 mql5에서 어떻게 구현됩니까? 매직으로 위치를 계산하는 방법은 무엇입니까? 아니면 종류별로?

 
이 주제와 관련이 없는 댓글은 " MQL4 MT4 MetaTrader 4 초보자의 질문 "으로 이동되었습니다.
 
Nikita Chernyshov :

안녕 동료들.

문제는 mql4에서 위치 수 를 계산하기 위해 다음과 같은 함수를 작성할 수 있다는 것입니다.

이 비즈니스는 mql5에서 어떻게 구현됩니까? 매직으로 위치를 계산하는 방법은 무엇입니까? 아니면 종류별로?

코드 Ehlers_CG EA 의 예, CalculateAllPositions 함수.

 
Vladimir Karputov :

코드 Ehlers_CG EA 의 예, CalculateAllPositions 함수.

매우 감사합니다. 좀 더 이해하기 쉬운 형태로 리메이크 해보았습니다. 그러나 이런 식으로 0을 제공하고 무한한 수의 주문을 엽니다. 나는 거래 아이디어에주의를 기울이지 말 것을 요청합니다. 나는 단지 일반적인 개발을위한 것입니다.


 #include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
#include <Trade\AccountInfo.mqh>
#include <Trade\DealInfo.mqh>
#include <Trade\OrderInfo.mqh>
#include <Expert\Money\MoneyFixedMargin.mqh>

CPositionInfo  m_position;                   // trade position object
CTrade         trade;                       // trading object
CSymbolInfo    symbol_info;                     // symbol info object
CAccountInfo   m_account;                     // account info wrapper
CDealInfo      m_deal;                       // deals object
COrderInfo     m_order;                       // pending orders object
CMoneyFixedMargin *m_money;


input double lot = 0.01 ;
input int     TakeP = 300 ;
input int     StopL = 300 ;
input int     Magic = 123 ;
input int     Slip  = 50 ;

input int     MA    = 50 ;

double ma[];
int     handle;
int     digits;
double point;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   handle = iMA ( NULL , 0 ,MA, 0 , MODE_SMA , PRICE_CLOSE );
   
   trade.SetExpertMagicNumber(Magic);
   trade.SetDeviationInPoints(Slip);
   trade.SetTypeFilling( ORDER_FILLING_FOK );
   trade.SetAsyncMode( false );
   
   digits=( int ) SymbolInfoInteger ( NULL , SYMBOL_DIGITS );
   point= SymbolInfoDouble ( NULL , SYMBOL_POINT );
   
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   CopyBuffer (handle, 0 , 0 , 50 ,ma);
   ArraySetAsSeries (ma, true ); 
   
   double Ask = SymbolInfoDouble ( NULL , SYMBOL_ASK );
   double Bid = SymbolInfoDouble ( NULL , SYMBOL_BID );
   
   if ( Ask > ma[ 1 ] && CalculateAllPositions( POSITION_TYPE_BUY ) == 0 )
     {
       double tp = NormalizeDouble ( Ask +TakeP*point,digits);
       double sl = NormalizeDouble ( Ask -StopL*point,digits);
       
       if (!trade.Buy(lot, NULL , Ask ,sl,tp))
          {
       //--- сообщим о неудаче
       Print ( "Метод Buy() потерпел неудачу. Код возврата=" ,trade.ResultRetcode(),
             ". Описание кода: " ,trade.ResultRetcodeDescription());
          } else
               {
                 Print ( "Метод Buy() выполнен успешно. Код возврата=" ,trade.ResultRetcode(),
                 " (" ,trade.ResultRetcodeDescription(), ")" );
               }
     }
     
   if ( Bid < ma[ 1 ] && CalculateAllPositions( POSITION_TYPE_SELL ) == 0 )
     {
       double tp = NormalizeDouble ( Bid -TakeP*point,digits);
       double sl = NormalizeDouble ( Bid +StopL*point,digits);
       
       if (!trade.Sell(lot, NULL , Bid ,sl,tp))
          {
       //--- сообщим о неудаче
       Print ( "Метод Sell() потерпел неудачу. Код возврата=" ,trade.ResultRetcode(),
             ". Описание кода: " ,trade.ResultRetcodeDescription());
          } else
               {
                 Print ( "Метод Sell() выполнен успешно. Код возврата=" ,trade.ResultRetcode(),
                 " (" ,trade.ResultRetcodeDescription(), ")" );
               }
     }     
   Comment (CalculateAllPositions( POSITION_TYPE_BUY ));
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Счетчик ордеров                                                  |
//+------------------------------------------------------------------+
int CalculateAllPositions( const ENUM_POSITION_TYPE type)
  {
   int count= 0 ;   
  
   for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--)
      {
       if (m_position.SelectByIndex(i)) 
        {
         if (m_position. Symbol ()== NULL && m_position.Magic()==Magic && m_position.PositionType()==type)
         count++;
       }
         
     }
     return (count);
  }
 
Nikita Chernyshov :

매우 감사합니다. 좀 더 이해하기 쉬운 형태 로 리메이크 해보았습니다 . 그러나 이런 식으로 0을 제공하고 무한한 수의 주문을 엽니다. 나는 거래 아이디어에주의를 기울이지 말 것을 요청합니다. 나는 단지 일반적인 개발을위한 것입니다.


당신의 실수의 핵심 은 내가 Expert Advisors에서 그렇게 많은 인증 코드를 작성하는 것이 헛된 것이 아니라는 것입니다. 당신은 거의 모든 내부, 특히 OnTradeTransaction 을 버렸습니다.

 

문제가 발생했습니다. 표시기 기반 EA는 실제 계정에서 올바르게 작동하지만 테스터, OHLC 및 모든 틱 모두에 대한 틱 생성 모드에 있습니다 . 결과는 동일합니다. 오류의 결과는 0 막대의 빈 표시기 버퍼입니다(표시기를 계산하는 데 사용되는 상위 TF에 새 막대가 나타날 때만). 그러나 EA에 Sleep을 추가하여 표시기 카운트를 만들 수 있었고 틱 생성 모드에 따라 이 Sleep이 달라야 한다는 것이 밝혀졌습니다. Sleep(15000)은 모든 틱에서 생성하기에 충분하고 Sleep (30000)은 OHLC에 필요합니다).

따라서 틱 생성 모드에 따라 다른 지연 시간이 모델링되는 것이 논리적으로 밝혀지기 때문에 Sleep의 상황이 정상인지 여부에 대한 질문이 발생합니다!?

개발자 여러분, 나는 그 이유가 무엇인지 이해할 수 없기 때문에 표시기로 설명 된 상황에 대해 명확히 해달라고 요청합니다. 코드 또는 테스터의 오류입니다!

지표와 고문은 개인적으로 제공 할 준비가되어 있으며 누구에게 말하십시오.

 
Aleksey Vyazmikin :

문제가 발생했습니다. 표시기 기반 EA는 실제 계정에서 올바르게 작동하지만 테스터, OHLC 및 모든 틱 모두에 대한 틱 생성 모드에 있습니다 . 결과는 동일합니다. 오류의 결과는 0 막대의 빈 표시기 버퍼입니다(표시기를 계산하는 데 사용되는 상위 TF에 새 막대가 나타날 때만). 그러나 Sleep을 추가하여 표시기를 강제로 계산하는 데 성공했으며 틱 생성 모드에 따라 이 Sleep이 달라야 한다는 것이 밝혀졌습니다. Sleep(15000)은 모든 틱에서 생성하기에 충분하지만 Sleep( 30000) OHLC에 필요합니다.

따라서 틱 생성 모드에 따라 다른 지연 시간이 모델링되는 것이 논리적으로 밝혀지기 때문에 Sleep의 상황이 정상인지 여부에 대한 질문이 발생합니다!?

개발자 여러분, 나는 그 이유가 무엇인지 이해할 수 없기 때문에 표시기로 설명 된 상황에 대해 명확히 해달라고 요청합니다. 코드 또는 테스터의 오류입니다!

지표와 고문은 개인적으로 제공 할 준비가되어 있으며 누구에게 말하십시오.

표시기의 수면이 작동하지 않습니다. 게다가 테스터에 관해서는 Expert Advisor에서도 무시된다.

 
Ihor Herasko :

표시기의 수면이 작동하지 않습니다. 게다가 테스터에 관해서는 Expert Advisor에서도 무시된다.

나는 이미 수면 권고자에 그것을 썼고, 그것이 무시되고 당신이 이것에 대해 100% 확신한다면 이것은 오류가 테스터에 있다는 또 다른 확인입니다.

지연은 제 시간에 발생하지 않을 수 있지만 프로그램에 대해 에뮬레이트될 수 있습니다.

추가됨: 수면 은 테스터에서 작동합니다. 여기에 이를 확인하는 간단한 코드가 있습니다.

   Print ( iClose ( Symbol (), PERIOD_CURRENT , 0 ));
   Sleep ( 15000 );
   Print ( iClose ( Symbol (), PERIOD_CURRENT , 0 ));

결과

 2019.01 . 22 08 : 28 : 24.661 2019.01 . 21 23 : 49 : 00    66920.0
2019.01 . 22 08 : 28 : 24.661 2019.01 . 21 23 : 49 : 15    66928.0
 
Ihor Herasko :

표시기의 수면이 작동하지 않습니다. 게다가 테스터에 관해서 는 Expert Advisor에서도 무시된다 .

이것은 사실이 아닙니다.

 
Aleksey Vyazmikin :

나는 이미 수면 권고자에 그것을 썼고, 그것이 무시되고 당신이 이것을 100% 확신한다면 이것은 오류가 테스터에 있다는 또 다른 확인입니다.

지연은 제 시간에 발생하지 않을 수 있지만 프로그램에 대해 에뮬레이트될 수 있습니다.

추가됨: Sleep은 테스터에서 작동합니다. 여기에 이를 확인하는 간단한 코드가 있습니다.

결과

원래 게시물은 다음과 같습니다.

그러나 Sleep을 추가하여 표시기를 계산하는 데 성공했고 여기에서 공개되었습니다..

그래서 지표에서 수면 에 반응했습니다.

Expert Advisor의 Sleep에 관해서는 4와 5에서 다른 동작을 수행해야 하는 이유가 명확하지 않습니다. 4-ke에서는 다음과 같습니다.

 void OnTick ()
{
   Print ( "Before: " , TimeCurrent ());
   Sleep ( 100000 );
   Print ( "After: " , TimeCurrent ());
}
2019.01 . 22 07 : 38 : 19.432 2018.11 . 08 00 : 02 : 05   Test AUDUSD,M5: After: 2018.11 . 08 00 : 02 : 05
2019.01 . 22 07 : 38 : 19.432 2018.11 . 08 00 : 02 : 05   Test AUDUSD,M5: Before: 2018.11 . 08 00 : 02 : 05
사실, 질문입니다. 수면은 어떤 식으로든 지표의 데이터 재계산에 영향을 주어서는 안 됩니다. 버퍼를 채우는 데 문제가 있습니다. 재현 가능한 코드가 있습니까?
사유: