どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 900

 
lufer:
ターミナルウィンドウでEAをロードしても何も起こらないし、削除しようとすると、ターミナルが非常に長い間停止して、しばらくしてから削除 されます。いくつかの要素に手動で値を割り当ててみましたが、すべてOKです。配列の初期化ループの何かが間違っているようです。

解決しない」とはどういう意味ですか?Int配列に倍精度1以下のデータを押し込んでいるので、当然出力には0が含まれます。まあ、ループも不自由だったんですけどね。

このコードで動作するはずです。

#property strict

extern int N=100;                       // Количество баров

double Mas[];                             // Объявление массива
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

int OnInit()
  { 
    ArrayResize(Mas,N);
     return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+

void OnDeinit(const int reason)
  {

  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

void OnTick()
  {                                       
       for(int i=0; i<N; i++)                     // Цикл записи данных
         {                      
    
              Mas[i]=iATR(NULL,0,5,i+1);           // Вычисление значений          
         }
           Print(DoubleToStr(Mas[0],_Digits),"," ,DoubleToStr(Mas[50],_Digits),"," ,DoubleToStr(Mas[99],_Digits));      // Вывод значений
  }
 
evillive:

動かないってどういうこと?int配列に1より小さいdoubleデータを押し込んでいるのだから、当然出力は0になる。しかも、ループがメチャクチャだった。

このようなコードであれば、動作するはずです。

もちろんdouble Mas[]については 全くその通りです(ATPはなぜか整数値でポイントをカウントしていると考えたことがあります)。 要は配列の型を変えても表示されなかったのですが、自分の間違いに 気づかされたわけです。 ありがとうございました。
 
別トピックを作るのもなんなので、こちらで質問させていただきます。OrderSelect関数の ドキュメントには、すべての注文データが「プログラム環境 」にコピーされると記載されています。プログラム環境」とは、現在のチャートのみを指すのか、それとも 端末全体を指すのか?同じEAがインストールされている異なるチャートから複数の注文を同時に行うことに問題があるため質問させていただきました。
 
.roman.:
別トピックを作るのもなんなので、こちらで質問させていただきます。OrderSelect関数のドキュメントには、すべての注文データが「プログラム環境 」にコピーされると記載されています。現在のチャートのみを参照しているのか、それとも 端末全体を参照しているのか?同じEAをインストールした異なるチャートから複数の注文を同時に処理することに問題があるため、この質問をさせていただきました。
これらの注文は、この注文が開かれているターミナルで実行されているすべてのユーザーアプリケーションで利用可能です。
 
evillive:
これらの注文は、注文が開かれているターミナルで実行されているすべてのユーザー・プログラムから利用できます。
では、同時に別のチャートから選択された別の注文のデータが、ソフトウェア環境に誤ってコピーされないようにするには、どうすればよいのでしょうか。
 
.roman.:
その場合、別のチャートから選択された別の注文のデータが、ソフトウェア環境に誤ってコピーされないようにするにはどうしたらよいでしょうか。
異なる注文のデータが重なることは一切なく、守るべきものは何もない。
 
evillive:
異なる注文のデータが重なることは一切なく、守るべきものは何もない。

それじゃあ、話が違うじゃないですか。私はもともと、ドキュメントに書かれている「ソフトウェア環境」とは何かということを言いたかったのです。端末全体ということでしょうか?

具体的には、OrderSelect関数で OrderSymbolとSymbolを排他的に比較するにもかかわらず、1ペアのチャートからデータ(注文開始時間、開始価格など)が表示されることがあるという問題です。つまり、気になるのは、例えばEURUSDに対するEAのOrderSelect機能中に、別の通貨ペアのOrderSelect機能も動作し始め、この機能の最後の呼び出し時の注文データが「プログラム環境」に読み込まれるということはないのでしょうか。

 
.roman.:

それじゃあ、話が違うじゃないですか。私はもともと、ドキュメントに書かれている「ソフトウェア環境」とは何かということを言いたかったのです。端末全体ということでしょうか?

具体的には、OrderSelect関数でOrderSymbolとSymbolを排他的に比較するにもかかわらず、1ペアのチャートからデータ(注文開始時間、開始価格など)が表示されることがあるという問題です。そこで疑問なのですが、例えばEURUSDでOrderSelect関数が動いている間に、EAは別の通貨ペアでもOrderSelect関数で動き出し、この関数の最後の呼び出しの注文データが「プログラム環境」に読み込まれるということはあるのでしょうか?

コードが必要です。エラーがあります
 
.roman.:

それじゃあ、話が違うじゃないですか。私はもともと、ドキュメントに書かれている「ソフトウェア環境」とは何かということを言いたかったのです。端末全体ということでしょうか?

具体的には、OrderSelect関数でOrderSymbolとSymbolを排他的に比較するにもかかわらず、1ペアのチャートからデータ(注文開始時間、開始価格など)が表示されることがあるという問題です。つまり、気になるのは、例えばEURUSDに対するEAのOrderSelect機能中に、別の通貨ペアのOrderSelect機能も動作し始め、この機能の最後の呼び出し時の注文データが「プログラム環境」に読み込まれるということはないのでしょうか。

各オーダーは、他のオーダーと明確に区別されるユニークなパラメーターを持っています。これらは、チケットとオープンした時間(履歴を検索するとクローズした時間)です。網膜の模様と同じように、1つの取引口座の中で唯一無二の存在なのです。

OrderSelect関数で 順番を選択するだけでは不十分で、その順番が正しいか、次の順番を選択しなければならないかを確認する必要があります。

 
Vinin:
コードが必要です。エラーがあります
for(int i=OrdersTotal()-1;i>=0;i--)
        {
            if(OrderSelect(i,SELECT_BY_POS) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic)
               {
                  if(OrderType()==OP_BUY)
                     {
                        double openPrice = 0;
                        openPrice = OrderOpenPrice();
                        if(Ask>openPrice)
                           {
                              Print("OrderSymbol ",OrderSymbol()," OrderTicket ",OrderTicket()," OrderOpenPrice ",OrderOpenPrice());
                           }
                     }
                  if(OrderType()==OP_SELL)
                     {
                        double openPrice = 0;
                        openPrice = OrderOpenPrice();
                        if(Bid<openPrice)
                           {
                              Print("OrderSymbol ",OrderSymbol()," OrderTicket ",OrderTicket()," OrderOpenPrice ",OrderOpenPrice());
                           }
                     }
               }
        }

不要な計算(問題とは無関係)を削除しました。プリンターは、この問題を示すために特別にコードに追加されました。EAが開いているシンボルと注文記号の比較にもかかわらず、それは(osiチャートからこの場合のように、例えば、ユーロでの注文のデータを取る)これを表示することができます。