MAサイン225を使用し、なおかつCFDの株価指数取引で時間成行によるポジション管理を実現する為、こんなEAを作ってみました。
簡単なテストは実施していますが、実運用での保証は致しませんのであしからず。
また、機能や役割は特定の状況を想定していますので最小限です。ご了承ください。
使用用途:
- 取引したい時間にトレードできないが、取引する方向(買いや売り)が予め決まっている場合で、タイマー注文したいとき
- 操作できる端末がスマートフォンであり、EAの各パラメーターの設定が厳しい状況で自動売買を実行したいとき
機能概要:
- 時間足やブローカー、適用通貨の制限無し
- 最大1ポジションとなるよう管理機能あり(通貨とマジックナンバーのキーで制御)
- 同EAで建てたポジションは、一度MT4を終了しても、再度MT4起動後に同EAを設定すれば時間指定の決済管理が可能
- MT4 Build600以降の変更?OnTimer()関数により、1秒毎に稼働する(ただし、恐らくMT4の制限?で、結局Tick変動がないと稼働しない)
- 上記のTick制限があるため、ポジションオープンもクローズも数分の時間的マージンあり (なので、オープンとクローズ時間は10分程度離した方が良い)
- オープン時間とクローズ時間の前後に制限無し (例えば、6時に建てて、3時に決済とかも指定可能(翌日決済のオペレーションが可能)
- ポジションクローズ直後に、チャートからEAが自動的に取り除かれる (よって、古いサインで再度発注されることはなく、注文に際し毎回EAを設定する)
- 買い専用EAと売り専用EAの2つにわけてます (つまり、EAの設定をぽちぽちせず、EAのドロップアンドドラッグだけで操作を完了させることができます)
- TakeProfitやStopLossは設定しません
- 運用ロット数や、指定時刻の妥当性はEA設定時に人の目で確認が必要
Pict紹介
1.
MAサイン225用に、買い売り、日中夜間用の計4EAで用意しておくと便利かと思います
2.
時刻指定は、10時以前は3桁、10時以降23時台までは4桁で指定する
秒や日の指定はできない
想定外の桁数や時刻が指定された場合の挙動はテスト未実施(無保証EAです)
3.
次回取引のオープン時間、クローズ時間や、Long・Shortの別、ロット数を表示します
4.
TPとSLは設定しません
5.
1回の取引完了後、自動でEAがチャートから取り除かれます(EA停止します)
無料公開です。。。
— SourceCode(買いの場合) —
事前設定の時間やロット数の変更は、”extern xxx”の部分を改変して下さい
//+——————————————————————+
//| MorningLong.mq4 |
//| Copyright 2014, Life with FX |
//| http://lifewithfx.jp |
//+——————————————————————+
#property copyright “Copyright 2014, Life with FX”
#property link “http://lifewithfx.jp”
#property version “1.00”
#property strict#include <WinUser32.mqh>
#define COMMENT “LFX225”
extern int MAGIC = 140331;
extern double lots = 0.01;
extern int OPEN_MMDD = 0300;
extern int CLOSE_MMDD = 0915;//+——————————————————————+
//| Expert initialization function |
//+——————————————————————+
int OnInit()
{
//— create timer
EventSetTimer(1);Comment(“LONG!!\n”,
” OpenTime: “, OPEN_MMDD,”\n”,
” CloseTime: “, CLOSE_MMDD,”\n”,
” PosLots: “, lots);//—
return(INIT_SUCCEEDED);
}
//+——————————————————————+
//| Expert deinitialization function |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— destroy timer
EventKillTimer();}
//+——————————————————————+
//| Expert tick function |
//+——————————————————————+
void OnTick()
{
//—}
//+——————————————————————+
//| Timer function |
//+——————————————————————+
void OnTimer()
{
//—
//
int serverHM = Hour() * 100 + Minute();if (OPEN_MMDD <= serverHM &&
serverHM < OPEN_MMDD + 5 &&
isOpenNewPosition()) {
OrderSend(Symbol(), OP_BUY, lots, Ask, 15, 0, 0, COMMENT, MAGIC, 0, Blue);
}if (CLOSE_MMDD <= serverHM &&
serverHM < CLOSE_MMDD + 5) {
myCloseOrder();
PostMessageA( WindowHandle( Symbol(), Period()), WM_COMMAND, 33050, 0);
}}
//+——————————————————————+
bool isOpenNewPosition() {
for (int i = 0; i < OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS) == false) {
return true;
}if (OrderSymbol() == Symbol() &&
OrderMagicNumber() == MAGIC) {
return false;
}
}
return true;
}
void myCloseOrder() {for (int i = 0; i < OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS) == false) {
break;
}
if (OrderSymbol() != Symbol() ||
OrderMagicNumber() != MAGIC) {
continue;
}OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 10, White);
break;
}
}
— SourceCode(売りの場合) —
//+——————————————————————+
//| MorningShort.mq4 |
//| Copyright 2014, Life with FX |
//| http://lifewithfx.jp |
//+——————————————————————+
#property copyright “Copyright 2014, Life with FX”
#property link “http://lifewithfx.jp”
#property version “1.00”
#property strict#include <WinUser32.mqh>
#define COMMENT “LFX225”
extern int MAGIC = 140331;
extern double lots = 0.01;
extern int OPEN_MMDD = 0300;
extern int CLOSE_MMDD = 0915;//+——————————————————————+
//| Expert initialization function |
//+——————————————————————+
int OnInit()
{
//— create timer
EventSetTimer(1);Comment(“SHORT!!\n”,
” OpenTime: “, OPEN_MMDD,”\n”,
” CloseTime: “, CLOSE_MMDD,”\n”,
” PosLots: “, lots);//—
return(INIT_SUCCEEDED);
}
//+——————————————————————+
//| Expert deinitialization function |
//+——————————————————————+
void OnDeinit(const int reason)
{
//— destroy timer
EventKillTimer();}
//+——————————————————————+
//| Expert tick function |
//+——————————————————————+
void OnTick()
{
//—}
//+——————————————————————+
//| Timer function |
//+——————————————————————+
void OnTimer()
{
//—
//
int serverHM = Hour() * 100 + Minute();if (OPEN_MMDD <= serverHM &&
serverHM < OPEN_MMDD + 5 &&
isOpenNewPosition()) {
OrderSend(Symbol(), OP_SELL, lots, Bid, 15, 0, 0, COMMENT, MAGIC, 0, Red);
}if (CLOSE_MMDD <= serverHM &&
serverHM < CLOSE_MMDD + 5) {
myCloseOrder();
PostMessageA( WindowHandle( Symbol(), Period()), WM_COMMAND, 33050, 0);
}}
//+——————————————————————+
bool isOpenNewPosition() {
for (int i = 0; i < OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS) == false) {
return true;
}if (OrderSymbol() == Symbol() &&
OrderMagicNumber() == MAGIC) {
return false;
}
}
return true;
}
void myCloseOrder() {for (int i = 0; i < OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS) == false) {
break;
}if (OrderSymbol() != Symbol() ||
OrderMagicNumber() != MAGIC) {
continue;
}OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 10, White);
break;
}
}