cAlgo Tips & Sample cTrader Tools (cBot インジケーター)

【cTrader】ストップロスが決められない人達へ【Tools】

2021年1月14日

ストップロスの位置がわからない!

ストップロスはどこに置こう?

エントリーしたいけど、どこにストップロスを置いたらいいか迷うということありませんか?

「そんなの迷う時点で半人前」とか言われてしまえばその通りなんですが、たとえルール通りにストップ決めてトレードしてる人もきっと一度はこんな経験があるんじゃないでしょうか。

(ajinori昔のトレード日誌より抜粋(泣))

もちろん本来はこの負けは負けで受け入れて、そのままぶれずにルール通りにトレードを繰り返すのが正しい姿勢です。

しかし、あまりにもこういうトレードを繰り返すと「もしかしてストップロスのルールを見直した方がいいのかも・・・」「いや、いっそのことストップロスのルールなんて決めないほうが正解なのかも・・・」って気持ちになることもあるんじゃないでしょうか。

 

じゃあこんなことを試してみては

そんな気持ちに陥ってしまったときにもしかしたら役に立つかもしれない手法を紹介します。

というか昔ajinoriがそんな風に思ってしまったときに試していた手法です。お勧めというほどではありませんが、一応、使ってて利益は出せていました

もちろん使い方次第なんですけどね。トレンド判断は間違ってないのに、ストップロスの設定が下手すぎて負けてしまうという方には相性がいいと思います。

 

ストップロスを散らして注文してみる

手法というほどのものでもなく、わからないなら適当に何パターンも入れればいい、という単純思考です。つまりこんな注文をします。

わかりますかね?エントリー時にポジションを分割してストップロスとテイクプロフィットを散らしてます。図ではラベルが重なってて見えてませんが、0.1Lots×10ポジションで合計で1.0Lots持ってます。手動で入れるのは大変なのでcBot化しました。

 

SplashOrder

機能概要

以前、公開したEasyEntryと同じような形でエントリーできます。起動して、(一番小さい)ストップロスにしたい位置でクリックすると、設定した数に分けて注文が入ります

【cTrader】EasyEntry【便利ツール】

エントリーロットどう決めてますか? エントリーする際のロット数ってどう決めてますか?毎回固定ロットの方もいれば、資金がある程度増えたらロットをあげるというルールがある方もいるでしょう。もしかしたら「毎 ...

続きを見る

なお、EasyEntryにあるような自動ロット調整機能と待機注文機能はありませんのでご了承ください。

 

パラメータ

Whole Lots

全体のロット数を指定します。これを分割して発注します。合計がこの数値を超えないように、分割後の端数は切り捨てて発注されます。

Split

いくつに分割するか指定します。あまり細かく分けすぎるなどで1発注当たり発注量が最低発注単位を下回ると発注されません

SL Step Pips

何Pipsおきにストップロスを置くか指定します。

Risk Reward Ratio

リスクリワード比を指定します。この数値でストップロスからテイクプロフィットが自動的に設定されます。

Traling Stop

トレーリングストップの有無を指定します。Yesにすると勝手にストップロスが動きます。

 

ダウンロード

ダウンロード後、ダブルクリックしてインストールしてください。

cBotなのでチャートに適用後、発注したいときに▶を押してからチャート上をクリックします。クリックするといきなり発注が入るので注意してください。

 

ソースコード公開

特に説明したいとこがあるわけではないんですが、短いソースコードですし、cAlgo初心者の方には勉強になる部分もあるかもしれませんので公開します。

マウスイベントの使い方や、チャートオブジェクトの描き方、Async系発注の使い方なんかがもしかしたら参考になるかもしれません。

また、プログラムできる方なら、自分のルール仕様に作り直すことも可能でしょう。SLだけ、もしくはTPだけ散らすというのもアリかと。その気になればなかなか検証しがいがありそうですね。

using System;
using cAlgo.API;
using cAlgo.API.Internals;

