2018.06.03 Sunday

スポンサーサイト

0

    一定期間更新がないため広告を表示しています

    2018.06.03 Sunday

    自動売買EA(MT4)でテクニカル入門-インジケータとEA

    0

      JUGEMテーマ:FXツール情報

       

      次はローソク足のパターンでトレードをするようなEAに挑戦しようと思っていますが、テーマが重くて手が出ていません。ローソク足パターンのデータの持ち方、パターン比較方法が全く思いつかないw

      いっそのこと、ディープラーニングで学習させようかと・・・どっちみち時間がかかりそう。┐( ̄~ ̄)┌

      今は運用関連を調べることでお茶を濁しています。σ( ̄、 ̄=)

       

      さて、MT4のインジケータとEAの情報の持ち方の違いについてです。

      「インジケータとEAって別個に作らなくても流用できるよね?」と考えて調べましたが意外と素直にできたので、DLLのデバッグするのに重宝しました。

       

      インジケータは現在位置がループ中の一点になります。

      例えば、一目均衡表やスパンモデルを描画しようと思うと、転換線、基準線、雲の数値を計算しますが、その現在位置はループの変数"i"になります。

       

          int limit = Bars-IndicatorCounted();
          int    i;

          for (i=limit-1; i >= 0; i--)
          {

          //転換線の値の計算
              Change[i] = (high[iHighest(NULL, 0, MODE_HIGH, 9, i)] + low[iLowest(NULL, 0, MODE_LOW, 9, i)]) / 2;

          //基準線の値の計算
              Standard[i] = (high[iHighest(NULL, 0, MODE_HIGH, 26, i)] + low[iLowest(NULL, 0, MODE_LOW, 26, i)]) / 2;

          //雲の値の計算
              Span_A_L[i] = (Change[i] + Standard[i]) / 2;
              Span_B_L[i] = (high[iHighest(NULL, 0, MODE_HIGH, 52, i)] + low[iLowest(NULL, 0, MODE_LOW, 52, i)]) / 2;

              Span_A_H[i] = (Change[i] + Standard[i]) / 2;
              Span_B_H[i] = (high[iHighest(NULL, 0, MODE_HIGH, 52, i)] + low[iLowest(NULL, 0, MODE_LOW, 52, i)]) / 2;

       

      こんな感じですね。

       

      これがEAになると、ループがありません。

      EAでは現在位置が"0"で、過去に遡るときはプラス方向のインデックス(これはインジケータも同じですね)になります。

       

      //転換線の値の計算
          double    change = (High[iHighest(NULL, 0, MODE_HIGH, 9, 0)] + Low[iLowest(NULL, 0, MODE_LOW, 9, 0)]) / 2;
      //基準線の値の計算
          double    standard = (High[iHighest(NULL, 0, MODE_HIGH, 26, 0)] + Low[iLowest(NULL, 0, MODE_LOW, 26, 0)]) / 2;
      //雲の値の計算
          double    spanB = (High[iHighest(NULL, 0, MODE_HIGH, 52, 0)] + Low[iLowest(NULL, 0, MODE_LOW, 52, 0)]) / 2;

       

      (ヒストグラムを描画するわけではないので他の数値は省略しています)

       

      入力データで大きく違うのは、インジケータはループする+現在位置はその時々(インデックス)の位置になり、EAでは「0」が現在位置になるということです。

       

      そして出力側で違うのは、インジケータは数値を描画用バッファに入れることが目的になり、EAではオーダーすることが目的になります。

       

      EAのオーダーは特殊なことはしないので省略します。

      インジケータにオーダー印を描画する方法ですが、描画用バッファのスタイル定義は、DRAW_ARROW とします。

       

      初期化時

      //--- BUY
           SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID, 4);
           SetIndexArrow(0, 233);
           SetIndexBuffer(0, ExtBuySbuffer);
           SetIndexLabel(0, "Buy marker");

      //--- SELL
           SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID, 4);
           SetIndexArrow(1, 234);
           SetIndexBuffer(1, ExtSellSbuffer);
           SetIndexLabel(1, "Sell marker");

       

      計算時

          int limit = Bars-IndicatorCounted();
          int    i;

          for (i=limit-1; i >= 0; i--)
          {
              //バッファ初期化
              ExtBuySbuffer[i] = EMPTY_VALUE;
              ExtSellSbuffer[i] = EMPTY_VALUE;

       

            :

        売買判断関数の呼び出し

            :

              if (sell == true)
              {
                  ExtSellSbuffer[i] = close[i];
              }
              if (buy == true)

              {
                  ExtBuySbuffer[i] = close[i];
              }

       

      そして計算時にオーダーをするときにはClose価格を入れておけば、そこに売買矢印が表示されます。

       

      これでEA作る際には、まずインジケータを作成し、ある程度オーダーが目的の位置に表示されるようになったら、EAに移植するという方法でEA開発ができるようになります。

       

      iCustomを使用するのは非常に便利なのですが、バックテストでオーダーしてくれないことが多いので、そういう場合の回避策にはなると思います。

      フォワードなら時間間隔があるので、iCustomでも大丈夫なのかもしれませんねー

       

       


      FX初心者ランキング

       

       

      Calendar
            1
      2345678
      9101112131415
      16171819202122
      23242526272829
      30      
      << September 2018 >>
      PR
      OANDA
      OANDA Japan
      ConoHa
      お名前.com
      外為オンライン
      外国為替証拠金取引の外為オンライン口座開設申込
      XM
      Selected Entries
      Categories
      Archives
      Recent Comment
      Recommend
      Links
      Profile
      Search this site.
      Others
      Mobile
      qrcode
      Powered by
      30days Album
      無料ブログ作成サービス JUGEM