MT4のEAで複数ポジションを持ちたいんですがどうすればよいのでしょうか?

添付しているソースを複数ペアかつ異なる時間帯で同時動作させようとしますが
1つの発注がなされると他のペア(時間帯)で条件が発生してもポジションを保有しません。
どこをどのように変更すればよいかお教えください。

☆今わかっていること
・このEAは単独では動作する(バックテストおよび実口座で複数動かしても1つだけは動作する)
・1つのMT4内に複数のチャートを起動し、動作させたいペア毎に別名保存したEAを
割り当てています。(例えばUSDJPのM15ならMA-USDJP-M15.mq4という具合)
・ソース内でマジックナンバーを指定してますがパラメータで異なるものに指定している。
・証拠金は十分にあります。

☆やりたいこと
具体的にやりたいのはUSDJPのM15、M30、AUDJPのM15、GBPJPのM30の
合計4つをこのソースで同時に走らせたいのです。

以下がそのソースです(移動平均のクロスで売買するものです)

extern double Lots = 0.1;
extern double MovingPeriodFast=26;
extern double MovingPeriodSlow=130;
extern double MovingShift = 6;
extern int MAGICMA=2050610;

//| Calculate open positions |
int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//—- return orders volume
if(buys>0) return(buys);
else return(-sells);
}

//| Check for open order conditions |
void CheckForOpen()
{
double mafast,mafast1,maslow,maslow1;
int res;
//—- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//—- get Moving Average
mafast=iMA(NULL,0,MovingPeriodFast,MovingShift,MODE_SMA,PRICE_CLOSE,0);
maslow=iMA(NULL,0,MovingPeriodSlow,MovingShift,MODE_SMA,PRICE_CLOSE,0);
mafast1=iMA(NULL,0,MovingPeriodFast,MovingShift,MODE_SMA,PRICE_CLOSE,1);
maslow1=iMA(NULL,0,MovingPeriodSlow,MovingShift,MODE_SMA,PRICE_CLOSE,1);
//—- sell conditions
if(mafast1>=maslow1 && mafast<maslow)
{
res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",MAGICMA,0,Red);
return;
}
//—- buy conditions
if(mafast1<=maslow1 && mafast>maslow)
{
res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",MAGICMA,0,Blue);
return;
}
}
//| Check for close order conditions |
void CheckFor Close()
{
double mafast,mafast1,maslow,maslow1;
//—- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//—- get Moving Average
mafast=iMA(NULL,0,MovingPeriodFast,MovingShift,MODE_SMA,PRICE_CLOSE,0);
maslow=iMA(NULL,0,MovingPeriodSlow,MovingShift,MODE_SMA,PRICE_CLOSE,0);
mafast1=iMA(NULL,0,MovingPeriodFast,MovingShift,MODE_SMA,PRICE_CLOSE,1);
maslow1=iMA(NULL,0,MovingPeriodSlow,MovingShift,MODE_SMA,PRICE_CLOSE,1);
//—-
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
//—- check order type
if(OrderType()==OP_BUY)
{
if(mafast1>=maslow1 && mafast<maslow) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
break;
}
if(OrderType()==OP_SELL)
{
if(mafast1&l t;=maslow1 && mafast>maslow) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
break;
}
}
}
//| Start function |
void start()
{
//—- check for history and trading
if(Bars<100 || IsTradeAllowed()==false) return;
//—- calculate open orders by current symbol
CheckForClose();
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
}

..[補足]..
確認不足でした。。。
各mq4ファイルのMAGICMAは重複しない値にしております。
MAl-USD-M15.mq4は1001
MAl-USD-M30.mq4は1002
という具合です。
ちなみにmq4ソース内を同一にして実行時のパラメーターで別々にするのは
ダメなんでしょうか?

回答1

(移動平均のクロスで売買するものです)

これだけで、実際に取引したら、だめだということは明らかです。
通貨毎、足ごとに、他のインジと組み合わせて、最適化がまず必要です。
単独の通貨で、テストしたのであれば、判っていると思います。

各通貨、足ごとの、最適化した後ということで回答します。

まず、通貨、足ごとに、最適化しているので、
NULL は、それぞれの通貨の名称にしておかないと、急に書き換えたりするときに、判らなくなります。
MovingPeriod,も通貨ごとに、規定ししないと、間違いの元です。

MT4のバックテストでは、一度に複数の通貨のテストはできません。
テスト結果だけを、重ね合わせても、ドローダウンが合計できないので、barごとに、ドローダウン、評価損益をファイルに書き込むか、プログラムの中で、printを使って、書きだすかです。
最後に、表計算ソフトを使い合算し、合計の評価損、ドロー 織Ε鵑魴彁擦垢襪靴ないでしよう。

面倒でしたら、最初から、表計算ソフトでやり、作動をMT4で確認する方法も良いでしょう。

実際の取引では、1台のPCで、いくつものMT4を立ち上げて、複数のEAを動かすことは可能です。
原則は、1つのMT4で1つのEAを動かすことです。
MT4を立ち上げる上限は、PCの能力次第です。
MT4自体のEAが重くなければ、3つ、4つば同時に動きます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA