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

 
fxsaber:

ロシアのハッカーか...。ちょっとやそっとのことで、なぜ専門家たちを止めるんだ?

ところで、あなたにもバグがある。スタティックが機能しない。

 
Алексей Тарабанов:

ところで、あなたにもバグがある。スタティックが機能しないのだ。

ここにエラーは見当たりません。

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

初心者からの質問 MQL5 MT5 MetaTrader 5

fxsaber, 2018.08.02 17:09

// SLがトリガーされた場合、すべてのExpert Advisorを停止します。

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

void OnTrade()
{
  static int PrevTotal = OrdersHistoryTotal();
  const int Total = OrdersHistoryTotal();
  
  for (int i = Total - 1; i >= PrevTotal; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderCloseReason() == DEAL_REASON_SL))
    {
      long Chart = ChartFirst();
  
      while (Chart != -1)
      {
        if ((Chart != ChartID()) && EXPERT::Is(Chart))
          EXPERT::Remove(Chart);
  
        Chart = ChartNext(Chart);
      }

      break;
    }        
    
  PrevTotal = Total;
}
 
// このインジケータは、Expert Advisorを介した取引の試みをすべて遮断する。このインジケータでは、手指による取引のみが可能です。
// ターミナル実行中にスイッチを切りたくならないように、インジケーターは不可視モードになって います。

#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0

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

void MyAlert( const string Str )
{
  string StrArray[];
  
  for (int i = StringSplit(Str, '\n', StrArray) - 1; i >= 0; i--)
    Alert(StrArray[i]);
}

bool NextOnCalculate( const string SymbName = NULL )
{
  const SYMBOL Symb(SymbName);
  
  MqlRates Rates[1] = {0};
  Rates[0].time = TimeCurrent();
          
  return(Symb.IsCustom() ? Symb.CloneRates(Rates) : ChartSetSymbolPeriod(0, _Symbol, _Period));
}

const SYMBOL SymbTimer("Timer");

void OnInit()
{
  if (_Symbol == SymbTimer.Name)
    ChartIndicatorGet(0, 0, ChartIndicatorName(0, 0, 0));    
  else if (SymbTimer.IsExist() && SymbTimer.On() && NextOnCalculate(SymbTimer.Name))
  {
    iCustom(SymbTimer.Name, PERIOD_CURRENT,
            ".." + StringSubstr(MQLInfoString(MQL_PROGRAM_PATH), StringLen(TerminalInfoString(TERMINAL_PATH)) + 5));
    
    SymbTimer.Off(); 
  }
}

string GetExpertData( const ulong Chart = 0 )
{
  string Str = NULL;

  MqlParam Parameters[];
  string Names[];

  if (EXPERT::Parameters(Chart, Parameters, Names))
  {
    Str += "\n" + ::ChartSymbol(Chart) + " " + ::EnumToString(::ChartPeriod(Chart)) + " " + Parameters[0].string_value + "\n";

    const int Amount = ::ArraySize(Names);

    for (int i = 0; i < Amount; i++)
      Str += (string)i + ": "+ Names[i] + " = " + Parameters[i + 1].string_value + "\n";
  }

  return(Str);
}

void Active( const int AlertTime = 5 )
{
  static const uint StartTime = GetTickCount();
  static uint PrevInterval = 0;
  const uint Interval = (GetTickCount() - StartTime) / 1000;
  const string Str = MQLInfoString(MQL_PROGRAM_NAME) + ": I've been watching you for " + TimeToString(Interval, TIME_SECONDS);
    
  long Chart = ChartFirst();

  if (Chart != -1)  
    do
    {
      if (EXPERT::Is(Chart))
        MyAlert(GetExpertData(Chart) + "Removed - " + (string)EXPERT::Remove(Chart));
        
      ChartSetString(Chart, CHART_COMMENT,  Str);
      ChartRedraw(Chart);
    }
    while ((Chart = ChartNext(Chart)) != -1);    
  else if (!(Interval % AlertTime) && (Interval != PrevInterval))
  {
    MyAlert(Str);
    
    PrevInterval = Interval;
  }
}

