위대하고 끔찍한 MT4 영원히 (또는 전환 전략을 올바르게 개발하는 방법) - 페이지 16

 

그것은 너무 잘 밝혀졌습니다 - (어떤 목적에 따라!?)

 #include <Trade\Trade.mqh>
CTrade Trade;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   int total= PositionsTotal ();
   int Ordertotal= OrdersTotal ();
   while (! IsStopped () && (total <= 1 ))   // Закончим, когда появится более одной позиции.
       if (total == 1 )
         Trade.PositionClose( PositionGetTicket ( 0 )); // Если есть позиция - закрываем.
       else
         if (Ordertotal!= 0 )
            Trade.Buy( 0.01 ); // Если нет позиции и ордера - открываем позицию.
  }
//+------------------------------------------------------------------+
 
SanAlex :

그것은 너무 잘 밝혀졌습니다 - (목적에 따라!?)

만나지 마세요. 그들은 MT 버그를 잡기 위해 모든 종류의 음모를 구축하는 특별한 DC가 있습니다.

 
Alexey Viktorov :

MT 버그를 잡기 위해 모든 종류의 음모를 꾸미는 특수 DC.

대부분의 브로커는 Result.deal == 0과 같은 방식으로 작동합니다.

예를 들어 Signals는 가장 인기 있는 스캘핑 브로커입니다.

잘 알려진 브로커 중에서 MT5가 다른 방식으로 작동하는 곳을 찾기가 상당히 어렵습니다.

 
SanAlex :

그것은 너무 잘 밝혀졌습니다 - (어떤 목적에 따라!?)


"잘하는 것"은 정확히 무엇입니까?
위에서 이미 지적한 코드에 오류가 있습니다.
 
fxsaber :

대부분의 브로커는 Result.deal == 0과 같은 방식으로 작동합니다.

예를 들어 Signals는 가장 인기 있는 스캘핑 브로커입니다.

잘 알려진 브로커 중에서 MT5가 다른 방식으로 작동하는 곳을 찾기가 상당히 어렵습니다.

글쎄, 나는 포지션을 닫을 시간이 없기 때문에 어떤 종류의 스캘핑이 작동하는지 모르겠습니다 ...

괜찮으시다면 위치 수에 대한 수표를 추가해 보세요.

     else if (! PositionsTotal () && ! OrdersTotal ())

나는 두 가지 입장이 열려 있고 닫혀 있다고 생각한다. 이 두 위치의 유형을 얻으려고 시도하는 것은 나쁘지 않을 것입니다. 그들이 반대 방향에 있다면 이것은 내 의심을 확인시켜 줄 것입니다 ...

 
Ihor Herasko :

만들어진:

결과:

글쎄, 이 주문의 상태를 얻으십시오. 티켓이 알려진 경우.

거래가 실패했으며 행사 가격은 0입니다.

거래 요청 결과 구조(MqlTradeResult)

거래 시스템에 주문하기 위한 거래 요청 에 대한 응답으로 거래 서버는 미리 정의된 특수 MqlTradeResult 구조의 형태로 거래 요청 처리 결과에 대한 정보가 포함된 데이터를 반환합니다.

 struct MqlTradeResult
  {
   uint      retcode;           // Код результата операции
   ulong     deal;             // Тикет сделки, если она совершена
   ulong     order;             // Тикет ордера, если он выставлен
   double    volume;           // Объем сделки, подтверждённый брокером
   double    price;             // Цена в сделке, подтверждённая брокером
   double    bid;               // Текущая рыночная цена предложения (цены реквота)
   double    ask;               // Текущая рыночная цена спроса (цены реквота)
   string    comment;           // Комментарий брокера к операции (по умолчанию заполняется расшифровкой кода возврата торгового сервера)
   uint      request_id;       // Идентификатор запроса, устанавливается терминалом при отправке 
   uint      retcode_external; // Код ответа внешней торговой системы
  };

 
Rashid Umarov :

글쎄, 이 주문의 상태를 얻으십시오. 티켓이 알려진 경우.

