GogoJungle LABO
GogoJungle LABOは自動売買EAやインジケーターなど、
投資に特化したプログラミングに関するQ&Aサービスです。
コードを書いていてわからないことや、トレード・手法について、
世界中の投資家たちと英知を共有しましょう!
プログラミングに関してわからないことがあれば、
GogoJungle LABOで質問してください。
あなたがわかることがあれば、
ぜひ解決方法をシェアして手助けをしてください。
初心者も質問できる開発者LABOです。
EA・インジケータ作成補助ソフト
EA・インジケータの作成補助ソフトを使用すれば、
コード作成の時間が大幅に短縮でき、
また初心者の方でも簡単にEAやインジケータの作成が可能です。
ソフトの紹介
EA作成ソフト
インジケータ作成ソフト
EA・インジケータ作成ソフトのセット
EA作成のセミナー
LABOの活動について
GogoJungle LABOが実際どのように活動しているか、
一部抜粋をします。
通貨ペアと時間足の制限について

EAをチャートにのせるに時に、
通貨ペアと時間足を制限したいのですが、
どのようにコードを書いたら良いのでしょうか。
教えてください。

この関数が便利です!
指定した通貨ペアと時間足に自動で切り替えられます。
ChartSetSymbolPeriod
例)
string suffix=StringSubstr(Symbol(),6);
if(!ChartSetSymbolPeriod(0, “USDJPY”+suffix, PERIOD_M1))
ポジション管理について

EAを自作で何個か作って試しているのですが、
どうも違うEAのポジションを決済してしまう時があります。
1つのMT4でEA別にポジションを管理するにはどのようにコードを書いたら良いのでしょうか。
教えてください。

違うEAのポジションを決済してしまう現象は、
OrderCloseの際に誤って他EAのチケット番号を指定してしまっていることにより発生します。
下記2つの対応をすれば問題ないかと思います。
① EAごとに異なるマジックナンバーを設定(外部パラメータにされるのがよいかと思います)
extern int Magic = 999999;
② ポジション管理
for (int i = 0; i < OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == FALSE) break; if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic){ RefreshRates(); Ticket=OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0, White); return; } }
マジックナンバーと通貨ペアが正しいことを判定すれば正しいチケットを決済することができます。
MQL4 or MQL5 どちらから始めたらよいでしょうか?

個人的にインジケーターやEAを使用して1年くらいになるものですが、ボチボチ自分でも作ってみたいと思っています。
Gogojungleに出品することを目標にMQLを勉強しようかと思っているのですが、MQLにはバージョン4と5があり、プログラムの書き方に違いがあるとのことを耳にし、どちらを勉強するべきなのか迷っております。
現在ゴゴジャンで出品しているEAのほとんど(全部?)がMT4用だと思いますので同じようにMQL4を勉強するべきなのか、今後のことを考え新しいバージョンのMT5にするべきなのか。
皆さんの意見をお聞かせ願えたらと思います。
よろしくお願いします。

MQL4はC言語ベース、MQL5はC++言語ベースとなっています。
C++はCの拡張版と考えるならMQL4で基礎を学んだ方が良いと思います。

難しい話は抜きにするとmql4のほうが簡単です。
mql5だと同じ作業でもコードが長くなります。
普通にやると注文発注でも10倍くらい違うことも。
しかしバックテストや最適化は5のほうが圧倒的に早いです。
gogojungleで買う人はmql4のほうが多いですし、mql5は日本語解説がまだ少ないので私はmql4をおすすめします。
EA制作を始めたきっかけがあれば教えてください

初心者です。
経験者の方々の歴史を少しでもお聞かせ願えたらと、EAを作成しようと思ったきっかけみたいことがあれば教えていただけますでしょうか。
またその後継続して作成するためのモチベーションなども伺えたらうれしいです。

裁量で兼業でFXをやろうと思うとどうしても休憩時間や仕事が終わったあとにしかできませんので裁量を初めて2週間程ですぐにEA運用に切替ました。
何個かEAを購入して運用をはじめ、含み損を抱えたときにロジックがわからず手動で損切するべきなのか保有するべきなのかわからなかったので
そういうこともあり自分で作った方が良いと考えました。
勉強を始めたばかりの頃はうまくいかず何度もあきらめかけましたが、習得した技術が直結してお金に代わるというわかりやすさがモチベーションにつながり現在に至ります。
EventSetMillisecondTimerを利用してミリ秒単位でOnTimerを実行する

