알고리즘, 결정 방법, 성능 비교

 

이 스레드에서는 특정 문제를 해결하고 제안된 솔루션의 성능을 비교하는 다양한 방법에 대해 논의합니다.

누구나 문제와 해결 방법에 대해 토론할 수 있습니다. ;)

 

나는 문제를 해결할 것을 제안합니다.

  1. 각 호출에서 조건부 " 마법 "이 될 의사 난수수신하고 기록 하는 함수를 작성하십시오.

2. 첫 번째 함수를 의사 난수 횟수만큼 호출하고 (생성된) 조건부 "마법"을 전달하는 두 번째 함수를 작성합니다.

3. 사용자가 전달한 " transaction " 번호(일련 번호)에서 " magic " 번호를 반환하는 세 번째 함수를 작성하십시오.


요구 사항:

  1. 매직을 기록하기 위한 메모리 소모는 가능한 한 매직의 수에 근접해야 하며, 그 수 는 미리 알 수 없습니다 .
  2. 기능이 빠르게 작동해야 합니다.

//------------------------------------------------ --------

논의된 라이브러리에는 이 문제를 해결하기 위한 툴킷이 있다고 생각합니다.


추신. 세 가지 기능 모두 Expert Advisor 주문 작업을 모방하며 그 수는 미리 알 수 없습니다. 따라서 문제는 우리 주제에 맞습니다.

 
Реter Konow :

나는 문제를 해결할 것을 제안합니다.

  1. 각 호출에서 조건부 " 마법 "이 될 의사 난수수신하고 기록 하는 함수를 작성하십시오.

2. 첫 번째 함수를 의사 난수 횟수만큼 호출하고 (생성된) 조건부 "마법"을 전달하는 두 번째 함수를 작성합니다.

3. 사용자가 전달한 " transaction " 번호(일련 번호)에서 " magic " 번호를 반환하는 세 번째 함수를 작성하십시오.

요구 사항:

  1. 마법을 쓰기 위한 메모리 소모량 은 미리 알 수 없는 마법의 개수에 최대한 근접해야 한다.
  2. 기능은 빠르게 작동해야 합니다.

논의된 라이브러리에는 이 문제를 해결하기 위한 툴킷이 있다고 생각합니다.

추신. 세 가지 기능 모두 Expert Advisor 주문 작업을 모방하며 그 수는 미리 알 수 없습니다. 따라서 문제는 우리 주제에 맞습니다.

Peter, 제 생각에는 어떤 기능이든 유용해야 한다고 생각 합니다 . 이 세 가지 기능이 어떤 긍정적인 효과를 가져오는지 잘 모르겠습니다.

 
Victor Ziborov :

Peter, 제 생각에는 어떤 기능이든 유용해야 한다고 생각 합니다 . 이 세 가지 기능이 어떤 긍정적인 효과를 가져오는지 잘 모르겠습니다.

이것은 주제 https://www.mql5.com/ru/forum/221917 의 분기입니다.

여기에서 우리는 도서관에서 제안한 솔루션의 효율성을 실제로 확인합니다.

해당 스레드에서 문자열에 마법 주문을 작성한 다음 배열에 넣는 솔루션이 비효율적이라고 주장했습니다.

이 문제에 대한 해결책은 새로운 일반 라이브러리에도 있습니다.

문자열에 쓰는 것이 비효율적인 해결책이라는 주장을 확인하거나 반증하는 것은 흥미롭습니다.

어떤 연습이 보여줄지 아는 것이 유용하고 흥미로울 것이라고 생각합니다.


누구든지 라이브러리 도구를 사용하여 이 문제를 해결하려고 시도할 수 있습니다.

나는 내 방식으로 이 문제를 해결하려고 노력할 것이다.

그런 다음 성능을 비교합니다.

Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
  • 2017.12.07
  • www.mql5.com
С 6 декабря 2017 года в стандартную поставку MetaTrader 5 стали входить так называемые Generic-классы, реализующие эффективные алгоритмы для хранен...
 

