複数のEAを同時に実行する - ページ 2

 

まず、すべての変数を意味のあるデフォルト値で初期化したことを確認します。例えば、初期化される前のBuyTicketを 使用しているので、初回実行時にはどのような値で あってもかまいません。

MQL4リファレンス・ファイル(MQL4 Reference / Language Basics / Variables / Initialization of Variables)より抜粋しています。

If a variable is not initialized explicitly, the value stored in this variable can be any. Implicit initialization is not used.

そこで、以下の部分で、変数にデフォルトを追加します。

//Global Variables
int BuyTicket;
int SellTicket;
double InternalStopLoss;
double CalcDigits;
double CalcPoint;
bool MABuyFanning;
bool MASellFanning;
int SelectedOrder;
bool Closed;
int ErrorCode;
string ErrLog;
double BuyStopLoss;
double SellStopLoss;
bool NewBar;
double ThisBarOpen;
double SmallMA;
double MediumMA;
double LargeMA; 
 

そして、そう、MQL4にはバグや癖がありますが、リファレンスマニュアルで基本を読むだけで、ほとんどのエラーは避けられるでしょう。

また、MQL4プログラムによくあるバグについての記事もあります。フォーラムのトップページをチェック すれば、リンクがあります。

 
drazen64:

まず、すべての変数を意味のあるデフォルト値で初期化したことを確認します。例えば、初期化される前のBuyTicketを 使用しているので、初回実行時にはどのような値で あってもかまいません。

MQL4リファレンス・ファイル(MQL4 Reference / Language Basics / Variables / Initialization of Variables)より抜粋しています。

そこで、以下の部分で、変数にデフォルトを追加します。



その通りなのですが、使い方によります。値がどこから取得されるかがわかっているので、単に宣言したいだけの場合もあれば、特定のデフォルト値で初期化しないと正しく動作しない可能性があるので、何かで初期化する必要がある場合もあります。
 
deysmacro:

それはそうなのですが、しかし、使い方次第です。値がどこから取得されるかがわかっているので、ただ宣言したいだけの場合もありますし、特定のデフォルト値で初期化しないと正しく動作しない可能性があるので、何かで初期化する必要がある場合もあります。


しかし、変数を使う前に何らかの値で初期化することは必要です。

初期化しないまま使うと、値が予測できなくなる。エラーも同様だ。もっと深くコードを解析 する前に、この問題を解決しておく必要がある。

最近のコンパイラーは、初期化されていない変数を使おうとすると、エラーを発生させます。MQL4は残念ながらそうではないので、コーダーはすべてが適切に初期化されていることを確認する必要があります。

 
適切な初期化をせずにvarを使用していることを1つ指摘 するとよいでしょう。
 
deysmacro:
適切な初期化をせずにvarを使用していることを1つだけ指摘 することができます。


https://www.mql5.com/en/forum/151167/page2#954612 の1行目の2文目を読んでみてください。

批判する前に答えを読めば いいのに。

ところで、あなたはここでどのような手助けをしているのですか? 「賢い」発言はあまり助けになりません。

 
for(Counter = 0; Counter <=OrdersTotal()-1; Counter++)
               {
               SelectedOrder = OrderSelect(Counter,SELECT_BY_POS);
               if(OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() && OrderType() == OP_BUY)
                  {
                 // while(IsTradeContextBusy()) Sleep(10);
                  Closed = OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),Slippage,Red);
                  if(Closed == true) BuyTicket = 0;
                  else Alert("Symbol: ",Symbol()," Ticket: ",BuyTicket," unable to close buy order(s): buy ma convergence close routine");                  
                  }
            Counter--;               
                }
 

自分のを投稿する前に読みましたよ。つまり、varに関連するものを一つ見せて、そのvarがきちんと初期化されていないことを教えてあげてください。


へへへ。GumRaiはそれを打ちます。XD

 

私が正しく理解すれば、プログラム起動時にBuyTicketやその他の変数に未知の値が含まれているために起こりうることを私が正確に指摘しなかったからといって、彼が初期化されていない変数を使っていることを心配する必要はない、ということですか?

まあ、それはそれとして。初期化されていない変数を使わせてあげればいいのです。何が間違っているのでしょうか?

 
提案されたようにすべての変数を初期化し、ブール変数から"==true "を削除 しました。また、コード行の中のバンクスペースをすべて削除しました。ラップトップとPCの2つのシンボルでデバッガーを使って約2時間テストしましたが、両方とも問題なく動作し、正しい時刻に売り、買い、終了し、全くエラーはありませんでした。しかしその後、PCとラップトップの両方で他の3つのシンボルにEAを追加し、4つすべてが両方の端末で動作するようにしたところ、それ以降、すべてのエントリーとエグジットをミスするようになったのです。テストの最後に、一方の端末ではオープンポジションを閉じる前にEAを削除し、もう一方の端末ではオープンポジションを閉じた後にEAを削除しました。オープンポジションが残っている端末では、EAを削除するのに非常に時間がかかりましたが、オープンポジションがない端末では、4つのEAをすべてすぐに削除することができました。修正したコードを以下に別途掲載します。