さて、Loop_Entry プログラムに柔軟性を持たせるため、次の対応を行いました。
・通貨ペアを "USDJPY" 固定から、プログラムを表示するチャートにあわせた
・ロット数(取引数)を 0.1 固定から、任意の数量を入力できるようにした
・スリッページを 3 固定から、任意のスリッページを入力できるようにした
次に"注文種別"の対応をしていきたいと思います。
注文種別は、「(指値)買い」固定になっていますが、これを「(指値)売り」もできるようにします。さらに、逆指値もできるようにしようと思います。
どうやって、上記種別をプログラムに判断させるかは、やはり入力パラメーターを使って、注文種別の情報をプログラムに渡すことにします。
そこで、次のルールで注文種別を入力するようにします。
・入力画面で "
指買" と入力したら "指値買い"
・入力画面で "
指売" と入力したら "指値売り"
・入力画面で "
逆指買" と入力したら "逆指値買い"
・入力画面で "
逆指売" と入力したら "逆指値買い"
そのため、プログラムに注文種別を渡すための識別子を "
CHUMON_SHUBETSU" とし、入力画面に初期表示する値を "
指買/指売/逆指買/逆指売" とするために、入力パラメーター部分に次のように追記します。
//---- input parameters
extern double SASHINE=0.0;
extern double LOTSU=0.1;
extern int SLIPPAGE=3;
extern string CHUMON_SHUBETSU="指買/指売/逆指買/逆指売";CHUMON_SHUBETSU には文字を入力するため、識別子のデータ種類は "string" を指定します。これで、何の注文種別で注文したいかを、プログラムへ渡すことができました。
では、渡された注文種別にしたがって、注文部分のプログラム OrderSend を修正したいと思います。
注文種別の指定は、OrderSend の次の部分で行います。
OrderSend(
Symbol(),
OP_BUYLIMIT,LOTSU,SASHINE,SLIPPAGE,0,SASHINE+20*Point,
NULL,0,0,Green);
#表示領域の都合上、改行記載してあります。
以前、「
注文の書き方」で調べた際、注文種別は次のように指定することができました。
指定内容 : 注文方法
--------------------------------------------------
0 : 成り行き買い
1 : 成り行き売り
2 : 指値買い
3 : 指値売り
4 : 逆指値買い
5 : 逆指値売り
#今回、"成り行き"は使いません。
そのため、それぞれの注文種別では、
"指値買い" の場合、OrderSend(Symbol(),
2,LOTSU,SASHINE,・・・
"指値売り" の場合、OrderSend(Symbol(),
3,LOTSU,SASHINE,・・・
"逆指値買い" の場合、OrderSend(Symbol(),
4,LOTSU,SASHINE,・・・
"逆指値売り" の場合、OrderSend(Symbol(),
5,LOTSU,SASHINE,・・・
と指定すればよいのですが、
入力される注文種別はどれが来るかわかりません。
そこで、
OrderSend の注文種別を指定する箇所が、入力された注文種別に従って変わるようにしたいと思います。
そのために、OrderSend の注文種別を指定する箇所に、新たな識別子 "
CHUMON_TYPE" を設けます。
OrderSend(Symbol(),
CHUMON_TYPE,LOTSU,SASHINE,・・・
そして、この識別子 "CHUMON_TYPE" に対して、
入力された注文種別に沿った値をセットするようなプログラムを書きます。
プログラムの書き方としては、次の通りです。
if(CHUMON_SHUBETSU=="指買") { CHUMON_TYPE=2; }これは以前、
「注文しすぎ」を防ぐ で記載した
if 文 を使います。
つまり、CHUMON_SHUBETSU(入力した注文種別)が "指買" という文字と等しければ中括弧の内容を実行するという書き方です。
中括弧の内容は、先ほど設けた識別子 "CHUMON_TYPE" に対して "指値買い" を意味する 2 の数値をセットしています。
これを、次のように OrderSend の前(上)に書くことで、指値買いの注文が可能となります。
if(CHUMON_SHUBETSU=="指買")
{
CHUMON_TYPE=2;
}
OrderSend(Symbol(),CHUMON_TYPE,LOTSU,SASHINE,・・・
同様に、"指値売り(
3)" "逆指値買い(
4)" "逆指値売り(
5)" についても次のように記載します。
if(CHUMON_SHUBETSU=="指買")
{
CHUMON_TYPE=2;
}
if(CHUMON_SHUBETSU=="指売")
{
CHUMON_TYPE=
3;
}
if(CHUMON_SHUBETSU=="逆指買")
{
CHUMON_TYPE=
4;
}
if(CHUMON_SHUBETSU=="逆指売")
{
CHUMON_TYPE=
5;
}
OrderSend(Symbol(),CHUMON_TYPE,LOTSU,SASHINE,・・・
これで、入力画面にてどの注文種別が来ても、一つの OrderSend で注文をすることが可能となりました。
ただこのままでは、
Tick が変わる度に、
4つの if 文 が実行されてしまい非常に無駄です(注文タイミングが遅れてしまいます)。
入力したパラメーターは、プログラムが再起動されない限り変わることはありません。
そのため、注文種別を判定する部分は、
プログラムが起動した際に1回だけ実行される場所であるint init() エリアに記載することで無駄な実行を避けることができます。
なお、int init()エリアと OrderSend が記載されている int start() エリアで、同じ CHUMON_TYPE 識別子を使う場合には、int init()エリアよりも上に CHUMON_TYPE 識別子 の定義を次のようにしておく必要があります。int CHUMON_TYPE;#OrderSend の注文種別の指定は整数で行う必要があるため、CHUMON_TYPE の識別子も int で定義します。
#入力パラメーターの定義も int init()エリアよりも上に記載されているため、両方のエリアで扱えます。
長くなりましたので、続きは次回へ。