TimeGMT()の憂鬱

スキャルピングEAを作る場合、週跨ぎのポジション保有は避けた方が良いので、週末強制クローズ機能の搭載を考えている。
ただしMT4のサーバー時間は時差が異なっていたり、夏時間があったり無かったりするので、サーバー時間を世界協定時(UTC)に変換してから処理するロジックを考える事が多いと思う。
 
そこでTimeGMT()という関数が登場するわけだが、思いのほか役立たずだったりする…
リファレンスには、
time_gmt_ref.png
とあるが、要するにMT4サーバーではなくPCの時間を参照してますよっと。
ダメじゃん…
そもそも、取引自体はMT4サーバー側で行うのだから、時間の進み具合はMT4サーバーに合わせなければならない。
PCやVPSと、MT4サーバーの時計のどちらが正しいのかは分からないが、取引する上ではMT4サーバーの時間が絶対である。
 
直近のMT4サーバー時間を返すTimeCurrent()と、TimeGMT()の間の整合性が保証されない限り、TimeGMT()を使った時間処理の正しさも保証されなくなってしまう。
 
結局、MT4サーバーの時差を直接的に得る関数はMQLには用意されてないという事になり、パラメータ等でUTCオフセットと夏時間有無を指定させるしか手段が無い模様。
(GMTとUTCは同じと考えて良いが、気になる方はWikipedia該当ページへ)
 
他に方法が無いかと、例えば週のレート配信開始時間と終了時間からサーバーの時差を割り出せないか検討したみたが、配信時間外にも関わらず、稀にゴミのようなバーが存在するブローカーが数社あり、この方法では信頼性に欠けることが判明している。
 
週末強制クローズ機能に関しては、時間処理の他にもOnTick()イベントの制約として、閑散とした週末を迎えた場合に強制クローズが出来ない可能性があるなど、課題が幾つか残っている。
 
 
ところで、MQL5のリファレンスは公式サイトで日本語化されたのだが、主流であるMQL4のリファレンスは日本語化されないまま放置されるのだろうか?
MQL5リファレンス(日本語)
 

テーマ : FX(外国為替証拠金取引)
ジャンル : 株式・投資・マネー

【MQL】全角半角混在文字列を指定バイト数以内にカットする関数

タイトルの件、ちょっとマニアックかもしれません。
普通にMT4を使っているなら需要ないはずw
 
以前、【MQL】OrderSend関数のコメント設定には文字数制限がある という記事で、「OrderSendで発注するとき、コメントに設定できる文字数は半角31文字(全角15文字)まで」というのを紹介しました。
 
対応としてStringSubstr関数やStringFormat関数を使ってコメントを31文字以内にすれば良いのですが、これらの関数は半角全角の区別なく1文字ずつ処理します。
そのためコメントに全角文字が含まれていると、シフトJISで31バイトを超えてしまうためにコメントの設定に失敗します。バイト数でカットしても良いのですが、全角半角混在のときは文字化けが発生してトラブルの元になるかもしれません。
 
そこで全角半角混在文字列を、文字化けすることなく指定バイト数以内にカットする関数を紹介します。
string StringLeftB(string value,int length)
  {
   uchar strArray[];
   int lengthBytes;
   string result=value;
   
   lengthBytes=StringToCharArray(result,strArray)-1;
   while(lengthBytes>length)
     {
      result=StringSubstr(result,0,StringLen(result)-1);
      lengthBytes=StringToCharArray(result,strArray)-1;
     }
   return(result);
  }

例えば
string comment="1二三四五六七八9零1二三四5六七八9零";
comment=StringLeftB(comment,31);
の結果は、シフトJISでの31バイト目が全角文字1バイト目に当りますので
1二三四五六七八9零1二三四5六七
の30バイトになります。
 
ただし、作った本人はコメントに半角文字しか設定しないので、不要な機能かもしれませんw
 

