리소스 로딩... 로딩...

4.5 C++ 언어 빠른 시작

저자:선함, 2019-04-30 08:50:54, 업데이트:

요약

C++는 매우 어려운 프로그래밍 언어입니다. 어려운 부분은 주로 깊이 있는 학습입니다. 하지만 C++로 전략 논리를 작성하면 매우 복잡한 전략이 아닌 한 많은 깊은 지식이 필요하지 않습니다. 몇 가지 기초를 배우는 것이 충분합니다.

img

왜 우리는 C++를 양적 거래용으로 선택해야 할까요?

일부 사람들에게 C++를 사용하는 것은 모든 사람이 사용할 수 있는 것이 적합하다는 것을 의미하지는 않습니다. 이유는 프로그래밍 언어가 단지 도구이기 때문입니다. 양적 거래에서 C++는 필수 요소가 아닙니다. 파이썬이나 C++와 같은 스크립트 프로그래밍 언어를 사용하는 것이 좋다면 많은 시간과 에너지를 절약 할 수 있습니다. 이는 전략 설계에 집중하는 데 사용될 수 있습니다.

그러나 양적 투자 기관 중, 기본 양적 거래 시스템 소프트웨어의 대부분은 C++에 의해 작성되었습니다. 왜냐하면 고유 한 언어 특성이 특히 수치 계산에서 다른 언어보다 일부 측면에서 효율적이고 빠르기 때문입니다. 이것은 또한 C++가 금융 파생상품과 고주파 거래에 더 적합하다는 것을 의미합니다. 따라서 더 빠른 프로그래밍 언어를 사용하려면 C++이 있어야합니다.

전체 전략

모든 사람들이 이 섹션의 내용을 더 빠르게 이해하도록 하기 위해, C++ 언어를 소개하기 전에, C++에 의해 작성된 전략을 살펴보자.

img

우리는 모두 MACD가 두 개의 곡선을 가지고 있다는 것을 알고 있습니다. 즉 빠른 라인과 느린 라인을 기반으로 거래 논리를 설계합니다. 빠른 라인이 느린 라인을 넘을 때 긴 포지션을 열고 빠른 라인이 느린 라인을 넘을 때 짧은 포지션을 열십시오. 완전한 전략 논리는:

  • 긴 포지션 오픈: 현재 포지션이 없으며 빠른 라인이 느린 라인보다 크면.

  • 짧은 포지션 오픈: 현재 포지션이 없으며 빠른 라인이 느린 라인보다 작다면.

  • 긴 포지션을 닫습니다: 현재 긴 포지션을 유지하고 있고 빠른 라인이 느린 라인보다 작다면.

  • 마감 마감 위치: 현재 마감 위치가 있고, 빠른 라인이 느린 라인보다 크면

위의 전략 논리를 C++ 언어로 작성하면 다음과 같습니다:

double position = 0;  //Position status parameter, the default position is 0
uint64_t lastSignalTime = 0; // Last signal trigger time

bool onTick(string symbol) { // onTick function, inside the function is the strategy logic
    auto ct = exchange.SetContractType(symbol); // set the trading variety
    if (ct == false) { // if setting the trading variety is not successful 
        return false; // return false
    }
    auto r = exchange.GetRecords(); // get the k line array
    if (!r.Valid || r.sizeO < 20) { // if get the k line array is not successful or the number of k line is less than 20 
        return false; // return false
    }
    auto signalTime = r[r.size() - 2].Time; // get the previous k line time
    if (signalTime <= lastSignalTime) { // if the previous k line time is less than or equal to the last trigger signal time
        return false; // return false
    }
    auto macd = TA.MACD(r); // calculate the MACD indicator
    auto slow = macd[0][macd[0].size() - 2]; // get the previous k line MACD value 
    auto fast = macd[l][macd[l].size() - 2]; // get the previous k line MACD average value
    string action; // define a string variable action
    if (fast >= slow && position <= 0) { // if the previous k line macd value is greater than or equal to the previous k line macd average value, and there are no long position holding
        action = "buy"; // assign buy to the variable action
    } else if (fast <= slow && position >= 0) { // if the previous k line macd value is less than or equal to the previous k line macd average value, and there are no short position holding
        action = "sell"; // assign sell to the variable action
    }
    if (actton.size() > 0) { // If there are orders for placing order
        If (position != 0) { // If there are holding position
            ext::Trade("cover", symbol); // call the C++ trading class library and close all position
        }
        position = ext::Trade(action, symbol, 1); // call the C++ trading class library, placing orders according the direction of variable "action", and renew the position status
        lastSignalTime = signalTime; // reset the time of last trigger signal
    }
    return true; // return true
}

void main() { // program starts from here
    while (true) { // enter the loop
        if (exchange.IO("status") == 0) { // if the connection with the exchange is not successful
            Sleep(1000); // pause for 1 second
            continue; // skip this loop, continue to the next loop
        }
        if (!onTtck("this_week")) { // if the connection is ok, enter the if loop and start to execute the onTick function
            Sleep(1000); // pause for 1 second
        }
    }
}

위의 코드는 C++로 작성된 완전한 양적 거래 전략입니다. 실제 시장에서 적용 될 수 있으며 자동으로 주문을 할 수 있습니다. 코드 크기에 따라 다른 언어보다 더 복잡합니다. 왜냐하면 C++ 언어는 주로 FMZ Quant 플랫폼에서 고주파 전략 개발을 위해 사용되기 때문입니다.

코딩 부분은 이전보다 조금 더 많지만, 불필요한 트레이딩 클래스 라이브러리가 이미 많이 줄어들었고, 기본 시스템 수준의 처리 대부분은 FMZ 퀀트 플랫폼에 의해 패키지되었습니다.

초보자에게는 전체 전략의 설계 프로세스가 변경되지 않습니다: 시장 다양성을 설정하고 K-라인 데이터를 얻고 위치 정보를 얻고 거래 논리를 계산하고 주문을합니다.

식별자

식별자는 또한 이름이다. C++의 변수와 함수 이름은 대소문자 민감성, 즉 변수 이름 테스트와 변수 이름 테스트는 두 가지 다른 변수이다. 식별자의 첫 번째 문자는 문자, 하부점 _, 그리고 다음 문자는 또한 숫자가 될 수 있습니다.

mohd    zara    abc    move_name    a_123
myname50    _temp    j    a23b9    retVal

의견

댓글에는 단선 댓글과 블록 레벨 댓글이 포함됩니다. 단선 댓글은 두 개의 슬라이스로 시작되며, 슬라이스와 별자리 (/* ), 그리고 별자리와 슬라이스와 (*/ ) 로 끝납니다.

// this is a single-line comment

/*
 * this is a multiple-line comment
 * block-level comments
 *
 */

세미콜론 & 문장 블록

C++에서 반점점은 명령어 종료자입니다. 즉, 각 명령어는 반점으로 끝납니다. 논리적 실체의 끝을 나타냅니다. 예를 들어 세 가지 다른 명령어입니다:

x = y;
y = y + 1;
add(x, y);

변수

변수는 운영 저장 영역입니다. C++에서 변수를 정의하려면 먼저 변수의 유형을 정의해야합니다. 양적 거래 전략 개발에서 일반적으로 사용하는 유형은: 정수 (int ), 부동 (double ), 문자열 (string) 및 자동 파생 유형 (auto ).

정수는 정수로 이해될 수 있다. 부동 소수점 유형은 소수점으로 이해될 수 있다. 문자열은 문자이며 영어 또는 다른 언어의 문자가 될 수 있다.

때때로 API를 호출할 때, 하지만 이 API가 어떤 종류의 데이터를 반환할지 알 수 없으므로 자동 파생 타입 (auto) 을 사용하면 자동으로 데이터 타입을 결정하는 데 도움이 됩니다. 아래와 같이:

int numbers = 10; // use int to define a integer variable and assign 10 to this variable
double PI = 3.14159; // use double to define a float variable and assign 10 to this variable
string name = "FMZ Quant"; // use string to define a string variable and assign "FMZ Quant" to this variable
auto bar = exchange.GetRecords(); // use auto to define a variable (automatic derivation type) and assign k line array to this variable

배열

배열은 데이터를 저장하기 위한 컨테이너이다. C++ 배열은 같은 타입의 일정한 크기의 일정한 질의 요소들을 저장할 수 있다. 그래서 C++에서 배열을 선언하기 위해서는 요소의 종류와 요소의 수를 지정해야 한다. 모든 배열은 첫 번째 요소로서 지수가 0이다. 배열의 첫 번째 데이터는 "[0]", 두 번째 데이터는 " [1]", 그리고 다음과 같이 나타난다:

// define a array, array name is balance. there are 5 floating(double) type data inside it
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};

double salary = balance[0];  // get the first data in the array, the result is : 1000.0
double salary = balance[1];  // get the second data in the array, the result is : 2.0

기능

함수 는 하나의 작업을 함께 실행 하는 명령어 집합이다. 함수 선언에는 함수의 이름, 반환의 종류, 그리고 매개 변수가 포함된다. 반환 유형은 함수가 실행될 때 반환되는 데이터 타입이다. 매개 변수는 선택적이며 함수 또한 매개 변수를 포함할 수 없다. 함수가 호출될 때, 당신은 또한 함수에게 매개 변수를 전달할 수 있다. 다음 예제를 살펴보자:

// create a function called "max"
// when this function is called, it returns the int type data
// this function has 2 parameters, and they both are int type
// this function is for passing 2 int type numbers, and return the bigger one

int max(int num1, int num2) {
    int result; // define a int variable result
    if (num1 > num2) // if the num1 > num2
        result = num1; // assign the value of num1 to result
    else // otherwise
        result = num2; // assign the value of num2 to result
    return result; // return the value of result
}

운영자

양적 거래 전략을 작성하기 위해 C++를 사용하면 일반적으로 사용되는 연산자 세 가지가 있습니다: 수학적 연산자, 관계 연산자, 논리적 연산자 및 할당 연산자. 수학적 연산자는 덧셈,?? 셈, 곱셈, 나?? 셈의 수학적 연산입니다. 관계 연산자는 두 값이 더 작거나 더 크는지 비교할 수 있습니다. 논리적 연산자는 주로: 논리적 AND, 논리적 OR, 논리적 비. 할당 연산자는 우리가 전에 이야기 한 변수 할당입니다. 아래와 같이:

int main() {
    // arithmetic operator
    int a = 10;
    int b = 5;
    a + b; // the result is 15
    a - b; // the result is 5
    a * b; // the result is 50
    a / b; // the result is 2
    a % b; // the result is 0
    a++; // the result is 11
    a--; // the result is 9

    // relational operators
    a == b; // the result is false
    a != b; // the result is true
    a >= b; // the result is true
    a <= b; // the result is false

    logical operators
    true && true // the result is true
    true && false // the result is false
    false || false // the result is false
    true || false // the result is true
    !(true) // the result is false
    !(false) // the result is true
    return 0;
}

우선 순위

100*(10-1)/(10+5) 표현식이 있다면, 프로그램이 먼저 계산하는 단계는 무엇입니까? 중학교 수학은 우리에게 말합니다: 동일한 수준의 연산이라면 일반적으로 왼쪽에서 오른쪽으로 계산됩니다. 덧셈과 빼셈, 곱셈과 나?? 셈이 있다면 먼저 곱셈과 나?? 셈을 계산하고, 다음 더하고 빼십시오. 괄호가있는 경우 먼저 괄호의 내부를 계산하십시오. 연산 법칙이 충족되면 계산에 계산 법칙을 사용할 수 있습니다. 아래와 같이 C ++에 대한 위의 원칙과 동일합니다:

