エンジニアの備忘録

学んだ事をアウトプットしていきます

個人用MQL言語メモ

 

iLowest ()

成行買い(ドルストレート)で現在足の安値10pips下に損切りを置きたい場合

double point = Point();  
double buy_stop_loss = Low[0] - (100 * point);

0.00001(クロス円なら0.001)×100=10pipsになるので、それを現在足の安値から引いた値が損切り位置になる。

f:id:pmpmcherry:20211109105026p:plain

ちゃんと1.35487→1.35477にセットされている。

1e-05=0.00001なので問題ないが、表記が何故こうなるのかは分からない(クロス円は0.001で表示された)

 

本題のiLowest ()を使うと、上記と似たような方法で過去x本の足の最安値に置きたい場合に使えるが、

iLowest()は指定した期間内で最安値を持っている足のインデックス数を返してくれるだけであり、戻り値はintになる。

成行買いの損切りを1日以内の最安値に置きたい場合は、取得した値をLow[ ] に入れてあげれば良い。

int count_bars = 24;
int lowest_shift = iLowest
(NULL, PERIOD_D1, MODE_LOWER, count_bars, 0 );
double buy_stop_loss = Low [lowest_shift];

定率による資金管理とロット算出

1回ごとのトレードにより増減した口座残高から、指定した〇%分の損失許容額を出して、その額と損切りpips数からロット数を算出する。

extern bool fix_unit_management = true;
extern double equity_percent    = 2;      //2%
extern double stop_loss         = 500;    //損切り50pips
if ( fix_unit_management == true ) {

      double risk_amount = AccountEquity() * (equity_percent / 100);
      double tick_value  =  MarketInfo( Symbol(), MODE_TICKVALUE );
      double calc_lots  = ( risk_amount / stop_loss ) / tick_value;
      double lot_size   = calc_lots;
      printf ("この取引のロット = %f " , lot_size );
 }

f:id:pmpmcherry:20211110063933p:plain

約10万円の口座なので0.4ロット(クロス円)

ロット数のステップは0.01単位なので、

関数NormalizeDouble ()を使って小数点2桁以降は丸めておきます。(0.040065→0.04)

 

 

逆マーチンゲール

OrderProfit ( ) は、OrderSelect ( )で選択した注文の損益(手数料等を除く)を返す。

OrdersHistoryTotal ( ) は、ターミナル内で指定した期間の決済済注文数を返す。