OnTimerを利用することで一定時間毎に処理を実行できます。
OnTimerを利用するための準備として、通常はEventSetTimer関数を使用して処理頻度を秒単位で指定します。
int OnInit(){
EventSetTimer(1); // // 1秒毎にOnTimer関数を実行
return(INIT_SUCCEEDED);
}
しかし場合によっては1秒未満の短い間隔で処理を実行したい場合もあるかと思います。
その場合にはEventSetTimer関数の代わりにEventSetMillisecondTimer関数を使用します。
bool EventSetMillisecondTimer(
int milliseconds
);
この関数を使用することでミリ秒単位でOnTimerの実行頻度を指定できます。
処理頻度を1ミリ秒に設定する例は以下の通りです。
int OnInit(){
EventSetMillisecondTimer(1); // 1ミリ秒(0.001秒)毎にOnTimer関数を実行
return(INIT_SUCCEEDED);
}
MQL4で定義済みの定数を利用する

MQL4にはデフォルトで定義済みの定数がいくつかあります。
DATE
ファイルをコンパイルした日付(時間、分、秒は0で表示)
DATETIME
ファイルをコンパイルした日付(時間、分、秒まで詳細に表示)
FILE
現在のファイルの名称
PATH
現在のファイルのパス
FUNCTION
__FUNCTION__が実行された関数名。
OnTick関数内で実行した場合には、「OnTick」が出力される。
void OnTick(){
Print(__FUNCTION__);
}
FUNCSIG
__FUNCTION__が実行された関数名を戻り値と引数の型も含めて出力。
OnTick関数内で実行した場合には、「void OnTick()」が出力される。
関数のオーバーライドを使用している場合にはこちらを使用することで明確に判別が可能となる。
void OnTick(){
Print(__FUNCSIG__);
}
LINE
ソースコード内で__LINE__が実行された行数。
100行目で次のコードを実行した場合には、「100」と出力される。
Print(LINE);
MQLBUILD
ファイルをコンパイルしたコンパイラのビルド番号
WindowOnDroppedでインジケーター挿入されたチャートのウィンドウ番号を取得する

MT4のチャートはローソク足などが表示されるメインウィンドウと、RSIやMACDなどのオシレーター系のインジケーターなどが表示されるサブウィンドウがあります。
これらの各画面にはウィンドウ番号が割り振られています。
メインウィンドウは必ず1つしかないので、ウィンドウ番号は0で固定です。
サブウィンドウは複数表示される場合があるので、1から順に連番で数値が割り振られます。
サブウィンドウはユーザーの操作によって幾つになるか分からないため、サブウィンドウに表示するインジケーターではどのウィンドウに表示されるかが分かりません。
EA、インジケーター、スクリプトが挿入されたウィンドウの番号を取得するにはWindowOnDropped関数が用意されています。
int WindowOnDropped();
WindowOnDroppedを使用すると現在のプログラムが挿入されているウィンドウ番号を返します。
0であればメインウィンドウ、0以外の数字であればサブウィンドウに挿入されています。
ウィンドウ番号が分かれば、例えばObjectsDeleteAll関数を利用してインジケーターが挿入されているサブウィンドウのオブジェクトだけを削除するなどが可能です。
void OnDeinit(const int reason){
ObjectsDeleteAll(0, WindowOnDropped());
}
MQL4で曜日を計算する方法

現在の曜日を取得するにはDayOfWeek関数を使用します。
int DayOfWeek();
DayOfWeek関数の戻り値は整数です。
戻り値の数値が曜日を表しています。
0:日曜、1:月曜、2:火曜、3:水曜、4:木曜、5:金曜、6:土曜
DayOfWeek関数の戻り値が1の場合は現在は月曜日です。
if(DayOfWeek() == 1){
Comment(“月曜日です。”);
特定の日付の曜日を取得する
特定の日付(例えば2016年5月20日)の曜日を計算します。
まず日付のデータを用意します。
datetime型の変数であればそのまま使用できますが、日付をstring型で保持している場合にはStringToTime関数でdatetime型に変換しておきます。
datetime StringToTime(
string value
);
引数に変換したいstring型の日付を指定することでdatetimeに変換した結果を受け取れます。
string s_value = “2016-05-20”;
datetime dt_value = StringToTime(s_value);
次にdatetime型で用意した日付を、MqlDateTime型の構造体に変換します。
datetime型の変数をMqlDateTime型に変換するには、TimeToStruct関数を使用します。
void TimeToStruct(
datetime dt,
MqlDateTime& dt_struct
);
第一引数にdatetime型の日付を、第二引数に結果を受け取る構造体を指定します。
第二引数は参照渡しですので、事前にMqlDateTime型の構造体を作成しておく必要があります。
MqlDateTime dt_struct;
TimeToStruct(dt_value, dt_struct);
最後に構造体から曜日を取得します。
曜日は、
構造体名.day_of_week
の形式で取得することができます。
DayOfWeekの場合と同様に0が日曜日、6が土曜日となっています。
Comment(dt_struct.day_of_week);
FXのキャッシュバックプログラムの始め方【CFD他全てに対応】
FX取引におけるリベートのキャッシュバックプログラムの紹介記事です。
リベートキャッシュバックの詳細はこちらをクリック!