無料でロボットをダウンロードする方法を見る

興味深いスクリプト?
それではリンクにそれを投稿してください。-
他の人にそれをレーティングしてもらいます

記事を気に入りましたか?MetaTrader 5ターミナルの中でそれを試してみてください。

ライブラリ

Yury Dzyubanによるトレーリングのための関数を含むライブラリ - MetaTrader 4のためのライブラリ

I_D | Japanese English Español Русский 中文 Deutsch Português

ビュー:
517
レーティング:
投票: 42
パブリッシュされた:
2016.05.18 09:35

周知のように、ポジションを維持するまたは決済するアルゴリズムはポジションを開始する方法より重要なものです。ときどきトレーリングシステムの変更がトレードを大変革することができます。利益を上げることも下げることもできます。こちらでは、自分がよく使うポジションを維持する関数のライブラリをご紹介します。


ご紹介された関数の中には、最も人気のトレーリングストップの設定方法をベースにしているものも、自分で作ったものもあります。この関数は、つけやすくて切り替えやすいので、異なるトレーリングアルゴリズムを試してみさせます。この関数は簡単なので、これに基づいてより複雑なトレーリングアルゴリズムを作成することができます。関数はだいぶ違いますが、全ては新しいEAをビルドするための準備を簡単にします。


では、関数は以下の通りです。:

1. 最後のN本のローソク足のヒゲによるトレーリング。

void TrailingByShadows(int ticket,int tmfrm,int bars_n, 
                       int indent,bool trlinloss)

この関数は、指定された数の足の最安値または最高値を追いかける方法を実行します。

パラメータ:

ticket - 固有の注文番号(関数呼び出しの前にOrderSelect())関数により選択される);
tmfrm - トレーリングが行われる時間軸(1、5、15、30、60、240、1440、10080、43200);
bars_n - 損切りレベルを決めるために使用される足の本数(1以上);
indent - 損切りを設定するための指定された高値/安値からのインデント(0以上);
trlinloss - 「損失の」ゾーン内に(つまり、初期の損切りレベルから始値までの間で)損切りラインを引いた方がいいかどうかを表すシグナル(Trueならば、トレールした方がいいである。Falseならば、損切りレベルが始値より高い場合のみトレールする)

ヴィクトル・バリッシュポルツ氏によるストラテジー「日足に移動平均線のブレイクアウト」の説明でこのトレーリングストップの設定方法について初めて読みました。このストラテジーでは、最後の2本の足のヒゲでトレールすることが紹介されています。驚いたことにトレーリングが良く行われます。このアルゴリズムのおかげで、ロールバック(ロールバックの深さが指定された足の数bars_nによる)とボラティリティの低下を切り抜けることができます。各ティックごとに使ってもローソク足の終りだけで執行されます。私は普通日足でこれを使い、最後の2-4本の足のヒゲでトレールします。


2. X足のフラクタルによるトレーリング。

void TrailingByFractals(int ticket,int tmfrm,int frktl_bars,
                        int indent,bool trlinloss)

この関数は、指定された時間軸内に価格を追いかけてフラクタルの極値により損切りラインを移動します。周知のように、クラッシックなフラクタル(ビル·ウィリアムズによるフラクタルインジケータ)は、5本の足の組み合わせですけど、3本など他の足の本数を使ってもいいと思います(足の本数の友愛数も考慮される)。

パラメータ:

ticket - 固有の注文番号(関数呼び出しの前にOrderSelect()関数により選択される);
tmfrm - トレーリングが行われる時間軸(1、5、15、30、60、240、1440、10080、43200);
bars_n - フラクタル内の足の本数(3以下);
indent - 損切りを設定するためのフラクタルの極値からのインデント(0以上);
trlinloss - 「損失の」ゾーン内に(つまり、初期の損切りレベルから始値までの間で)損切りラインを引いた方がいいかどうかを表すシグナル(Trueならば、トレールした方がいいである。Falseならば、損切りレベルが始値より高い場合のみトレールする)

ロシア語のFXに関するフォーラムでは、「より低い時間軸でフラクタルによるトレーリングをすればいい」という意見を読んだことがあります。一般にフラクタルは、本当は極値を示すので、フラクタルによるトレーリングは極値によるトレーリングとも呼ばれます。アイデアは新しくなくてもいいです。多くの有名なトレーダーに使われています。これにより、ロールバックを切り抜け、すぐれた動きを「選択する」ことができます。前の関数と同じように作成された足でトレールします。必要ならば、パラメータを動的に変更することができます(ポジションの寿命内に)。例えば、利益成長率の高い場合、より長い時間軸へ切り替えるまたはフラクタルの足の本数を増やすことでシステムの感度を上げることができます。その他オプションも利用可能です。


