많은 사람들에게 흥미로운 주제: MetaTrader 4 및 MQL4의 새로운 기능 - 큰 변화가 진행 중입니다. - 페이지 66

 
MetaDriver :

스프레드가 트레이더의 커미션보다 높으면(바로 이것이 미성년자의 상황임) 트레이더가 스프레드 내에서 한도를 가진 핍을 만드는 것이 이익이 됩니다(다음 경기의 조건에서). 이는 자동으로 스프레드를 낮추고 거래를 위해 십자가를 더 매력적으로 만듭니다....등.

요컨대 - 가서 수업을 배우십시오 .. :)

글쎄 그렇지 않을거야
 
Mischek :
글쎄 그렇지 않을거야

정확히 어떤 일이 일어나지 않습니까? 일치 또는 자동 결과?

좀 더 구체적으로 말씀해 주세요.. ;)

 
MetaDriver :

정확히 어떤 일이 일어나지 않습니까? 일치 또는 자동 결과?

좀 더 구체적으로 말씀해 주세요.. ;)

수업이 이루어지지 않을 것입니다. :)
 
MetaDriver :

정확히 어떤 일이 일어나지 않습니까? 일치 또는 자동 결과?

좀 더 구체적으로 말씀해 주세요.. ;)

당신이 과장하는 결과
 
MetaDriver :

정확히 어떤 일이 일어나지 않습니까?

아무것도 안 일어날거야 . 하나의 큰 메타 거래자. 그리고 침묵)
 
MetaDriver :

당신은 당신이 얼마나 많이 모였는지조차 모릅니다. MT5 플랫폼에서 대규모 매칭 도입은 어떤 의미에서는 시장 "폭탄"이 될 수 있습니다. 이론적으로 가까운 장래에 외환 시장에서 "반시장 조성자 혁명"으로 이어질 수 있기 때문입니다. 어쩌면 "혁명"이라는 용어는 과장일 수도 있고 아닐 수도 있습니다. 모든 거래자가 시장 조성자가 될 수 있기 때문입니다(가격에 영향). 세계 시장의 상당 부분을 포괄하는 네이티브 애그리게이터의 대량 배포로.... 통화 가격 책정에 대한 유동성 공급자의 독점(거의) 힘의 시대는 영원히 끝날 수 있습니다.

이러한 배경에 대해 "혁신적인" 질문이 발생합니다. 거래자는 "새로운 시대"에 대한 준비가 되어 있습니까? 스프레드 형성 알고리즘을 테스트, 최적화 및 디버깅하기 위해 "광범위한 거래자"가 가지고 있는 일반 도구는 무엇입니까?

하지만 아무도.

티크 이력이 없습니다. 테스터에서 디버깅은 구현되지 않습니다. 견적 기준의 형식은 지정가 주문을 사용하여 HFT 전략을 테스트하고 최적화하는 데 사용할 기회를 남기지 않습니다( 즉, 모든 스프레드 형성 알고리즘이 그렇습니다 ).

동의합니다. 그냥 반대 진술: 현재 견적 형식은 수익 전략과 마찬가지로 브레이크아웃 전략에 적합하지 않습니다. 그러나 제안된 것과 같은 간단한 방법으로는 치료할 수 없습니다. 다가오는 상황에서 "극적인 개요"(위 참조)를 얻는다는 사실에도 불구하고 적어도 한 종류의 전략을 치료할 수 있습니다. 게다가, 다른 전략은 겪지 않을 것입니다! 피해자를 본다면 제안된 방식으로 확산을 수정하면 테스트/최적화의 현실성이 악화되는 전략 클래스의 예를 제시하십시오.

여기에 전적으로 동의합니다. 사실 테스터는 여전히 틱입니다. 따라서 사실 우리는 정규 역사의 형식에 대해서만 이야기하고 있습니다. 필요한 경우 "비표준 따옴표"를 사용할 수도 있습니다.
메타드라이버 :

