ライブラリ: エキスパート - ページ 3

 
ライブラリーの別の応用例

取引、自動取引システム、取引戦略のテストに関するフォーラム

パラメータGetRange()

fxsaber, 2018.11.16 09:17

#include <fxsaber\Expert.mqh> //https://www.mql5.com/ja/code/19003

#define  TOSTRING(A) (" " + #A + " = " + (string)(A))

// 最適化のための入力パラメータの範囲に関するデータを収集する。
string OptimizationData( void )
{
  string Str = NULL;
  MqlParam Params[];
  string Names[];
  
  if (EXPERT::Parameters(0, Params, Names))
  {
    const int Size = ArraySize(Names);
    bool Enable;
    long Value, Start, Step, Stop;
    long Total = 1;
    
    Str = Params[0].string_value;
    
    for (int i = 0; i < Size; i++)
      if (ParameterGetRange(Names[i], Enable, Value, Start, Step, Stop))
      {
        const long Interval = Stop - Start + 1;
        const long Amount =  Enable ? Interval / Step + ((bool)(Interval % Step) ? 1 : 0) : 1;
        
        Str += "\n" + Names[i] + " = " + (string)Value + (Enable ? TOSTRING(Start) + TOSTRING(Step) + TOSTRING(Stop) + TOSTRING(Amount) : NULL);
        
        Total *= Amount;
      }
      
    Str += "\n" + TOSTRING(Total);
  }
  
  return(Str);
}

input int Range1 = 5;
input int Range2 = 5;
input int Range3 = 5;

void OnTesterInit()
{
  ParameterSetRange("Range1", true, 5, 1, 2, 3);
  
  Print(__FUNCTION__ + "\n" + OptimizationData());
}

void OnTesterDeinit()
{
  Print(__FUNCTION__ + "\n" + OptimizationData());
  
  ChartClose();
}

int OnInit()
{
  return(INIT_FAILED);
}


OnTesterInit
Experts\fxsaber\Test3.ex5
Range1 = 5 Start = 5 Step = 1 Stop = 50 Amount = 46
Range2 = 5 Start = 23 Step = 1 Stop = 78 Amount = 56
Range3 = 5 Start = 26 Step = 5 Stop = 83 Amount = 12
 Total = 30912

OnTesterDeinit
Experts\fxsaber\Test3.ex5
Range1 = 5 Start = 1 Step = 2 Stop = 3 Amount = 2
Range2 = 5 Start = 23 Step = 1 Stop = 78 Amount = 56
Range3 = 5 Start = 26 Step = 5 Stop = 83 Amount = 12
 Total = 1344
 
バグ修正。
 
バグを修正しました。最終バージョン
 

.ex4形式のExpert Advisorを別の名前のExpert Advisorに接続して実行するにはどうすればよいですか。

Trade.ex4」という名前でコンパイルされたExpert Advisorがあります。

Hand.ex4」という名前のExpert Advisorを新規作成します。

Hand.ex4」が起動されたときに、「Trade.ex4」が完全に機能し、「Trade.ex4」が「Hand.ex4」に埋め込まれるように、これらを結合する方法。

つまり、マシン上にはHand.ex4ファイルしかありませんが、仕事ではTrade.ex4を使っています。

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

 
Vitaly Muzichenko:

.ex4形式のExpert Advisorをどのように実行できますか?

現在のライブラリはEX5でのみ動作します。

 
Sergey Eremin:

私自身は、あるプロジェクトの一環として、この方法で解決しました("name "タグをそのまま使って):

ありがとうございます!

ただ、保存したテンプレートの名前にchartIdを追加して、異なるチャートの同一のEAが同じファイルを取り合わないようにしました。


fxsaberさん、コードに "#ifndef __MQL5__"がありますが、なぜクロスプラットフォームを論理的結論にしないのですか?

Isを動作させるには、コードの最初に追加します:

#property strict

