FOREXにおけるシンボル名の最大長 - ページ 2

 

本当はFORESのために何かいいことをしたかったのですが、そういうわけにもいかなかったようです。

昔、Magicのプラグインファイルを書きましたが、今はそれを微調整しています。

FXのためにやろうと思ったが、そうもいかなかった。

誰かがGetForexName関数を追加してくれれば、FOREXでも使える ようになります。

//+------------------------------------------------------------------+
//|                                                    AutoMagic.mqh |
//|                                 Copyright 2017-2018 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
//version   "1.01
#define  FORTS
//---
struct SYMBOL_MAGIC
{
  long ch_id;
  ulong magic;
};
SYMBOL_MAGIC symb_magic;
//-------------------------------------------------------------------+
// Split string function                                             |
//+------------------------------------------------------------------+
string SplitString(const string a_str,ulong &a_month,ulong &a_year)
  {
   int str_size=StringLen(a_str);
   int str_tire=StringFind(a_str, "-");
   int str_tochka=StringFind(a_str, ".", str_tire);
   if((str_tire>0) && (str_tochka>0) &&(str_size > 0))
     {
      a_month= ulong(StringToInteger(StringSubstr(a_str,str_tire+1,str_tochka-str_tire-1)));
      a_year = ulong(StringToInteger(StringSubstr(a_str,str_tochka+1,str_size-str_tochka-1)));
      if((a_month > 0) && (a_year > 0)) return(StringSubstr(a_str, 0, str_tire));
     }
   return("");
  }
//-------------------------------------------------------------------+
// Get FOREX symbol function                                       |
//+------------------------------------------------------------------+
string GetForexName(const string a_str)
{
  //??????? Из любого названия пары функция долна возвращать ТОЛЬКО саму пару (н-р UERUSD)
  return("");
}  
//-------------------------------------------------------------------+
// Get Magic function                                                |
//+------------------------------------------------------------------+
ulong GetMagic(const string a_symbol)
{
//--- Get ChartID
  symb_magic.ch_id = ChartID();
//---
  if(SymbolSelect(Symbol(), true) == false)
  {
    Print(__FUNCTION__, ": Нет такого символа!");
    return(0);
  }  
#ifdef  FORTS
//--- Test symdol
  if(StringLen(a_symbol)>10)
  {
    Print(__FUNCTION__, ": Не правильный символ!");
    return(0);
  }
  if(symb_magic.ch_id != 0)
  {
    ulong month = 0;
    ulong year = 0;
    string new_str=SplitString(a_symbol,month,year);
    if(StringLen(new_str)>0)
    {
      symb_magic.magic = 0;
      uchar char_array[];
      int result=StringToCharArray(new_str,char_array,0,WHOLE_ARRAY,CP_ACP);
      if(result>0)
      {
        ulong value;
        for(int i = 0; i < result - 1; i++)
        {
          value=ulong(char_array[i]);
          value<<=(56 -(i*8));
          symb_magic.magic += value;
        }
        month<<=24;
        symb_magic.magic += month;
        year<<=16;
        symb_magic.magic += year;
        ulong a_chid = ulong(symb_magic.ch_id);
        a_chid<<=16;
        return(symb_magic.magic&=symb_magic.ch_id);
      }
    }
  }
#else
  string in_str = GetForexName(a_symbol);
  if(in_str != "")
  { 
    symb_magic.magic = 0;
    uchar char_array[];
    int result=StringToCharArray(a_symbol,char_array,0,WHOLE_ARRAY,CP_ACP);
    if(result>0)
    {
      ulong value;
      for(int i = 0; i < 6; i++)
      {
        value=ulong(char_array[i]);
        value<<=(56 -(i*8));
        symb_magic.magic += value;
      }  
      ulong a_chid = ulong(symb_magic.ch_id);
      a_chid<<=16;
      return(symb_magic.magic&=symb_magic.ch_id);
    }
  }
#endif    
  return(0); 
}
//-------------------------------------------------------------------+
// Is my magic function                                              |
//+------------------------------------------------------------------+
bool IsMyMagic(const ulong m_magic, const long chart_id)
{
  if(symb_magic.ch_id == chart_id)
  {
    ulong stored_magic=symb_magic.magic;
    stored_magic>>=16;
    ulong in_magic = m_magic;
    in_magic>>=16;
    if(in_magic == stored_magic) return(true);
  }
  return(false);
}
//+------------------------------------------------------------------+

最後の2バイトは、1つのEAで多くのウィザードを使用するために使用されます。

