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

 

現在、FOREXでも使用可能です(_BTCUSD_iのような「曲がった」文字も使用可能です)。

//+------------------------------------------------------------------+
//|                                                    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)
{
  string s_base = SymbolInfoString(Symbol(), SYMBOL_CURRENCY_BASE);
  if(StringLen(s_base) == 3)
  {
    int base_pos = StringFind(a_str, s_base, 0);
    if(base_pos > -1)
    {
      switch(base_pos)
      {
        case 0:
        case 1:
        case 2:
          return(StringSubstr(a_str, base_pos, 6));
        break;
        default:
          {
            string left_str = StringSubstr(a_str, base_pos - 3, 3);
            string right_str = StringSubstr(a_str, base_pos + 3, 3);
            if(right_str == "")
            {
              return(StringSubstr(a_str, base_pos - 3, 6));
            }
            else
            if(StringLen(right_str) < 3)
            {
              return(StringSubstr(a_str, base_pos - 3, 6));
            }
            else
            {
              bool is_match = true;
              uchar uch_array[];
              int result = StringToCharArray(right_str, uch_array, 0, WHOLE_ARRAY, CP_ACP);
              if(result == 4)
              {
                for(int i=0; i < result - 1; i++)
                {
                  if((uch_array[i] < 65) || (uch_array[i] > 90))
                  {
                    is_match = false;
                    break;
                  } 
                }
                if(is_match == true)
                {
                  return(StringSubstr(a_str, base_pos, 6));  
                }
                else
                {
                  is_match = true;
                  result = StringToCharArray(left_str, uch_array, 0, WHOLE_ARRAY, CP_ACP);
                  if(result == 4)
                  {
                    for(int i=0; i < result - 1; i++)
                    {
                      if((uch_array[i] < 65) || (uch_array[i] > 90))
                      {
                        is_match = false;
                        break;
                      } 
                    }
                    if(is_match == true)
                    {
                      return(StringSubstr(a_str, base_pos - 3, 6));  
                    }  
                  } 
                }
              }  
            }
          }
        break;  
      }
    }
  }
  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);
}
//+------------------------------------------------------------------+
 
prostotrader:

FOREXで使えるようになりました(_BTCUSD_iなどの「変な」文字もOKです)

コドベースへ

 
prostotrader:

昔、Magicを自動で取得するプラグインファイルを書いたことがあります。

課題は何だったのでしょうか?

曲がったシンボルに「FOREX done.」と表示されることを確認してください。

EURUSD」には表示されません。

ベースとなる記号は、常にペアの最初にあるのですか?

カスタムシンボルは何でもありです。おそらく、カスタムのものでこのようなチェックを実行するのが最も便利な方法でしょう。


エスゼット

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

ライブラリ: AutoMagic

ドミトリー・フェドセーエフ, 2017.02.03 13:31

チャートハンドルを 使ってマジックを形成するということは、誤ってチャートを閉じてしまうと、その注文は失われてしまうということです。

 
fxsaber:

EURUSDでは表示されません。

SZY

修正済み

ZYに追加されました。

より良いものを書く

 
prostotrader:

修正済み

今は動いています。では、実践編として一言お願いします。


ZS "AUDNZD"...

 
fxsaber:

今は動いています。では、実践編として一言お願いします。


ZS "AUDNZD"...

チャート上にEA用のユニークなMagikを自動的に作成し、65535個の追加Magikを使用することが可能です。

追加

FOREXは持っていない。

GetForexName 関数を確認せずに書いて しまいました。

 
prostotrader:

チャート上にEA用のユニークなMagikを自動的に作成し、65535個の追加Magikを使用することが可能です。

では、そのポジションや注文があるタイミングでチャートを閉じる ことで、EAが切り離された場合はどうでしょうか。


なぜ、このようなことがFXでうまくいかなかったのか、理由はよくわかりません。

bool SymbolIsExist( const string Symb = NULL )
{
  ResetLastError();

  SymbolInfoInteger((Symb == NULL) ? _Symbol : Symb, SYMBOL_CUSTOM);

  return(::GetLastError() != ERR_MARKET_UNKNOWN_SYMBOL);
}

string GetForexName( const string Symb )
{
  return(SymbolIsExist(Symb) ? SymbolInfoString(Symb, SYMBOL_CURRENCY_BASE) + SymbolInfoString(Symb, SYMBOL_CURRENCY_PROFIT) : NULL);
}

void OnStart()
{
  Print(GetForexName(_Symbol));
}
 
prostotrader:

FOREXは持っていない。

Do - MQ-Demo.

 
fxsaber:

では、ポジション・注文があるタイミングでチャートを閉じる ことで、EAが切れる場合はどうでしょうか。


ポジションがある場合、チャートが閉じられたときにすべてのデータを取得することができ、このシンボルの保留中の注文を単に「釘付け」にすることができます。

まだ誰も良いアイデアを思いついていない(同じシンボルで複数のEAを開くための)。

 
fxsaber:

ZS "AUDNZD"...

AUDNZDはRoboforexで動作します。