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

 

ディパック 、 いつもありがとうございます。あなたの例を分析しました。スタートアップのコードを少し変更しました。その結果、こうなりました。

void OnStart()
  {
int awd1[];
ArrayResize(awd1,6,7);
   for(int i=0;i<=5;i++)
   {
   awd1[i]=i+10;
   Print("awd1[", i, "]=", awd1[i]);
   }
   Alert("awd1[0]=", awd1[0], ", awd1[1]=", awd1[1], ", awd1[2]=", awd1[2], 
   ", awd1[3]=", awd1[3], ", awd1[4]=", awd1[4], ", awd1[5]=", awd1[5]);
  }

変更された点

1.int awd1[];の配列を含む行をOnStart()関数内に移動しました。

2.ArrayResize(awd1,6,7)関数を 追加しました。

3.スクリプトが動作します。

いくつかの結論を出してみる。スクリプトでは、OnStart()関数の内部で配列を宣言するのが正しい。配列が宣言された後、ArrayResize()関数を使ってそのサイズを必ず定義しなければなりません。そうしないと、コンパイラは嘆きます。私の結論は正しいのでしょうか?そうでない場合は、正しい解釈を教えてください。

 
silachara:

ディパック 、 いつもありがとうございます。あなたの例を分析しました。スタートアップのコードを少し変更しました。その結果、こうなりました。

変更された点

1.OnStart()関数内のint awd1[];配列宣言を含む行を移動。

2.ArrayResize(awd1,6,7)関数を追加しました。

3.スクリプトが動作します。

結論を出してみる。スクリプトでは、OnStart()関数の内部で配列を宣言するのが正しい。配列が宣言された後、ArrayResize()関数を使って必ずサイズを定義しなければなりません。そうしないと、コンパイラはエラーを発生します。私の結論は正しいのでしょうか?そうでない場合は、正しい解釈を教えてください。

一般的には、そうですね。そしてそれは、少なくとも静かに、しかし非常によく機能するでしょう。:)

以下の点のみ明記させていただきます。

1. 通常の変数や配列を宣言する場合、スクリプト(またはEA/インジケータ)が何をしようとしているのか、これらの変数/配列は何のためにあるのかを考える必要があると思います。

添付のスクリプトのワークフローでは、グローバルなプログラムレベルではなく、ローカルに変数を宣言することができます。つまり、配列は一度だけ宣言される。Start()本体でのループ宣言は必要ありません。例えば、for()ループを開始する前や、for() {}の後に さらにいくつかの変数の宣言が必要な場合などです。


したがって、配列はプログラムのグローバル変数ではなく、For()ループの文の前の OnStart()の本体で宣言されており、このプログラムの実行方式では全く問題ない。

私の考えでは、プログラムの中でグローバル変数のレベルで宣言する必要がないものは、この機会にローカルで宣言できるものはすべて宣言した方がいいと思っています。

2. コードについては、はっきりさせておきます。

void OnStart()
  {
   int awd1[];
   ArrayResize(awd1,6,7);
   for(int i=0;i<6;i++)
     {
      awd1[i]=i+10;
      Print("awd1[",i,"]=",awd1[i]);
     }
   string text=StringConcatenate("awd1[0]=",awd1[0],", awd1[1]=",awd1[1],", awd1[2]=",awd1[2],
                                 ", awd1[3]=",awd1[3],", awd1[4]=",awd1[4],", awd1[5]=",awd1[5]);
   Alert(text);
  }

ということです。

  • forに<=記号(less than equal)を使ってはいけない。だったところということです(i=0;i<=5;i++)。単純に<(less than)を付けて、5ではなく6と表記します。
for(int i=0;i<6;i++)

5はforにふさわしいやり方だと思います。

for(int i=5;i>=0;i--)
  • 以前、Stringconcatenate 関数を使うと長文の処理が速くなるという情報に遭遇した記憶があります。だから、普段からコードに使っているんです。念のため、こちらにも追加しておきました。


P./S.: 念のため、ArrayResize() の使用について、もう一つ明確にしておきます -動的 配列の場合。 この関数のドキュメントに、この関数が動的配列のリサイズを行えない場合の情報が あります。

 
Best_ATS:
友達を追加できないのですが?
また、生活の中で、仕事から個人的に知っているわけでもないのに、どうやって友人を想像するのでしょうか。
 

