MQL5による株式発振器とは - ページ 4

 
joo:

EAのグローバルレベルで2つの配列 Equity[]とTime[] を宣言します。

EAをテストする際に、株式と時間の値を適切な配列に書き込んでください。

テスト終了時にファイルを読み込み、必要なチャートにエクイティをプロットするスクリプトを使用します。

これはあなたの目的に最適な方法であり、なぜインジケータが必要なのか理解できません。

えー、自分がすでにやっていることのどこが難しいのか、はっきり正確に理解できれば、もっと楽なんですけどね...。

( OnCalculatedで変化する値は既にあるので、他に何が必要なのか?)

グローバル変数については、すでに考えていますが、定義上。

datetime  GlobalVariableSet(
   string  name,      // имя
   double  value      // устанавлимое значение
   );

また、配列の書き方や、少なくともValueへの参照を書いて、後で取り出せるようにするには...。質問です。

オブジェクトについては、2つのものを組み合わせたいと思っています。

1.結果に応じて表示される案件のライン(赤:すべて不採算、青:すべて採算)。

2.そして、Indicatorでは、一番下にある初期預金からのリターンのグラフを構築する。

そうでなければ、小さなスケールでオブジェクトを使用する場合、取引の円でさえ、価格のダイナミクスを見ることを防ぎます(ちなみに、私はそれを取り除きたいのですが、再び、私は方法がわかりません)。

私は、大きな時間枠でのExpert Advisorのテストについて話しています。私が現在理解しているように、まさにこの曲線の組み合わせは、各トレードの開始方向と移動方向の従来の比較の必要なしに、歴史上の負けと利益のトレードの分布の最も完全なアイデアを与えるでしょう。

 

sergey1294:
Даже не знаю как вам объяснить. AccountInfoDouble(ACCOUNT_EQUITY) хранит последнее значение эквити. После тестирования как сказал Ренат индикатор инициилизируется заново и пересчитывается. По этому данные эквити накопленные в буфере индикатора за время прогона стираются.

そして、これは-消去について-すでに「ホット」なのです。

しかし、OnCalculatedの これらの値を、別の外部で「消去不可能な」Indicator配列に書き込んで、ファイルの書き込みと読み込みという面倒でリソース集約的な手順なしに復元することを防ぐにはどうしたらよいでしょうか。

それとも、もうシステムレベルの問題(アレイの強制自動アンロードの、どうにもならない)なのでしょうか?

このようなリソース(メモリ上の変数の作成と削除)は、手動でも管理できると書いてありましたが......。

 
DV2010:

えー、すでにやってしまったことのどこが難しいのか、はっきり正確に理解できれば、救済もしやすいのですが......。

( OnCalculatedで変化する値は既にあるので、他に何が必要なのか?)

グローバル変数については、すでに考えていますが、定義上。

また、配列の書き方や、少なくともValueへの参照を書いて、後で取り出せるようにするには...。質問です。

オブジェクトについては、2つのものを組み合わせたいと思っています。

1.結果に応じて表示される案件のライン(赤:すべて不採算、青:すべて採算)。

2.そして、Indicatorでは、一番下にある初期預金からのリターンのグラフを構築する。

そうでなければ、小さなスケールでオブジェクトを使用する場合、取引の円でさえ、価格のダイナミクスを見ることを防ぎます(ちなみに、私はそれを取り除きたいのですが、再び、私は方法がわかりません)。

私の場合、大きな時間枠でExpert Advisorをテストすることについて話しています。私が現在理解しているように、まさにこの曲線の組み合わせは、各トレードの開始方向と移動方向を比較する従来の必要なしに、歴史上の負けトレードと利益トレードの分布の最も完全な画像を与えるでしょう。

ターミナルのグローバル変数ではなく、プログラムのグローバル変数という意味です。

1分足チャートでもオブジェクトを描画することができ、最大限の精度(頻度)を実現します。そして、チャートからオブジェクトを読み取った後、インジケータで線を引くことができます(信じられないほど強い欲求がある場合)、あなたは、任意の初期預金の株式を表示できるように、 インジケータの設定に補正係数を入力することもできます。

ここでも、すべての線と図がスクリプトによって構築されることも可能です。

 
joo:

ターミナル変数ではなくグローバル プログラム変数のことです。

1分足チャートでもオブジェクトをプロットでき、精度(頻度)を最大限に高めることができます。また、インジケーターの設定に補正係数を入力することで、初回入金時のエクイティを確認することもできます。

プログラムのグローバル変数についてですが、私の理解では、IndicatorのコードとExpert Advisorのコードにグローバル変数が存在する可能性があります。

これらの変数の1つはIndicatorの値の配列で、テスト後に何らかの理由(おそらくシステム的なもの)で消去されます。

しかし、それなら、Equtyの履歴を表示するための値を、グローバル変数やオブジェクトから、あるいはファイルから、OnCalculated Indicatorで取る必要があるということで、正しく理解できますでしょうか。

 
DV2010:

しかし、それならOnCalculated Indicatorの中だけでグローバル変数やオブジェクト、ファイルからEquty履歴を表示するための値を取得する必要があるというのは正しい理解でしょうか?

その通りです。
 
joo:
その通りです。

この場合、プログラムのグローバル 変数を使ってもよいのでしょうか?

なぜなら、Expert Advisorのグローバル変数は、インジケータでは表示されず、その後、インジケータのグローバル変数を使用する必要があり、インジケータ値の配列と異なり、Expert AdvisorモードのOnCalculatedの作業後に「消えない」はずですが。

そしてもう一つ、できれば現在のチャートのオブジェクトについての質問です。それに属するオブジェクトのリストを抽出する方法を探したのですが、やはり難しいです。プログラム的に行う方法を提案していただけませんか?

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
DV2010:

あと、できれば今のタイムテーブルの中のオブジェクトについての質問も。それに属するオブジェクトのリストを抽出する方法を探したのですが、やはり難しいです。プログラム的にどうすればいいか教えてください。

ObjectsTotal 関数を使って、チャート上のオブジェクトの数を取得します。

int  ObjectsTotal(
   long  chart_id,     // идентификатор графика
   int   nwin=-1,      // индекс окна
   int   type=-1       // тип объекта     
   );
ChartIDで チャートIDを取得する
 

大雑把に言うと、こんな感じです。

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2010, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
input int TradeHistoy=10000;

//Глобальные пременные
double   Equity[];
datetime EquityTime[];
int      cnt;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArrayResize(Equity,TradeHistoy);ArrayInitialize(Equity,0.0);
   ArrayResize(EquityTime,TradeHistoy);ArrayInitialize(Equity,1);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

//Записать накопленные данные в файл
   D_ArrayToCsv("DATA",Equity,TradeHistoy,";");
   D_ArrayToCsv("TIME",Equity,TradeHistoy,";");

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

//В нужном месте эксперта проверить значение эквити
//записать эквити и время замера 
   if(cnt<TradeHistoy)
     {
      Equity[cnt]=AccountInfoDouble(ACCOUNT_EQUITY);
      EquityTime[cnt]=TimeTradeServer();
     }

  }
//+------------------------------------------------------------------+

void D_ArrayToCsv(string filename,double &mass[],int line,string Separator)
  {
// запись массива в файл
   string str;
   int handle=FileOpen(filename,FILE_CSV|FILE_WRITE,Separator);
//Цикл записи строчек в файл
   for(int l=0;l<line;l++)
     {
      str=DoubleToString(mass[l],8);
      FileWrite(handle,str);
     }
   FileClose(handle);
  }
//+------------------------------------------------------------------+
そして、作成したファイルを好きなように加工することができます。
 

Roshさん、オブジェクトについてのヒントありがとうございます!これで私の課題のこの部分を処理できそうです。

...しかし、私が今マスターしようとしたファイル操作では、もう少し複雑です(実は恐れていたのです!)。

:)

一度にいくつもの驚きを。

1.ループ内で書き込み可能なファイルが、何らかの理由で複数の値ではなく、1つの値しか書き込まない。

2.FileWriteArray操作では、ポインタの取得と 渡された配列が空でないかのチェックは正常に行われますが

は、書き込まれた項目の数が-1 になる。

3.ドキュメントによると、テスト中のオープニング操作はMQL5testerfilesフォルダで行われ、メイン操作の間は、MQL5testerfilesフォルダで行われます。MQL5/filesを使用しているため、テストフェーズで記録されたデータを、本作業中にIndicatorがどのように受け取れるかという疑問がすぐに生じました(フォルダへのパスも単純ではなく、時間の経過とともに変化する可能性があります - \testerAgent-127.JP)。0.0.1-3000MQL5Files )

 
DV2010:


3.ドキュメントによると、テスト段階ではMQL5testerfilesフォルダでオープニング操作を行い、本稼働段階では、MQL5testerfilesフォルダでオープニング操作を行うようです。MQL5/filesを使用しているため、テストフェーズで記録されたデータを、本作業中にIndicatorがどのように受け取れるかという疑問が生じました(フォルダへのパスも単純ではなく、時間の経過とともに変化する可能性があります - \testerAgent-127.JP)。0.0.1-3000MQL5Files )

手作業で転送する必要があります。

以下は、ファイルから読み取るコードです。

void CsvTo1D_Array(string nameFile,double &array[],int line,string Separator)
{
        int end=0;
        int handle=FileOpen(nameFile,FILE_CSV|FILE_READ,Separator);

        if (handle!=1)
        {
                Alert("Файл ",nameFile," не найден!");
        }
        else
        {
                for (int l=0;l<line;l++)
                {
                        array[l]=StringToDouble(FileReadString(handle));
                }
                FileClose(handle);
        }
}
//+------------------------------------------------------------------+