auto num = 100*(10-1)/(10+5); // the value of num is 60
1 > 2 && (2 > 3 || 3 < 5); // the result is : false
1 > 2 && 2 > 3 || 3 < 5; // the result is : true

조건부 진술

일반적으로 우리가 코드를 쓸 때, 우리는 항상 다른 결정을 위해 다른 동작을 수행해야 합니다. 우리는 이 작업을 수행하기 위해 코드에서 조건부 명령어를 사용할 수 있습니다. C++에서는 다음과 같은 조건부 명령어를 사용할 수 있습니다:

  • if 명령어 - 이 명령어를 사용 하 여 지정 된 조건이 사실이라면만 코드를 실행 합니다

  • If...else 명령어 - 지정된 조건이 사실이라면 코드를 실행, 다른 조건이 거짓되면 코드를 실행

  • if...else if...else 명령어 - 이 명령어를 사용하여 실행할 여러 코드 블록 중 하나를 선택

  • 스위치 명령어 - 이 명령어를 사용하여 실행할 여러 코드 블록 중 하나를 선택

If 문장

이 명령어는 지정된 조건이 사실이라면만 코드를 실행합니다. 작은 글자를 사용하십시오. 대문자 (IF) 를 사용하면 C++ 오류가 발생합니다! 아래와 같이:

// grammar
if (condition) {
    //execute code only if the condition is true
}
 
//example
if (time<20) { // if current time is less than 20:00
    x = "Good day"; // when the time is less that 20:00, assign the "good day" to x
}

만약... 다른 표현

지정된 조건이 사실이라면 실행 코드, 조건이 거짓되면 실행되는 다른 코드, 아래와 같이:

//grammar
if (condition) {
    // execute code if the condition is true
} else {
    // the other code executed when the condition is false
}
 
//example
if (time<20) { // if current time is less than 20:00
    x = "Good day"; // when the time is less that 20:00, assign the "good day" to x
} else { // otherwise
    x = "Good evening"; // assign the "Good evening" to x
}

스위치 선언

이 명령어를 사용하여 실행할 여러 코드 블록 중 하나를 선택

switch (condition)
{
    case 1: // code to be executed if condition = 1;
        break;
    case 2: // code to be executed if condition = 2;
        break;
    default: // code to be executed if condition doesn't match any cases
}

루프용

For 루프는 N번의 코드 블록을 반복적으로 실행할 수 있으며 실행 흐름은 다음과 같습니다.

for (int a = 10; a < 20; a++){
    // code block
}
  • 단계 1: int a = 0을 실행하고 한 번만 실행합니다. 그것의 목적은 정수 변수를 선언하고 for 루프를 제어하기 위해 0으로 초기화하는 것입니다.

  • 2단계: a<20을 실행합니다. true가 되면 2줄의 코드 블록을 실행합니다.

  • 단계 3: a++를 실행하고, a++를 실행한 후, a는 11이 됩니다.

  • 단계 4: a<20을 다시 실행하고, 두 번째, 세 번째, 네 번째 단계가 반복적으로 실행됩니다. a<20이 거짓이 될 때까지, 거짓이라면 2 행의 코드 블록이 실행되지 않으며 전체 for 루프는 완료됩니다.

루프 동안

우리는 모두 시장이 끊임없이 변화한다는 것을 알고 있습니다. 최신 K-라인 배열을 얻고 싶다면 끊임없이 같은 코드를 반복해서 실행해야 합니다. 그러면 while 루프를 사용하는 것이 가장 좋은 선택입니다. 지정된 조건이 사실인 한 루프는 최신 k-라인 배열 데이터를 계속 얻을 것입니다.

