Максисальная длина названия символа на FOREX - страница 2

 

Вообще-то хотел сделать приятное для ФОРЕСников, но видимо не судьба

Давно написал подключаемый файл для автоматического получения Magic, а сейчас подправил его

и решил сделать и для форекс, но видимо не судьба.

Если кто-то допишет функцию  GetForexName, то и для ФОРЕКС будет работать.

//+------------------------------------------------------------------+
//|                                                    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-а байта служат для того, чтобы использовать много магиков в одном советнике.

chart_id - служит для идентификации именно данного чарта (можно открывать сколь угодно одинаковых символов)

Перед какими-любо действиями, связанными с Magic, нудно вызвать функцию IsMyMagic, которая проверит принадлежность магика данному советнику

 
prostotrader:

Просто не понятно как анализировать символ, если у него перед самой парой может быть что угодно :(

Создайте массив используемых валют, например "EUR" "USD" "JPY"
Потом функцией составляете из этого набора попарно все возможные сочетания, например "EURUSD" "EURJPY" "USDEUR" "USDJPY" "JPYEUR" "JPYUSD"
И при каждом сочетании проверяете есть ли вхождение этого сочетания в название анализируемого символа. Есть вхождение - шестибуквенное название найдено.

 
Andrei Fandeev:

Создайте массив используемых валют, например "EUR" "USD" "JPY"
Потом функцией составляете из этого набора попарно все возможные сочетания, например "EURUSD" "EURJPY" "USDEUR" "USDJPY" "JPYEUR" "JPYUSD"
И при каждом сочетании проверяете есть ли вхождение этого сочетания в название анализируемого символа. Есть вхождение - шестибуквенное название найдено.

Сделайте всем прияное, допишите функцию  GetForexName

 
prostotrader:

Спасибо, но мне нужно получить только "голое" название пары (6 символов).

Может быть у кого-то есть готовое решение?

Добавлено

Просто не понятно как анализировать символ, если у него перед самой парой может быть что угодно :(

копировщики часто используют 2 параметра префикс и суфикс (добавочный символ до EURUSD или после)

 
prostotrader:

Спасибо, но мне нужно получить только "голое" название пары (6 символов).

Может быть у кого-то есть готовое решение?

Добавлено

Просто не понятно как анализировать символ, если у него перед самой парой может быть что угодно :(

StringFind

 

это от брокера зависит у меня помню был случай который ввёл меня в некий ступор - клиент обратился с ошибкой от которой я тогда знатно офигел и прикинул что придётся писать дикие костыли для распознавания символа

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

2016.10.16 13:08:51.633 2016.08.25 04:40  Expert EURUSD(€),M15: unknown symbol name EURUSD(ˆ) for OrderSend function

 
prostotrader:

На форекс есть символы в основном с суффиксами, с префиксами уж крайне редко, но всегда основа(пара) написана большими буквами, а все приписки маленькими, вот от этого и можно отталкиваться. 

 
Vitaly Muzichenko:

На форекс есть символы в основном с суффиксами, с префиксами уж крайне редко, но всегда основа(пара) написана большими буквами, а все приписки маленькими, вот от этого и можно отталкиваться. 

Надежней, особенно если это вводный параметр приводить все к одному регистру StringToLower или StringToUpper и искать StringFind. Тогда не важно где и что добавлено.

 

если использовать только валютные пары:

Для функции SymbolInfoString()

ENUM_SYMBOL_INFO_STRING

Идентификатор

Описание

Тип свойства

SYMBOL_BASIS

Имя базового актива для производного инструмента

string

SYMBOL_CURRENCY_BASE

Базовая валюта инструмента

string

SYMBOL_CURRENCY_PROFIT

Валюта прибыли

string

SYMBOL_CURRENCY_MARGIN

Валюта в которой вычисляется залоговые средства

string

SYMBOL_BANK

Источник текущей котировки

string

SYMBOL_DESCRIPTION

Строковое описание символа

string

SYMBOL_FORMULA

Формула для построения цены пользовательского символа

string

SYMBOL_ISIN

Имя торгового символа в системе международных идентификационных кодов ценных бумаг — ISIN (International Securities Identification Number). Международный идентификационный код ценной бумаги  — это 12-разрядный буквенно-цифровой код, однозначно идентифицирующий ценную бумагу. Наличие данного свойства символа определяется на стороне торгового сервера.

string

SYMBOL_PAGE

Адрес интернет страницы с информацией по символу. Данный адрес будет отображаться в виде ссылки при просмотре свойств символа в терминале

string

SYMBOL_PATH

Путь в дереве символов

string

 
Konstantin Nikitin:

Надежней, особенно если это вводный параметр приводить все к одному регистру StringToLower или StringToUpper и искать StringFind. Тогда не важно где и что добавлено.

Но Я не пойму задачу, почему туда нельзя сразу подставить символ, независимо от его длины

Причина обращения: