Wizard In The Market
システムトレードの魔術師

*

■超直感!MT4プログラミング講座■ 第33回 発注スプリクトをサブルーチン化する(2)

公開日: : 最終更新日:2015/01/13 MT4(MQL4)プログラミング講座

こんにちは。キリンです。
昨日、同い年の投資を始めている医大生とお会いしてきました。
すでに何度か事業にもチャレンジされて、撤退もした経験をお持ちです。
素晴らしい行動力だなぁと思いつつ、
僕も負けてられないという意識にさせてもらいました。
こういうつながりを広めていきたいものですね!
関西でお会いできる方、ご連絡いただければ飛んでいきますので(w
では、本日の講義です。


第33回 発注スプリクトをサブルーチン化する(2)

■発注サブルーチン
■サブルーチンの説明
■まとめ
■発注スプリクト
これからはかなり本格的な内容になってきます。
実際に使えるサブルーチンですので、
コピーしていただいても構いません。
※参考文献
FXメタトレーダー実践プログラミング (現代の錬金術師シリーズ)/豊嶋久道

¥2,940
Amazon.co.jp
// 注文時の矢印の色

color ArrowColor[6] = {Blue, Red, Blue, Red, Blue, Red};
bool KirinOrderSend(int type, double lots, double price, int slippage, double slpips, double tppips, string comment, int magic)
{
int mult=1;
if(Digits == 3 || Digits == 5) mult=10;
slippage *= mult;
if(type == OP_SELL || type == OP_SELLLIMIT || type == OP_SELLSTOP) mult*=-1;
double sl=0, tp=0;
if(slpips > 0) sl = price – slpips * Point * mult;
if(tppips > 0) tp = price + tppips * Point * mult;
price = NormalizeDouble(price, Digits);
sl = NormalizeDouble(sl, Digits);
tp = NormalizeDouble(tp, Digits);
int starttime = GetTickCount();
while(true)
{
if(GetTickCount() – starttime > 10*1000)
{
Alert(“OrderSend timeout. Check the experts log.”);
return(false);
}
if(IsTradeAllowed() == true)
{
RefreshRates();
if(OrderSend(Symbol(), type, lots, price, slippage, sl, tp, comment, magic, 0, ArrowColor[type]) != -1) return(true);
int err = GetLastError();
Print(“[OrderSendError] : “, err, ” “, ErrorDescription(err));
if(err == ERR_INVALID_PRICE) break;
if(err == ERR_INVALID_STOPS) break;
}
Sleep(100);
}
return(false);
}

上記が僕が使っているスプリクトの一部です。
ブログ用に改変していますが、十分役に立つと思います。
■サブルーチンの説明
では、簡単に説明していきます。

int mult=1;
if(Digits == 3 || Digits == 5) mult=10;

上記は業者によるDigitsの差をなくすために、
桁数が多い5digitsの業者の場合、10倍するようにしています。
その準備ですね。

slippage *= mult;
if(type == OP_SELL || type == OP_SELLLIMIT || type == OP_SELLSTOP) mult*=-1;
double sl=0, tp=0;
if(slpips > 0) sl = price – slpips * Point * mult;
if(tppips > 0) tp = price + tppips * Point * mult;
price = NormalizeDouble(price, Digits);
sl = NormalizeDouble(sl, Digits);
tp = NormalizeDouble(tp, Digits);

上記はmultを使ってオーダーの種別により逆指値、指値を計算しています。
売りの場合は買いの場合と逆の計算をするので、
if文を使って符号を変えています。
▼doulbe NormalizeDouble(double num, int digit)
numの小数点以下の桁数をdigitに揃えます。
▼int Point
表示している通貨の1pipを返します
※重要
なぜ、priceにもNormalizeDoubleをしているかというと、
バックテストデータにはたまにゴミがあって、
4digitsの業者に5digitsのデータがあったりするんです。
その際、オーダーが通らずにエラーで返ってきてしまいます。
それを防ぐためにやってるんですね。
AskやBidも注文を通す際には必ずNormalizeDoubleをする必要があります。
ご注意ください。

int starttime = GetTickCount();

▼int GetTickCount()
start()が開始されてからの時間をミリ単位で返します

while(true)
{
if(GetTickCount() – starttime > 10*1000)
{
Alert(“OrderSend timeout. Check the experts log.”);
return(false);
}
if(IsTradeAllowed() == true)
{
RefreshRates();
if(OrderSend(Symbol(), type, lots, price, slippage, sl, tp, comment, magic, 0, ArrowColor[type]) != -1) return(true);
int err = GetLastError();
Print(“[OrderSendError] : “, err, ” “, ErrorDescription(err));
if(err == ERR_INVALID_PRICE) break;
if(err == ERR_INVALID_STOPS) break;
}
Sleep(100);
}
return(false);

whileで無限ループを発生させ、breakでループが崩されるまで動作し続けます。
そして、そのループが崩される条件のひとつが時間的制約です。
それが
if(GetTickCount() – starttime > 10*1000)
で表現されています。
▼void Alert(string txt)
ポップアップで警告を出します。
▼bool IsTradeAllowed()
トレードができる状態なのかを返します。
トレードできる状態ならtrue,
できなければfalseです。
▼RefreshRates()
AskとBidの値をチャートから再度取得します。
start()がはじまってからtick発生によるズレを回避します。
▼ArrowColor[]
あらかじめ冒頭で発注の種類による色の指定を行っておきました。
▼GetLastError()
プログラムで一番最後に発生したエラーを取得できます。
エラーの種類によって、リピートさせないかを判断しています。
今回のプログラムの場合、
リピートさせないエラーは、逆指値、指値注文が近すぎるときです。
▼Sleep(int time)
timeの時間の間、待機します。
■まとめ
簡単に要約しますと、10秒間の間に0.1秒に1回、注文が通るまで繰り返し注文をし続けるプログラムになります。
注文が通れば終了しますし、特定のエラーになれば終了します。
注文のタイプも自動で分けているため、成り行き、OCO等に万能に機能します。
これは使えると思いますよ^^
豊嶋先生に感謝です。
今日もお読みくださり、ありがとうございます!

にほんブログ村 為替ブログへ 
Fx-Kirin

About Fx-Kirin

2009年10月にFXを開始、翌年2010年5月から脱サラをしてFX業界に専念。 2012年10月頃から本格的に勝ち始め、一月で資産を倍にする、2年半月間負けなし等、安定した収支で2013年11月に生涯FX収支が1億を超える。 投資スタイルはシステムトレード。プログラミングの知識がほぼない状態から、独学で自分がしたいと思うことであればほぼ実現することが可能なレベルまで成長。好きな言語はRuby, Python。必要となればC++からVBA、Pascal等なんでも行う。MT4/MT5のプログラミングも得意。 2011年にはFXで稼いだ資金をもとにシンガポールに移住し、留学も兼ねて起業をチャレンジするほど、ビジネスを興すことに熱意がある。国内の業者を主に使い始めたことから、2012年に帰国。零細株式会社経営中。

Adsense

  • このエントリーをはてなブックマークに追加
  • Pocket
  • 67 follow us in feedly

関連記事

no image

■超直感!MT4プログラミング講座■ 第21回 ボリンジャーバンドを作ろう(3)

こんばんは!キリンです。 私は本日を持って、脱サラをしました。 もう二度とサラリーマン生活に戻らないという固い信念のもと

記事を読む

no image

■超直感!MT4プログラミング講座■ 第18回 インディケーターを色々いじってみよう

こんばんは!キリンです。 今日の名言 「日々、常に何か新しいことを学習し身につける。  それを繰り返すことによって、新し

記事を読む

no image

■超直感!MT4プログラミング講座■ 第10回 if関数を使ってみよう

こんにちは!キリンです。 昨日は土曜出勤でした。サラリーマン生活も残すところあと2週間弱。 今日は、引越し会社に引越しの

記事を読む

no image

■超直感!MT4プログラミング講座■ 第4回 関数の定義方法

おはようございます。キリンです。 「パソコンを付けたら、まずブログを書く!」というマイルール作ってみました。 実践せねば

記事を読む

no image

■超直感!MT4プログラミング講座■ 第34回 決済スプリクトをサブルーチン化する

こんにちは。キリンです。 自立ってそんなに難しくないと思うんですが、 自律は大変ですよね。 自立できれば自律を目指さなけ

記事を読む

no image

■超直感!MT4プログラミング講座■ 第38回 ブレイクアウトシステムのEA作成

おはようございます。キリンです。 脱サラしたことがついに親に発覚し、昨日電話かかってくると思ったらきませんでした。 親は

記事を読む

no image

■超直感!MT4プログラミング講座■ 第8回 スクリプトを使ってみよう!

こんばんは!キリンです。 昨日の動画を上げてから気づいたのですが、 おそらく、昨日の動画で私の話で何をいっているのか伝わ

記事を読む

no image

■超直感!MT4プログラミング講座■ 第6回 インディケータープログラムの解説

こんにちは!キリンです。 GW真っ最中! 私は引っ越し先を探してきました。 納得のいく部屋を見つけて、さらに洗濯機も購入

記事を読む

no image

■超直感!MT4プログラミング講座■ 第11回 配列を覚えよう

こんばんは。キリンです。 最近、各EAの動向で一喜一憂してしまっています。 精神的によろしくないですな^^; クロスファ

記事を読む

no image

■超直感!MT4プログラミング講座■ 第13回 MQL基本関数・変数を覚えよう!

こんばんは!キリンです。 昨日、faiさん(とあるMetaTraderの備忘秘録)にブログで私の講座を紹介していただきま

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Adsense

Ubuntu で仮想ディスプレイを使う

雑多な備忘録ですが、せっかくなので残しておきます。 Ubuntu 18.04 の resolv.c

PYPIへの登録を10秒でできるようになる方法

pip 使ってますよね Pythonを使っている人であれば、pip installでライブラリ

The art of debugging with GDB, DDD, and Eclipse の読書メモ

GDBの勉強がしたくて、下の本を原著で読んでみました。10年前の本だけど全然現役でした。

JupyterでボタンからJavascriptを実行して追加のアウトプットをさせない方法

Javascriptを実行するとアウトプットセルの行が増える これがとても面倒だった。上の

まだBokehで消耗してるの?これからはPandas-Bokehを使おうぜ

タイトルはあまり気にしないでください。全然、Bokehで消耗する価値があるとは思っています。ただ

→もっと見る

PAGE TOP ↑