3. マルチステップトレーリング。

void TrailingStairs(int ticket,int trldistance,int trlstep)

この関数は標準的なトレーリングストップの修正版です。私の記憶が確かならば、似てるものがKimIVにより開発されましたが、なんか自分なりの道を選びますね。標準的なトレーリングストップとの一番大きな違いは、損切りラインを1ポイントずつ移動する代わりに指定されたステップで損切りラインを移動することです(例えば、ステップを10に設定して40ポイントの距離でのトレーリングを行う場合、+40を達成すれば損切りラインが10ポイント(ステップ)に移動され、+50を達成すれば損切りラインが20ポイント(ステップ)に移動されます。等々です)。

パラメータ:
ticket -
固有の注文番号(関数呼び出しの前にOrderSelect()関数により選択される);
trldistance - ポイントで表される現在値からトレーリングストップ値までの距離(MarketInfo(Symbol(),MODE_STOPLEVEL)より大きいか又は等しい);
trlstep - トレーリングストップの変更するステップ(1以上)

trlstepが1と等しいならば、標準的なトレーリングストップに特に違いはありません。このアルゴリズムの強みは、相場に「自由を与える」ことです。損切りラインは価格が上下して決められた後でのみ移動されます。このアルゴリズムを初めて会ったのはヴィクトル・バリッシュポルツ氏の「移動チャネル」です。


4. 「結び」。

void TrailingUdavka(int ticket,int trl_dist_1,int level_1,
                    int trl_dist_2,int level_2,int trl_dist_3)

周知のように、ロールバックのない相場の動きが存在しません。一般に、価格スパイクが発生する後に、コンソリデーションまたはロールバックが行われます。この価格を追いかけるアルゴリズムのアイデアは、利益が上がれば上るほど、コンソリデーション又はロールバックの範囲に近づけながらもっともっと大きな利益を占領するようにトレーリングの距離を短くすることです。価格スパイクによるトレード以外にこの関数をチャネルによる取引のために使用できます。


パラメータ:
ticket -
固有の注文番号(関数呼び出しの前にOrderSelect()関数により選択される);
trl_dist_1 - 初期のトレーリングの距離(MarketInfo(Symbol(),MODE_STOPLEVEL)より大きいか又は等しく、trl_dist_2 trl_dist_3より以上);
level_1 - トレーリングの距離がtrl_dist_1 からtrl_dist_2 まで減らされる利益レベル(level_2以下、 trl_dist_1以上);
trl dist_2 - 現在値がlevel_1 を達成してからのトレーリングの距離(MarketInfo(Symbol(),MODE_STOPLEVEL)より大きいか又は等しい);
level_2 - トレーリングの距離がtrl_dist_2 からtrl_dist_3 まで減らされる利益レベル(trl_dist_1level_1より以上);
trl dist_3 - 現在値がlevel_2を達成してからのトレーリングの距離(MarketInfo(Symbol(),MODE_STOPLEVEL)より大きいか又は等しい)


例えば、ticket引数の値が30、50、20、70、10になれば、30ポイントでトレールします。現在値と始値の差が50ポイントを超えると、20ポイントなどより近い距離でトレールします。現在値と始値の差が70ポイントを超えると、10ポイントでトレールします。等々です。このように、いわゆる「結び」を締めます(これは近い将来にポジション決済につながる可能性が高い)。

5. 時間によるトレーリング。

void TrailingByTime(int ticket,int interval,int trlstep,
                    bool trlinloss)

ポジション残高と相場の状態を考慮せずに時間によってトレーリングを行います。一定の間隔(分)をおいて損切りラインを指定されたステップで移動してみます(もしできればだけど)。このトレーリングストップの設定方法を別に使うと、あまり結果は出ませんが、他のトレーリングストップの設定方法と組み合わせたら、かなりお役に立つでしょう。

パラメータ:
ticket -
固有の注文番号(関数呼び出しの前にOrderSelect()関数により選択される);
interval - ポジション開始から指定されたステップtrlstep で損切りラインを移動するときまでの間隔(分);
trlstep - トレーリングストップの変更するステップ(intervalによる);
trlinloss - trueならば 損切りラインからトレーリングを行ない、falseならば、始値からトレーリングを行なう


6. ATRによるトレーリング。

void TrailingByATR(int ticket,int atr_timeframe,int atr1_period,
                   int atr1_shift,int atr2_period,int atr2_shift,
                   double coeff,bool trlinloss)
