ブローカキャッシュバック


ChashBackForex経由でFXpro,Alpari NZなどのブローカに口座開設すると売買する度にキャッシュバックされます。 現在、アカウント切換える方が多数!

EA購入キャッシュバック

Get cashback from ForexTradingChoice.com
Forex trading choice経由でEAを購入するとキャッシュバックされます。&ブローカキャッシュバックやVPSキャッシュバックも有り。 

アンテナ

googleニュース

仮想通貨

bitvisitor  earnfreebitcoins  cointube.tv
Powered By 画RSS

←銀行振り込みでビットコイン買えます


XM


レバレッジ888倍
最大USD500の初回入金に50%ボーナスが即時反映
約定拒否、リクオートなしの抜群の約定力
最低入金額USD5から
カードで即時入金/手数料なし
三菱東京UFJ銀行より手数料無料で国内振込可
きめ細やかな日本語サポートサービス(現在6名のスタッフが常勤)

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。








Gain Capital Group

複数のEAを動かす時の落とし穴

下記(赤字)は、時刻が5分になったときに一回(バーが新したとき)だけ成行きで買い注文を出すEAです。
このEAを一つのメタトレ内で2つ動かすと、一つしか注文されません。
同時刻に2つ以上の注文を出すと一つは無視される様です。(正確には無視ではないのかも)




ある時間(分)になると成行きで注文を出すEAサンプル

extern int magic_num=20081022;
extern int mmmm = 5;
int Bar_num = -1;

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
datetime tm = TimeCurrent();
int mm = TimeMinute( tm );

if( Bar_num == Bars)return(0);
Bar_num = Bars;

int cnt, CurrentPosition = -1 ;
//マジックナンバーチェック
for( cnt=0;cnt<OrdersTotal();cnt++){
OrderSelect(cnt,SELECT_BY_POS);
if( OrderMagicNumber() == magic_num) {
CurrentPosition=cnt;
int ticket_num = OrderTicket();
}
}

if(CurrentPosition == -1){ //ポジションがないとき
if( mm == mmmm ){
OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "test", magic_num, 0, Blue);
}
}



//----
return(0);
}




注文部分の記述を赤字から青字の様に変更して注文が通ったか確認すれば良ったのですが、
今までずっと気がつかずに なぜ注文されないのだろう?っと悩んでました。情けない。 orz
プログラムって思わぬ落とし穴がありますね。気をつけねば・・・。(^^; )


OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "test", magic_num, 0, Blue);


int ticket = -1;
while( ticket<0){
ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "test", magic_num, 0, Blue);
Sleep(10000);
}


2008.10.24訂正
ぼなんさ さんからのコメントで「何かの拍子に無限ループに入ってしまったりしませんか? 」とのご指摘がありました。
確かにサーバがダウンして再度接続された場合など、どうなるか分かりませんね。
オーダーが通るまでループさせるのは危険なので、下記の様にFor文で繰り返し回数を指定した方が安全ですね。
int i=0;
for(i = 0; i < 10; i++){
ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "test", magic_num, 0, Blue);
if(ticket>0){break;}
Sleep(10000);
Print("注文繰り返し回数",i+1);
}

*相場の状況や通信環境によってオーダー完了時間は変わると思いますが、先ほどデモ口座でテストしたときは停止時間3秒で3回繰り返した後にオーダーが通ってました。


2008.10.25訂正
ぼなんさ さん情報ありがとうございます。
IsTradeAllowed()でトレードのためのスレッドが使えるか判定できるのですね。メタトレって凄いですね。
この他にもIsTradeContextBusy()で他のEAでスレッドがふさがれていないか判定できるみたいです。
今日(2008.10.25)は相場が休みなでチェックしてませんが、下記の様にすれば、
Error 146 ("Trade context busy")もなくなりますね。

if(!IsTradeAllowed()){
int i=0;
for(i = 0; i < 10; i++){
Print("注文待機中 待機回数:",i+1);
Sleep(10000);
if(IsTradeAllowed()){OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "test", magic_num, 0, Blue);}
}
}
else{
OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "test", magic_num, 0, Blue);
}




