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

 

흠, 상황이 좀 이상해서 주제로 활동을 올린 것처럼 제 입장에서 구체적으로 질문을 던졌는데 답 대신에 "이게 왜 필요해?"

네, 테스터에서 TS를 한 번에 여러 TF로 확장해야 합니다 . CTrade SB를 사용하여 이를 구현 하고 싶습니다. 여기에 예가 있습니다(내 예제 중 2개에서 수집). 시간, 티켓을 기억하고 티켓의 번호 는 주문이 마감되었는지 여부를 결정합니다. 그리고 닫힌 주문의 방향은 무엇이었습니까?

MQL4에서 테스터용 코드는 다음과 같습니다.

 //+------------------------------------------------------------------+
//|                                                        tst__.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
input int TP = 100 ;
input int SL = 100 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CNewbar
  {
private :
   datetime           mnewtime;
   ENUM_TIMEFRAMES    mperiod;
public :
                     CNewbar()                        { mperiod= PERIOD_CURRENT ;  mnewtime= TimeCurrent (); }
                     CNewbar( ENUM_TIMEFRAMES period)  { mperiod=period;          mnewtime= TimeCurrent (); }
   bool               NewBar(){ datetime t= iTime ( NULL ,mperiod, 0 ); if (mnewtime<t){ mnewtime=t; return ( true ); } return ( false );  }
  };

ENUM_TIMEFRAMES   TF[ 9 ]={ PERIOD_M1 , PERIOD_M5 , PERIOD_M15 , PERIOD_M30 , PERIOD_H1 , PERIOD_H4 , PERIOD_D1 , PERIOD_W1 , PERIOD_MN1 };
CNewbar *BAR[ 9 ];
int ticket[ 9 ];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   for ( int i= 0 ;i< 9 ;i++) BAR[i]= new CNewbar(TF[i]);
   ArrayInitialize (ticket,- 1 );
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   for ( int i= 0 ;i< 9 ;i++) delete BAR[i];
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   for ( int i= 0 ;i< 9 ;i++)
       if (BAR[i].NewBar())
        {
         if (ticket[i]< 0 ) ticket[i]= OrderSend ( _Symbol ,OP_BUY, 0.1 ,Ask, 30 ,Ask-SL* _Point ,Ask+TP* _Point );
         if ( OrderSelect (ticket[i],SELECT_BY_TICKET) && OrderCloseTime()> 0 )
           {
             int cmd= 1 -OrderType();
             double open=cmd ? Bid : Ask;
             double tp = open - (cmd ? 1 : - 1 ) * TP * _Point ;
             double sl = open + (cmd ? 1 : - 1 ) * SL * _Point ;
            ticket[i]= OrderSend ( _Symbol ,cmd, 0.1 ,open, 30 ,sl,tp);
           }
        }
  }

테스터를 위한 코드가 필요합니다. 옵티마이저에서 최소한의 검사와 가장 빠른 작업

sb ctrade를 사용하여 MQL5에서 이 코드를 작성하는 방법 ???!!!

 
Igor Makanu :

흠, 상황이 좀 이상해서 주제로 활동을 올린 것처럼 제 입장에서 구체적으로 질문을 던졌는데 답 대신에 "이게 왜 필요해?"

네, 테스터에서 TS를 한 번에 여러 TF로 확장해야 합니다 . CTrade SB를 사용하여 이를 구현 하고 싶습니다. 여기에 예가 있습니다(내 예제 중 2개에서 수집). 시간, 티켓을 기억하고 티켓 번호 는 주문이 마감되었는지 여부를 결정합니다. 그리고 닫힌 주문의 방향은 무엇이었습니까?

MQL4에서 테스터용 코드는 다음과 같습니다.

SB CTrade를 사용하여 MQL5에서 이 코드를 작성하는 방법 ???!!!

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

초보자의 질문 MQL5 MT5 MetaTrader 5

블라디미르 카르푸토프 , 2019.07.21 12:56

따라서 기본의 기초는 포지션 ID( POSITION_IDENTIFIER )이지만 포지션 티켓은 아닙니다. 이것은 네팅 때문에 중요합니다 .