Peter Konow , 뭔가 정리하고 있다면 적당히 수준에서 하세요. 즉흥적으로 하지 말고 뒤에서..... 물러서세요.

용어는 명확하고 모호하지 않아야 하며 구체적인 예가 있어야 합니다....
다음은 첫 번째 단락 전체를 주의 깊게 읽으면서 발생한 질문 목록입니다.

  1. Написать функцию, которая на каждом обращении будет  принимать и записывать  некоторое  псевдо-случайное  число, которое будет условным " меджиком ".

1) 의미론적 부하가 없는 텍스트를 굵게 강조 표시하는 이유는 무엇입니까?
2) 포인터를 취하는 것이 이미 함수에 대한 "참조"입니까, 아니면 아직입니까? 함수가 호출됩니다.
3) "쓰기 번호"라는 용어는 일반적으로 파일 작업에 사용됩니다. 이것은 부정확하고 메모리의 데이터 작업에 관한 것입니까, 아니면 프로그램 실행 사이에 데이터를 저장해야 합니까?
4) 원하는 경우 의사 난수는 음수일 수 있지만 마술은 그렇지 않습니다. 그래서 우리는 무엇을 가지고 있습니까? 특정 범위의 마술 또는 의사 무작위? 뭐라고요?

 
Sergey Dzyublik :

Peter Konow , 뭔가 정리하고 있다면 적당히 수준에서 하세요. 즉흥적으로 하지 말고 뒤에서..... 물러서세요.

용어는 명확하고 모호하지 않아야 하며 구체적인 예가 있어야 합니다....
다음은 첫 번째 단락 전체를 주의 깊게 읽으면서 발생한 질문 목록입니다.

1) 의미론적 부하가 없는 텍스트를 굵게 강조 표시하는 이유는 무엇입니까?
2) 포인터를 취하는 것이 이미 함수에 대한 "참조"입니까, 아니면 아직입니까? 함수가 호출됩니다.
3) "쓰기 번호"라는 용어는 일반적으로 파일 작업에 사용됩니다. 이것은 부정확하고 메모리의 데이터 작업에 관한 것입니까, 아니면 프로그램 실행 사이에 데이터를 저장해야 합니까?
4) 원하는 경우 의사 난수가 음수일 수 있지만 마술은 그렇지 않습니다. 그래서 우리는 무엇을 가지고 있습니까? 특정 범위의 마술 또는 의사 무작위? 뭐라고요?

주요 작업:

거래 번호를 통해 특정 마법에 대한 빠른 액세스를 구현합니다 .

마법을 "사전"에 작성하고 거래 번호를 통해 액세스해야합니다.

사전에 주문 수를 알 수 없으므로 사전의 크기를 알 수 없습니다.

그러나 액세스가 빨라야 하고 할당된 메모리 양이 허용 가능해야 합니다.

내가 제안한 작업은 주문을 한 다음 추가 작업을 위해 거래 번호로 마법을 받는 고문의 작업을 시뮬레이션하는 것을 목표로 합니다.

당신은 당신에게 편리한 방법으로 문제를 해결할 수 있습니다.

마법사의 특정 숫자는 중요하지 않습니다. 임의의 숫자일 수 있습니다. 이것은 모방일 뿐입니다.


추가됨:

의 "거래 번호를 통해 특정 마법에 대한 빠른 액세스를 구현하십시오. " 수정.

 

10, 11, 12의 세 가지 매직 넘버를 더하면
그렇다면 그들의 거래 번호는 무엇입니까? 0, 1, 2?

 
Sergey Dzyublik :

10, 11, 12의 세 가지 매직 넘버를 더하면
그렇다면 그들의 거래 번호는 무엇입니까? 0, 1, 2?

다른 스레드의 지식이 풍부한 사람들은 문자열에 마법을 쓰고 신속하게 문자열에서 "찾기"를 가져오는 효율적인 솔루션을 만드는 것이 불가능하다고 말했습니다.

그러나 내 생각에는 향후 주문의 수를 알 수 없다면 문자열에 마법을 쓰는 것이 유일한 좋은 해결책이라고 생각합니다.

나는 속도에 손실이 없을 것이라고 말했다.

