[警告は閉鎖されました!】フォーラムを乱雑にしないために、どんな初心者の質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしでは、どこにも行けない。 - ページ 61

 

専門家の皆様、ご回答よろしくお願いします。

MetaEditorは、プログラム作成用テンプレートのテキストファイルを持っています。これらは、プログラムを作成する際にウィザードで使用されます。テンプレートテキストには、作成されるプログラムファイルのタイプのパラメータが指定されます。コードテキストには表示されないが、それらのパラメーターの間にタグがある。しかし、端末はなぜかそれを認識する。Expert Advisor を作成した場合、次のティック以降に Start 機能が起動します。 インジケータを作成した場合、ティックなしで Start 機能が起動します。タグやその中に入っているものはどこに行くのですか?

 

その原因がどこにあるのか、さらに2つのテストを行いました。


1.iniから文字列の配列ではなく、個別の変数に読み込んでいます。結果は予想通り、つまりコピーするのは値ではなく参照です。

int    numCross=0;

string Cross_1="-", Cross_2="-", Cross_3="-";
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
  string sectionName = "common";
  
  numCross = ReadIniInteger( config_path, sectionName, "numCross", 0);
  ArrayResize( CrossName, numCross);
  for (int i=0; i<numCross; i++) CrossName[i] = "-";
  
  sectionName = "cross1";
  Cross_1 = ReadIniString( config_path, sectionName, "name", "-");
  Print("init.1: Cross_1=", Cross_1);
  sectionName = "cross2";
  Cross_2 = ReadIniString( config_path, sectionName, "name", "-");
  Print("init.1: Cross_2=", Cross_2);
  sectionName = "cross3";
  Cross_3 = ReadIniString( config_path, sectionName, "name", "-");
  Print("init.1: Cross_3=", Cross_3);
  Print("init.1: read complete");

  Print("init.2: Cross_1=", Cross_1);
  Print("init.2: Cross_2=", Cross_2);
  Print("init.2: Cross_3=", Cross_3);
  Print("-------------------------------");
  
  sectionName = "cross1";
  Cross_1 = StringSubstr( ReadIniString( config_path, sectionName, "name", "-"), 0, 0);
  Print("init.3: Cross_1=", Cross_1);
  sectionName = "cross2";
  Cross_2 = StringSubstr( ReadIniString( config_path, sectionName, "name", "-"), 0, 0);
  Print("init.3: Cross_2=", Cross_2);
  sectionName = "cross3";
  Cross_3 = StringSubstr( ReadIniString( config_path, sectionName, "name", "-"), 0, 0);
  Print("init.3: Cross_3=", Cross_3);
  Print("init.3: read complete");

  Print("init.4: Cross_1=", Cross_1);
  Print("init.4: Cross_2=", Cross_2);
  Print("init.4: Cross_3=", Cross_3);

  return(0);
}


を表示します。

2009.04.10 14:31:42 example AUDUSD,H4: init.4: Cross_3=USDJPY
2009.04.10 14:31:42 example AUDUSD,H4: init.4: Cross_2=GBPUSD
2009.04.10 14:31:42 example AUDUSD,H4: init.4: Cross_1=EURUSD
2009.04.10 14:31:42 example AUDUSD,H4: init.3: read complete
2009.04.10 14:31:42 example AUDUSD,H4: init.3: Cross_3=USDJPY
2009.04.10 14:31:42 example AUDUSD,H4: init.3: Cross_2=GBPUSD
2009.04.10 14:31:42 example AUDUSD,H4: init.3: Cross_1=EURUSD
2009.04.10 14:31:42 example AUDUSD,H4: -------------------------------
2009.04.10 14:31:42 example AUDUSD,H4: init.2: Cross_3=USDJPY
2009.04.10 14:31:42 example AUDUSD,H4: init.2: Cross_2=USDJPY
2009.04.10 14:31:42 example AUDUSD,H4: init.2: Cross_1=USDJPY

2009.04.10 14:31:42 example AUDUSD,H4: init.1: read complete
2009.04.10 14:31:42 example AUDUSD,H4: init.1: Cross_3=USDJPY
2009.04.10 14:31:42 example AUDUSD,H4: init.1: Cross_2=GBPUSD
2009.04.10 14:31:42 example AUDUSD,H4: init.1: Cross_1=EURUSD


2. 文字列の配列を返したが、関数がiniの文字列値を読み取るのではなく

string ReadIniString(string FileName, string SectionName, string KeyName, 
                     string Default = "")
  {
   string ReturnedString = "";
   int nValue = GetPrivateProfileStringA( SectionName, KeyName, Default, 
                                          ReturnedString, 255, FileName);
   if( nValue > 0)
       return( ReturnedString);
   else 
       return( Default);
  }

win apiから何も呼び出さないテスト関数を使用しました。

string CrossName[];
int    numCross=0;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
  string sectionName = "common";
  
  numCross = ReadIniInteger( config_path, sectionName, "numCross", 0);
  ArrayResize( CrossName, numCross);
  for (int i=0; i<numCross; i++) CrossName[i] = "-";
  
  for (int i=0; i< numCross; i++)
  {
    sectionName = StringConcatenate("cross", i+1);
    CrossName[ i] = someFunc( i+1);
    Print("init.1: CrossName[", ( i+1), "]=", CrossName[ i]);
  }
  Print("init.1: read complete");
  
  for ( i=0; i< numCross; i++)
  {
    Print("init.2: CrossName[", ( i+1), "]=", CrossName[ i]);
  }
  

  Print("-------------------------------");
  for ( i=0; i< numCross; i++)
  {
    sectionName = StringConcatenate("cross", i+1);
    CrossName[ i] = StringSubstr( someFunc( i+1), 0, 0);
    Print("init.3: CrossName[", ( i+1), "]=", CrossName[ i]);
  }
  Print("init.3: read complete");
  
  for ( i=0; i< numCross; i++)
  {
    Print("init.4: CrossName[", ( i+1), "]=", CrossName[ i]);
  }

  return(0);
}
//+------------------------------------------------------------------+
string someFunc(int val)
{
  string ReturnedString = "CROSS_"+ val;
  return( ReturnedString);
}
//+------------------------------------------------------------------+

出来栄え

2009.04.10 14:41:12 example AUDUSD,H4: init.4: CrossName[3]=CROSS_3
2009.04.10 14:41:12 example AUDUSD,H4: init.4: CrossName[2]=CROSS_2
2009.04.10 14:41:12 example AUDUSD,H4: init.4: CrossName[1]=CROSS_1
2009.04.10 14:41:12 example AUDUSD,H4: init.3: read complete
2009.04.10 14:41:12 example AUDUSD,H4: init.3: CrossName[3]=CROSS_3
2009.04.10 14:41:12 example AUDUSD,H4: init.3: CrossName[2]=CROSS_2
2009.04.10 14:41:12 example AUDUSD,H4: init.3: CrossName[1]=CROSS_1
2009.04.10 14:41:12 example AUDUSD,H4: -------------------------------

2009.04.10 14:41:12 example AUDUSD,H4: init.2: CrossName[3]=CROSS_3
2009.04.10 14:41:12 example AUDUSD,H4: init.2: CrossName[2]=CROSS_2
2009.04.10 14:41:12 example AUDUSD,H4: init.2: CrossName[1]=CROSS_1
2009.04.10 14:41:12 example AUDUSD,H4: init.1: 読み込み完了
2009.04.10 14:41:12 example AUDUSD,H4: init.1: CrossName[3]=CROSS_3
2009.04.10 14:41:12 example AUDUSD,H4: init.1: CrossName[2]=CROSS_2
2009.04.10 14:41:12 example AUDUSD,H4: init.1: CrossName[1]=CROSS_1

の変換に問題があるようであることがわかりました。

LPTSTR lpReturnedString [out] 取得した文字列を受け取るバッファへのポインタ GetPrivateProfileString fi  tomql4 string の win api .
 
xruss >> :

論理的には、シグナルが発生する前にORD型を定義しておくべきだと思ったのですが、そうしないと、取引基準にどのように考慮されるのでしょうか。

プライベートで回答する - この方法がより生産的だと思います。

 
Reshetov >> :

車輪を再発明するのではなく、既製のExpert Advisorの一つを使用して、マーチンゲールで取引し、それがすでに実装されている方法を確認することは、はるかに簡単です。


例えば、Universum3.0


ありがとうございます。すべてが大昔に発明されたものだということに、まったく同感です。

 

テスターでEAをテスト する際、init()関数が実行される。


EAのinit()関数で、外部変数を正規化したい。

を作成し、これらの正規化された値を使用して、start() からインジケータを呼び出します。

この正規化をstart()に入れたくないのです。

ストラテジーテスターでEAの最適化を行う際、外部変数が変更されるたびにinit()関数が実行されるのでしょうか?
 
begemot61 писал(а)>>

テスターでEAをテストする際、init()関数が実行される。


EAのinit()関数で、外部変数を正規化したい。

を作成し、start()からインジケータを呼び出す際に、これらの正規化された(新しい)値を使用します。

この正規化をstart()に入れたくないのです。

ストラテジーテスターでEAの最適化を行う際、外部変数が変更されるたびにinit()関数が実行されるのでしょうか?

はい、そうなります。

 

int start()
{
if (OrdersTotal() == 0
&& TimeDayOfWeek(TimeCurrent()) == 5
&& TimeHour(TimeCurrent()) == 12
&& TimeMinute(TimeCurrent()) == 30
&& TimeSeconds(TimeCurrent()) >= 00)
{
Alert("Тра ляля");
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"sell",999999,0,Red);
}


なぜここで注文が開けないのか、どなたか教えてください。私は何を間違えているのだろう?
 
Dimoncheg писал(а)>>
なぜここで注文が開かないのか、誰か心当たりはありませんか?私は何を間違えているのだろう?

じゃあ、こっちは...金曜日まで待つんだ、その1分間にティックがあれば開くはずだ。

 
Roger >> :

じゃあ、こっちは...金曜日まで待たないといけないが、その1分以内にティックがあれば開くはずだ。

>> それこそ、金曜日とか他の曜日にやってもアラートは効くし、注文は全然開かないし。