MQL5에서 함께 배우고 쓰기 - 페이지 13

 
Yedelkin :

기이한. 사이트에 이미 있어야 하는 MQL5의 코드가 필요합니다. 그냥 볼 가치가 있습니다. 그게 바로 우리가 말하는 것입니다.

그러나 그것은 당신에게 달려 있습니다.

검색은 매우 지루합니다. 누군가가 즉시 말할 수 있다는 것뿐입니다.

그건 그렇고, 나는이 코드를 mql5로 변경했습니다. 누군가에게 유용할 수도 있습니다.

 input double risk= 0.01 ;
   double lot_min = SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MIN );
   double lot_max = SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MAX );
   double lot_step= SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_STEP );
   double contract= SymbolInfoDouble ( _Symbol , SYMBOL_TRADE_CONTRACT_SIZE );
   double free_margin= AccountInfoDouble ( ACCOUNT_FREEMARGIN );
   int leverage=( int ) AccountInfoInteger ( ACCOUNT_LEVERAGE );
   double lot;
   
     lot= NormalizeDouble (free_margin*risk*leverage/contract, 2 );
     lot= NormalizeDouble (lot/lot_step, 0 )*lot_step;
   if (lot<lot_min) lot=lot_min;
   if (lot>lot_max) lot=lot_max;
 
주님.
의견을 부탁합니다:

ENUM_TRADE_RETURN_CODES
코드 식별자 설명
10004 TRADE_RETCODE_REQUOTE 인용
10006 TRADE_RETCODE_REJECT 요청이 거부되었습니다.
...
코드 없음 10005 . 이거 실수 아니야?
감사합니다...
 

문제. GetTickCount() 와 같은 함수 가 있습니다. 시스템이 시작된 후 경과 된 밀리초 수를 반환합니다 . 메모에는 " 카운터는 시스템 타이머의 해상도에 의해 제한됩니다. 시간은 부호 없는 정수로 저장되기 때문에 컴퓨터가 계속 실행될 때 49.7일마다 오버플 로됩니다."

카운터가 넘친 후에는 어떻게 됩니까? 0으로 재설정되고 새 카운트다운이 시작됩니까? 아니면 시스템이 멈추나요?

 

Yedelkin :

카운터가 넘친 후에는 어떻게 됩니까? 0으로 재설정되고 새 카운트다운이 시작됩니까? 아니면 시스템이 멈추나요?

오버플로 및 처음부터 시작합니다.
 
Renat :
오버플로 및 처음부터 시작합니다.
알았어!
 

문제. switch(expression){...} 문의 설명에는 " switch 문의 표현 은 정수 유형이어야 합니다"라고 나와 있습니다. 인터넷에서 다른 유형의 표현으로 이 연산자에 대한 설명을 만났습니다. switch 문의 사용이 문자열 유형 표현식을 포함하도록 확장됩니까?

 
Yedelkin :

문제. switch(expression){...} 문의 설명에는 " switch 문의 표현 은 정수 유형이어야 합니다"라고 나와 있습니다. 인터넷에서 다른 유형의 표현으로 이 연산자에 대한 설명을 만났습니다. switch 문의 사용이 문자열 유형 표현식을 포함하도록 확장됩니까?

아니요, 불행히도 그렇지 않습니다. 문자열 유형의 경우에만 ... else if ... else

스위치에서 정수 유형 을 사용하기 때문에 다음과 비교할 때 몇 배의 속도 향상이 달성됩니다.

Документация по MQL5: Основы языка / Типы данных / Целые типы
Документация по MQL5: Основы языка / Типы данных / Целые типы
  • www.mql5.com
Основы языка / Типы данных / Целые типы - Документация по MQL5
 
stringo :

아니요, 불행히도 그렇지 않습니다. 문자열 유형의 경우에만 ... else if ... else

스위치에서 정수 유형 을 사용하기 때문에 다음과 비교할 때 몇 배의 속도 향상이 달성됩니다.

알겠습니다. 팁 감사합니다!
 

문제. StringConcatenate() 함수에 대한 설명은 " 임시 문자열 변수를 사용하지 않기 때문에 덧셈 연산을 사용하여 문자열을 연결하는 것보다 StringConcatenate() 함수가 더 빠르고 메모리 효율적입니다."라고 말합니다. 핸드북의 예제를 약간 변경하여 사용했습니다.

   string a= "a" ,b= "b" ,c;
   uint    start,stop;
   long    i,length= 10000000 ;
//--- первый способ
   start= GetTickCount ();
   for (i= 0 ;i<length;i++)
     {
      c=a+b;
     }
   stop= GetTickCount ();
   Print ( "time for 'c = a + b' = " ,(stop-start), " milliseconds, i = " ,i);