나는 "모퉁이를 돌아보기"위해 조금 더 노력하고 있습니다. // 당신이 쓴 모든 것이 정확합니다.

"대량 시장 조성자"는 정확히 귀하가 설명한 시나리오의 작동으로 인해 결국 달러에 의해 "만능 교환기"의 위치를 잃는 것으로 이어질 수 있습니다. 이것은 "미성년자"에 대한 스프레드가 크게 감소한 단순한 결과입니다. 외환 시장은 더욱 역동적이고 효율적이 될 것입니다. 그리고 예측에 기반한 거래 시스템(가격 조작이 아닌)이 승리할 것입니다. 나에게 환율에 대한 모든 비시장 규제는 심각한 남용으로 가득 차 있습니다. 동시에, 아무리 고귀한 목표를 선언하더라도 검증을 위해 내부자를 화폐화할 가능성이 항상 있으며 법적 메커니즘이 이를 거부할 수 있다고 가정하는 것은 어리석은 일입니다.

간단히 말해서 - 저는 "공정한 외환"에 관심이 있습니다. 아마도 저는 개인적으로 그러한 역전으로 인해 재정적으로 이익을 얻지 못할 것입니다(아마도 그럴 것입니다). 그러나 내가 병합하면 적어도 내가 어리석은 알고리즘을 개발했기 때문에 병합하고 있다는 것을 알게 될 것이지, 내가 어리석게 "착한" 사람이었기 때문이 아닙니다.

지금까지 코멘트가 없습니다. 더 생각하겠습니다. 나는 순전히 스톱에서 일정한 로트를 거래하는 단일 수익성 전략을 본 적이 없습니다. 없음. 이론적으로 이것은 매우 이해할 수 있습니다. (그들이 존재한다고 말하는 것은 H-변동성이 지속적으로 2.0보다 큰 거래 지평이 있다는 것을 말하는 것입니다.) 내가 본 모든 작동 추세 전략은 시장 주문으로 가득 차거나 지정가 주문에 의한 철수에 진입/종료합니다. (또는 시장). 시장의 경우 HighAsk/LowBid 기록은 LowAsk/HighBid보다 더 가치가 없습니다. 그들에게는 OHLC 막대의 모든 지점에서 스프레드에 대한 정보가 더 중요합니다.

마지막으로 HighBid+LowAsk와 같은 절반 측정만으로는 테스터를 적절하게 만들기에 충분하지 않다는 것을 이해하게 됩니다.

 
Urain :

마지막으로 HighBid+LowAsk와 같은 절반 측정만으로는 테스터를 적절하게 만들기에 충분하지 않다는 것을 이해하게 됩니다.

작성된 내용에서 그러한 결론을 도출하면 ... 당신도 아무것도 이해하지 못했습니다)
 
TheXpert :
작성된 내용에서 그러한 결론을 도출하면 ... 당신도 아무것도 이해하지 못했습니다)

글쎄, 당신은 무엇을 할거야?! 그가 와서 몇 마디만 하면 잠 못 이루는 밤이 보장됩니다. )

저를 위한 글은 아니었지만 지금은 잠도 안 옵니다.

 
MetaDriver :

(존재한다는 것은 H-변동성이 지속적으로 2.0보다 큰 거래 범위가 있음을 의미합니다)

글쎄요, 이것은 일반적으로 유행하는 성배 입니다. 뿐만 아니라 꾸준히 2x 미만입니다. 열 전체에 걸쳐 H-ox가 일관되게 2보다 작거나 크도록 하는 그러한 도구가 없습니다. 특정 지역에서/특정 순간에. 추세를 거래할 때와 반환할 때를 알고 있습니다. 시장 필터링
 
hrenfx :

새로운 거래를 위해 테스터를 개선해야 했습니다. 이전 코드를 이해하는 것은 새 코드를 작성하는 것보다 잃을 시간이 더 많습니다(몇 주를 죽였습니다. 때때로 접근 방식을 사용했습니다).