テーマ : FX(外国為替証拠金取引)
ジャンル : 株式・投資・マネー

【MQL】過去のチャートデータを取得するスクリプト

過去のチャートデータを取得するにはチャートの自動スクロールを外してHomeボタンを押し続ければ良いのですが、数ヶ月以上になると時間が掛かるので面倒です。
 
そこでMT4のスクリプトから、チャートを過去へスクロールさせてデータを取得できるようにしてみました。
 

 GetHistoricalData.mq4

//+------------------------------------------------------------------+
//| GetHistoricalData.mq4 |
//| Copyright 2015, nekonote |
//| http://nya0nekonote.blog.fc2.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, nekonote"
#property link "http://nya0nekonote.blog.fc2.com/"
#property description "チャートを過去へスクロールしてヒストリカルデータを取得します。"
#property version "1.00"
#property strict

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
long chart_shift = ChartGetInteger(0,CHART_SHIFT); // チャートの右端移動モードを控える
long chart_autoscroll = ChartGetInteger(0,CHART_AUTOSCROLL); // チャートの自動スクロールモードを控える
long chart_scale = ChartGetInteger(0,CHART_SCALE); // チャートのスケールを控える
int bars_count; // チャートの総バー数
int retry_count; // ヒストリカル取得のリトライ回数

// チャートの自動スクロールを外してスケールを最小にする
ChartSetInteger(0,CHART_SHIFT,0);
ChartSetInteger(0,CHART_AUTOSCROLL,0);
ChartSetInteger(0,CHART_SCALE,0);

// チャートを過去へスクロールしてヒストリカルデータを取得する
bars_count=iBars(NULL,0);
retry_count=0;

while(retry_count<5 && !IsStopped())
{
Comment("Bars Count = ",iBars(NULL,0),"\n","Retry Count = ",retry_count);
// チャートを過去へスクロール
ChartNavigate(0,CHART_BEGIN,-2048);
ChartRedraw();
// チャートが更新されるのを待つ
Sleep(1000);
// 総バー数が更新されたかチェックする
RefreshRates();
if(bars_count==iBars(NULL,0))
retry_count++;
else
retry_count=0;
bars_count=iBars(NULL,0);
}

// チャート状態を元に戻す
Comment("");
ChartSetInteger(0,CHART_SHIFT,chart_shift);
ChartSetInteger(0,CHART_AUTOSCROLL,chart_autoscroll);
ChartSetInteger(0,CHART_SCALE,chart_scale);
ChartNavigate(0,CHART_END);
ChartRedraw();

}
//+------------------------------------------------------------------+

 
やっている事はチャートを過去方向へスクロールして1秒ウェイトして総バー数をチェックして…の繰り返しです。
スクリプト実行中はチャート左上に総バー数が表示され、総バー数が5回連続で変化しなかった時は取得完了と見做して終了します。
GetHistoricalData_Comment.png
 
数年分のヒストリカルデータが取得できるForex.comなどで使うと便利ですよ!
 

【MQL】FileOpenで開くことの出来ないファイル拡張子

とあるMQL4スクリプトを組んでいる最中、FileOpen関数で何をやってもエラー5002(wrong file name)になる箇所があって調べてみたら、ファイル拡張子によって開くことが出来ないセキュリティ制約が存在するようだ。

以下の拡張子はFileOpenでエラーになる(読み書き出来ない)
.bat .js .vbs .wsf .vb .exe .dll .msi .ocx

やりたかった事はzipファイルの操作で、OSのzip用dllは仕様非公開でimport出来ないし、7-zip32.DLL等を別途用意するよりはスクリプトを一時生成してcscript.exe経由でOS機能を呼び出した方が汎用性高いかな?と思っただけなのですが。
そもそも.vbsや.jsはMQL4から生成出来ないというオチです。
※cscript.exeという回り道などせずole32使えよ!という話もある

【MQL】static変数の初期化の制約

