初心者の方からの質問 MQL4 MT4 MetaTrader 4 - ページ 121

 
Ihor Herasko:

少なくとも1つのブロックを書き、それを見せる。次のステップは、ここで提案することです。

配列について:ここでは、グローバルレベルで4つの配列を宣言しています。

// массивы, в которых будут храниться характеристики ордеров:
int _OrderTicket[],_OrderType[];
double _OrderOpenPrice[];
datetime _OrderOpenTime[];

そして、ポジションオープン 機能でゼロにしたのです。

   // обнуляем массивы
   ArrayInitialize(_OrderTicket,0);
   ArrayInitialize(_OrderType,0);
   ArrayInitialize(_OrderOpenPrice,0);
   ArrayInitialize(_OrderOpenTime,0);

今、どうやって埋めればいいのか?私がやろうとしている例では、追加の変数が適用されていますが、その使い方がよくわかりません。

// переменная, которая будет хранить количество ордеров, 
// принадлежащих эксперту:
int _ExpertOrdersTotal=0;

チケット、ポジションタイプ、オープンプライス、オープンタイムの値を対応する関数で取得できるのに、なぜこのような配列が必要なのかはよく分かりませんが。

 
novichok2018:

配列について:ここでは、グローバルレベルで4つの配列を宣言しています。

その後、ポジションオープン 機能でゼロにしました。

今、どうやって埋めればいいのか?私が使おうとしている例では、追加の変数を適用していますが、その使い方がよくわかりません。

チケット、ポジションタイプ、オープンプライス、オープンタイムの値は対応する関数で取得できるのに、なぜこのような配列ばかりなのか、よくわかりません。

一から書き直し、すべての中間データをAlert(.NET)で出力してみてください。例えば

int ord=OrdersTotal();
if ! ord )
{
   Alert("Ордера отсутствуют. Выход");
   return;
} else   Alert("Всего ордеров = ", ord);