그래서 처음부터 새로운 테스터를 작성하는 데 5시간이 걸렸습니다(디버깅 포함). 그 특징(나는 시작으로서 만족한다):

  • M1 HighBid + LowAsk 막대별 모델과 함께 작동합니다(결과는 MT5 테스터보다 정확함).
  • 한 캐릭터.
  • 테스트 TS에서 초당 약 100,000,000 bar (초당 277 FOREX 년)의 속도 (i7 2700K)는 비어 있지 않고 많은 것이 계산됩니다. 시장에서 끊임없이.  
  • 누락된 MM - 많지 않습니다.
  • 핍으로만 이익을 얻습니다.
  • 평균 슬리피지 및 커미션을 조정하는 기능.
  • 자체 최적화 기준이 있는 옵티마이저 - 각각에 대해 정렬된 실행 행과 함께 별도의 파일이 생성됩니다(기가바이트가 소요될 수 있음).
  • 테스터에 오류 검사가 없습니다. 테스터의 모든 뉘앙스를 알고 있으므로 허용하지 않습니다.
  • TS는 약간 잘린 MQL4로 작성되었습니다. 불필요한 부분은 삭제되었습니다. 그러나 C++의 모든 기능을 사용할 수 있습니다.
  • 테스터는 OOP 없이 작성되었습니다. 올바르게 작성하는 방법을 모르겠습니다. 저것들. 거의 순수한 C 언어.
  • 무료 C++ 의 소스 ~ 20Kb.
  • 정류장 및 시장이 버려집니다(OrderClose가 남음) - 필요하지 않습니다.
  • 각 실행(선택 사항 - 실행 번호 지정)을 매트에서 시각화하고 연구할 수 있습니다. 패키지 - 파일은 단순히 Equity 및 Balance 쓰기를 변경합니다.
  • 유전자가 없습니다.
  • OpenCL이 없습니다 - 할 수 없습니다.
  • 단일 스레드. 모든 코어를 로드하는 것은 어리석은 일입니다. 몇 가지 옵티마이저를 수동으로 실행하십시오.
  • 콘솔 응용 프로그램.
  • TS 입력 매개변수, 테스터 설정 및 최적화 범위는 파일에 지정됩니다.
  • TS는 테스터와 함께 단일 EXE 파일로 컴파일됩니다.
  • 시작하기 전에 EXE, 기록, 설정의 세 가지 파일만 있습니다.
  • 옵티마이저는 실행의 현재 상태가 조건을 충족하지 않으면(예: 드로다운이 너무 높음) 실행을 중단합니다.
  • 테스터에 대한 기록은 오래 전에 작성된 MQL4 스크립트에 의해 준비됩니다.
  • 주문 테이블에 대한 메모리 동적 할당 없음 - 메모리를 한 번 할당하고 잊어버리십시오.
  • 로그 없음 - 보지 않습니다.
  • 주문 내역 없음 - 유사합니다.
  • 표시기의 개념과 이와 관련된 모든 것은 없습니다. TS에는 필요하지 않습니다.
  • 가격은 정수(long int)입니다.

MQL5에서 동일한 넌센스를 제출하면 클라우드를 메이트 모드로 사용할 수 있습니다. 최적화. 매번 기록만 보내야 합니다. 여기서 이러한 정보를 정기적으로 압축해야 합니다.

전체적으로 이론적으로 초당 ~ 1000억 막대의 속도를 달성하는 것이 가능합니다(테스트 TS에서). 같은 앵무새의 전체 클라우드에서 MT5 테스터의 성능은 무엇인지 궁금합니다.

초당 1000억 바는 다양한 종류의 연구에 적합한 속도 입니다. 다른 단위로 변환하면 이 속도는 1초에 한 기호인 FOREX 분 기록의 연도가 ~ 300,000번 실행됨을 나타냅니다.