거래가 실패했으며 행사 가격은 0입니다.

그것은 단지 요점, 통과했습니다. 스크립트 실행이 끝난 후 하나 또는 두 개의 위치가 계속 매달려 있습니다(코드에 삽입할 인쇄 수에 따라 다름).

코드:

 #define PRINT(A) Print ( #A + " = " + ( string )(A))

#include <Trade\Trade.mqh>

void OnStart ()
{
  CTrade Trade;
  
   while (! IsStopped () && ( PositionsTotal () <= 1 )) // Закончим, когда появится более одной позиции.
     if ( PositionsTotal () == 1 )
    {
      Trade.PositionClose( PositionGetTicket ( 0 )); // Если есть позиция - закрываем.
       Print ( "Закрытие, т. к. PositionsTotal() равно 1" );
    }
     else if (! OrdersTotal ())
    {
       printf ( "Перед открытием. PositionsTotal: %d, OrdersTotal: %d" , PositionsTotal (), OrdersTotal ());
      Trade.Buy( 0.01 ); // Если нет позиции и ордера - открываем позицию.
      PRINT(Trade.ResultRetcodeDescription());
      PRINT(Trade.ResultDeal());
      PRINT(Trade.ResultOrder());
      PRINT(Trade.ResultComment());
       if ( OrderSelect (Trade.ResultOrder()))
         PRINT( OrderGetInteger ( ORDER_STATE ));
       printf ( "После открытия. PositionsTotal: %d, OrdersTotal: %d" , PositionsTotal (), OrdersTotal ());
    }
    
   Print ( "Выход. PostionsTotal: " , PositionsTotal ());
}

결과:

 2021.05 . 05 14 : 25 : 14.738 Test (EURUSD,M1)        Перед открытием. PositionsTotal : 0 , OrdersTotal : 0
2021.05 . 05 14 : 25 : 14.821 Test (EURUSD,M1)        Trade.ResultRetcodeDescription() = done at 0.00000
2021.05 . 05 14 : 25 : 14.821 Test (EURUSD,M1)        Trade.ResultDeal() = 0
2021.05 . 05 14 : 25 : 14.821 Test (EURUSD,M1)        Trade.ResultOrder() = 2249888681
2021.05 . 05 14 : 25 : 14.821 Test (EURUSD,M1)        Trade.ResultComment() = Request executed
2021.05 . 05 14 : 25 : 14.821 Test (EURUSD,M1)         EnumToString ( ENUM_ORDER_STATE ( OrderGetInteger ( ORDER_STATE ))) = ORDER_STATE_PLACED
2021.05 . 05 14 : 25 : 14.821 Test (EURUSD,M1)        После открытия. PositionsTotal : 1 , OrdersTotal : 1
2021.05 . 05 14 : 25 : 14.899 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal () равно 1
2021.05 . 05 14 : 25 : 14.899 Test (EURUSD,M1)        Выход. PostionsTotal: 2
 
Alexey Viktorov :

글쎄, 나는 포지션을 닫을 시간이 없기 때문에 어떤 종류의 스캘핑이 작동하는지 모르겠습니다 ...

모든 것이 작동합니다. MT5의 아키텍처 기능일 뿐입니다.

괜찮으시다면 위치 수에 대한 수표를 추가해 보세요.

이 검사는 소스 코드에 있습니다.

나는 두 가지 포지션이 열려 있고 닫혀 있다고 생각한다. 이 두 위치의 유형을 얻으려고 시도하는 것은 나쁘지 않을 것입니다. 그들이 반대 방향에 있다면 이것은 내 의심을 확인시켜 줄 것입니다 ...

마감 포지션이 없습니다.

 
fxsaber :

손은 아직 뻗어 있지 않았습니다. 하루내로 포스팅하겠습니다.

작동하지 않아 문제를 찾았습니다.

 
fxsaber :

작동하지 않아 문제를 찾았습니다.

기대합니다. 도움이 필요하시면 작성해 주세요.