int OnCalculate( const int, const int, const int, const double &[] )
{
  static int i = 0;
  
  if ((_Symbol == SymbTimer.Name) && NextOnCalculate())
    Active();
  else if (i++ > 0)
    ChartIndicatorDelete(0, 0, ChartIndicatorName(0, 0, ChartIndicatorsTotal(0, 0) - 1));           
    
  return(0);
}


ZY ターミナルを再起動すると、(MT5 build 1881)プロセス内でハングアップすることがあります。該当プロセスのterminal64.exeを強制的に削除し、MetaTrader 5BasesCustomhistory*.hccを削除することで克服できます。

 
ありがとう。素晴らしい!
 

記事の 中で著者は、このライブラリーの結果のニュアンスを詳細に強調している。一読をお勧めする。

Методы дистанционного управления работой советников
Методы дистанционного управления работой советников
  • www.mql5.com
В наше время информационных технологий использование различных роботов и электронных экспертов для торговли на финансовых рынках стало довольно обычным явлением. Главными преимуществами электронных экспертов принято считать безукоризненное выполнение алгоритма и безустанная работа 24 часа в сутки. Для их круглосуточного использования арендуются...
 
Andrey Khatimlianskii:

MT4には、FileSaveとFileLoad(それぞれ3行で書かれている)よりも多くのものが欠けている:

  1. CHART_EXPERT_NAMEがありません(そして、他のすべてのニュアンス、つまりnameタグを修正した後を除いて、それを置き換えるものがありません)。

私のプロジェクトでは、このように解決しました("name "タグで):

      void Update()
      {                
         long chartId = ChartFirst();
         
         while(chartId > 0)
         {
            #ifdef __MQL4__
            string chartEAName = GetChartEAName(chartId);
            #endif 
            
            #ifdef __MQL5__     
            string chartEAName = ChartGetString(chartId, CHART_EXPERT_NAME);
            #endif
            
            if(chartEAName == m_eaName)
            {
               // ...
            }
            
            chartId = ChartNext(chartId);
         }
      }
      
      #ifdef __MQL4__
      string GetChartEAName(const long chartId)
      {
         if(!SaveTemplate(chartId))
         {
            return "";
         }
         
         string result = "";
         
         int handle = FileOpen("ea_name_checking.tpl",FILE_TXT|FILE_READ);
         if(handle == INVALID_HANDLE)
         {
            Print
            (
               "Error in ", __FILE__,", line ", __LINE__,
               ": can't open template file 'ea_name_checking.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.tpl");
         
         return result;
      }
      
      bool SaveTemplate(const long chartId)
      {
         ResetLastError();
         
         if(!ChartSaveTemplate(chartId, "\\Files\\ea_name_checking.tpl"))
         {            
            Print
            (
               "Error in ", __FILE__,", line ", __LINE__,
               ": can't save template to the file 'ea_name_checking.tpl', error code = ", GetLastError()
            );
            
            return false;
         }
         
         return true;
      }      
      #endif

SubstringParserがこのコードを持っているところ:

#property strict

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 "";
         }
      }
};

つまり、チャート・テンプレートを保存し、それを読み込んで解析し、Expert Advisorの名前を見つける。まだ松葉杖のようなものだが、今のところ(2、3ヶ月)うまくいっている。普通のHDDを使っているのであれば、あまり頻繁に(例えば1ティック ごとに)行わない方がいいと思います。いつかMQL4にCHART_EXPERT_NAMEが 登場することを願っています

 
スクリプトの実行をサポートする新しいバージョンはありますか?
 
Stanislav Korotky:
スクリプトの実行をサポートする新しいバージョンはありますか?

この例は 動作しないのですか?

 
fxsaber:

この例は うまくいかないのですか?

私の使用例とはあまり似ていません。この例に関する主な疑問は、音楽ファイルの名前をグローバル変数を通して投げるのではなく、スクリプトのパラメータで指定した場合はどうなるのか、ということです。私のプロジェクトをプライベート・メッセージでお送りしましょう。

 
Stanislav Korotky:

私の使用例とはあまり似ていません。この例に関する主な疑問は、音楽ファイルの名前をグローバル変数を通して投げるのではなく、スクリプトのパラメータで指定した場合はどうなるのか、ということです。

理由はまったく覚えていないが、入力パラメータを使ったオプションがすぐに提案されている。例題があまりにひねくれているので、MT5の制限に違いない。