ATR (Average True Range) は、相場のボラティリティを測るインジケータです。ATRの値が高くなればなるほど、トレンドが変化する可能性が高くなります。ポイントで表されます。ほとんどの場合、ATRによるトレーリングは価格変動型にあわせて(適応的に)損切りを移動させます。ボラティレティが高い場合(価格スパイクが見られる場合)、トレーリングを自由にします。「堂々めぐりをする」場合、より近い距離でトレールします。この方法ではATRが2つ使用されます。1つ目のATRとして5期間ATRなど短期ATRの使うことをおすすめします。2つ目のATRとして20期間ATRなど長期ATRの使うことをおすすめします。損切りを計算するために、長期ATRの値が使用されます。それは、ボラティリティの低い足が損切りレベルを現在値に近くしないためです。

パラメータ:
ticket -
固有の注文番号(関数呼び出しの前にOrderSelect()関数により選択される);
atr_timeframe - ATRが計算される時間軸(1、5、15、30、60、240、1440、10080、43200);
atr1_period - 1つ目のATR期間(0以上で、atr2_periodに等しくなる可能ですがおすすめしない);
atr1_shift - 一定の本数の足のために現在の足に対して 1つ目のATR が計算される「窓」のシフト(正の整数);
atr2_period - 2つ目のATR期間(0以上);
atr2_shift - 一定の本数の足のために現在の足に対して 2つ目のATR が計算される「窓」のシフト(正の整数);
coeff - 損切りはATRをcoeffに掛けて求められる。つまり、coeffは、幾つかのATRの距離で損切りラインを設定するのか指定しなければならない;
trlinloss - 「損失の」ゾーン内に(つまり、初期の損切りレベルから始値までの間で)損切りラインを引いた方がいいかどうかを表すシグナル(Trueならば、トレールした方がいいである。Falseならば、損切りレベルが始値より高い場合のみトレールする)

これも人気のあるトレーリングストップの設定方法の一つです(ほとんどの場合、有利になる)。標準的なトレーリングストップとの違いは、価格変動に適応することです。


7. バリッシュポルツによる「ラチェット」トレーリング。

void TrailingRatchetB(int ticket,int pf_level_1,int pf_level_2,
                      int pf_level_3,int ls_level_1,
                      int ls_level_2,int ls_level_3,
                      bool trlinloss)

ラチェット (英: ratchet) は、動作方向を一方に制限するために用いられる機構です。方法の名前は自分で思い出しました。バリッシュポルツの話では、2つ目のトレーリングストップ系売買戦略と呼ばれます。また、KimIV はいわゆる「3レベルトレーリング」を使います。内容: 損益分岐点へ損切りを早く移動し、利益確定を小さくして損切りをステップで移動します(その次に、標準的なトレーリングストップでもどんなトレーリングストップでも使用できます)。このようなトレーリングストップの設定方法の実用性は、「ポジションの大多数が少なくともしばらくの間利益を出す」ことに存するので、 機会のあり次第に損益分岐点へ損切りを移動します。早まって決済が行われてからエントリーシグナルがまだある場合、再びエントリーすることは可能です。一般に、損益分岐点でポジションを決済することが多いはずです(ある取引はすごい利益を出すだろう)。著者はこの方法はピプシングではないと強調しています。ただ、負の確率を下げるために使用されます。

パラメータ:
ticket -
固有の注文番号(関数呼び出しの前にOrderSelect()関数により選択される);
pf_level_1 - 損切りが損益分岐点へ移動されて、また1移動される含み益のレベル(ポイント);
pf_level_2 - 損切りがpf_level_1からpf_level_1 の距離(始値から計算される)で移動される含み益のレベル;
pf_level_3 - 損切りがpf_level_1からpf_level_2 の距離(始値から計算される)で移動される含み益のレベル;
ls_level_1 - 始値からls_level_1の損切りレベルまでの距離;
ls_level_2 - 現在値がls_level_1を割った後、超えてくる場合の損切りレベルまでの距離;
ls_level_3 - 現在値がls_level_2を割った後、超えてくる場合の損切りレベルまでの距離;
trlinloss - 「損失の」ゾーン内に(つまり、初期の損切りレベルから始値までの間で)損切りラインを引いた方がいいかどうかを表すシグナル(Trueならば、トレールした方がいいである。Falseならば、損切りレベルが始値より高い場合のみトレールする)

著者によると、ユーロドルには5・10・25の値を指定すればいいです。つまり、利益が5ポイントならば、損切りを1ポイントで移動します。利益が10ポイントならば、損切りを5ポイントで移動します。利益が25ポイントならば、損切りを10ポイントで移動します。次に、相場を自由にします。損切りまでの距離を計算する関数の部分は著者に述べられません。フォーラムの話し中に思い出しました。著者は自分のプロジェクトの口座でその方法を使って有利に取引するそうです。ただし、この方法は特殊なので誰にも合わないと思います。


8. 価格チャネルによるトレーリング(rebusさんが推奨する関数)。

void TrailingByPriceChannel(int iTicket,int iBars_n,int iIndent)

パラメータ:
iTicket -
固有の注文番号(関数呼び出しの前にOrderSelect()関数により選択される);
iBars_n - チャネル期間;
iIndent - 損切りを設定するためのチャネル境界からのインデント

大体においてローソク足のヒゲによるトレーリング(上記をご覧ください)とにています。また、フラクタルによるトレーリングと似たところがあるかもしれません。


9. 移動平均線によるトレーリング。

void TrailingByMA(int iTicket,int iTmFrme,int iMAPeriod,int iMAShift,
                  int MAMethod,int iApplPrice,int iShift,int iIndent)
価格チャネルによるトレーリングに近いアイデアです。関数には固有の注文番号、時間軸、そして損切りが設定される移動平均線からのインデント(ポイント)が指定されます。移動平均線の本質を考慮すると、このアルゴリズムはトレンド相場の場合に損切りをかなりよく移動させるのに、レンジ相場の場合に間違って早まった決済につながる可能性が明らかです。ただし、相場の状態に合わせてトレーリングのパラメータ(平均期間や平均方式など)を変更してみても良いでしょう。

パラメータ:
iTicket -
固有の注文番号(関数呼び出しの前にOrderSelect()関数により選択される);
iTmFrme - 移動平均が計算される時間軸(1、5、15、30、60、240、1440、10080、43200);
iMAPeriod - 移動平均を計算する為の平均期間;
iMAShift - 価格チャートに対するMAのシフト;
iMAMethod - 平均方式: 0 (MODE_SMA)、1 (MODE_EMA)、2 (MODE_SMMA)又は3 (MODE_LWMA);
iApplPrice - 計算で使用される価格タイプ: 0 (PRICE_CLOSE), 1 (PRICE_OPEN), 2 (PRICE_HIGH), 3 (PRICE_LOW), 4 (PRICE_MEDIAN), 5 (PRICE_TYPICAL), 6 (PRICE_WEIGHTED);
iShift - 現在の足に対して後ろへ指定された期間により移動すること;
iIndent - 損切りを設定するための移動平均線からのインデント


10. 五分五分のトレーリング(英:Fifty-fifty trailing)。

void TrailingFiftyFifty(int iTicket,int iTmFrme,double dCoeff,
                        bool bTrlinloss)

内容は以下の通りです。最後の足が作成され次第、現在の値から損切りラインまでの距離をdCoeff減らします(初期値は0.5なので、「五分五分のトレーリング」と呼ばれる)。例えば、損切り幅に40ポイントを指定して買いエントリーします。エントリーが行われた足が作成された後に、Bidレートが始値より42ポイント高くなりました。「損失の」ゾーン内にトレールしないつもりなら(bTrlinloss==true)、始値から現在値までの距離の42をdCoeff(0.5と仮定してみよう)に掛けて21を得ます。損切りを21ポイント引き上げます。次の足が作成された後に、利益が71ポイントとなったと仮定してみましょう。それでは、現在値と損切りの差は以下の通りです。71-21=50。計算された値の半分は0.5に掛けて求められます。損切りをもう一回25ポイント引き上げます。(始値から損切りまで21ポイント+25ポイント=46ポイント)

ここでご紹介する「損失の」ゾーン内にトレールしない(bTrlinloss==true)ストラテジーは、損切りレベルが始値より高い場合のみトレールすることを意味します。bTrlinlossがfalseならば、「損失の」ゾーン内にもトレーリングが行われます(つまり、初期の損切りレベルから始値までの間で損切りを引く)。このように、上記の例の数字を使うと、まず足が作成された後に、損切りを始値のお代わりに損切りから現在値までの距離の半分で移動します。損切りを40ポイントとしましょう。利益は42ポイントならば、損切りから現在値までの距離は以下のようになります。 (40+42)/2 = 82/2 = 41。損切りラインを1ポイント引き上げます(41-40=1)。 次の足が作成された後に、利益が71ポイントとなったと仮定してみましょう。計算式は以下の通りです。ア.71 - 1 = 70、イ.70*0.5 = 35、ウ.1 + 35 = 36。計算式から見れば、また損切りを36ポイント引き上げます。という事で、「損失の」ゾーン内にトレールするストラテジーはトレールしないストラテジーより始値から現在値までの距離が高くて、損切りの移動が遅くなります。「損失の」ゾーン内にトレールするストラテジーの好みは、負の場合に損切りを引っ込めることです。例えば、bTrlinlossがtrueならば、利益が-10である場合: ア.損切りから現在値までの距離は30ポイントになります(|-40 + (-10)| = 30)。イ.計算された値の半分は0.5に掛けて求められます。30*0.5 = 15。次に、ウとして、損切りを25ポイント引き下げます(-40 + 15 = -25)。

「損失の」ゾーン内にトレールする場合、決済が早すぎることが多いですが、負けは小さいです。

パラメータ:
iTicket -
固有の注文番号(関数呼び出しの前にOrderSelect()関数により選択される);
iTmFrme - トレーリングが行われる時間軸(1、5、15、30、60、240、1440、10080、43200);

dCoeff - 何回に現在値から損切りまでの距離が減らされる係数;

bTrlinloss - 「損失の」ゾーン内に損切りラインを引いた方がいいかどうかを表すシグナル


11. 「キル・ロス」。

void KillLoss(int iTicket,double dSpeedCoeff)
上記のような様々なトレーリング注文の設定方法(バリッシュポルツによる「ラチェット」トレーリングやフラクタルによるトレーリング)を組み合わせながら、この関数のアイデアが生まれました。アイデア通りに「損失の」ゾーン内のトレーリングのためだけに使用されます。例えば、不正確にエントリーしたことが分かりました。損失が早く増え、相場が初期の損切りレベルに近づけるので、含み損を制限した方がいいでしょうね。そのためには、相場と同じ速度で損切りを相場に向かって移動する必要があります。これはそのまま「キル・ロス」という関数です。起動した後に、この関数はグローバル変数に損切りから現在値までの距離の値を格納します。次回に相場が初期の損切りレベルにXポイント近くなると、これは損切りを相場に向かってdSpeedCoeff * Xポイントに引きます。上記の係数dSpeedCoeffの値として定数も変数(例えば、ボラティリティによる値など)も使用することができます。有利な方へと相場が反転する場合(損失が減る場合)、「キル・ロス」は何もしません。P.S. 動作中に関数は2つのグローバル変数sldiffzeticketを使用します。zeticketは他上記の関数でも使用されます。注意: 必要ならば、関数内にこのグローバル変数の名前を変更することができます(例えば、幾つかの上記の関数を組み合わせる場合)。

上記の全ての関数はTrailingFuncLib.mq4という添付ファイルに集められています。私にとっては他よりライブラリの方が使いやすいですが、お好みに合わせて各関数ごとを別に使えます。また、という関数が正確に動作するEAの例として、MyFractalsgexamplea.mq4ファイルを添付します。興味があれば嬉しいです 。


2007年8月11日更新:半自動売買を行う(エントリーなど半分は手動で、決済など残りの半分は自動で行う)方のために、上記の各関数に基づいてEAを書きました。かれらのEAはTrailingExperts.zipという名前のファイルにアーカイブされます。更に、手動でエントリーして、必要なトレーリングステップの設定方法を実行するEAを起動することができます。ただ、固有の注文番号などパラメータを指定する必要があります。必要ならば、相場の状態によってEAを切り替えてトレーリング関数を変更することができます。詳細はソースコードのコメントをご覧ください。お役に立つかもしれません。


MQL4プログラミングの初心者なので(2007年3月から勉強を始めた)、ご意見、ご推奨、ご提案があったらよろしくお願いします。このライブラリが少しでもお役に立てれば幸いです。

よろしくお願いします。
ユーリイ・ジュウバン

MetaQuotes Software Corp.によりロシア語から翻訳された
元のコード: https://www.mql5.com/ru/code/7108

Dealers Trade v 7.74 MACD Dealers Trade v 7.74 MACD

エキスパートアドバイザDealers Trade v 7.74 MACDは、複数ロットのスキャルピングをベースにしています。このEAを何度もリアル口座で稼動させました。

Dealers Trade v 7.51 RIVOT Dealers Trade v 7.51 RIVOT

エキスパートアドバイザDealers Trade v 7.51 RIVOTは、複数ロットのスキャルピングをベースにしています。このEAを何度もリアル口座で稼動させました。

SymbolLister SymbolLister

利用可能なシンボル一覧を表示する簡単な関数です。

ZZ_All Quotings 0-0050 ZZ_All Quotings 0-0050

全ての通貨ペア、金属、指数、CFDなどのヒストリーをロードするために使用されるスクリプトです。また、ヒストリーにある「ホール」の管理を行います。