대부분의 시간은 언어의 구문을 배우는 데 보냈습니다. 그냥 구글링했습니다. 프로그래머가 아닙니다 .

귀하의 겸손한 요구에 대한 보편적인 프레임워크를 작성하는 것은 엄청난 시간 낭비라고 즉시 말씀드리고 싶습니다. 더 나은 탐색. 고려해야 할 사항이 있으면 추가하십시오.

이것은 핵심일 뿐입니다. 이제 옵티마이저를 위한 까다로운 툴킷이 필요합니다. 여기에는 훨씬 더 많은 시간이 소요됩니다. 생각해야 합니다.

그래서 나는 이 모든 것을 읽었고 , 사람이 자신의 의식의 흐름에 완전히 빠져 있거나 그가 쓴 것의 적어도 절반은 단순하고 평범한 거짓말이라는 생각이 듭니다.

언어에 대한 깊은 지식이 없는 독학 프로그래머가 몇 시간 만에 초당 100,000,000바의 성능을 가진 단일 스레드 테스터를 작성했다고요? 대조적으로, 가장 높은 수준의 전문성을 가진 사람들은 유능한 고성능 HFT 테스터를 만드는 데 수년을 보내고 전체 팀을 만들어 함께 작업하고 전략을 작성하지만 여기에서 한 사람이 테스터를 무릎에 앉히기로 결정하고 즉시 선도적인(폐쇄형) HFT 플랫폼의 성능보다 훨씬 더 높은 성능을 제공합니다.

초당 100,000,000개의 막대를 실행할 수 있도록 메모리가 가져야 하는 대역폭을 계산해 보겠습니다. 각 막대는 4개의 가격 + AskLow HighBid이며, 각각 길이가 64비트인 6개의 정수 유형이 생성됩니다( Integer price(long int) ). 초당 100,000,000바의 경우

64비트 * 6개 가격 * 100,000,000바 = 38,400,000,000비트 = 4,800,000,000바이트 = 초당 4,577MB .


이는 DDR2 533 이상 메모리 모듈 에서 이러한 성능을 근본적으로 이론적으로 달성할 수 있음을 의미합니다. 최소한 선언된 성능은 현대 장비의 물리적 한계와 비슷합니다.

그러나 프로그램 시간 비용은 훨씬 더 중요한 제한을 부과합니다. 무시할 수 없습니다. 그래서 저는 빠른 64비트 C 컴파일러 Win-Lcc 64 를 사용하여 많은 수학적 계산 없이 막대 배열의 직접 반복 성능을 측정했습니다. 참고: 우리는 직접에 대해 이야기하고 있습니다. 가장 빠른 반복. 환경 및 기타 간접 비용과 함께 일하지 않습니다. hellfix와 달리 저는 "전략 테스터"의 전체 소스 코드를 제공하여 누구나 좋아하는 컴파일러에서 컴파일하고 성능을 측정할 수 있도록 합니다.

 #include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define LAPS 10000               //Количество серий
#define ELEMENTS 10000            //Количество баров в одной серии
#define INVOKE                   //Определено, если требуется эмулировать
                                / /вызов функции

//Представление бара
struct bar
{
         long long Open;
         long long High;
         long long Low;
         long long Close;
         long long AskLow;
         long long BidHigh;
};

