現在運用しているEAのソース その2

全ソース

個別説明

OnTick関数

OrdersTotal()関数で、現在のポジション数を確認します。
本EAは1つしかポジションを取らないので、1つでもポジションがある場合は、発注判定ロジックに入りません。

ポジションが0の場合はbed関数(独自関数:後述)で、エントリするかどうかの判定をします。onTick()のあとの処理はストップロスのチェックです。本EAはエントリ時にストップロスを指定するのですが、日本のFX業者だと、FreeMargin( = 口座残高 – 必要証拠金 – 含み損)が0になると強制決済になりEAが停止してしまうところが多いので、そうなる前のぎりぎりのところFreeMarginが口座残高の1%未満になったら、強制決済をするようなロジックを入れています。

ストップロス処理

ストップロスの処理はこの関数で実施しています。

すべての発注済みの注文についてループ処理をして決済していきます。
OrdersTotal関数は保留中の注文も取得されるのですが、本EAは成行注文のみなので、基本的にはすべて発注済み注文となります。
万が一、ぎりぎりのタイミングでまだ発注されていない場合で会っても、次のTickで決済されるので問題ありません。
MagicNumberや通貨ペアが同じもののみをキャンセルする処理を一応入れていますが、普通は1つの口座で1EAしか運用しないと思うので、本来は不要です。いつも流用しているので残っているだけです。
買いと売りのエントリで決済処理を分けていますが、多分一緒でもよいと思います。ただ、指定価格のところが現在価格と乖離するとエラーになってしまうので、このようにしています。
※ 結局MQL4には「成行注文」という概念がないようなので、スリッページを思いっきり広くしています。

発注処理

発注準備

まずRSIの値を取得します。

次に、口座残高からロット数を決めています。

つぎに、前回の取引で負けていた場合に、ポップアップウィンドウを表示し、取引を続行するかどうかをユーザに尋ねます。と、いうよりもポップアップを出すことにより、取引を「OK」ボタンが押されるまで一時停止するための処理です。

おなじ取引で何度もポップアップが出力されないように、「OK」ボタンが押された場合は、チケット番号を変数名としてグローバル変数(EAやMT4を停止しても4週間くらい保存され続ける変数)に保管しておきます。

逆にそのチケット番号ですでにグローバル変数がある場合は、「OK」ボタンが押されたということなので、ポップアップウィンドウは出力しません。

発注処理

RSIが規定値以上だったら売り、規定値以下だったら買いの注文を出します。

発注価格が確定してから、利益確定値と損切り値を確定するため、一度発注してそれが確定してから注文変更するという流れを取っています。

直近の取引取得

最後に途中で使った直帰の取引を取得する処理です。同一EAのものを取得するために、マジックナンバーと通貨ペアでフィルタリングしています。

取引履歴を見る場合、特に運用始めは、同一口座で別のEAや手動取引の履歴が入っていることはよくあるので、この処理は必要です。

1,000履歴まで遡って履歴を探します。前回の取引が負けているかどうかなので、今思えばちょっとやりすぎで、1つ前の処理が別のマジックナンバーだったらもう無視して、そのEAでは過去の取引履歴なし状態としていいと思います。

他のロジックで動いていたEAの処理を流用したもので、特に問題ないので今はこのまま運用しています。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする