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 와 같은 "비뚤어진" 기호 사용).

코드베이스로

prostotrader :

오래전에 매직을 자동으로 받기 위한 플러그인 파일을 작성했습니다.

과제는 무엇이었나요?

"FOREX done." 메시지가 표시되는지 확인하십시오. "곡선" 문자 에

"EURUSD"에는 표시되지 않습니다.

기본 캐릭터는 항상 쌍에서 먼저 나오나요?

사용자 정의 기호는 무엇이든 가질 수 있습니다. 아마도 사용자 정의 검사에서 그러한 검사를 실행하는 것이 가장 편리할 것입니다.


추신

차트 핸들 을 사용하여 마법을 생성한다는 것은 차트가 실수로 닫히면 주문이 손실된다는 것을 의미합니다.

fxsaber :

"EURUSD"에는 표시되지 않습니다.

추신

수정됨

ZY에 추가됨

더 좋은 것을 쓰다

prostotrader :

수정됨

지금 작동합니다. 이제 이 문제의 실용적인 측면에 대해 몇 마디 듣고 싶습니다.


추신 "AUDNZD"...

fxsaber :

지금 작동합니다. 이제 이 문제의 실용적인 측면에 대해 몇 마디 듣고 싶습니다.


추신 "AUDNZD"...

65535개의 추가 마법을 사용할 수 있는 능력으로 차트에 고문을 위한 고유한 마법을 자동으로 생성합니다.

추가됨

나는 외환이 없다

유효성 검사 없이 GetForexName 함수를 작성했습니다.

prostotrader :

65535개의 추가 마법을 사용할 수 있는 능력으로 차트에 고문을 위한 고유한 마법을 자동으로 생성합니다.

그렇다면 어드바이저가 차단되어 포지션/오더가 있는 순간 차트를 닫는다면 ?


Forex에서 이와 같은 것이 작동하지 않는 이유를 잘 이해하지 못했습니다.

 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 :

나는 외환이 없다

만들기 - MQ-데모.

fxsaber :

그렇다면 어드바이저가 차단되어 포지션/오더가 있는 순간 차트를 닫는다면 ?


위치가 있는 경우 차트가 닫힐 때 모든 데이터를 얻을 수 있으며 이 기호에 대한 보류 중인 주문은 간단히 "못을 박을" 수 있습니다.

더 나은, 지금까지 아무도 제안하지 않았습니다(동일한 기호에 대해 여러 고문을 여는 경우).

fxsaber :

추신 "AUDNZD"...

Roboforex AUDNZD에서 근무