mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 62

 
바실리 푸쉬카요프 :
어떻게 생겼는지 그림이 있습니까? 그리고 OBJ_CHART 가 아직 사용되지 않았는지 완전히 명확하지 않습니다.

사진이 없습니다. 그러나 손으로 만들 수 있습니다. 삽입 -> 개체 -> 그래픽 개체 -> 그래프 를 선택하고 OBJ_CHART 삽입 후 개체 속성에서 "개체를 배경으로 그리기"를 선택하고 눈금을 끕니다.

 
fxsaber :

사진이 없습니다. 그러나 손으로 만들 수 있습니다. 삽입 -> 개체 -> 그래픽 개체 -> 그래프 를 선택하고 OBJ_CHART 삽입 후 개체 속성에서 "개체를 배경으로 그리기"를 선택하고 눈금을 끕니다.


감사합니다 멋져보이네요

 

디버그 모드에서는 함수나 표현식이 반환하는 값을 찾을 수 없습니다.

예를 들어

 void OnStart ()
{
   double Angle = 1 ;
   double d = MathSin (Angle / 2 ) * MathSin (Angle * 2 ) ;
}

예를 들어 강조 표시된 기능이 반환한 것입니다.


나는 (디버그 모드에서만이 아니라) 이 방법을 사용한다

 template < typename T>
T MyPrint( const T Value, const string Str )
{
   static const bool IsDebug = MQLInfoInteger ( MQL_DEBUG );

//  if (IsDebug)
  {
//    DebugBreak(); // если хочется посмотреть средствами дебага

     Print (Str + " = " + ( string )Value);
  }
  
   return (Value);
}

#define _P(A) MyPrint(A, __FUNCSIG__ ", Line = " + ( string ) __LINE__ + ": " + #A)

void OnStart ()
{
   double Angle = 1 ;
   double d = _P( MathSin (Angle / 2 )) * _P( MathSin (Angle * 2 )) ;
}


결과

 void OnStart (), Line = 21 : MathSin (Angle/ 2 ) = 0.479425538604203
void OnStart (), Line = 21 : MathSin (Angle* 2 ) = 0.9092974268256817
 

거래 요청 확인 결과 구조(MqlTradeCheckResult)

필드 설명

설명

균형

거래 실행 후 잔액의 가치

형평성

거래 실행 후 발생할 자체 자금의 가치

여유

필요한 거래 작업에 필요한 증거금

margin_free

필요한 거래 작업 실행 후 남아 있는 무료 자체 자금의 양

margin_level

필요한 거래 작업이 완료된 후 설정되는 증거금 수준

이 필드는 거래 탭의 라인에 해당합니다.


Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура результата проверки торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура результата проверки торгового запроса
  • www.mql5.com
Прежде чем отправить торговому серверу запрос на торговую операцию, рекомендуется провести его проверку. Проверка осуществляется функцией OrderCheck(), которой передается сам проверяемый запрос и переменная типа структуры MqlTradeCheckResult. В эту переменную и будет записан результат проверки.
 
fxsaber :

이 필드는 거래 탭의 라인에 해당합니다.


같은 값이 현재 상태 를 보여주지만, 계산된 값 이 구조에서 반환되지 않는데, 이는 거래 실행 후의 것입니까?

 
Artyom Trishkin :

같은 값이 현재 상태 를 보여주지만, 계산된 값 이 구조에서 반환되지 않는데, 이는 거래 실행 후의 것입니까?

거래 주문이 실행된 경우 이 줄에 있었을 계산된 값을 표시합니다.

 

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

일반 클래스 라이브러리 - 버그, 설명, 질문, 사용법 및 제안

레나트 팻쿨린 , 2017.12.08 23:34

거래 기록 형식이 유동적이고 주기적으로 확장되기 때문에 MqlDeal 구조가 없습니다. 이것이 없으면 플랫폼의 기능을 확장하는 것이 불가능합니다.

따라서 유일한 옵션은 Get 함수를 통해 액세스하는 것입니다. 또한 이전에 영향을 받은 레코드의 나머지 필드에 대한 액세스는 레코드가 캐시로 이동하기 때문에 첫 번째 액세스보다 몇 배나 빠릅니다 .

위의 테스트에서 거래 번호는 매번 새로운 것으로 이전에 선택한 거래 의 캐시를 지속적으로 무너뜨립니다.

 

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

MT5 대 MT4. 배열을 채우는 속도.

레나트 팻쿨린 , 2017.12.12 12:19

1) 아이디어가 잘못되었습니다. 로컬 어레이가 더 빨리 채워지지 않습니다(대략, 마이크로 수준까지 내려가지 않고).

2) 정기적인 초기화 함수를 통해 배열을 빠르게 채워야 합니다.

3) 속도를 최대화하려면 배열을 벡터(1차원)로 유지하여 손에서 액세스를 최적화할 수 있는 더 많은 기회를 갖는 것이 좋습니다. 다차원성의 경우 필수 프레임워크로 엄격하게 제한하고 컴파일러가 다차원 인덱스의 추가 상수 계산을 수행하도록 합니다.

4) 빠른 액세스를 위한 어레이는 정적으로 유지되어야 하므로 아웃 오브 바운드에 대한 검사 양이 크게 줄어듭니다.

 

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

mql5에서 판매 위치 열기

fxsaber , 2017.12.12 21:56

 // true - not for trade by market-orders
bool IsBadFilling( const string Symb )
{
   return (!( SymbolInfoInteger ( _Symbol , SYMBOL_FILLING_MODE ) & ( SYMBOL_FILLING_IOC | SYMBOL_FILLING_FOK )));
}

void OnTick ()
{
   if (IsBadFilling( _Symbol ))
  {
     Print ( "Change symbol " + _Symbol + " or server " + AccountInfoString ( ACCOUNT_SERVER ) + " for trade by market!" );
    
     ExpertRemove ();    
  }
}


결과

 2017.12 . 05 00 : 00 : 00    Change symbol EURUSD or server AMPGlobalClearing-Demo-CQG for trade by market!

테스터에서 시장이 열리지 않는 이유를 빠르게 파악할 수 있습니다. 시장가 주문은 이와 같이 금지되지만 보류 주문은 그렇지 않을 때 테스터의 잘못된 행동일 수 있습니다.


SYMBOL_FILLING_MODE가 0일 때 테스터는 이 값을 (SYMBOL_FILLING_IOC | SYMBOL_FILLING_FOK) 로 대체하는 것이 좋습니다. 저것들. 해당 심볼 필드의 브로커 작업이 유효하지 않은 경우 본격적인 거래를 허용합니다.

 
// Опознает кривые COPY_TICKS_INFO-тики
// Отсутствие цены (высохшая сторона стакана - нулевая цена) не признается валидной ситуацией
bool IsTickInfoBad( const MqlTick &Tick )
{
   return (!Tick.ask || !Tick.bid || Tick.last || Tick.volume || ((Tick.flags & ( 0x7F ^ ( TICK_FLAG_ASK | TICK_FLAG_BID ))) != 0 ));
}

#define DEFINE_FIELD(A)             \
   if (!Ticks[i]. ##A)                 \
    Ticks[i]. ##A = Ticks[i - 1 ]. ##A

// Корректирует ошибочные COPY_TICKS_INFO-тики
void CorrectTicksInfo( MqlTick &Ticks[] )
{
   const int Size = ArraySize (Ticks);
  
   for ( int i = 1 ; i < Size; i++)
     if (IsTickInfoBad(Ticks[i]))
    {
      DEFINE_FIELD(bid);
      DEFINE_FIELD(ask);      
      
      Ticks[i].last = 0 ;
      Ticks[i].volume = 0 ;
      Ticks[i].flags = TICK_FLAG_ASK | TICK_FLAG_BID ;
    }
}
TS가 실수로 계정을 유출하지 않도록 CopyTicks(COPY_TICKS_INFO) 후에 매번 이와 같은 작업을 수행하는 것이 좋습니다.