static変数の初期化で変な値がセットされていることに気付いて調べたら

MQL4 Referenceより引用
> Global and static variables can be initialized only by a constant of the corresponding type or a constant expression.

ぁぁ、そもそもstatic変数を式や関数戻り値で初期化したらダメなのかぁ~
今までMQL標準関数と四則演算の組み合わせでstatic変数を初期化しても、コンパイル警告もなく正常に初期化出来てたから、この制約には全く気づかなかった。

今回もコンパイル警告出なかったけど、関数三重入れ子の式でstatic変数を初期化したら、どこから生まれたか分からない値が入っていました。怖いなぁ…
プロフィール

nekonote

Author:nekonote

EAを作るのが趣味になってしまったらしい。

あとマニアックな運用とかetc...その時の気分で書き殴る(?)
そんなブログ

※当ブログ記事へのリンクはご自由にどうぞ

 
運用は…fx-onのみんなのMT4に公開しているかも?
fx-on 通常会員ページ
fx-on 出品者ページ

最新記事
最新コメント
月別アーカイブ
カテゴリ
検索フォーム
ブログランキング
にほんブログ村 為替ブログ システムトレード 自作EA派へ





QRコード
QR
RSSリンクの表示
リンク
FX情報サイト
 優秀トレーダーの投資法をゲット!
FX投資情報コミュニティfx-on.com


国内MT4取扱会社
外為ファイネスト カコテン iOsMA (type DI) EURAUD タイアップキャンペーン

アヴァトレード・ジャパン株式会社 カコテン iOsMA (type DI) EURAUD タイアップキャンペーン

FOREX.com×タイアップキャンペーン☆Beatrice-07 FXTF×ForexSolidタイアップキャンペーン



自作EA紹介


EAフォワード集計結果
海外MT4業者
海外業者を選ぶ際は、まず金融庁の「注意喚起」を熟読して下さい。無登録業者で事故っても自己責任ですよ!
自分はゲムトレード&GEMFOREXに突撃してみましたw




自分もカコテンシリーズを幾つか出品しています。 運用結果でネタが集まれば時々記事にします。

ゲムトレードはEAの将来価値をリスクヘッジするには良い仕組みを提供していると思います。ただし本当に実力のあるEAはfx-on等から買った方が良いでしょう。
取引明細には現れませんがIBのような仕組みでゲムトレードへ報酬が渡っていますので、単一EAの長期運用ではデメリットが成績に現れると思われます。

※繰り返しますが海外業者でトラブっても自己責任です。お忘れなく!
FX専用VPS
レンタルサーバーなら使えるねっと



みんなのMT4
紫色:リアル口座
水色:デモ口座
ねこぱんち | fx-on.com
ねこぱんちMAXでも | fx-on.com
ねこのまえあし | fx-on.com
€$ XM demo | fx-on.com
£$ FxPro demo | fx-on.com
€¥ IFC Markets demo 2nd! | fx-on.com
£¥ IC Markets demo  | fx-on.com
$¥ MGK Global demo | fx-on.com
BigBoss demo AUDJPY | fx-on.com
€x LandFX demo | fx-on.com
KAKO10 iIchimoku リアル OANDA | fx-on.com
KAKO10 iIchimoku デモ FXTF | fx-on.com
KAKO10_iMA(H27.5~) | fx-on.com
KAKO10 iMA デモ Axiory(運用終了) | fx-on.com
KAKO10 iMA デモ Axiory新鯖 | fx-on.com
Ava demo iOsMA方向性スイング(運用終了) | fx-on.com
カコテン iOsMA (type DI) デモ Centrade | fx-on.com
カコテン iMomentum (type DI) デモ Arena | fx-on.com
瞬殺!!! NCSEC demo ※運用終了 | fx-on.com
GEMFOREX demo 新サーバーお試し ※破綻 | fx-on.com
 | fx-on.com
 | fx-on.com
 | fx-on.com
 | fx-on.com