int main( void )
{
         struct bar bar_array[ELEMENTS];
         //Общее время выполнения стратегии
        clock_t eleps_time = 0 ;
         //Общее время выполения
        clock_t total_time = 0 ;
         //К сожалению заявленный объем памяти (100 000 000 баров) выделить не удалось,
     //поэтому выделяем память порциями, 1000 раз, по 100 000 баров за раз.
        clock_t ttime = clock();
         for ( int lap = 0 ; lap < LAPS; lap++)
        {
                 //Заполняем бары случайными числами
                 for ( int i = 0 ; i < ELEMENTS; i++)
                {
                        bar_array[i].Open = ( long long ) rand ();
                        bar_array[i].High = ( long long ) rand ();
                        bar_array[i].Low = ( long long ) rand ();
                        bar_array[i].Close = ( long long ) rand ();
                        bar_array[i].AskLow = ( long long ) rand ();
                        bar_array[i].BidHigh = ( long long ) rand ();
                         //if(i < 5)
                         //      printf("%i\n", bar_array[i].High);
                }
                 //Эмулируем работу ТС c массивом котировок
                 //Рассчитываем время на выполнение этого блока и суммируем его, получая общее время
                 //выполнения
                clock_t btime = clock();
                 //Наша стратегия будет проверять простое соответствие проверяемого бара настоящему.
                 //Настоящий бар, это бар чей high > open, low, close а low < high, open, close
                 int signal = 0 ;

                 for ( int i = 0 ; i < ELEMENTS; i++)
                {
                         #ifndef INVOKE
                         if ( bar_array[i].High > bar_array[i].Low &&
                            bar_array[i].High > bar_array[i].Open &&
                                bar_array[i].High > bar_array[i].Close)
                                signal++;
                         #endif
                         #ifdef INVOKE
                        signal += TradeSystem(&bar_array[i]);
                         #endif
                 }
                eleps_time += clock() - btime;
        }
         printf ( "Bars was worked: %i\n" , LAPS*ELEMENTS);
         //Печатаем общее время выполнения
     double timedif = (( double )clock() / ( double )CLOCKS_PER_SEC);
     printf ( "Bars %f seconds\n" , timedif);
         //Печатаем время выполнения торговой системы
         double eleps_diff = ( double )eleps_time / ( double )CLOCKS_PER_SEC;
         printf ( "The TradeSystem time is %f seconds\n" , eleps_diff);
         printf ( "The Eleps tik is %i tiks\n" , eleps_time);
         return 0 ;
}
//
// Функция торговой системы. Принимает на вход бар,
// обрабатывает его и возвращает целочисленный результат
int TradeSystem( struct bar &cbar)
{
         if ( cbar.High > cbar.Low &&
                cbar.High > cbar.Open &&
                cbar.High > cbar.Close)
                                 return 1 ;
         return 0 ;
}

이 코드는 Invoke 지시문에 따라 배열을 반복하고 간단한 비교(매우 빠른 작업)를 수행하거나 동일한 비교를 수행하는 함수를 호출한다는 것을 알 수 있습니다.

이제 이 코드가 100,000,000개의 막대를 반복하고 비교하는 데 얼마나 걸렸는지 봅시다.

100,000,000개의 바를 직접 열거하는 데 1.28초가 소요되었음을 알 수 있으며, 이는 선언된 성능보다 거의 3분의 1 수준입니다.

100,000,000개의 막대를 열거하고 각 막대에 대해 계산된 함수를 호출하는 데 1.79초가 소요되었음을 알 수 있습니다. 이는 선언된 성능보다 1.5배 이상 나쁩니다.

모든 테스트는 하드웨어 i7 870, DDR3 3200 8Gb에서 수행되었습니다.

대부분의 시간은 실제 데이터 준비(약 9초)에 소요되었습니다. 옵티마이저의 설계에서 약간의 비최적성으로 인해 막대한 오버헤드 비용이 발생합니다. 하지만 이번에는 고려하지 않았기 때문입니다. 그것은 단지 전략을 실행하는 것에 관한 것이었습니다.

자신의 결론을 도출하십시오. 나는 수치가 선언 된 결과가 가볍게 말해서 현실과 일치하지 않는다는 것을 보여주기를 바랍니다. 옵티마이저를 설명하는 코드의 이론적인 성능조차도 선언된 것과 일치하지 않습니다. 선언된 기능에 접근하는 실제 테스터를 구현하면 성능이 더욱 떨어집니다. 모든 함수 호출, 다소 유용한 수학적 계산은 맨손으로 열거하는 시간을 즉시 단축합니다.