こんにちは!新しい価格が最初に表示され、前の価格が下に落ちるなどということはどうすればいいのでしょうか?わかりやすくするために、例を作ってみました。

double NN=0;
double NN1=0;
double NN2=0;
double NN3=0;
void OnTick()
  {
//---
if(Ask>NN)NN=Ask;
if(NN>NN1)NN1=NN;
if(NN1>NN2)NN2=NN1;
if(NN2>NN3)NN3=NN2;
        Comment(""       
             + "1.   "+"Buy: "" Max: " + DoubleToStr(NN,5)
             + "\n"  
             + "2.   "+"Buy: "" Max: " + DoubleToStr(NN1,5)
             + "\n"  
             + "3.   "+"Buy: "" Max: " + DoubleToStr(NN2,5)
             + "\n"  
             + "4.   "+"Buy: "" Max: " + DoubleToStr(NN3,5)
             + "\n"
             + "------------------------------------------------" );
           
  }
 
abeiks:

こんにちは!新しい価格が最初に表示され、前の価格が下に落ちるなどということはどうすればいいのでしょうか?それは例によって明らかでしょう。

私は例を作りましたが、多かれ少なかれ条件を使えば、自分で考えることができます。

double bda_Price[4];
void OnTick()
{
      int li_int;
//---
    if (Ask > bda_Price[0])
    {
        ArrayInitialize (bda_Price, 0.);
        bda_Price[0] = Ask;
        double lda_Price[3];
        ArrayCopy (lda_Price, bda_Price, 0, 1);
        for (int li_int = 1; li_int < 4; li_int++)
        {bda_Price[li_int] = lda_Price[li_int-1];}
    }
    string ls_txt;
    StringInit (ls_txt, 100);
    for (li_int = 0; li_int < 4; li_int++)
    {ls_txt = StringConcatenate (ls_txt, (string) li_int, ".   Buy:  Max: ", DoubleToStr (bda_Price[li_int], Digits), "\n");
    ls_txt = StringConcatenate (ls_txt, "------------------------------------------------" );
    Comment (ls_txt);
//---
}
 
TarasBY:

例題を作りましたので、多かれ少なかれご自身で条件を考えてみてください。


ありがとうございました。
 
abeiks:

こんにちは!新しい価格が最初に表示され、前の価格が下に落ちるなどということはどうすればいいのでしょうか?わかりやすくするために、例を挙げてみました。

ここでは、完全に原始的なコードを紹介します。

double Price1, Price2, Price3, Price4;

void OnTick()
  {
Price4=Price3;
Price3=Price2;
Price2=Price1;
Price1=Ask;
Comment(Price1, "\n", Price2, "\n", Price3, "\n", Price4);
  }
 
silachara:

ここで、完全に原始的なコードを作ってみました。




ありがとうございました。
 

皆さん、こんにちは。初歩的なスクリプトを使ってストラテジーテスターで 取引注文を出そうとしましたが、失敗しました。

int start()

{

//----

int res;

double ask=Close[0]+MarketInfo(_Symbol,MODE_SPREAD)*Point。

res=OrderSend(Symbol(),OP_BUY,0.1,ask,3,0,0,", 0,0,Blue) となります。

if(res>-1)Alert("Open BUY order with ticket ",res))チケットで買い注文。

//----

return(0)です。

}

可視化モードのテスターチャートにスクリプトを置いたのですが、MT4ターミナルで取引注文が開いてしまいます。

また、SimpleFXTester_v2.ex4を使用したストラテジーテスターで、オープンオーダーの情報を取得することができません。

よろしくお願いします。

 
kosmos0975:

皆さん、こんにちは。初歩的なスクリプトを使ってストラテジーテスターで取引注文を出そうとしましたが、失敗しました。

int start()

{

//----

int res;

double ask=Close[0]+MarketInfo(_Symbol,MODE_SPREAD)*Point。

res=OrderSend(Symbol(),OP_BUY,0.1,ask,3,0,0,", 0,0,Blue) となります。

if(res>-1)Alert("Open BUY order with ticket ",res))チケットで買い注文。

//----

return(0)です。

}

可視化モードのテスターチャートにスクリプトを置いたのですが、MT4ターミナルで取引注文が開かれてしまいます。

また、SimpleFXTester_v2.ex4を使用したストラテジーテスターで、オープンオーダーの情報を取得することができません。

よろしくお願いします。

Strategy Testerのスクリプトが動作しない。