POSITION_IDENTIFIER

Position ID는 새로 개설된 각 Position에 할당되는 고유 번호로 평생 동안 변경되지 않습니다. 위치를 연 주문 티켓에 해당합니다.

 

포지션 ID는 각 주문(ORDER_POSITION_ID)과 거래(DEAL_POSITION_ID)를 개설, 변경 또는 마감한 순서로 표시됩니다. 이 속성을 사용하여 위치와 연결된 주문 및 거래를 검색합니다.

 

네팅 모드에서 포지션이 반전되면(단일 인/아웃 거래에 의해) 포지션 ID POSITION_IDENTIFIER는 변경되지 않습니다. 그러나 동시에 POSITION_TICKET은 취소로 이어진 주문의 티켓으로 변경됩니다. 헤지 모드에서는 포지션 반전이 제공되지 않습니다.


따라서 위치 식별자(POSITION_IDENTIFIER)를 기억하고 추적해야 합니다.


이제 작업이 개선되었습니다. 처음 시작할 때 구매 위치를 열고 기억하십시오(주의: 위치 식별자는 기억해야 하지만 티켓은 기억하지 않아야 함). 포지션이 마감된 경우 반대 포지션을 엽니다. 예를 들어 BUY 포지션이 있었다가 닫혔습니다. 즉, SELL 포지션이 즉시 열립니다.


이제 문제를 해결하는 것이 훨씬 쉬울 것입니다.


 
Vladimir Karputov :

도움말을 스크롤 했는데 CTrade SB에서 위치 식별자로 작업하는 방법이 표시되지 않습니다. SB CTrade는 주문이 체결되었는지 여부를 독립적으로 결정할 수 없습니까? 마지막으로 마감된 주문은 어떤 유형이었습니까?

이 목적을 위해 어떤 라이브러리를 사용해야 합니까?

 
Igor Makanu :

도움말을 스크롤했는데 CTrade SB에서 위치 식별자로 작업하는 방법이 표시되지 않습니다. SB CTrade는 주문이 체결되었는지 여부를 독립적으로 결정할 수 없습니까? 마지막으로 마감된 주문은 어떤 유형이었습니까?

이 목적을 위해 어떤 라이브러리를 사용해야 합니까?

글쎄, 나는 이미 백 번 말했다 - 사전에서 "주문"이라는 단어를 버리십시오. 이 작업을 수행할 때까지 계속 진행할 수 없습니다. 일반적으로 나는 아마 당신을 도울 수 없습니다. 비애.

 
Vladimir Karputov :

글쎄, 나는 이미 백 번 말했다 - 사전에서 "주문"이라는 단어를 버리십시오. 이 작업을 수행할 때까지 계속 진행할 수 없습니다. 일반적으로 나는 아마 당신을 도울 수 없습니다. 비애.

그리고 이것을 이해하는 방법을 알려주세요.