다음은 실용적인 증거입니다.

 //+------------------------------------------------------------------+
//|                                                        Magic.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
//+------------------------------------------------------------------+
string All_magics;
int     order_number;
int     Random_orders_of_strategy;
//+------------------------------------------------------------------+
void Save_magic( int magic)
{
 order_number++;
 //---------------------------------
 //Записываем каждый магик вместе с порядковым номером ордера.
 //---------------------------------
 All_magics +=   "_" + ( string )order_number + "_" + ( string )magic;
 //---------------------------------
}
//+------------------------------------------------------------------+
void Trading()
{
 Random_orders_of_strategy = MathRand ();
 
 //----------------------------------------
 //Имитируем открытие неопределенного количества ордеров стратегии.
 //----------------------------------------
 for ( int a1 =   0 ; a1 < Random_orders_of_strategy; a1++)
   {
     int this_magic = MathRand ();
     //----------------------------
    Save_magic(this_magic);
     //----------------------------
   }
 //----------------------------------------
}
//+------------------------------------------------------------------+
int Get_magic( int deal_number)
{
 //--------------------------------------------
 //Получаем начало строки магика.
 //--------------------------------------------
 int Magic_position_start =   StringFind (All_magics, "_" + ( string )deal_number + "_" , 0 ) + 3 ;
 //--------------------------------------------
 //Получаем конец строки магика.
 //--------------------------------------------
 int Magic_position_end   =   StringFind (All_magics, "_" + ( string )(deal_number + 1 ) + "_" , 0 );
 //--------------------------------------------
 //Получаем количество цифр из которых состоит магик.
 //--------------------------------------------
 int Magic_lenght         =  Magic_position_end - Magic_position_start;
 //--------------------------------------------
 //Извлекаем магик из общей строки.
 //--------------------------------------------
 string Magic             =   StringSubstr (All_magics,Magic_position_start,Magic_lenght);
 //--------------------------------------------
 //Возвращаем цифровое значение магика.
 //--------------------------------------------
 return (( int )Magic);
}
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   Trading();
   //--------------------------
   ulong t1 = GetMicrosecondCount ();
   Get_magic( 1 );
   ulong t2 = GetMicrosecondCount ();
   //--------------------------
   Print ( "Время исполнения функции Get_magic() при количестве ордеров " ,Random_orders_of_strategy, " равно " ,t2 - t1);
   //--------------------------
   Print ( "Random_orders_of_strategy  " ,Random_orders_of_strategy);
   Print ( "magic 1:  " ,Get_magic( 1 ), "  magic 2: " ,Get_magic( 2 ), "  magic 3: " ,Get_magic( 3 ));
   
  }
//+------------------------------------------------------------------+


누군가 내 솔루션이 유용하다고 생각할 것입니다 ...

(코드는 15 마이크로초 안에 24,000명 이상의 마술사 중에서 올바른 마술사를 찾습니다!)

(또한 1바이트의 추가 메모리도 낭비되지 않습니다.)

빨리 하실 수 있는 분 계시면 부탁드립니다.
 
Sergey Dzyublik :

10, 11, 12의 세 가지 매직 넘버를 더하면
그렇다면 그들의 거래 번호는 무엇입니까? 0, 1, 2?

아니요. 거래 번호는 1로 시작해야 합니다.
 

주제에 대한 흥미로운 질문 :

예를 들어, 다음 주문의 다음 로트가 이미 다른 쌍에 대해 열린 결과를 기반으로 하는 다중 통화 어드바이저가 있습니다.


주문 개시 조건 - 오픈 신호가 있는 경우 총 로트가 0.1 이하이고 총 인출액이 예치금의 101% 이하

옵션 1: 모든 데이터를 배열에 넣고 다음 데이터 열기 요청이 도착할 때 추출합니다(매 틱마다 새 주문을 열지 말자).


옵션 2 - 다음 주문 개설을 요청할 때마다 확인, 모든 쌍에 대해현재 시간 에 모두 사용 가능



어떤 솔루션이 더 빠르고 저렴할지

 

주석)