void main() {
    auto ct = exchange.SetContractType(symbol); //set the trading variety
    while(true) {
        auto r = exchange.GetRecords(); // constantly getting k-line arrays
    }
} 

파기 진술

루프에는 전제 조건이 있습니다. 이 전제 조건이 "진짜"일 때만 루프는 반복적으로 작업을 시작하여 전제 조건이 "거짓"이 될 때까지 루프는 종료됩니다. 그러나 브레이크 명령어를 사용하면 루프 실행 중 즉시 루프에서 뛰어 나갈 수 있습니다.

# including <iostream>
using namespace std;
int main() {
    for(int a = 0; a < 5; a++) {
        if(a == 2) break;
        cout << a << endl;
    }
    return 0;
}

// print out : 0, 1

계속해

계속 명령어는 또한 루프에서 뛰어 나오지만 전체 루프에서 뛰어 나오지 않습니다. 대신 루프를 중단하고 다음 루프로 계속합니다. 아래와 같이, a=2이 되면 루프는 중단되고 다음 루프는 루프의 전제 조건이 전체 루프에서 뛰기 위해 "거짓"이 될 때까지 계속됩니다.

# including <iostream>
using namespace std;
int main() {
    for(int a = 0; a < 5; a++) {
        if(a == 2) continue;
        cout << a << endl;
    }
    return 0;
}

// print out : 0, 1, 3, 4

반품신고

return 명령어는 함수의 실행을 종료하고 함수의 값을 반환합니다. return 명령어는 함수의 본부에서만 나타날 수 있으며 코드 내의 다른 장소는 문법 오류를 일으킬 것입니다!

# including <iostream>
using namespace std;

int add(int num1, int num2) {
    return num1 + num2;  // The add function returns the sum of two parameters
}
 
int main()
{
    cout << add(5, 10); // call the add function, and print out the result:50
    return 0;
}

전략 건축

FMZ 퀀트 플랫폼에서 C++로 전략을 작성하는 것이 매우 편리합니다. FMZ 퀀트에는 다음과 같은 공식적으로 내장된 표준 전략 프레임워크와 거래 클래스 라이브러리가 많이 있습니다.

bool onTick() { //onTick function
    // strategy logic
}

void main() { // program starts from here
    while (true) { // enter the loop
        if (exchange.IO("status") == 0) { // if the exchange connection is not stable
            sleep(1000); // pause for 1 second
            continue; // skip this loop, enter the next loop
        }
        if (!onTick()) { // if the exchange connection is stable, enter this if statement, start to execute the onTick function
            sleep(1000);// pause for 1 second
        }
    }
}

위와 같이, 이것은 표준 전략 프레임워크이며, 이러한 형식은 고정되어 있습니다. 전략을 작성하기 위해 프레임워크를 사용하십시오. 당신은 단지 두 번째 줄에서 전략 논리를 작성해야합니다. 다른 시장 인수 및 주문 처리는 프레임워크와 거래 클래스 라이브러리에 의해 처리되며, 당신은 단지 전략 개발에 집중해야합니다.

요약하면

위의 내용은 C++ 언어 빠른 시작의 내용입니다. 더 복잡한 전략을 작성해야하는 경우, FMZ 퀀트 플랫폼 C++ 언어 API 문서를 참조하거나 직접 작성 서비스에 대한 공식 고객 서비스를 문의하십시오.

다음 섹션에 대한 알림

양적 거래의 핵심은 거래 도구 (프로그래밍 언어) 가 아니라 거래 전략입니다. 다음 섹션에서는 실행 가능한 C ++ 거래 전략을 작성합니다. 여전히 가장 간단한 기술 분석 지표를 예로 사용합니다.

학교 후 운동

  • FMZ 퀀트 플랫폼에서 C++ 언어를 사용하여 역사적인 K-라인 데이터를 얻으려 합니다.
  • 이 섹션의 시작에 전략 코드를 작성하고 다음으로 특정 언급을 시도하십시오.

더 많은