GN       0        16 : 24 : 14.030     Core 1    2018.06 . 06 08 : 00 : 00    Sell market. Ticket = 20
JF       0        16 : 24 : 14.030     Core 1    2018.06 . 06 08 : 00 : 00    Sell market. Identifier = 0
FQ       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    ======closePosition======
HG       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    market buy 0.10 AUDUSD, close # 20 ( 0.73633 / 0.73637 / 0.73633 )
PH       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    deal # 21 buy 0.10 AUDUSD at 0.73637 done (based on order # 21 )
KJ       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    deal performed [ # 21 buy 0.10 AUDUSD at 0.73637 ]
IL       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    order performed buy 0.10 at 0.73637 [ # 21 buy 0.10 AUDUSD at 0.73637 ]
RN       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    CTrade:: OrderSend : market buy 0.10 position # 20 AUDUSD [done at 0.73637 ]
HN       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    Позиция с магиком 2544113114312914 , тикетом 20 и лотом 0.1 успешно закрыта.
LO       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    Очистка данных произведена.
CH       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    ======checkMargin======
OF       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    market buy 0.10 AUDUSD ( 0.73633 / 0.73637 / 0.73633 )
DS       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    deal # 22 buy 0.10 AUDUSD at 0.73637 done (based on order # 22 )
RM       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    deal performed [ # 22 buy 0.10 AUDUSD at 0.73637 ]
DS       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    order performed buy 0.10 at 0.73637 [ # 22 buy 0.10 AUDUSD at 0.73637 ]
FF       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    CTrade:: OrderSend : market buy 0.10 AUDUSD [done at 0.73637 ]
MJ       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    magic = 2544113114312914
RR       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    balance = 11308.94
JK       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    lot = 0.10
HQ       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    Buy market. Ticket = 22
CJ       0        16 : 24 : 14.030     Core 1    2018.06 . 19 16 : 00 : 00    Buy market. Identifier = 20
HR       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    ======closePosition======
FI       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    market sell 0.10 AUDUSD, close # 22 ( 0.74021 / 0.74025 / 0.74021 )
RF       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    deal # 23 sell 0.10 AUDUSD at 0.74021 done (based on order # 23 )
ID       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    deal performed [ # 23 sell 0.10 AUDUSD at 0.74021 ]
GM       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    order performed sell 0.10 at 0.74021 [ # 23 sell 0.10 AUDUSD at 0.74021 ]
NQ       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    CTrade:: OrderSend : market sell 0.10 position # 22 AUDUSD [done at 0.74021 ]
PO       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    Позиция с магиком 2544113114312914 , тикетом 22 и лотом 0.1 успешно закрыта.
FO       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    Очистка данных произведена.
CH       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    ======checkMargin======
OI       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    market sell 0.10 AUDUSD ( 0.74021 / 0.74025 / 0.74021 )
JO       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    deal # 24 sell 0.10 AUDUSD at 0.74021 done (based on order # 24 )
LM       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    deal performed [ # 24 sell 0.10 AUDUSD at 0.74021 ]
ND       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    order performed sell 0.10 at 0.74021 [ # 24 sell 0.10 AUDUSD at 0.74021 ]
LI       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    CTrade:: OrderSend : market sell 0.10 AUDUSD [done at 0.74021 ]
OJ       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    magic = 2544113114312914
RR       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    balance = 11335.85
DK       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    lot = 0.10
PN       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    Sell market. Ticket = 24
QE       0        16 : 24 : 14.030     Core 1    2018.07 . 04 08 : 00 : 00    Sell market. Identifier = 22
NR       0        16 : 24 : 14.030     Core 1    2018.07 . 19 00 : 00 : 00    ======closePosition======
NF       0        16 : 24 : 14.030     Core 1    2018.07 . 19 00 : 00 : 00    market buy 0.10 AUDUSD, close # 24 ( 0.73968 / 0.73989 / 0.73968 )
JI       0        16 : 24 : 14.030     Core 1    2018.07 . 19 00 : 00 : 00    deal # 25 buy 0.10 AUDUSD at 0.73989 done (based on order # 25 )
QK       0        16 : 24 : 14.030     Core 1    2018.07 . 19 00 : 00 : 00    deal performed [ # 25 buy 0.10 AUDUSD at 0.73989 ]
MM       0        16 : 24 : 14.030     Core 1    2018.07 . 19 00 : 00 : 00    order performed buy 0.10 at 0.73989 [ # 25 buy 0.10 AUDUSD at 0.73989 ]
PN       0        16 : 24 : 14.030     Core 1    2018.07 . 19 00 : 00 : 00    CTrade:: OrderSend : market buy 0.10 position # 24 AUDUSD [done at 0.73989 ]
DO       0        16 : 24 : 14.030     Core 1    2018.07 . 19 00 : 00 : 00    Позиция с магиком 2544113114312914 , тикетом 24 и лотом 0.1 успешно закрыта.
LP       0        16 : 24 : 14.030     Core 1    2018.07 . 19 00 : 00 : 00    Очистка данных произведена.
KK       0        16 : 24 : 14.030     Core 1    2018.08 . 08 16 : 00 : 00    ======checkMargin======
RI       0        16 : 24 : 14.030     Core 1    2018.08 . 08 16 : 00 : 00    market sell 0.10 AUDUSD ( 0.73933 / 0.73937 / 0.73933 )
GO       0        16 : 24 : 14.030     Core 1    2018.08 . 08 16 : 00 : 00    deal # 26 sell 0.10 AUDUSD at 0.73933 done (based on order # 26 )
OM       0        16 : 24 : 14.030     Core 1    2018.08 . 08 16 : 00 : 00    deal performed [ # 26 sell 0.10 AUDUSD at 0.73933 ]
JD       0        16 : 24 : 14.030     Core 1    2018.08 . 08 16 : 00 : 00    order performed sell 0.10 at 0.73933 [ # 26 sell 0.10 AUDUSD at 0.73933 ]
QI       0        16 : 24 : 14.030     Core 1    2018.08 . 08 16 : 00 : 00    CTrade:: OrderSend : market sell 0.10 AUDUSD [done at 0.73933 ]
HN       0        16 : 24 : 14.030     Core 1    2018.08 . 08 16 : 00 : 00    Sell market. Ticket = 26
CF       0        16 : 24 : 14.030     Core 1    2018.08 . 08 16 : 00 : 00    Sell market. Identifier = 0
 
Vladimir Karputov :

글쎄, 나는 이미 백 번 말했다 - 사전에서 "주문"이라는 단어를 버리십시오. 이 작업을 수행할 때까지 계속 진행할 수 없습니다. 일반적으로 나는 아마 당신을 도울 수 없습니다. 비애.

확인? 질문을 바꿔보겠습니다.

CTrade:: ResultOrder() 로 기억된 티켓을 사용하는 방법

발견하다:

1. 포지션이 닫혀 있습니까?

2. 클로즈드 포지션은 어떤 유형의 거래였습니까?

3. 동시에 9개의 포지션, 주문 또는 티켓으로 작업해야 하거나 ... 귀하의 재량에 따라 헤지 계정에 대한 모든 용어


이 공식에서 내 질문은 명확합니까? (위에 게시된 MQl4에서 재현 가능한 예)

추신: 어순을 잊을 수 없습니다. 불행히도 이 단어는 도움말에서 다른 용어와 함께 사용됩니다. https://www.mql5.com/en/docs/standardlibrary/tradeclasses/ctrade/ctraderequestorder

 
Igor Makanu :

흠, 상황이 좀 이상해서 주제에 활동을 좀 했고, 제 입장에서는 구체적으로 질문이 있었는데 답 대신에 "이게 왜 필요해요?"

그 이유는 책임자의 무능함입니다. 글을 쓰는 데 5분이 걸렸고 교정에 한 번 시도했습니다.


MT4

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

초보자의 질문 MQL5 MT5 MetaTrader 5

fxsaber , 2019.07.21 12:54

 void OnTick ()
  {
   static int ticket1 = - 1 ;
   
   if (ticket1< 0 ) ticket1= OrderSend ( _Symbol ,OP_BUY, 0.1 ,Ask, 30 ,Ask- 100 * _Point ,Ask+ 100 * _Point );

   if ( OrderSelect (ticket1,SELECT_BY_TICKET) && OrderCloseTime())
    {
     int cmd= 1 -OrderType();
     double open = cmd ? Bid : Ask;
     double tp = open - (cmd ? 1 : - 1 ) * 100 * _Point ;
     double sl = open + (cmd ? 1 : - 1 ) * 100 * _Point ;
     ticket1= OrderSend ( _Symbol ,cmd, 0.1 ,open, 30 ,sl,tp);
    }
  }


MT5

 #include <Trade\Trade.mqh>

#define Bid SymbolInfoDouble ( _Symbol , SYMBOL_BID )
#define Ask SymbolInfoDouble ( _Symbol , SYMBOL_ASK )

void OnTick ()
{
   static CTrade Trade; // Не стал возиться с Deviation.
   static ulong ticket1 = 0 ;
 
   if (!ticket1)
    ticket1 = Trade.PositionOpen( _Symbol , ORDER_TYPE_BUY , 0.1 , Ask, Ask - 100 * _Point , Ask + 100 * _Point ) ? Trade.ResultOrder() : 0 ;
   else if (! PositionSelectByTicket (ticket1) && HistorySelectByPosition (ticket1))
  {
     ENUM_ORDER_TYPE cmd = ( ENUM_ORDER_TYPE ) HistoryOrderGetInteger ( HistoryOrderGetTicket ( HistoryOrdersTotal () - 1 ), ORDER_TYPE );
     double open = cmd ? Bid : Ask;
     double tp = open - (cmd ? 1 : - 1 ) * 100 * _Point ;
     double sl = open + (cmd ? 1 : - 1 ) * 100 * _Point ;
    ticket1 = Trade.PositionOpen( _Symbol , cmd, 0.1 , open, sl, tp) ? Trade.ResultOrder() : 0 ;
  }
}


이 글을 쓰기 위해서는 아주 정통할 필요는 없고, MT5의 기초만 알면 충분합니다.


추신: 네팅에서 클로즈드 포지션의 유형을 결정할 때 약간의 뉘앙스가 있습니다. 하지만 여기서는 중요하지 않습니다.

 
fxsaber :

이 글을 쓰기 위해서는 아주 정통할 필요는 없고, MT5의 기초만 알면 충분합니다.

덕분에!

예, "5줄" 쓰기에서 SB의 도움으로 해결되지 않는 경우 이것이 제가 찾고 있던 솔루션입니다.

그러나 하나의 SB CTrade가 내 문제를 해결할 수 없다는 것을 얼마나 이해했습니까? 그리고 CPositionInfo를 사용해야 했나? - 여러 TF에서 동시에 9개 포지션을 함께 하고 싶다면?

추신: 저는 스마트 TV에 앉아서 MQL5 도움말을 스크롤하고 있습니다. 거래 기능 이 아주 잘 설명되어 있고 SB의 사용이 의심스럽습니다. ... 원시 전략은 SB를 사용하는 것이 합리적으로 보이지만 조금 더 복잡합니다. 기능이 충분하지 않거나 명확하지 않은 사용, 아마도 연습이 필요할 수 있습니다. "비틀림"을 더 많이 시도할 것입니다.


다시 한번 감사합니다!

 
fxsaber :

그 이유는 책임자의 무능함입니다. 글을 쓰는 데 5분이 걸렸고 교정에 한 번 시도했습니다.


MT4


MT5


이 글을 쓰기 위해서는 아주 정통할 필요는 없고, MT5의 기초만 알면 충분합니다.


추신: 네팅에서 클로즈드 포지션의 유형을 결정할 때 약간의 뉘앙스가 있습니다. 하지만 여기서는 중요하지 않습니다.

바로 여기

 ENUM_ORDER_TYPE cmd = ( ENUM_ORDER_TYPE ) HistoryOrderGetInteger ( HistoryOrderGetTicket ( HistoryOrdersTotal () - 1 ), ORDER_TYPE );

잠재적인 오류가 있습니다.

기록 목록에서 주문은 이 목록에 나타나는 순서대로 정렬되지 않습니다. 라이브러리를 개발하는 동안 이것을 발견했습니다. 나는 그것에 의지했습니다. 그러나 모든 것이 그렇게 간단하지 않다는 것이 밝혀졌습니다. 한도 -> 스탑 -> 한도 -> 스탑 -> 한도 -> 스탑 순서대로 하나씩 지정가와 스탑 주문 을 해보고, 임의의 순서로 하나씩 삭제하고, 이력 목록에 마지막으로 기록된 것을 보세요. 당신은 놀랄 것입니다.

 
Artyom Trishkin :

바로 여기

잠재적인 오류가 있습니다.

기록 목록에서 주문은 이 목록에 나타나는 순서대로 정렬되지 않습니다. 라이브러리를 개발하는 동안 이것을 발견했습니다. 나는 그것에 의지했습니다. 그러나 모든 것이 그렇게 간단하지 않다는 것이 밝혀졌습니다. 한도 -> 정지 -> 한도 -> 정지 -> 한도 -> 정지의 순서로 지정가 및 중지 주문 을 차례로 배치하고 각각을 임의의 순서로 삭제하고 기록 목록에 마지막으로 기록된 항목을 확인하십시오. 당신은 놀랄 것입니다.

오류가 없기 때문에 목록은 HistorySelectByPosition을 통해 구성됩니다.

사유: