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

 
fxsaber :
 for ( int i =:: ArrayResize (TmpSort, :: ArraySize (ARRAY)) - 1 ; i >= 0 ; i--)

이런 식으로 쓰는 것은 추천하지 않습니다. 시스템이 어레이에 필요한 양의 메모리를 할당하지 못하면 프로그램은 계속 조용히 작동하여 예측할 수 없는 결과를 초래합니다.

 
Alexey Navoykov :

그런 글은 추천하지 않습니다. 시스템이 어레이에 필요한 양의 메모리를 할당하지 못하면 프로그램은 계속 조용히 작동하여 예측할 수 없는 결과를 초래합니다.

진짜로, 나는 그것을 틀림없이 넣었다.

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

라이브러리: HistoryTicks

fxsaber , 2019.09.10 18:58

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

라이브러리: HistoryTicks

fxsaber , 2018.12.10 13:55

MT4/5 Expert Advisor에서 시작 부분에 다음 줄을 작성하는 경우
 #include <fxsaber\HistoryTicks\ ArrayResize .mqh> // https://www.mql5.com/ru/code/20298

ArrayResize 또는 ArrayCopy를 수행하는 동안 오류가 발생할 경우 자세한 알림을 받게 됩니다.

이를 통해 어레이를 통해 정보를 전달할 때 식별하기 어려운 문제를 볼 수 있지만 더 중요한 것은 EA 작성자의 잘못이 아닌 범위를 벗어난 어레이 로 인해 EA가 중지되었다는 메시지를 수신할 수 있다는 것입니다. 예를 들어, 메모리 부족이나 기타 오류로 인해. 저것들. 어드바이저의 비정상 정지가 발생했음을 즉시 알 수 있으며 몇 시간 후에 실수로 눈치채지 못할 것입니다.


HistoryTicks 라이브러리에는 이미 이 줄이 포함되어 있습니다(추가로 작성할 필요가 없음). 왜냐하면 툴킷의 주요 목적은 실제 계정에 대한 전투 고문입니다.


다른 프로젝트의 터미널 로그에는 그러한 항목만 있었습니다.

MemoryException 4471871064 bytes not available, 0 heapmin result


삽입된 행 덕분에 발생한 세부 정보가 사용자 로그에 표시되었습니다.

 Alert : ThirdPartyTicks - ERROR in int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int )! - see the logs.
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 64 : :: MQLInfoString ( MQL_PROGRAM_PATH ) = C:\Program Files\ICMarkets - MetaTrader 5 \MQL5\Scripts\fxsaber\ThirdPartyTicks.ex5
PROGRAM_SCRIPT
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 66 : typename (T) = MqlTick
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 67 : sizeof (T) = 60
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 68 : Res = - 1
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 69 : NewSize = 129140
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 70 : Reserve = 74402041
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 71 : :: ArraySize (Array) = 129139
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 72 : PrevSize = 129139
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 73 : NewSize* sizeof (T) = 7748400
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 74 : PrevSize* sizeof (T) = 7748340
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 75 : Reserve* sizeof (T) = 169155164
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 76 : :: GetLastError () = 4004
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 77 : DuringTime = 1195
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 79 : :: TerminalInfoInteger ( TERMINAL_BUILD ) = 2138
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 80 : :: TerminalInfoInteger ( TERMINAL_DISK_SPACE ) = 6344
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 81 : :: TerminalInfoInteger ( TERMINAL_MEMORY_PHYSICAL ) = 16301
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 82 : :: TerminalInfoInteger ( TERMINAL_MEMORY_AVAILABLE ) = 31530
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 83 : :: TerminalInfoInteger ( TERMINAL_MEMORY_TOTAL ) = 32602
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 84 : :: TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1072
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 86 : :: ChartID () = 132088214536525342
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 87 : :: PeriodSeconds () = 60
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 88 : :: Symbol () = EURUSD
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 89 : :: TimeCurrent () = 2019.09 . 10 19 : 49 : 15
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 90 : :: TimeLocal () = 2019.09 . 10 19 : 49 : 12
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 94 : :: SymbolInfoTick ( _Symbol ,Tick) = true
 time = 2019.09 . 10 19 : 49 : 13.178 bid = 1.10436 ask = 1.10439 last = 0.00000 volume = 0 2 TICK_FLAG_BID
int ARRAYRESIZE::ArrayResize_Real< MqlTick >( MqlTick &[], const int , const int ), Line = 97 : :: ChartSetInteger ( 0 , CHART_BRING_TO_TOP , true ) = true
array out of range in 'Array.mqh' ( 11 , 10 )
 

MQL5의 MQL4 함수 MarketInfo(asymbol, MODE_MARGIN_REQUIRED)의 유사점을 알려주시겠습니까?

구매를 위해 1랏을 여는 데 필요한 무료 자금의 양을 확보 해야 합니다.

MQL5에서 SymbolInfoDouble(symbol, ...) 함수의 다양한 변형을 살펴보았지만 필요한 변형을 찾을 수 없으며 모든 곳에서 0이 반환됩니다.

 
Elena Baranova :

MQL5의 MQL4 함수 MarketInfo(asymbol, MODE_MARGIN_REQUIRED)의 유사점을 알려주시겠습니까?

구매를 위해 1랏을 여는 데 필요한 무료 자금의 양을 확보 해야 합니다.

MQL5에서 SymbolInfoDouble(symbol, ...) 함수의 다양한 변형을 살펴보았지만 필요한 변형을 찾을 수 없으며 모든 곳에서 0이 반환됩니다.

https://www.mql5.com/ru/articles/2555#not_enough_money

Какие проверки должен пройти торговый робот перед публикацией в Маркете
Какие проверки должен пройти торговый робот перед публикацией в Маркете
  • www.mql5.com
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку, так как небольшая ошибка в логике советника или индикатора может привести к убыткам на торговом счете. Именно поэтому нами разработана серия базовых проверок, призванных обеспечить необходимый уровень качества продуктов Маркета. Если в процессе проверки...
 

죄송합니다. 이 링크가 필요한 이유를 모르겠습니다. 나는 거기에서 내 질문에 대한 답을 보지 못했습니다.

 
Elena Baranova :

죄송합니다. 이 링크가 필요한 이유를 모르겠습니다. 나는 거기에서 내 질문에 대한 답을 보지 못했습니다.

기사에서 정확히 무엇을 보지 못했습니까?

검증 예:

MQL5

 bool CheckMoneyForTrade( string symb, double lots, ENUM_ORDER_TYPE type)
  {
//--- получим цену открытия
   MqlTick mqltick;
   SymbolInfoTick (symb,mqltick);
   double price=mqltick.ask;
   if (type== ORDER_TYPE_SELL )
      price=mqltick.bid;
//--- значения необходимой и свободной маржи
   double margin,free_margin= AccountInfoDouble ( ACCOUNT_MARGIN_FREE );
   //--- вызовем функцию проверки
   if (! OrderCalcMargin (type,symb,lots,price,margin))
     {
       //--- что-то пошло не так, сообщим и вернем false
       Print ( "Error in " , __FUNCTION__ , " code=" , GetLastError ());
       return ( false );
     }
   //--- если не хватает средств на проведение операции
   if (margin>free_margin)
     {
       //--- сообщим об ошибке и вернем false
       Print ( "Not enough money for " , EnumToString (type), " " ,lots, " " ,symb, " Error code=" , GetLastError ());
       return ( false );
     }
//--- проверка прошла успешно
   return ( true );
  }
 
Vladimir Karputov :

기사에서 정확히 무엇을 보지 못했습니까?

검증 예:

MQL5

구매를 위해 1랏을 여는 데 필요한 무료 자금의 양을 확보 해야 합니다.

그리고 여기 기사의 수표가 있습니까?

 
Elena Baranova :

구매를 위해 1랏을 여는 데 필요한 무료 자금의 양을 확보 해야 합니다.

그리고 여기 기사의 수표가 있습니까?

더욱이, 그 기사는 그 자료에 대한 부지런한 연구를 가르칩니다.

이 예에서는 거래 요청을 보내기 전에 확인할 수 있는 완전한 기능도 제공합니다.


한번:

 //--- значения необходимой и свободной маржи
   double margin,free_margin= AccountInfoDouble ( ACCOUNT_MARGIN_FREE );

즉시 도움:

ACCOUNT_MARGIN_FREE

포지션 개설에 사용할 수 있는 예치 통화로 된 계좌의 무료 자금 금액

AccountInfoDouble


그리고 2는 최소 체크입니다.

   //--- вызовем функцию проверки
   if (! OrderCalcMargin (type,symb,lots,price,margin))
     {
       //--- что-то пошло не так, сообщим и вернем false
       Print ( "Error in " , __FUNCTION__ , " code=" , GetLastError ());
       return ( false );
     }
   //--- если не хватает средств на проведение операции
   if (margin>free_margin)
     {
       //--- сообщим об ошибке и вернем false
       Print ( "Not enough money for " , EnumToString (type), " " ,lots, " " ,symb, " Error code=" , GetLastError ());
       return ( false );
     }
Документация по MQL5: Информация о счете / AccountInfoDouble
Документация по MQL5: Информация о счете / AccountInfoDouble
  • www.mql5.com
Информация о счете / AccountInfoDouble - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Elena Baranova :

구매를 위해 1랏을 여는 데 필요한 무료 자금의 양을 확보 해야 합니다.

그리고 여기 기사의 수표가 있습니까?

나는 당신이 짧은 코드를 읽는 데 어려움을 겪을 것이라고 생각하지 않고 다음 도움말을 읽으십시오 https://www.mql5.com/en/docs/trading/ordercalcmargin

 
Vladimir Karputov :

더욱이, 그 기사는 그 자료에 대한 부지런한 연구를 가르칩니다.

이 예에서는 거래 요청을 보내기 전에 확인할 수 있는 완전한 기능도 제공합니다.


한번:

즉시 도움:

ACCOUNT_MARGIN_FREE

포지션 개설에 사용할 수 있는 예치 통화로 된 계좌의 무료 자금 금액

AccountInfoDouble


그리고 2는 최소 체크입니다.

포지션 개설에 사용할 수 있는 예금 통화로 계좌의 무료 자금 금액이 필요하지 않습니다.

로트 크기를 잔액의 %로 계산합니다.

구매를 위해 1랏을 여는 데 필요한 무료 자금의 양을 확보 해야 합니다.