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에서 근무