2018年5月20日日曜日

マルチ通貨 EAの作り方

今日はマルチ通貨対応のEAを開発してみます。
通常は通貨ペア指定をSymbol()にしてチャートの通貨ペアを使用します。
””やNULLも同じ意味です。

このシンボルを USDJPY の様に指定するとチャートの通貨ペア以外を選ぶことが出来ます。業者によっては _USDJPY や USDJPY.oj5k の様になっていることもありますので、気配値表示を参照にして下さい。※重要

簡単なEAを作ります。

void OnTick(){
if(iRSI(Symbol(),PERIOD_CURRENT,14,PRICE_CLOSE,0)<30
&&!OrdersTotal())
{
int RV=OrderSend(Symbol(),OP_BUY,0.1,Ask,5,Ask-0.1,Ask+0.1);
}
}

EA適応したチャート Symbol() のRSIが30を下回り、かつポジションを持っていない時にEA適応したチャートの通貨で買い発注します。

USDJPYとEURUSDをそれぞれ一つのEAで発注する時はこんな感じになります。
初めにUSDJPYのRSIを判定し条件が合えばUSDJPYの発注をします。
初めにEURUSDのRSIを判定し条件が合えばEURUSDの発注をします。

void OnTick(){
if(iRSI("USDJPY",PERIOD_CURRENT,14,PRICE_CLOSE,0)<30
&&!OrdersTotal())
{
int RV=OrderSend("USDJPY",OP_BUY,0.1,Ask,5,Ask-0.1,Ask+0.1);
}

if(iRSI("EURUSD",PERIOD_CURRENT,14,PRICE_CLOSE,0)<30
&&!OrdersTotal())
{
    RV=OrderSend("EURUSD",OP_BUY,0.1,Ask,5,Ask-0.001,Ask+0.001);
}
}

TakeProfitとStopLossも桁が変わるので変更しています。

※OnTick()はチャートのティック(価格)が変動した時に動作します。
上のソースをUSDJPYに適応した時にはUSDJPYの価格が動いた時に動作するのでEURUSDはタイミングが合わないかもしれません。

これを回避するにはOnTimer()を使用します。
int OnInit()
{
EventSetMillisecondTimer(30);
return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
EventKillTimer();
}

void OnTimer(){
if(iRSI("USDJPY",PERIOD_CURRENT,14,PRICE_CLOSE,0)<30
&&!OrdersTotal())
{
int RV=OrderSend("USDJPY",OP_BUY,0.1,Ask,5,Ask-0.1,Ask+0.1);
}

if(iRSI("EURUSD",PERIOD_CURRENT,14,PRICE_CLOSE,0)<30
&&!OrdersTotal())
{
    RV=OrderSend("EURUSD",OP_BUY,0.1,Ask,5,Ask-0.001,Ask+0.001);
}
}
OnInit()内にEventSetMillisecondTimer(30);を指定します。
30msごとにOnTimer()を動作させると設定します。

void OnDeinit(const int reason)
{
EventKillTimer();
}

こちらは終了処理です。必ず入れて下さい。
OnTick()をOnTimer()に変更します。
これで価格が動く、動かないにかかわらず30ms毎に動作します。

※OnTimer()はバックテストでは動作しません。

また、複数通貨ペアのEAをOnTick()でバックテストした時に選択した通貨ペア以外は発注されません。通貨ペア毎にバックテストをしてエクセルか何かで合成してください。
















2 件のコメント:

  1. TACA様こんにちは、^^
    マルチ通貨EAの作り方を参考にmqlを書き換えてDAMO口座で稼働させてみました。
    int start(){から OnTick(){ に変更error修正しBackTest実行してBackTestできました。
    DEMO口座貼り付け稼働してみましたが、、、貼り付けた通貨チャートしかエントリーしませんでした。
    その後、
    int OnInit()
    {
    EventSetMillisecondTimer(30);
    return(INIT_SUCCEEDED);
    }

    void OnDeinit(const int reason)
    {
    EventKillTimer();
    }

    void OnTimer(){
    に書き換えました。
    ※OnTimer()はバックテストでは動作しません。
    と書かれていましたが、BackTest実行しました。
    書かれているとおりBackTest出来ませんでした。
    (BackTest出来ないのに大丈夫なのかなぁと思いながらも、、、)
    DEMO口座貼り付け稼働しましたが 一週間全くエントリーなしでした。
    (個別にチャートに貼り付けたEAはエントリーしています)
    あと、このEA_DEMO口座で稼働させてみましたが、、、
    自分が思った程のEAではなかったみたいです。
    色々教えて下さりありがとうございました。m(_ _)m


    返信削除
  2. 自分でもEA作ってみたいと思い前にi Customの本をtacaさんが勧めていたので買ってみたんですが、tacaさんはi Custom関数を使っていませんね!? 使わなくてもカスタムインジケーターを使えるんですかね?

    返信削除