// Посмотрев, что получилось, добавляете:
int n;
int Ords[10];
for(n=0; n<ord && n<10; n++)
{
   OrderSelect(...
}

そして、誰かのお手本があれば、それを完全に鵜呑みにして研究することです。この例の作者が何のために配列を使っているのか、誰にもわかりません。

 
novichok2018:

配列について:ここでは、グローバルレベルで4つの配列を宣言しています。

構造体の配列を使用する。よりアクセスしやすくなります。ここでは、静的配列を用いたバリエーションを紹介します。より分かりやすくなりました。でも、私自身はダイナミックアレイを使っています。でも、それに伴ってコードも少し大きくなります。

#define MAX_ORDERS_CNT   int(500)
struct OrderInfo
{
   int      nTicket;
   int      nType;
   double   fOpenPrice;
   double   fSL;
   double   fTP;
   datetime dtOpenTime;
};

OrderInfo  arrstOrderInfo[MAX_ORDERS_CNT];

そして、ポジションオープンの 機能でゼロにしたのです。

いいえ、そうではありません。動的配列は、デフォルトでサイズがゼロの配列が宣言されているからです。つまり、この場合、この4行のコードは何もしないのです。

さて、どのように記入するのでしょうか?私が使おうとしている例では、追加の変数がありますが、その使い方がよくわかりません。

次に、注文のループを構成し、その中で各「自分の」注文を配列に格納する。

g_nOrderCnt = 0;
for (int i = OrdersTotal() - 1; i >= 0; --i)
{
   if (!OrderSelect(i, SELECT_BY_POS))
      continue;

   if (OrderSymbol() != Symbol())   // Если нужны ордера только по текущему символу, к графику которого прикреплен советник
      continue;

   if (OrderMagicNumber != i_nMagicNumber)  // Если имеется входной параметр советника i_nMagicNumber, в котором указан ID ордеров советника
      continue;

   if (g_nOrderCnt < MAX_ORDERS_CNT)
      continue;

   g_arrstOrderInfo[g_nOrdersCnt].nTicket = OrderTicket();
   g_arrstOrderInfo[g_nOrdersCnt].nType = OrderType();
   g_arrstOrderInfo[g_nOrdersCnt].fOpenPrice = OrderOpenPrice();
   g_arrstOrderInfo[g_nOrdersCnt].fSL = OrderStopLoss();
   g_arrstOrderInfo[g_nOrdersCnt].fTP = OrderTakeProfit();

   ++g_nOrdersCnt;
}

しかし、チケット、ポジションタイプ、オープンプライス、オープンタイムの値は対応する関数で取得できるのに、これらの配列は何のためにあるのかよくわかりません。

一般的に、口座に存在するすべての注文がこの特定のEAによって処理される必要がないため、配列で作業する方がはるかに高速で便利です。そして、結果的に多くの労力と費用を節約することができるのです。

なお、先に述べたのは一般的なケースです。もちろん、ユニバーサリズムが常に必要なわけではありません。通常、このような配列はストラテジーの要求に基づいて作成される。例えば、注文を種類別に一度に分けることができます。Buy、Sell、BuyStop、SellStop、BuyLimit、SellLimit。そうすると、このような配列が4つ必要になります。しかし、そうすれば、取引を決定する際に、未決済注文のリストをもう一度確認する必要がなくなります。ある種類のオーダーの数だけを知り、必要な配列を参照すればよいのです。

もう一つ重要なことがあります。それは、1ティックの処理中にオーダーの配列を変更することです。OnTickの入力時にある注文リストを受け取り、その途中のどこかで別の注文リストを受け取ったということはよくあることです。この場合、プログラムの動作にエラーが発生し、キャッチすることが困難になります。そして、OnTickを入力するときにすでに形成されていた注文の配列は変更されません(もちろん、プログラムの実行中に自分で変更しない限り)。

 
STARIJ:

string s=FileReadString(F1); // テキストファイルの文字列を読み込む
StringSplit(s, "," , a); // カンマで区切られた文字列要素を配列に格納します.
datetime T1=StrToTime(a[4]); // さらに,変換 ...
int ord=StrToInteger(a[8])とする。
double Price=StrToDouble(a[12])とする。

ありがとうございます、ちょうど欲しかったものです。



次に、作られた5つの製品です。

アラート読み取りを投入します(任意)

例えば、レベル "200 "の場合

アラートが鳴ると、何かがポーズを開き、何かが自分自身を削除し、何かが他のことをする。このようにシグナルを出す仕組みを実装したいのですが


追伸

やりたいことができたので、審査に出すことができる。完璧に脱皮する。しかし、ここに投稿することは禁じられています。

 
Ihor Herasko:

例えば、注文を種類別に一度に分けることが可能です。Buy、Sell、BuyStop、SellStop、BuyLimit、SellLimit。そうすると、このような配列が4つ必要になります。しかし、そうすれば、取引を決定する際に、未決済注文のリストをもう一度確認する必要がなくなります。ある種類のオーダーの数だけを知り、必要な配列を参照すればよいのです。

それこそ、Buy and Sellの ためだけというか、必要なものです。私のシンプルなストラテジーでは、オープンポジション同士が干渉しあってクローズ条件が見えないようにすることがポイントです。もしかしたら、アレイがなくても大丈夫かも?どうやって作るのか、どうやって対処するのか、私には理解できないのです。スクリーンショットを見れば、私の状況がよくわかるかもしれませんね。

コードのすべてがシンプルで明確に動作しているように見えますが、このケースだけは理解不能です。

 
novichok2018:

これはまさに私が必要としているもの、いやむしろBuy and Sellにのみ 必要なものだ。私のシンプルな戦略にとって、最も重要なことは、オープンポジションが互いのクローズ条件に干渉しないことです。配列がなくても大丈夫かも?どうやって作るのか、どうやって対処するのか、私には理解できないのです。スクリーンショットを見れば、私の状況がよくわかるかもしれませんね。

コードのすべてがシンプルで明確に動作しているように見えますが、このケースだけは理解不能です。

もちろん、最も単純な(そして中程度の複雑さの)ものでは、配列がない方が便利です。また、何百ものオーダーを使うようになると、オーダーを見分けるのがとても楽になります。例えば、OrderType()に従って、1つは0を買い、もう1つは1を売るとします。あなたのトレーダーの戦略は良い - あなたは1日得ることができるか、半日を失う。あとは、この矢をどう受け止めるかだ。しかも、頻度が高すぎる。まずシグナルの出し方を学ぶのは意味がある:買い、売り
 
LRA:
もちろん、最も単純な(そして中程度の複雑さの)場合、配列がない方が便利です。しかし、何百ものオーダーを使いこなすとなると......。

ログに 2018.01.25 20:22:12 2018_WPR14_AMarkets EURUSD,M5: OrderClose error 138 としっかり繰り返されるのは、私の状況のせいでしょうか。

2018.01.26 16:38:12 2018_WPR14_AMarkets EURUSD,M5: Alert: Total orders = 3 ?スクリーンショットでは、この期間が売りの2つの終値条件を捉えていることがわかります。

そして、ポジションを建てる ためのシグナルは、複数の指標の組み合わせによって引き起こされ、1つの指標によって閉じられる。そして、彼らはそれほど頻繁に動作しません:それは5分の間に数日間沈黙している場合があります。例えば、今年の2月1日以降に発動したポジションは14件のみです。


 
novichok2018:

ログに 2018.01.25 20:22:12 2018_WPR14_AMarkets EURUSD,M5: OrderClose error 138 としっかり繰り返されるのは、私の状況のせいでしょうか。

2018.01.26 16:38:12 2018_WPR14_AMarkets EURUSD,M5: Alert: Total orders = 3 ?スクリーンショットでは、この期間が2つのクローズ条件を捉えていることがわかります。

どのような状況ですか?端末がログを作成し、それがエラーの原因になっているということでしょうか?そして、138は何を意味するのでしょうか?どうやって実現したかというと、非常に稀なエラーです。 スクリーンショットに写っているのは、半分くらいです。Expert Advisor にどのように説明すればよいのでしょうか? 数学的な条件を記述する必要があります - スクリーンショットを見る代わりに、Expert Advisor は数値で操作します。

 
LRA:

端末がログを作成することで、エラーが発生するということですか? ...138とはどういう意味か、どこを見ればいいかわかる?

いや、この履歴の間隔でテスターが失敗するから、信号が正しく動作しないのだと言っているのです。リクオートは 24時間続けられないから。

 
novichok2018:

いや、私が言いたいのは、この時点のテスターには不具合があり、信号が正常に動作しないということなのです。リクオートは24時間続けられないから。

テスターでレコチョク? それは初耳です。テスターは理想的なもので、スリップもありません

...何かが指標を蹴っている - トレンドが上昇している買います ...了解...TPを上げたいほどではないのですが、すでに動いていますし......。

そこで、もしそうなったら終了し、次のティックで続行するようなEAを設定します。そして、デモで試してみてください