//--- второй способ
   a= "a" ; // заново инициализируем переменную a
   start= GetTickCount ();
   for (i= 0 ;i<length;i++)
     {
       StringAdd (a,b);
     }
   stop= GetTickCount ();
   Print ( "time for 'StringAdd(a,b)' = " ,(stop-start), " milliseconds, i = " ,i);

//--- третий способ
   a= "a" ;c= "" ;  
   start= GetTickCount ();
   for (i= 0 ;i<length;i++)
     {
       int k= StringConcatenate (c,a,b);
       //c="";   //с такой строчкой работает ещё дольше.          
     }
   stop= GetTickCount ();
   Print ( "time for 'StringConcatenate(c,a,b)' = " ,(stop-start), " milliseconds, i = " ,i);
내가 얻은 출력에서 :

DR  0  DoubleToString (EURGBP,M1)  22 : 15 : 55   time for 'c = a + b'              = 2359 milliseconds, i = 10000000
QE  0  DoubleToString (EURGBP,M1)  22 : 15 : 56   time for 'StringAdd(a,b)'          = 1031 milliseconds, i = 10000000
FE  0  DoubleToString (EURGBP,M1)  22 : 16 : 00   time for 'StringConcatenate(c,a,b)' = 3891 milliseconds, i = 10000000

StringConcatenate 는 더하기 연산을 사용하여 문자열을 연결하는 것보다 느린 것으로 나타났습니다. 캐치 뭔데?

Документация по MQL5: Основы языка / Типы данных / Тип string
Документация по MQL5: Основы языка / Типы данных / Тип string
  • www.mql5.com
Основы языка / Типы данных / Тип string - Документация по MQL5
 
Yedelkin :

문제. StringConcatenate() 함수에 대한 설명은 " 임시 문자열 변수를 사용하지 않기 때문에 덧셈 연산을 사용하여 문자열을 연결하는 것보다 StringConcatenate() 함수가 더 빠르고 메모리 효율적입니다."라고 말합니다. 핸드북의 예제를 약간 변경하여 사용했습니다.

내가 얻은 출력에서 :

StringConcatenate 는 더하기 연산을 사용하여 문자열을 연결하는 것보다 느린 것으로 나타났습니다. 캐치 뭔데?

확인하는 것은 약간 다릅니다(모든 것을 올바르게 이해한 경우). 기능의 기능은 다른 ...

이 코드와 같은 것

 ////////////////////////////////////////////////////////////////////////////////
//             Global variables, used in working the trade system             //
////////////////////////////////////////////////////////////////////////////////
string a= "Пример" ;
double b= 1.26 ,c = 1.27 ;
string d;

uint    start,stop;

long    i,length= 10000000 ;
////////////////////////////////////////////////////////////////////////////////
void OnStart ()
{
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//

start= GetTickCount ();
   
   for (i= 0 ;i<length;i++)
  {
  d=a+( string )b+( string )c;
  }

stop= GetTickCount ();

Print ( "time for 'd = a + b + c' = " ,(stop-start), " milliseconds, i = " ,i);

//Второй способ
d= "" ;

start= GetTickCount ();

   for (i= 0 ;i<length;i++)
  {
   StringAdd (d,a);
   StringAdd (d,( string )b);
   StringAdd (d,( string )c);
  }
stop= GetTickCount ();

Print ( "time for 'StringAdd()' = " ,(stop-start), " milliseconds, i = " ,i);

//Третий способ
d= "" ;

start= GetTickCount ();

   for (i= 0 ;i<length;i++)
  {
   int k= StringConcatenate (d,a,b,c);
  }

stop= GetTickCount ();

Print ( "time for 'StringConcatenate(d,a,b,c)' = " ,(stop-start), " milliseconds, i = " ,i);
//----------------------------------------------------------------------------//   
}
////////////////////////////////////////////////////////////////////////////////

그리고 그러한 결과

 2011.04 . 15 15 : 28 : 58      123 (EURUSD,D1) time for 'd = a + b + c' = 81094 milliseconds, i = 10000000
2011.04 . 15 15 : 30 : 24      123 (EURUSD,D1) time for 'StringAdd()' = 85828 milliseconds, i = 10000000
2011.04 . 15 15 : 31 : 46      123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 81812 milliseconds, i = 10000000
2011.04 . 15 15 : 33 : 36      123 (EURUSD,D1) time for 'd = a + b + c' = 82938 milliseconds, i = 10000000
2011.04 . 15 15 : 35 : 00      123 (EURUSD,D1) time for 'StringAdd()' = 83859 milliseconds, i = 10000000
2011.04 . 15 15 : 36 : 21      123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 80719 milliseconds, i = 10000000

추신

대부분의 경우 d= "" 줄은 for 루프에 배치되어야 하지만 이 캔트는 결과에 실제로 영향을 미치지 않는다고 생각합니다.