#ifdef __MQL4__
        class SubstringParser
        {
           private:
              string m_text;
              string m_subStart;
              string m_subEnd;
           
           public:
              SubstringParser(const string text, const string subStart, const string subEnd)
              {
                 m_text = text;
                 m_subStart = subStart;
                 m_subEnd = subEnd;
              }
              
              string Get()
              {
                 int startPhraseLengt = StringLen(m_subStart);
                 int startPos = StringFind(m_text, m_subStart) + startPhraseLengt;
                 int endPos = StringFind(m_text, m_subEnd, startPos);
                         
                 if(startPos >= startPhraseLengt && endPos > startPos)
                 {
                    return StringSubstr(m_text, startPos, endPos - startPos);      
                 }
                 else
                 {
                    return "";
                 }
              }
        };

   string GetChartEAName(const long chartId)
   {
      if(!SaveTemplate(chartId))
      {
         return "";
      }
      
      string result = "";
      
      int handle = FileOpen("ea_name_checking_" + (string)chartId + ".tpl",FILE_TXT|FILE_READ);
      if(handle == INVALID_HANDLE)
      {
         Print
         (
            "Error in ", __FILE__,", line ", __LINE__,
            ": can't open template file 'ea_name_checking_" + (string)chartId + ".tpl', error code = ", GetLastError()
         );
      }
      else
      {
         string text = "";
         
         while(!FileIsEnding(handle)) 
         { 
            text = text + FileReadString(handle, (uint)FileSize(handle)) +"\r\n";
         }
         
         SubstringParser eaSectionTextParser(text, "<expert>", "</expert>");            
         string eaSectionText = eaSectionTextParser.Get();
         
         if(StringTrimLeft(StringTrimRight(eaSectionText)) != "")
         {
            SubstringParser eaNameParser(eaSectionText, "name=","\r\n");
            string eaName = StringTrimLeft(StringTrimRight(eaNameParser.Get()));
            
            if(eaName != "")               
            {
               result = eaName;
            }
         }            
      }
      
      FileClose(handle);
      FileDelete("ea_name_checking_" + (string)chartId + ".tpl");
      
      return result;
   }
   
   bool SaveTemplate(const long chartId)
   {
      ResetLastError();
      
      if(!ChartSaveTemplate(chartId, "\\Files\\ea_name_checking_" + (string)chartId + ".tpl"))
      {            
         Print
         (
            "Error in ", __FILE__,", line ", __LINE__,
            ": can't save template to the file 'ea_name_checking_" + (string)chartId + ".tpl', error code = ", GetLastError()
         );
         
         return false;
      }
      
      return true;
   }      
 #endif

そして関数自体を修正します:

  static bool Is( const long Chart_ID = 0 )
  {
                #ifdef __MQL4__
                        string chartEAName = GetChartEAName(Chart_ID);
                #endif 
                
                #ifdef __MQL5__     
                        string chartEAName = ChartGetString(Chart_ID, CHART_EXPERT_NAME);
                #endif
                return(chartEAName != NULL);
  }


他に難しい点は?

 
Andrey Khatimlianskii:

他に何か問題がありますか?

インジケーターが1つしかないチャート。


ZY このように動作するはずです。

SubstringParser eaSectionTextParser(text, "\r\n\r\n<expert>", "</expert>");
 

ライブラリのすべての機能がMT4で動作するようになりました。

ライブラリはクロスプラットフォームになりました。

 
すべてのライブラリ機能が MT4で動作するようになりました。
ライブラリはクロスプラットフォームになりました。


MT4の例:

MT4の例: MT4の例, MT4の例, MT4の例, MT4の例, MT4の例, MT4の例

Библиотеки:エキスパート

fxsaber, 2019.04.09 13:19

#include <fxsaber\Expert.mqh> //https://www.mql5.com/ru/code/19003

void OnStart()
{
  MqlParam Params[2];

  // Путь к советнику
  Params[0].string_value = "Moving Average";
  
  // Первый входной параметр советника
  Params[1].type = TYPE_DOUBLE;
  Params[1].double_value = 0.5;  

  Print(EXPERT::Run(ChartOpen(_Symbol, _Period), Params));
}
 
Vitaly Muzichenko:

.ex4でEAを実行する最良の方法は?

#include <fxsaber\Expert.mqh> //https://www.mql5.com/ja/code/19003

void OnStart()
{
  MqlParam Params[2];

  // カウンセラーへの道
  Params[0].string_value = "Moving Average";
  
  // Expert Advisor の最初の入力パラメータ。
  Params[1].type = TYPE_DOUBLE;
  Params[1].double_value = 0.5;  

  Print(EXPERT::Run(ChartOpen(_Symbol, _Period), Params));
}