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プログラミング講座■ 第7回 インディケーター表示のために

没になった回です。 内容が雑なため、第8回へ移動していただければと思います。 興味のある方はご覧いただければと思います。

記事を読む

no image

■超直感!MT4プログラミング講座■ 第31回 サブルーチンを使えるようになろう

おはようございます。キリンです。 昨日、家の近くの図書館に行ってきました。 そこで借りた本の一冊に、 「生き方」(稲盛 

記事を読む

no image

■超直感!MT4プログラミング講座■ 第3回 関数を覚えよう!

こんばんは!キリンです。 前回の「変数の定義」のお話ですが、 やはりつまづいている方が多かったようですね。 基本的で、非

記事を読む

no image

■超直感!MT4プログラミング講座■ 第14回 インディケーターの定義部

こんばんは!キリンです。 最近ピグによく顔を出しています。 よければ遊びに来てくださいね。 ではでは、本日の講義です。

記事を読む

no image

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

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

記事を読む

no image

■超直感!MT4プログラミング講座■ 第25回 発注スプリクトの作成

おはようございます。キリンです。 今日から引越しの準備です。 今週はあまり仕事が進んでないです・・・。 引越しの準備とか

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

■超直感!MT4プログラミング講座■ 第2回 変数を覚えよう!

こんばんは。キリンです。 この講座の第1回で、非常に大きな反響をいただけました。 MT4のプログラミングに興味持っている

記事を読む

no image

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

おはようございます。キリンです。 日本、負けてしまいましたね。 でも、すごい感動しました。 すごい夢をもらいました。 優

記事を読む

Comment

  1. baron より:

    キリンさんお久しぶりです。
    GBPJPYの3桁でTICKMILLというブローカーでトレーリングストップを使用できていますが、
    XMというブローカーではトレーリングストップが出来ません。
    エラー130が表示されます。 ブローカーで使用出来るもの出来ないものがあるのでしょうか。
    トレーリングストップは1にしています。
    _point = Point;
    if (Digits % 2 == 1)
    {
    _point *= 10;
    Slippage *= 10;
    }

    maxlot = MarketInfo(Symbol(), MODE_MAXLOT);
    minlot = MarketInfo(Symbol(), MODE_MINLOT);

    double lotstep = MarketInfo(Symbol(), MODE_LOTSTEP);
    if(NormalizeDouble(lotstep, 3) <= 0.001) lotdigit = 3;
    else if(NormalizeDouble(lotstep, 2) <= 0.01) lotdigit = 2;
    else if(NormalizeDouble(lotstep, 1) <= 0.1) lotdigit = 1;
    else lotdigit = 0;

    trade_mode = 0;

Message

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

Adsense

joblib によって謎のバグが起こる

joblib 0.14.1 にて確認.0.13.2 だと起こらない.import joblib を消

Fixing kernel error AMD-Vi: Event logged IO_PAGE_FAULT on Ryzen Machine

My pc was periodically shut down on 7:40 am JS

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

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

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

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

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

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

→もっと見る

PAGE TOP ↑