chart_id - チャートの識別に使用されます (同じシンボルをいくつでも開くことができます)

マジックを使う前に、関数IsMyMagicを呼び出して、マジシャンが与えられたEAに属しているかどうかをチェックします。

 
prostotrader:

ただ、シンボルの前に何かをつけることができる場合、どのように分析すればよいのかが不明です :(

使用する通貨を "EUR" "USD" "JPY" などの配列で作成します。
そして、この関数を使用して、例えば「EURUSD」「EURJPY」「USDEUR」「USDJPY」「JPYEUR」「JPYUSD」のように、可能なすべての組み合わせをペアリングすることができるのです。
そして、その都度、分析対象のシンボル名にこの組み合わせの出現があるかどうかを確認するのです。発生した場合 - 6文字の名前が見つかります。

 
Andrei Fandeev:

EUR" "USD" "JPY "など、使用する通貨の配列を作成します。
そして、この関数を使用して、例えば「EURUSD」「EURJPY」「USDEUR」「USDJPY」「JPYEUR」「JPYUSD」のように、可能なすべての組み合わせをペアリングすることができるのです。
そして、その都度、分析対象のシンボル名にこの組み合わせの出現があるかどうかを確認するのです。発生した場合 - 6文字の名前が見つかります。

GetForexName 関数を追加してください。

 
prostotrader:

ありがとうございます。しかし、私はペアの「素」の名前(6文字)だけを取得する必要があります。

もしかしたら、誰かが既成の解決策を持っているかもしれません。

追加

ただ、ペア自体の前に何かを持つことができる場合、シンボルをどのように分析するのかが不明です :(

コピー機では、2つのパラメータprefixとsuffix(EURUSDの前または後の追加記号)がよく使われます。

 
prostotrader:

ありがとうございます。しかし、私はペアの「素」の名前(6文字)だけを取得する必要があります。

もしかしたら、誰かが既成の解決策を持っているかもしれません。

追加

ただ、ペア自体の前に何かを持つことができる場合、シンボルをどのように分析するのかが不明です :(

文字列検索

 

クライアントがエラーを起こしたので、私は本当に怖くなり、シンボル認識のための粗いキットを書かなければならないと思いました。

2016.10.16 13:08:51.633 2016.08.25 04:39 ExpertEURUSD(€),M15: OrderSend error 4106

2016.10.16 13:08:51.633 2016.08.25 04:40 ExpertEURUSD(€),M15: OrderSend関数の シンボル名EURUSD(ˆ) が不明です。

 
prostotrader:

FXでは、ほとんどが接尾語、ごくまれに接頭語の記号がありますが、必ずベース(ペア)は大文字で、接頭語はすべて小文字で書かれているので、それをベースに考えていけばいいんです。

 
Vitaly Muzichenko:

FXでは、接尾辞がほとんどで、接頭辞はごくまれにしかない記号がありますが、常に基本(ペア)は大文字で、接頭辞はすべて小文字で書かれているので、これを起点にするとよいでしょう。

特に入力パラメータであれば、全てをシングルケースの StringToLowerか StringToUpperに 落とし込んで、 StringFindで検索 する方が確実です。それなら、どこに何を加えても問題ない。

 

通貨ペアのみ使用する場合。

ForSymbolInfoString()

enum_symbol_info_string

識別子

商品説明

物件タイプ

SYMBOL_BASIS

デリバティブの原資産名

シンボル_通貨ベース

商品の基準通貨

シンボル_カレンシー_プロフィット

利益通貨

シンボル_カレンシー_マージン

マージンを計算する通貨

SYMBOL_BANK

現在の引用元

シンボル_ディスクリプション

シンボルの文字列説明

SYMBOL_FORMULA

カスタムシンボルの価格構成式

SYMBOL_ISIN

ISIN(International Securities Identification Number)システムにおける取引記号の名称。国際証券識別番号とは、証券を一意に識別する12桁の英数字のコードです。この特性の有無は、トレードサーバー側で定義されます。

シンボルページ

シンボルに関する情報が掲載されているウェブページのアドレス。このアドレスは、ターミナルでシンボルのプロパティを表示する際に、リンクとして表示されます

SYMBOL_PATH

シンボルツリー内のパス

 
Konstantin Nikitin:

特に入力パラメータであれば、すべてを StringToLowerか StringToUpperの 1つのケースに落とし込み StringFindで検索 する方が確実です。それなら、どこに何を加えても問題ない。

しかし、なぜそこで文字の長さに関係なく代入できないのか、その問題が理解できない