これはなに?
エントリー、クローズ、獲得pips数が表示されます。
似たようなインジケーターは存在しますが、pips数が表示できるように自分で少し改良しました。
主に自分での振り返りでの利用を想定しています。
是非自慢とかにも使ってください。
それだけなので利用イメージをつけて終わりです。
エントリー、クローズ、獲得pips数が表示されます。
似たようなインジケーターは存在しますが、pips数が表示できるように自分で少し改良しました。
主に自分での振り返りでの利用を想定しています。
是非自慢とかにも使ってください。
それだけなので利用イメージをつけて終わりです。
MT4用のオーダーパネル、注文ツール、発注ツール、決済ツール、エントリー支援ツール等と呼ばれるトレードサポートツールです。
「攻守のバランスが取れた質の高い取引を実現する」ため、これだけあれば十分だと思える機能だけを詰め込みました。
「【保存版】FXにおける資金管理・リスク管理・ロット管理のすべて」で書いた資金管理の考え方をもとに、「1度の取引で総資金の2~5%」のリスクを取ることを前提としたサポートツールです。
主な機能は「ワンクリック注文」、ポジションを構築したときに、「建値」、複数注文時の「平均建値」、また「自動建値設定」、「自動トレール設定」ができます。
エントリー時のリスクを考慮した「自動ロット管理機能」や「分割エントリー機能」、「ハイレバ支援モード」を備えています。
面倒な計算をすることはなく、「自動的」に「資金管理」をすることを一番の目的として考えております。
v1.61以降からはおまけ機能として省略していた「アラート機能」や各種「分析支援機能」など、便利な機能も追加しております。
以前に作成しようとしていたオーダーパネルが「多機能すぎて完成が遠い」ために作成しました。
また、AverageBreakEvenの正当進化系です。
全自動建値設定のAutoBreakEvenの機能を実装するかは検討中です。
細かい修正などで更新の都合上ファイル配置が手間になるため、常に最新である保証ができませんのでご了承ください。
※試用期限が切れている場合や、機能自体が古い場合がありますのでご了承ください。
現在最新版については都度Discordにてリリースしております。
今後手間を減らせるのであればgithubなどでの配布も検討中です。
合わせまして解説も最新との仕様が違う場合がありますのでご留意ください。
大変多機能となりましたため、解説動画についても徐々に充実させていきたいです。
平均建値を入れる機能です。
エントリー時に表示される赤色、青色ラインにslを設定します。
通常の建値機能です。
エントリー位置より設定値で指定した値幅だけ離して建値を設定します。
建値設定を一括でキャンセルします。
※それぞれボタンがポジション方向に分かれておらず一つのため、機能として利用はできますが両建ては推奨しておりません。
tp、slラインを初期位置にリセットします。
損益表示(pips表示)をリセットします(v1.02より追加)
設定項目から自動建値設定をオンにすることで指定の値幅(pips)を超えた際に自動的に建値の設定がされます。(v1.06)
v1.50より建値をそれぞれの建値値か、平均建値か選択するオプションが追加されております。
v.1.62からはトレンド判定による設定や、閾値の自動調整機能が追加されております。
v1.28より追加
設定項目に応じたトレールを設定します。
ATRに味付けをした計算がされています。
トレーリングストップ設定を「true」にすることで、建値より有利な位置にあるばあいは自動的にトレール設定が入るようになります。
トレーリングストップ利用時間軸から設定します。
表示数値は分単位です。
(例)60=1H、240=4H、1440=1Dと換算されています。
実際に設定されるラインはトレールライン表示の設定で確認できます。
目安はスキャル~デイは60以下、数日スイングは240、数週スイングは1440以上です。
一括で予約注文の取り消しを行います。
一括で全てのポジションの半分ロットをクローズします。
一括で全てのポジションを利確・予約の取り消しをします。
設定項目から確認画面のオンオフが設定できます。(v1.06)
ロットを自動決定し、売り注文をします。枠内表示は自動計算されたロット数が表示されます。
ロットを自動決定し、買い注文をします。枠内表示は自動計算されたロット数が表示されます。
slライン(デフォルトではピンク表示)を移動すると設定したリスク割合のロット数を自動的に決定します。
またこの機能を利用してエントリーする場合に限り、自動的にslが入ります。
リスクを固定したトレードが可能になります。
注文時に自動的にtpを設定します。
エントリー位置とsl位置から、設定パネルで設定したリスクリワードのtp位置を自動で決定(黄緑ライン)します。
設定により、手動tp、機能オフも可能です。(v1.02より追加)
ついつい攻めすぎてしまう人用にハイブリッドTPモード追加(v1.08より追加)
利用者様のご要望により実装された機能です。
slの設定値を通常手動で移動しますが、自動で設定値幅通りに動かすことが可能です。
一部EOPの変動ロット機能が活かせない場合がございますためご了承ください。
あらかじめ設定したリスク割合に合わせて切り替わります。
左のMが成行時のリスク割合、右のSが分割時のリスク割合。
v.1.18より追加
海外口座とゼロカットを最大限に活かした資金効率最高のトレードを支援します。
※本機能はギャンブルトレードを推奨するものではありません。
sl位置のタイミングで「強制ロスカット」になるロット調整を行います。
(スプレッドやスリッページ分のズレが発生する場合があります)
面倒な計算は不要で最大限に資金効率を上げたトレードをすることが可能です。
基本的には「1口座につき1ポジション」、「1度のslで口座残高が0」を前提とした利用方法を想定しています。
「必要な金額だけ入金」して利用することを想定しているため、追加口座への口座残高の移動等をすることで「必ず資金管理を実施」してください。
※必要な金額とは一度に晒すリスクとして「総資金の2~5%程度」の金額を推奨しております。
また、機能を理解してリスクを許容できる方のみご利用ください。
こちらの機能を最大限に活かすためにはGemforexやXMTradingの様にレバレッジが高い取引所での利用を推奨しております。
※1 多くの取引所ではゼロカットを利用した「複数業者間での両建てや、複数口座間での両建ては悪質な禁止行為」となっているためご注意ください。
※2 レバレッジが低い口座でのエントリーやsl位置が極端に近いエントリーなど、最大レバレッジを超えるロット数に調整される場合注文ができません。ロット数制限をかけてしまうと資金効率が下がり機能の意図と合わないため注文可能なロット数への調整はしておりません。利用口座の変更や自分の納得できるsl位置に移動して再度エントリーしてください。
成行エントリー時にsl側に向けて ロットを自動決定し、分割で指値注文をします。
ロットを自動決定し、分割で指値注文をします。
ボタンがオンになっている際にエントリーライン(デフォルトでは黄色)が表示されます。
slラインとの間に設定した分割数、自動計算されたロット数でのエントリーをします。
Splitボタンを押下したまま注文ボタンを押すとエントリー位置(水色ライン)が表示されます。
エントリー位置が表示されたまま注文ボタンを押すと自動決定されたロット数で指値が配置されます。
v1.61から追加
アラート設定ラインを表示します。
アラートラインにアラートを設定します。
アラート設定はそのままに、ラインを隠します。
隠れている場合は表示します。
※現状チャート切替時は再表示されます。
アラート設定を削除します。
某コントローラーの様に損益を表示することができます。
取引終了後の検証や振り返りのため、チャート上に数値を表示してポジションの履歴が表示できます。
v1.62から追加
前身のMultiFunctionPanelで実装した機能だが、煩雑すぎてなかったことにした蛇足機能。
簡単にフィボナッチを引くことができます。
フィボナッチリトレースメント作成用の操作ラインを表示します。
左右のラインの高安を基準にフィボナッチを設定します。
また、表示されている場合は隠します。
フィボナッチエクスパンション作成用の操作ラインを表示します。
左右のラインの高安を基準にフィボナッチを設定します。
また、表示されている場合は隠します。
v1.63以降
N値、E値を表示します。
表示されている場合は隠す。
フィボナッチエクスパンション作成時にチャネルを表示する。
表示されている場合は隠す。
フィボナッチリトレースメントの高安の範囲内にフィボナッチエクスパンションの値が存在する場合、一番近いリトレースメントのとエクスパンションの値にゾーンを表示します。
フィボナッチ関連のオブジェクトを削除します。
v 1.63以降
楽しくなって実装しちゃっただけで、これだけみてると基本的にはやられます。
3波確定位置を決めるラインの表示。
クリック操作も可能。
4波確定位置を決めるラインの表示。
クリック操作も可能。(クリック操作については4波優先)
操作パネルを隠します。
隠れている場合は表示します。
※現状チャート切替時は再表示されます。
SL,TPのラインを隠します。
隠れている場合は表示します。
※現状チャート切替時は再表示されます。
対象となる口座は下記のリンクからの口座開設後、Twitter、DiscordのDMなどで連絡をいただければ確認後にライセンスキーを送ります。
XMTrading、Titanfx、Gemforex
現在評価版の配布をしております。
こちらが更新されていない場合、Discordにて最新のものは配布しております。
バージョン:v 162
更新日:2022/11/19
試用期限:2022/12/1
要望や不具合についてはこの記事のコメント欄か、Discordまでご連絡いただけると幸いです。
優先度A(利便性向上・不具合修正)
優先度B(機能強化)
優先度C(オプション・検討)
対応済
全て円建て口座で行っております。
基本的には XMTrading の MT4 口座を対象として考えておりますツールになっておりますため、一部取引所では正常に動かない可能性などがありますため、ご了承いただけますと幸いです。
※簡単な確認はしておりますが、基本的にMicro口座の動作保証はしておりません。
取引所 | プラットフォーム | 口座種別 | 株価指数 | 貴金属 | 原油 | FX通貨ペア (小数点3桁、5桁) | 仮想通貨 |
XMTrading | MT4 | Standard | × | △ | × | ○ | × |
XMTrading | MT5 | Standard | × | × | × | ○ | × |
TitanFX | MT4 | Blade | × | △ | × | ○ | × |
Gemforex | MT4 | Standard | × | × | × | ○ | × |
FXGT | MT5 | Standard | × | × | × | ○ | △ |
○=検証済み
△=検証中/対応中/一部動作に問題ある可能性あり
×=未検証
トレードサポートツールです。
主な機能は複数ポジションでポジションを構築したときに、「平均建値」を「ワンクリック」で設定できます。
現在大がかりなオーダーパネルを作っているのですが、永遠にデモ版となりいつ気持ちよく動作できるかわからないため、必要な機能だけ抽出しました。
エントリー後デフォルトでショートの場合は赤色、ロングの場合は青色のラインが表示されるため、そのラインをショートの場合は下回る、ロングの場合は上回ってからボタンを押下してください。
特にエラー表示とかも出ないため、うまく動作しない場合は現在値と反対になっているかブローカーのストップレベル分(最低値幅)離れていないことが考えられます。
某コントローラーの様に損益を表示することができます。
為替FX以外については桁がずれている通貨ペアもあると思いますので目安として使ってください。
後々対応予定です。
slラインを移動すると設定したリスク割合のロット数を自動的に表示します。(パネルオーダーボタン利用時のみ)
赤枠が売りボタン、青枠が買いボタン、それぞれ中の数値がロット数になります。
またこの機能を利用してエントリーする場合に限り、自動的にslとtp(設定したリスクリワード比率の位置)が入ります。
リスクを固定したトレードが可能になります。
現在テスト用としてDiscordにて配布しております。
前回の続きの記事になります。
少し多忙でいまいち進捗が良くないため少し期間が空きました。
こちらに関しては声を大にして特筆する機能ではないと思っています。
標準的な2%ルール、5%ルールのような機能です。
エントリー時に合わせてsl設定位置をすることで最適なロットサイズを計算します。
エントリー地点からsl位置までの値幅の損失が出た場合に、損失額が資金量の〇%になるように自動的にロットが調整されます。
資金管理についてはトレードの全体的に包括されるものであること、また自分が都度ロット計算をすることを手間に感じることから実装した機能になります
①Risk(%)欄にリスク割合を入力します。
②Risk(%)ボタンを押下します。(オンの場合はピンク色)
③画面に表示されている濃いピンク色のライン(sl)を移動します。
※この画面ですと成行注文になっていますが、もちろんほかの注文方法でも指値、逆指値でも利用できます。
処理としてはエントリー値、sl値の値幅に対して、資金量の指定したリスク割合のから適正ロットを割り出します。
イベント処理により、slラインやほかのラインを移動するごとに再計算しております。
特に珍しい処理でもないと思うので今回のコードについては割愛いたします。
現在こちらの注文ツールについてテスターを募集しております。
開発中の物になるため、不具合等に理解がある方のみおねがいしております。
直接Discordに来ていただくか、下記のフォームにて応募ください。
連絡先としてメールアドレス、TwitterID、DiscordIDのいずれかは忘れずに入力をお願いいたします。
成績公開をしたEAについての解説ページになります。
結構前に作っていたものなのでサンプルがこれしかなかったんですが、単体通貨ペアでのバックテスト成績です。
日足の確定を見てエントリーするだけのシンプルな手法になります。
基本的に損切はせず、プラスになるまでアベレージダウン(一定条件の元毎日損失を減らすためのエントリー)を繰り返します。
今現在の手法自体はとてもシンプルなため、考えられる戦略がハイリスク戦略とローリスク戦略です。
損をしないことを優先にする。
損失(含み損)が出ている場合は2日目以降(2ポジション目以降)に平均建値を超えて手数料等考慮し1円でもプラスになったら決済。
利益が出ることを優先にする。
損失(含み損)が出ている場合でも当初の利確目標まで待つ。
こちらの手法は損切なしでひたすらにアベレージダウンを繰り返すため、事故が起きた場合中々大変なことになります。
実際に2021/2/24に強制ロスカットを食らっています。
そこで考えられる1つ目の決済方法がローリスク戦略として挙げた平均建値決済。
取引通貨ペア数が多いため全ポジションを1つのバスケットとして考えた場合にプラスになる瞬間は少なくないのでそこで決済する。
2つ目が口座の損失割合で強制的に決済をする。
ここの2つとも処理としては存在しているのですが、単体通貨ペアでの検証時は動作していたものの複数通貨ペア対応にしたところうまく動作していないようです。
またロット管理自体も1つの通貨ペアで取引をする前提のロット管理方法なので、同時にポジションを持ちすぎてしまうとすぐにオーバーフローしてしまいます。
そのためロット数を減らす(28通貨同時にポジションをとることは考えづらいため、1/14とかになるでしょうか)
NY時間にとある条件を満たした場合に逆指値エントリー。
もし逆指値に刺さらずにsl位置まで行くのならば注文をキャンセルします。
損をしないことを優先にする。
5pipもしくは最低限のラインを超えた場合に即建値、半利。
利益が出ることを優先にする。
トレーリングストップを利用してslを上げていく。
その中でも固定数値でトレールするほうが確保する動きは早く、ATRでトレールするほうが動きは遅い。
動きが遅いほど利益になりやすいが、損失しやすい。
こちらの手法に関しては相場環境問わず使えるためエントリー方法、利確方法ともに優秀だと思われます。
現在考えられる改善手段はトレーリングストップの方法を検討するだけです。
元が値幅で利確設定だったものを現在はATR設定にして検証しています。
エントリーロジック(管理方法?)自体は優秀なために、トレールを固定値幅ではなくATR設定(または別の方法)にして利益を伸ばす方向を考えています。
大きく分けて3つやりたいことがあります。
完全多通貨ペア対応と複数ロジックの共存です。
参考までに複数通貨ペア対応にするメリットとしてはトレードチャートが1枚で済むため28枚分のチャートを用意しないでいいこと、また同時管理がしやすいことです。
デメリットとしては先に挙げた通り処理が複雑化すること(単体通貨ペアの処理とは違う)とMT4(mql4)自体が複数通貨ペアを考慮したつくりとなっていないため、バックテストができないことです。
そのためデモ口座として実際に動かしてテストしております。
今現在利用している2つのロジックはそれぞれ管理画面を持っていて別の方法で実行されています。
1つ目のロジックは完全に見るだけの管理画面、2つ目のロジックはエントリー対象通貨ペアを監視するような作りになっています。
エントリー対象の場合は別途チャートを開いてエントリーしています。
操作性が悪くなることと動きとして煩雑になることとあまりごちゃごちゃと同時にチャートを開きたくないため統合できればと思っています。
現在の物でも最大1日1回エントリーしかしない息の長いスイングと超短期を合わせた面白い組み合わせとなっていると思っているのですが、もう一つ違う時間軸でのエントリーもできると面白いと思っているものがあります。
そちらも単体ではほぼ準備ができているのですが、まだ検証中のため同時に利用をしておりません。
なんでも盛りたくなるのは悪い癖ですが、ちょっと検証中のグリッド系をもう一つ動かしていたりします。
こちらも利用できるようでしたらぜひ取り込んでしまいたいところです。
考えかたは前者のスイングに近いですが保有時間が最大半日程度のデイとなります。
組み合わせとしては面白いと思いませんか?
またUIがごちゃごちゃのため綺麗にまとめられたりしたら無料配布等もできれば面白いかもと思っています。
主に28通貨ペアを対象にした2つのストラテラジーが動いています。
結論から言うと勝てていません、一時期は資金が2倍になったのですがバグにより想定の動きをせず一度強制ロスカットを食らっています。
※2021/4/5バグ修正
ロジック等については別記事で解説いたします。
こちらのポジション一覧でslが入っているものが「NY5pipストラテジー」、tpが入っているものが「DailyBarストラテジー」、通貨ペアがEURUSDかつ何も入っていないものが現在検証中のものです。
ロジックの追加もしていて見栄えも良くないので安定稼働ができそうなことを確認したら近日仕切り直します!
前回の続きの記事になります。
聞いたことのない注文方法だなと思った方はお察しの通り、「完全オリジナルの注文方法」になります。
長年実現したいと思っていた注文方法の一つです。
一言でいうと「目標とするラインをタッチしたときに注文を執行」します。
通常の指値や逆指値と変わらないと思うかもしれませんが、どこが違うのかというと、タッチしただけではなく「タッチ後に〇本以内に戻る」のならばという条件つきです。
少し名前にセンスがないので呼称に関してはもう少し検討中になります。
分かりづらいのでもう少し戻り成行注文を掘り下げて説明すると
①現在USDJPYが99.8円です。
②100円で売りたいと思います。
③通常の指値の場合は100円にタッチしたらすぐにショート注文が約定されます。
④戻り成行の場合は100円にタッチした後に「5本以内に100円以下に戻るのならばショート注文」を約定させます。
上記の通り、この注文方法の構想は逆張り時のリスクを減らす注文方法となっております。
指値というものは絶対的に逆張りの注文となるため、指値をそのまま突き抜けてしまうといった事故が起こることが間々あります。
そのリスクを通常の指値注文よりも抑えるために実現したいと思っていた注文方法となります。
同様に戻り指値注文に関してですが上記「④のタイミングで指値を配置する」ことができます。
例えば100円ラインをブレイクした際に99.2円まで戻るのならば場合買いたいと思っている場合、ブレイクラインを100円に設定、指値を99.2円に設定する。
この場合は順張りの注文となり、100円にタッチ後「5本以内に100円以下に戻るのならば99.2円に買い指値を配置」の様なよりリスクを抑えた通常ではできない様な注文方法を実現できます。
こちらは順張りの押し目買い、戻り売りをしたいときの注文方法になります。
世界中調べたわけではありませんがおそらく完全オリジナルな注文方法のため、テストしつつ実装している段階です。
現在の物は少し不都合があったため修正予定になりますが、Rボタンを押下すると戻成行用のエントリーラインをセットすることができます。
OnTickの中でエントリーラインと指定時間足の現在値を比較し、エントリーラインをCloseが超えた場合には買い注文フラグを立てます。
フラグが立っている状態で〇本以内にエントリーライン以下に戻るのを待ち戻った場合は注文を執行。
もしくは設定本数以上ローソク足が進んだ場合は期限切れキャンセルとなります。
もう一つの注文キャンセル方法としては、エントリー時に設定をしたslをエントリーラインを下回る前に超えた場合には注文キャンセルという処理を検討しております。
こちらについては現在実装前のため、構想のみです。
開発中のため変数設定もわかりづらいですがここで利用している「ReverseLimit」についてはローソク足の指定本数になります。
簡単にまとめると
①トリガーラインを超えたローソク足の時間を変数に入れる。
②ローソク足が進むごとに繰り返し、指定したローソクの本数を過ぎるまたはslを超えた場合に設定解除。
キャンセル処理に関しては最初の分岐点がオブジェクトの有無のため、オブジェクトの削除と注文方法のフラグのリセットだけになります。
if(ObjectFind("reMarket") != EMPTY)
{
objrm = NormalizeDouble(ObjectGetDouble(0,"reMarket",OBJPROP_PRICE1),MarketInfo(Symbol(),MODE_DIGITS));
if(High[1] < objrm && High[0] > objrm)
{
ReverseOrderFlag = -1;
rm_time = iTime(Symbol(),5,0);
}
if(Low[1] > objrm && Low[0] < objrm)
{
ReverseOrderFlag = 1;
rm_time = iTime(Symbol(),5,0);
}
rm_bars_shift = iBarShift(Symbol(),5,rm_time,true);
if(ReverseLimit > rm_bars_shift && rm_bars_shift != -1 && rm_bars_shift != 0)
{
if(ReverseOrderFlag == -1)
{
for(int i = 1; i < ReverseLimit; i++)
{
if(Close[i] < objrm)
{
BtnOrderType = "Market";
lotSize = RoundDown(StringToDouble(ObjectGetString(0,"reMarkettext",OBJPROP_TEXT)),2);
OpenShortOrder();
ObjectDelete("reMarket");
ObjectDelete("reMarkettext");
ReverseOrderFlag = 0;
}
}
}
else
if(ReverseOrderFlag == 1)
{
for(int i = 1; i < ReverseLimit; i++)
{
if(Close[i] > objrm)
{
BtnOrderType = "Market";
lotSize = RoundDown(StringToDouble(ObjectGetString(0,"reMarkettext",OBJPROP_TEXT)),2);
OpenLongOrder();
ObjectDelete("reMarket");
ObjectDelete("reMarkettext");
ReverseOrderFlag = 0;
}
}
}
}
else
if(ReverseLimit <= rm_bars_shift)
{
ObjectDelete("reMarket");
ObjectDelete("reMarkettext");
ReverseOrderFlag = 0;
}
}
戻指値に関しても同様の処理となっていますが、同じ様に作成したため現在1本のラインがトリガーライン、エントリーラインを兼任しています。
当然ですが指値の場合はエントリーラインが執行時価格以上になるためエラーとなりますよね。
トリガーラインとエントリーラインを分けないといけないことを失念していたため、使いやすい様にGUI操作側での根本的な修正を検討しております。
言葉で説明するにはいまいち分かりづらい注文方法のため簡単に動画にまとめてお見せできないことが残念です。
私の中ではこれだけでも優位性があり面白い注文方法だと考えているため是非実装したく思っております。
もう少し仕様が煮詰まってきましたら再度解説と動画でお見せしてみたいと思います。
戻指値に関しては丸々処理の変更があると思いますので主に戻指値に関しての解説として検討しています。
それでは今回はこのあたりで終わります。
今回はWindows10、MT4を例に作業していきます。
環境等の違いは適宜読み替えて利用してください。
①MT4のファイルメニューから「データフォルダを開く」をクリックします。
②MT4のインストールフォルダが開くため、「MQL4」を選択します。
③EAをインストールしたい場合は「Experts」、インジケーターをインストールしたい場合は「Indicators」のフォルダがコピー先の対象フォルダになります。
それぞれ利用したいファイルMT4の場合は「~.ex4」ファイル、MT5の場合は「~.ex5」ファイルをコピーします。
④コピーが完了したら導入完了です!お疲れさまでした!
文字ナビゲーターに表示されない場合は右クリックから「更新」を押下してください。
簡潔ですが以上になります。
前回の記事の続きになります。
今回は機能からGUIが生えてきました。
最初はGUIなんて作る予定もなく思い付きで作り始めたため、何をどこまで作り込むか全然計画を立てていなかったためとても苦労しました。
もしこの記事を見た後に作成する方は最初にざっくりでいいので「必要な機能の洗い出し」と「GUIの設計」をすることをお勧めします。
1度情報をするべくざっくり大枠でほしいと思った機能が以下の通り
機能の詳細はまた別記事で解説します。
今回やらかした大きなことは作りながら考える、考えながら作る、あれもこれも作りたい・・・。
最初に形を考えずに欲しい機能欲しい機能と付けていったらあとから配置を変えるのが一苦労でした。
そのため一度スタートに戻って形から決めていきます。
いろんな描画ソフトで使いやすいものを試そうと思いましたが、調べたり覚えたり書いたりテストしたり全部自分でやっているためなかなか面倒です。
この時点で思った以上に大規模なプロジェクトになってまいりました。
そのため一番手軽に利用できそうなExcelをチョイス。
図形をセルに張り付く設定にして、ボタン類の配置を考えていきます。
またどのボタンがどのような挙動をするのかという洗い出しが必要になります。
オンオフトグルで切り替わるのか、押すと何かが変わるのか等・・・
理想でいうのならば「オブジェクトの種類」「変数名」「オブジェクトの挙動」「オブジェクトに与えられる機能」あたりも洗い出しておくと後々管理が楽でしょう。
実装してテストをしていくうちに使いやすい形が出てくると思うので最初はざっくり決めました。
大きく分けて通常のオブジェクトと標準ライブラリのDialogというものがあるようです。
もともと通常のオブジェクトとして作っていましたが、作り直しを考えている段階で標準機能としてGUIを作る事ができることに気づく。
試しに作ってみるが、慣れていないことと利用方法がイマイチ理解できず。
通常オブジェクトの場合は関数化して必要な値を与えることでボタン等が作成できるために工数が違いすぎる。
関数化できそうな事に気づくも構造体変数structの受け渡しが上手くできずに頓挫。
ネット上にもMT4でGUIを作るような資料は少なかったため後回しへ。
まだ全然理解できていませんがこのような感じで記述する必要がありそうです。
Create_LabelSymbolのほうが一般的にネット上で公開されている書式、Create_BtnTrapRepeatのほうが簡略化するために試行錯誤をしている形。
class CPanelDialog : public CAppDialog
{
private:
CLabel m_LabelSymbol;
CButton m_BtnTrapRepeat;
public:
CPanelDialog(void);
~CPanelDialog(void);
virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
protected:
bool Create_LabelSymbol(void);
bool Create_BtnTrapRepeat(string name1, string name2, string text, double x1, double y1, double x2,double y2);
};
bool CPanelDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
{
if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2)) return(false);
if( !Create_LabelSymbol())return (false);
if(!Create_BtnTrapRepeat(
"m_BtnTrapRepeat", "__BtnTrapRepeat", "Trap",
indent_left,
indent_top+full_height+controls_gap_y,
indent_left+full_width,
indent_top+full_height+controls_gap_y+full_height
)) return(false);
return(true);
}
CPanelDialog AppWindow;
bool CPanelDialog::Create_LabelSymbol(void)
{
int x1=indent_left;
int y1=indent_top;
int x2=x1+full_width;
int y2=y1+full_height;
if( !m_LabelSymbol.Create( m_chart_id, m_name + "m_LabelSymbol", m_subwin, x1, y1, x2, y2 ) ) return false;
if( !m_LabelSymbol.Text( StringConcatenate(Symbol()," ",PERIOD_CURRENT)) ) return false;
if( !Add( m_LabelSymbol ) ) return false;
return true;
}
bool CPanelDialog::Create_BtnTrapRepeat(string name1, string name2, string text, double x1, double y1, double x2,double y2)
{
if(!m_BtnTrapRepeat.Create(0,name2,0,x1,y1,x2,y2)) return(false);
if(!m_BtnTrapRepeat.Text(text)) return(false);
if(!Add(m_BtnTrapRepeat)) return(false);
return(true);
}
これについては力技で並べていくか、記述する行数が違いすぎるためもう少し効率的なやり方が必要に思えます。
苦労の末簡単な解決策はすぐに見つからなそうだったので、オブジェクトとして作成していくことに。
もともと途中まではオブジェクトで作成していったためつぎ足す形です。
最終的な配置については利用しながら使いやすさを考えていきます。
こういう感じで関数を作っておくとあとは必要な値を引数として渡すだけで作成ができます。
void CreateButton(string name, string label, int x, int y, int width, int height,
color bgColor = C'236,233,216', color textColor = clrBlack, int anchor = CORNER_RIGHT_UPPER)
{
ObjectCreate(name, OBJ_BUTTON, 0, 0, 0);
ObjectSet(name,OBJPROP_XDISTANCE,x+width);
ObjectSet(name,OBJPROP_YDISTANCE,y);
ObjectSet(name,OBJPROP_WIDTH,x);
ObjectSet(name,OBJPROP_XSIZE,width);
ObjectSet(name,OBJPROP_YSIZE,height);
ObjectSet(name, OBJPROP_CORNER, anchor);
ObjectSet(name, OBJPROP_BGCOLOR, bgColor);
ObjectSet(name, OBJPROP_COLOR, textColor);
ObjectSet(name, OBJPROP_ZORDER, 100);
ObjectSetText(name, label, FontSize);
}
void CreateLabel(string name, string label, int x, int y, int width, int height,
color bgColor = C'236,233,216', color textColor = clrBlack, int anchor = CORNER_RIGHT_UPPER)
{
ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
ObjectSet(name,OBJPROP_XDISTANCE,x+width);
ObjectSet(name,OBJPROP_YDISTANCE,y);
ObjectSet(name,OBJPROP_WIDTH,x);
ObjectSet(name,OBJPROP_XSIZE,width);
ObjectSet(name,OBJPROP_YSIZE,height);
ObjectSet(name, OBJPROP_CORNER, anchor);
ObjectSet(name, OBJPROP_BGCOLOR, bgColor);
ObjectSet(name, OBJPROP_COLOR, textColor);
ObjectSet(name, OBJPROP_ZORDER, 100);
ObjectSetText(name, label, FontSize);
}
最初にも書きましたが機能の洗い出しとGUIの設計は必ず最初にやろうです。
後からGUIの配置を変えることは想像を絶するくらいに苦痛です。
また次回に続きます。
現在注文ツールを作成しており、技術的な部分を含めて不定期更新しようかと思っております。
作成中の記事につきバグなどがある可能性が十分にあるため、そのままのコードを利用したい場合は注意してください。
また、今までに作成したコードをそのまま利用していたり、ほかサイトのコードを参考に作成している場合があるためコーディングの仕方が統一されていない場合があります、ご了承ください。
もとはといえば何がしたかったのかというと、「全ての通貨ペアポジション」に対する「ポジション管理機能」が欲しかっただけ。
エントリー後のポジション管理が甘く利益になったポジションを損失にしてしまうことが多かったため、強制的に「自動建値」を入れる機能があればマイナスは防げるかなと思ったからです。
ググっても自分の理想とする挙動のものが見つからないため、自分で作成しようと思いました。
そこからですが、紆余曲折あり今までにやりたかった機能を実装して注文ツールとして形にしようと考えています。
void OrderBuyEven(double point)
{
if(MarketInfo(OrderSymbol(), MODE_BID) - OrderOpenPrice() >= BeslAt * point)
{
if(OrderStopLoss() < OrderOpenPrice() && OrderStopLoss() != OrderOpenPrice() + Besl * point)
{
Print("建値+", Besl, " pips");
if(OrderLots() > 0.01)
{
ticket = OrderClose(OrderTicket(), NormalizeDouble(OrderLots() / Trades, NormDigit), MarketInfo(OrderSymbol(),MODE_BID), slippage, CLR_NONE);
Print("半利しました ",OrderSymbol()," - ",iClose(OrderSymbol(),0,0));
}
}
}
void OrderSellEven(double point)
{
if(OrderOpenPrice() - MarketInfo(OrderSymbol(), MODE_ASK) >= BeslAt * point)
{
if(OrderStopLoss() > OrderOpenPrice() && OrderStopLoss() != OrderOpenPrice() - (Besl + spread) * point)
{
Print("建値+", Besl, " pips");
if(OrderLots() > 0.01)
{
ticket = OrderClose(OrderTicket(), NormalizeDouble(OrderLots() / Trades, NormDigit), MarketInfo(OrderSymbol(),MODE_ASK), slippage, CLR_NONE);
Print("半利しました ",OrderSymbol()," - ",iClose(OrderSymbol(),0,0));
}
}
}
通貨ペアごとに違う設定の閾値と、sl幅を設定できるようにしています。
現実的な用途を考えた場合ボラティリティが違うのに同一設定では使いづらいからという考えのもと設定値を増やしております。
細かくこれがこの設定と言うまで細分化はしてませんが、ある程度の区分けとして低ボラ通貨ペア、並ボラ通貨ペア、高ボラ通貨ペア、超ボラ通貨ペアと分けられるようにしています。
細かい処理は省きますが、簡単に説明します。
という少し面倒な処理をしています。
for(int i=0; i<ArraySize(PairList); i++)
{
if(OrderSymbol() == PairList[i])
{
BeslAt= BeslAt_Low * 10;
Besl= Besl_Low * 10;
}
}
簡潔ですが今回はこのあたりまで。
まだ最終的な完成形ではないですが、少し違う形で機能ごとに無料公開を考えております。
もし詳細な情報を知りたい場合はこちらの記事やTwitter・Discordで質問をしていただくか、またはDiscordではリアルタイムで悩みながらコーディングをしているためそちらを参考にしていただければと思います。