グローバル変数を初期化しよう
グローバル変数を初期化するのですが、
int BuyTicket = 0; //買いチケット
とすることもできます。
しかし、OnInit()関数という初期化専用の関数があるのでそちらに記述したほうが僕は良いと考えています。
なので、グローバル変数の宣言と共に初期化する
のではなく、グローバル変数は宣言のみにして初期化はOnInit()関数内に記述することにしましょう。
例
int BuyTicket; //宣言のみ int OnInit(){ //グローバル変数初期化 BuyTicket = 0; //OnInit()内で初期化 }
ようなカンジです。
あと損切り価格や利食い価格に使う損切りpipsと利食いpipsは注文レートから差し引きしたレートで注文を出さなくてはいけないので、初期化処理と共に注文レートから差し引く前の状態にしてしまいたいと思います。
extern double TakeProfit = 50; //利食い 50pips extern double StopLoss = 0; //損切り 0pips
上記はあくまでもpipsの状態なので、レート上のpipsに変えなくてはいけません。上記のTakeProfit,StopLoss 自体は外部変数ですが、グローバル変数にこのレート上に置き換えた損切りpips、利食いpipsを代入します。
例えば、USDJPY 50pipsの場合
double rateTakeProfit = 0.50; //レート上の50pips
GBPUSD 50pipsの場合(外貨同士)
double rateTakeProfit = 0.0050; //レート上の50pips
がレート上の50pipsとなります。上記の値に変換してグローバル変数rateTakeProfitに代入します。
0ならば何もする必要はありませんがこの損切りや利食いはユーザーに入力させるものですのでテスト段階で0だろうと変換処理&代入処理は記述しなくてはいけません。
変換処理は下記の記事をご覧下さい。
ストップレベルと比較して返して注文エラーを防ごう!!自作関数(MQ4)
extern int Slippage = 3; //スリッページ 3pips
スリッページも同様にpipsの状態では注文できないので、pointに変換します。
_Pointが0.001又は0.00001の場合3pipsは30pointなので、
int OrderSlippage = 30; //スリッページ point == (0.001 || 0.00001)
となるように代入しなくてはなりません。
詳しくは最小変動レートを返す 定義済み _Point変数(MQL4)をご覧下さい。
真偽値(bool型)の初期化は基本的にfalseで初期化します。false=off、true=onです。
最初からスイッチをオンにしているのは不格好ですよね。
isBuyTracking = false;
外部変数を初期化しよう
外部変数はユーザーに変更させることが可能な変数なので変更し忘れなどもありえるので、最小限の初期値をあらかじめ代入しておくのが親切かと思います。外部変数もOnInit()関数内でも良いのですが、
僕は宣言と共に初期化してしまいます。MetaQuotes社のサンプルでも宣言と共に初期化していますし、、、
プログラミングで忘れてはいけないのは入力チェックです。ユーザーに値を入れさせるものには入力チェックが必要です。
//lotの検証 if(checkLotSize(LotSize) == true){ OrderLotSize = LotSize; //ロット数の上限下限内ならば代入して初期化 } //+------------------------------------------------------------------+ // lotのチェックメソッド //+------------------------------------------------------------------+ bool checkLotSize(double lot){ if(lot<getMinLot(Symbol())){ Alert("lot min is ",getMinLot(Symbol())); return(false); } if(getMaxLot(Symbol())<lot){ Alert("lot max is ",getMaxLot(Symbol())); return(false); } return(true); } double getMinLot(string symbol){ return MarketInfo(symbol,MODE_MINLOT); } double getMaxLot(string symbol){ return MarketInfo(symbol,MODE_MAXLOT); }
いろんな情報を取得できるMarketInfo()関数の使い方(MQL4)
このサンプルにはロット数のチェックしかしていませんが、これはロットには上限下限があります。
しかし損切り価格や利食い価格には上限下限がありません。なので入力チェックは必要ないと判断してチェックをしていません。
今回のをコードにすると下記のようになります。
//--- 外部変数の初期化 グローバル変数の宣言 //--- //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit(){ //lotの検証 if(checkLotSize(LotSize) == true){ OrderLotSize = LotSize; } //スリッページを注文できる形にする OrderSlippage = SlippagePipsUnit(Slippage,_Point); //pipsをレート上のpipsに変換してストップレベルと比べて大きい方を返す:利確と損切り rateStopLoss = getStopLevleRateUnit(Symbol(),Slippage,StopLoss); rateTakeProfit = getStopLevleRateUnit(Symbol(),Slippage,TakeProfit); //グローバル変数初期化 BuyTicket = 0; //買チケット変数の初期化 SellTicket = 0; //売チケット変数の初期化 isBuyTracking = false; //買追尾判定変数の初期化 isSellTracking = false; //売追尾判定変数の初期化 return(INIT_SUCCEEDED); }
関数の型について
変数に型があるように、関数にも型があります。例えばOrderSend()関数はint型です。
つまり返ってくる値がint型なのです。だから変数の型も関数の型に合わせたものにしなくてはなりません。
int 返ってくる値を入れる変数 = OrderSend(引数に入れる型はなんでもOK!!);
もう一つ例を上げるとポジションを決済するOrderClose()関数の返り値はbool型です。
つまりポジションの決済が成功したかがbool型、true=成功,false=失敗で返ってくるわけです。