記事"かずかずのインスツルメントで取引を行うExpert Advisorの作成"についてのディスカッション - ページ 4

 
Interesting:

私の理解が正しければ、バッファは1つで十分です(正しく計算され、グラフに描画される必要があります)。

追記

インデューサーは "右"(現在)ではなく、"左"(歴史の最初)のデータを表示するような気がするのですが・・・。

あるいは、このインジケータのロジックをまったく理解していないのかもしれません。


例えばEURUSDをEURUSDに、EURJPYをEURJPYに出力すれば、すべてうまくいきます。

つまり、出力方向は正しいようです。

私はここで多くのバリエーションを試しました:

handle1=iMA(InstrumentName,PERIOD_CURRENT,ex_Period_MA_1,0,MODE_SMA, PRICE_CLOSE);

...

copied=CopyBuffer(handle1,0,0,0,Counted_bars,Buf_0);

それでも何も出てこない。

どなたか、1つの画面に2つの異なるツールを表示する例を、少なくとも何らかの方法でお持ちではないでしょうか?

 
gisip:

なぜ別の計器のチャートを正常に表示できないのでしょうか?

MQL4ではすべてうまくいったのですが、ここでは同じインストゥルメントに表示した場合のみうまくいき、その後はエラーは出ません。


トリミングした形では動作します。チェックとエコノミクスを追加してください。

#property indicator_separate_window    // インジケータは別のウィンドウに描画されます。
#property indicator_buffers 1

#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Aqua

input string InstrumentName="EURJPY";

//-- インジケータの配列
double ScreenBuffer[];

//-- ダイナミック・バッファ
double ArrayBuffer[];
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int OnInit() // 特別な init() 関数
  {
//--------------------------------------------------------------------

   IndicatorSetString(INDICATOR_SHORTNAME,InstrumentName);
   SetIndexBuffer(0,ScreenBuffer,INDICATOR_DATA);
   ArraySetAsSeries(ArrayBuffer,true);
   ArraySetAsSeries(ScreenBuffer,true);
   return 0;                          // 終了
  }
//--------------------------------------------------------------------
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int Counted_bars;   // 操作するバーの数 
   int copied;

//--------------------------------------------------------------------
   copied=(int)SeriesInfoInteger(InstrumentName,0,SERIES_BARS_COUNT);
   copied=CopyClose(InstrumentName,PERIOD_M1,0,copied,ArrayBuffer);//-- メモリ・バッファにデータを書き込む

   for(int i=0; i<copied; i++)
     {
      ScreenBuffer[i]=ArrayBuffer[i];
     }

//--------------------------------------------------------------------
   return(rates_total);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,0,-1);             // チャートのすべてのオブジェクトが削除される。
  }
 
gisip:

例えばEURUSDをEURUSDに、EURJPYをEURJPYに出力すると、すべてうまくいきます。

つまり、出力方向はある意味正しい。

私はここで多くのバリエーションを試しました:

handle1=iMA(InstrumentName,PERIOD_CURRENT,ex_Period_MA_1,0,MODE_SMA, PRICE_CLOSE);

...

copied=CopyBuffer(handle1,0,0,0,Counted_bars,Buf_0);

それでも何も出てこない。

どなたか、1つの画面に2つの異なるツールを表示する例を、少なくとも何らかの方法でお持ちではないでしょうか?

MQL4のソースコードはありますか?


私はすでに代替案を提案しましたが、それは現在のインストゥルメント用のインデックスを作り、それを100%デバッグすることです。その後、Expert Advisorや他の指標で必要なパラメータを使って簡単に呼び出すことができます。

このような実装では、計算機に渡されるパラメータが他のインストゥルメントでは正しくない(バーの数などが 一致しない)ため、インディクターの基本的なロジックを変更する必要があります。

そして大体において、このコンセプトはあまり「正しくない」のです(控えめに言って)。


追記

要するに、ここには2つの選択肢がある:

1.現在のTFとインストゥルメントに対してすべてを実現し、その操作性をチェックする。 その後、iCustom()を使用する;

2.インデューサのロジックを、計算機でパラメータで指定された計器のすべてのデータを絶対に受信するように書き換える(コストがかかり、あまり正しくない方法)。

Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Доступ к таймсериям и индикаторам / Bars - Документация по MQL5
 
gisip:
変更したが、まだ機能せず、チャートが正しくない。

インジケータで次の操作を行ってください。

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int OnInit() // 特別な init() 関数
  {
//--------------------------------------------------------------------

   IndicatorSetString(INDICATOR_SHORTNAME,InstrumentName);
   SetIndexBuffer(0,ScreenBuffer,INDICATOR_DATA);
   ArraySetAsSeries(ScreenBuffer,true);
   
   return 0;                          // 終了
  }

配列と時系列におけるインデックスの方向」をお読みください。

 
DC2008:

切り取られたフォームが機能。チェックとエコノミーを追加する。

この2つは実際には必要ない。

//1

//-- ダイナミック・バッファ
double ArrayBuffer[];
...............
ArraySetAsSeries(ArrayBuffer,true);

//2

   for(int i=0; i<copied; i++)
     {
      ScreenBuffer[i]=ArrayBuffer[i];
     }
 
Interesting:

その2つは必要ないものだ。

実はそうなんだ。
 

うん、うまくいったと思う!

本当にありがとう!

もっとテストしてみます。

 

取引を視覚化する必要があるExpert Advisorは多通貨に対応しています。EURUSDでハングアップし、他の通貨ペアで取引を開くとします。結果に違いがあり、それは私のせいだと理解していますが、確認することができません(Expert AdvisorがEURUSDに掛かっていると、AUDUSDの取引でチャートを開く ことができません)。

Expert AdvisorがAUDUSDに掛かっているときは、開いてみるとプログラム通りに動いているのですが、EURUSDに掛かっているときは結果が違っていて、その理由がわかりません。トレードの視覚化はとても役に立ちます。

Документация по MQL5: Операции с графиками / ChartOpen
Документация по MQL5: Операции с графиками / ChartOpen
  • www.mql5.com
Операции с графиками / ChartOpen - Документация по MQL5
 

7.Exp_TEMA.mq5をテストすると、Told[] Tnew[1]式に次の値が表示されます。
Told[] 式を評価できませんでした。
Tnew[1] 無効な配列範囲です。
これらの値は何を意味し、Expert Advisorの作業結果にどのように影響するのでしょうか?

8.テスト中にExp_TEMA.mq5がバー内で取引を開始するのはなぜですか?

9.ポジションをクローズして反対方向にポジションを建てる代わりに、フリップ、つまり2倍のボリュームで反対方向にポジションを建てることは、コードの削減、取引実行時間の短縮、スリッページの削減、コスト(手数料など)の削減につながりますか?

バー内での取引。

 
ias:

7.Exp_TEMA.mq5をテストすると、Told[] Tnew[1]式が次の値を取得します。
Told[] 式を評価できませんでした。
Tnew[1] 無効な配列範囲です。
これらの値は何を意味し、Expert Advisorの動作にどのように影響しますか?

Tnew[1]無効な配列 範囲については、範囲のオーバーランと思われます。配列の項目 番号は 0 から始まることを忘れないでください!