システムトレード 게시글

トレーリングストップとマジックナンバー - MetaTrader 4用自動売買システム

첨부파일
34177.zip (1.19 KB, 다운로드 0회)

トレーリングストップは、ストップロスを利益エリアに移動させることで、常に自動的に取引を確保するのをサポートします。

まず、トレーリングストップの入力パラメータを指定するコードから始めましょう。

input bool isTrailingStop = true; //トレーリングストップ
input int trailingStart = 15; //トレーリング開始(pips)
input int trailingStep = 5; //トレーリングステップ(pips)

input int MagicNumber = 0; //マジックナンバー

グローバル変数

//グローバル変数
double myPoint = 0.0;

このEAを実行すると、最初にOnInit()関数が実行され、この関数内で入力変数の検証と初期化を行います。

int OnInit()
{
    if (isTrailingStop && trailingStart <= 0) {
        Alert("パラメータが不正です");
        return(INIT_PARAMETERS_INCORRECT);
    }
    myPoint = GetPipPoint(Symbol());
    return(INIT_SUCCEEDED);
}

価格の動き(ティック)が発生するたびに、このEAがペアリングされているチャート上でOnTick()関数が実行されます。この関数内ではsetTrailingStop()関数が呼び出されます。

void OnTick()
{
    //---
    setTrailingStop(MagicNumber);
}

setTrailingStop()関数

void setTrailingStop(int magicNumber = 0) {
    if (isTrailingStop == false) return;
    int tOrder = 0;
    string pair = "";
    double sl = 0.0, tp = 0.0;
    pair = Symbol();
    tOrder = OrdersTotal();
    for (int i = tOrder - 1; i >= 0; i--) {
        bool hrsSelect = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        if (OrderMagicNumber() == magicNumber && StringFind(OrderSymbol(), pair, 0) == 0) {
            if (OrderType() == OP_BUY) {
                if ((Bid - (trailingStart * myPoint)) >= OrderOpenPrice() && (Bid - ((trailingStart + trailingStep) * myPoint) >= OrderStopLoss())) {
                    sl = NormalizeDouble(Bid - (trailingStart * myPoint), Digits());
                    if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, clrBlue)) {
                        Print("#", OrderTicket(), " ストップロスの更新に失敗しました");
                    }
                }
            }
            if (OrderType() == OP_SELL) {
                if ((Ask + (trailingStart * myPoint)) <= OrderOpenPrice() && ((Ask + ((trailingStart + trailingStep) * myPoint) <= OrderStopLoss()) || OrderStopLoss() == 0.0)) {
                    sl = NormalizeDouble(Ask + (trailingStart * myPoint), Digits());
                    if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, clrBlue)) {
                        Print("#", OrderTicket(), " ストップロスの更新に失敗しました");
                    }
                }
            }
        }
    }
}

他に必要な標準関数はGetPipPoint()です。

// GetPipPoint関数
double GetPipPoint(string pair) {
    double point = 0.0;
    int digits = (int) MarketInfo(pair, MODE_DIGITS);
    if(digits == 2 || digits == 3) point = 0.01;
    else if(digits == 4 || digits == 5) point = 0.0001;
    return(point);
}

ご質問がある場合は、コメントに残してください。また、グループシェアリングにも参加できます(インドネシア語) t.me/codeMQL

また、SignalForexアプリも提供しています。

SignalForexアプリをダウンロードし、使用することで、より利益を上げるためのサポートをしていただけます。

SignalForexアプリはこちらからダウンロードできます。

    연관 포스트

    댓글 (0)