2014年03月22日

くるくるワイドを半自動EAで勉強してみた


何か変わった手法はないかとネットを徘徊していたら「くるくるワイド」というものに出会った。

手法については美味しいスワップの受け取り方(本家のサイト)

第一印象はよくわからん手法。でもなんか面白そう。習うより慣れる主義なので、理解できたことから試してみることに。が、デモトレじゃ時間がかかるし、自分でレンジ幅を設定し、ロングやショートトラップの張り直しをしなくてはいけないのでEAで全自動は難しい。

で、前回のCAppDialogを使い注文する方法を思いついた訳だが、VisualModeでは動かない。
ので、テキストファイルで数値を渡す方法を考えた。

1.渡したい数値はテキストファイルに書く
2.ファイルを更新したことをEAに通知するためにチャートに矢印を書き込む
2014031123-1.gif
3.EAは矢印を見て、ファイルを解析動作する(上矢印なら買い注文とか、そんな感じ)
矢印のチェック関数をPickUp↓

#define EVENT_NONE 0
#define EVENT_BUY 1
#define EVENT_SELL 2
#define EVENT_EXIT 3
#define EVENT_BUYLIMIT 4
#define EVENT_SHORTTRAP 5

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CheckEvent()
{
int i;
int iObjTotal, iType, iCode;
int iEvent;
int iErr;
string sName;

iEvent = EVENT_NONE;
iObjTotal = ObjectsTotal();
for(i = 0; i < iObjTotal; i++){
sName = ObjectName(i);
iErr = GetLastError();
if(!(iErr == ERR_NO_MQLERROR || iErr == ERR_NO_ERROR)){
Print("Err=" + iErr);
continue;
}
iType = ObjectType(sName);
if(iType == OBJ_ARROW){
iCode = ObjectGet(sName, OBJPROP_ARROWCODE);
switch(iCode){
case SYMBOL_ARROWUP:
ObjectDelete(sName);
iEvent = EVENT_BUY;
break;
case SYMBOL_ARROWDOWN:
ObjectDelete(sName);
iEvent = EVENT_SELL;
break;
case SYMBOL_CHECKSIGN:
ObjectDelete(sName);
iEvent = EVENT_EXIT;
break;
case SYMBOL_THUMBSUP:
ObjectDelete(sName);
iEvent = EVENT_BUYLIMIT;
break;
case SYMBOL_THUMBSDOWN:
ObjectDelete(sName);
iEvent = EVENT_SHORTTRAP;
break;
}
}
}
return(iEvent);
}


なんかかっちょ悪いが、目的は「くるくるワイド」を勉強するなのでOK。

AUDJPY 2013.1.1〜2014.3.10でバックテストと言うか勉強した結果はこんな感じ
2014031123-2.gif
実施した内容は
1.ロングスワップ(2万通貨)
2.ショートトラップ(0.1万通過×10本)
3.ショートトレード(1万通過)(途中から未実施)
※枚数は$10000で2008.10の55円台に耐えられる範囲で設定
※ショート固定、ピンポン、複利ロングは未実施(つーか理解できてない・・・)

2013.5.27に建てたロングスワップ(97.5)が最後まで出口に到達できず持ちっぱなしとなったが、ショートトラップで稼いだ分でペイできたようで最終的に全ポジション決済でプラスとなった。

ただ2013.8の86円台から持ち直したからで、もしそのまま下落したら・・・。いや86円台でうろうろしたとしてもアウトか。その辺はショート固定とか、ショートトレードでなんとかする見たいだけどまだ理解できてないです。ムズいですね。
posted by K at 00:06 | Comment(0) | くるくるワイド | このブログの読者になる | 更新情報をチェックする
2014年03月11日

CAppDialogを使ったEAを作ったら・・・


MQL5の仕様が追加されたMQL4は好きにボタンとか入力欄とか配置できるCAppDialogというクラスが使えます。

サンプルについている、
カスタムインディケータ\Examples\SimplePanel\SimplePanelはCAppDialogを使って作られています。
実行すると、こんなパネルが表示されます。

20140311-01.gif

これってEAからも使えるのかな?と思いサンプルプラグラムを作って見ました。
EAから使えるのであれば、EA実行中に色々と制御が出来るようになるなーと思ったわけです。

20140311-4.gif

こんな感じです。うまくいきました。

次に、VisualModeで実行してみました。

20140311-3.gif

な、なんだモノリスか・・・?

テスターのログを確認したら、エラーだそうです。

20140311-4.gif

VisualModeでは機能しない仕様?とりあえずビルド610ではダメでした。
ま、そんな気がしたので実験したんですが・・・。残念。
posted by K at 22:46 | Comment(0) | ビルド600以降の話 | このブログの読者になる | 更新情報をチェックする
2014年02月27日

MQL4 OnTimerはバックテストで動くのか?

MT4のビルド600(?)からMQL4にMQL5の機能が追加されてますね。

クラスが使えたり、イベントハンドラが増えたりで、今までで出来なかったことや、煩雑になった処理がシンプルに出来たりするのではないかと興味がそそるわけです。

で、今回はOnTimerについて私の失敗談です。

OnTimerは指定時間の間隔で呼ばれる関数です。

1秒毎といえば1秒毎、
60分毎といえば60分毎にOnTimer関数が呼ばれます。

この関数を使って、一定時間ごとにポジションを積み増す(ピラミッディング)処理がつくれないかな?と思ったわけです。今までのTick駆動でも時間をチェックすればよいだけですが、時間をチェックしなくて良くなるなーと思ったわけです。

結果は、フォワードなら問題なし(当たり前か・・・)。
バックテストはOnTimer関数は呼ばれませんでした。
完全無視のようです。

私のバックテストの挙動予想は、
1.バックテストの時間でシミュレートされる(すばらしい!!)
2.リアルタイムの時間で呼ばれる(1秒と指定したら実際の1秒で処理される)

だったのですが、どちらも外れ。

結論、今後はわかりませんが、現時点でバックテストでOnTimerは使えないです。



----

タグ:MT4 MQL4 OnTimer
posted by K at 13:12 | Comment(0) | ビルド600以降の話 | このブログの読者になる | 更新情報をチェックする