2008.10.27訂正
またまた訂正です。(m´・ω・`)m ゴメンナサイ…
beak文が洩れてました。For文で繰り返した分だけ注文してしまいますね。(;^ω^)
先ほどのテストした結果では問題なさそうです。
Print文も追加しておきました。


int ticket = -1;
int repeat=10;
if(!IsTradeAllowed()){
int i=0;
for( i = 0; i < repeat; i++){
if(IsTradeAllowed()){
ticket =OrderSend(Symbol(), OP_BUY, 0.1, Ask, 0, 0, 0, "test", magic_num, 0, Blue);
if(ticket>0){break;}
}
Print("注文待機中 待機回数:",i+1);
Sleep(10000);
}
if(i==repeat)Print("注文繰り返し回数",repeat,"回を超えましたので注文できませんでした。");
}
else{
OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "test", magic_num, 0, Blue);
}


*上のサンプルでは10秒スリープを10回にしていますが、デモ口座でテストしたときに(相場の動きが激しい時に?)10回を超えて注文されないこともありました。
繰り返し回数を多くすると値が動いてしまうし、といって注文されないのも寂しいし・・・。
回数を決めるのは、相場の状況や通信環境にもよるので結構難しいですね。









Gain Capital Group

コメント

やはりそうでしたか

やはり、そういうことがあったんですね。
わたしも実験してみようと思っていたところでしたが、実証していただき、またコードまで記してくださりありがとうございました。

バッティングするなら、乱数で次回の実行タイミングを複数EAでばらばらにしなくてはいけないと考えていましたが、かならず一つは実行されてゆくので、示してくださったコードで実用的ですね。

同じEAのマジックナンバーだけ変えたものを同時に動かしたりすると一方のオーダーだけ通っていることが良くありますね・・・。
パラメーターの設定をちょっと変えただけのものをいくつも同時にフォワードテストしていて良くこの罠(?)にはまっていました。

一つの解決法としてオーダーが通るまでオーダーを繰り返せばよいわけなので、それをこのコードでシンプルに解決しているように思うのですが、このコードだと何かの拍子に無限ループに入ってしまったりしませんか?

Robowalksさん おはようございます。
トレイリングストップを使ってるとヤバイすよ。
片方だけ機能しなくなります。

ぼなんさ さん ご指摘ありがとうございます。
確かに無限ループする可能性ありますね。
とんでもないときにオーダーが通ったりして・・・。(汗)
For文使って繰り返し回数をしてした方が良いですね。
記事訂正しておきました。

繰り返し回数を限定すれば、無限ループの恐れはなくなりますね。

あと、一つの解決法としては、オーダーの直前にIsTradeAllowed()を入れておくことで、複数のEAによるオーダーのバッティングを少しは避けられるようです。

以前にブログに関連の記事を載せたので参考にしてみてください。
(タイトルを失念して昨日は見つかりませんでした…)
http://bonansa.blog47.fc2.com/blog-entry-148.html

参考になるのは記事で紹介しているリンク先ですが・・・。

ニュースサイト
商品先物

ライブ 商品先物 表の提供はForexpros.jp
ランキング
にほんブログ村 為替ブログ FX システムトレード派へ
にほんブログ村 為替ブログへ
にほんブログ村 先物取引ブログへ
FX
プロフィール

ガマウシ

Author:ガマウシ

最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブロとも申請フォーム

この人とブロともになる

FC2ブログ
ブログ
このブログに関して
【著作権に関して】
当サイトで掲載・配信している動画及び画像の著作権/肖像権等は各権利所有者に帰属致します。
当サイトに掲載されている画像や記事等において、著作権や肖像権に関して問題がありましたら、下記連絡先まで御連絡下さい。即刻削除等の対処をさせて頂きます。
又、リンク先で起こったトラブルにつきましては、当サイトは一切関知しておりませんので、ご利用の際は自己責任にて対処をお願いいたします。

各種お問い合わせにつきましては、 下記にあるメールフォームからお願いします。
メールフォーム

名前:
メール:
件名:
本文:

CoinsPrice



国債
日本国債 10年


米国債 10年


英国債 10年


スイス国債 10年


オーストラリア国債 10年


ニュージーランド国債 10年


カナダ国債 10年


ドイツ国債 10年


イタリア国債 10年


ギリシャ国債 10年


ポルトガル国債 10年


スペイン国債 10年




ブログ内検索
リンク
仮想通貨リンク
インフレ率
インフレ率(年平均)の推移 - 世界経済のネタ帳

インフレ率(期末月)の推移 - 世界経済のネタ帳

インフレ率(期末月)の推移 - 世界経済のネタ帳

インフレ率(期末月)の推移 - 世界経済のネタ帳

インフレ率(期末月)の推移 - 世界経済のネタ帳

インフレ率(期末月)の推移 - 世界経済のネタ帳

インフレ率(期末月)の推移 - 世界経済のネタ帳

インフレ率(期末月)の推移 - 世界経済のネタ帳

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。