namespace cAlgo.Robots {
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class SplashOrder : Robot {
        [Parameter("Whole Lots", DefaultValue = 1.0)]
        public double WholeLots { get; set; }

        [Parameter("Split", DefaultValue = 10)]
        public int Split { get; set; }

        [Parameter("SL Step Pips", DefaultValue = 5.0)]
        public double SlStepPips { get; set; }

        [Parameter("Risk Reward Ratio", DefaultValue = 3.0)]
        public double RRR { get; set; }

        [Parameter("Traling Stop", DefaultValue = false)]
        public bool IsTraling { get; set; }

        // --- for order
        private TradeType _tradeType;
        private double _unitVolume;
        private double _minSlPips;

        // --- for line
        private ChartHorizontalLine _slLine;
        private ChartHorizontalLine _tpLine;
        private const string SL_LINE_NAME = "stoploss_splashorder_line";
        private const string TP_LINE_NAME = "takeprofit_splashorder_line";
        private ChartMouseEventArgs _mousePos=null;

        //-----------
        // OnStart
        protected override void OnStart() {
            var unitVol = Symbol.QuantityToVolumeInUnits(WholeLots) / Split;
            if (unitVol < Symbol.VolumeInUnitsMin) {
                Print("unitvolume (WholeLots/Split) is too small!");
                Stop();
                return;
            }
            _unitVolume = Symbol.NormalizeVolumeInUnits(unitVol, RoundingMode.Down);

            // --- place line
            _slLine = Chart.DrawHorizontalLine(SL_LINE_NAME, Ask, Chart.ColorSettings.LosingDealColor);
            _tpLine = Chart.DrawHorizontalLine(TP_LINE_NAME, Bid, Chart.ColorSettings.WinningDealColor);
            _tpLine.LineStyle = _slLine.LineStyle = LineStyle.Dots;

            // --- event
            Chart.MouseMove += DrawLine;
            Chart.MouseDown += ClickOrder;
        }

        //----------------
        // mouse move
        private void DrawLine(ChartMouseEventArgs args) {
            _mousePos = args;
            _tradeType = (args.YValue < Bid ^ args.ShiftKey ? TradeType.Buy : TradeType.Sell);
            var distance = Math.Abs((_tradeType==TradeType.Buy ? Bid : Ask) - args.YValue);
            var slMin = (args.ShiftKey ? distance / RRR : distance);
            var tpMin = (args.ShiftKey ? distance : distance * RRR);
            _slLine.Y = (_tradeType == TradeType.Buy ? Bid - slMin : Ask + slMin);
            _tpLine.Y = (_tradeType == TradeType.Buy ? Bid + tpMin : Ask - tpMin);
            _minSlPips = slMin / Symbol.PipSize;
        }

        //-----------------
        // mouse down
        private void ClickOrder(ChartMouseEventArgs args) {
            var decimals = Symbol.Digits + (int)Math.Log10(Symbol.PipSize);
            for (int i = 0; i < Split; i++) {
                var sl = Math.Round(_minSlPips + i * SlStepPips, decimals);
                var tp = Math.Round(sl * RRR, decimals);
                ExecuteMarketOrderAsync(_tradeType, SymbolName, _unitVolume, ToString(), sl, tp,
                    i.ToString(), IsTraling, (res => { if (!res.IsSuccessful) Print(res.Error.ToString()); }));
            }
            Stop();
        }

        //------------
        // OnTick
        protected override void OnTick() {
            if(_mousePos!=null) DrawLine(_mousePos);
        }

        //-------------
        // OnStop
        protected override void OnStop() {
            Chart.MouseMove -= DrawLine;
            Chart.MouseDown -= ClickOrder;
            Chart.RemoveObject(TP_LINE_NAME);
            Chart.RemoveObject(SL_LINE_NAME);
        }
    }
}

ソースコード非公開のつもりで作り始めたため、(最低限の整形はしたつもりですが)見にくい部分はご容赦ください。コードの書き方や変数命名規則なんかはあまり参考にしない方がいいです。

コード内コメントもほとんどありませんが、わからないとか説明してほしいというところがあったら言っていただければ説明します。あと、間違い見つけたら教えてください。

-cAlgo Tips & Sample, cTrader Tools (cBot インジケーター)

© 2024 cTrader's Life Powered by AFFINGER5