FOREX'te sembol adının maksimum uzunluğu - sayfa 5

 
prostotrader :

Bir pozisyon varsa , grafik kapatıldığında tüm veriler elde edilebilir ve bu sembol için bekleyen emirler basitçe "çivilenebilir".

Neden olsun? Varyantınızın ciddi bir eksisi, grafik tutamacında bir bağlama olmasıdır.

Daha iyisi, şimdiye kadar kimse gelmedi (aynı sembolde birkaç danışman açmak için)

Saptan kurtulabilirsiniz, ancak o zaman başka bir şeye bağlanmanız gerekir. Örneğin, danışmanın giriş parametrelerine + ona giden yol. Ancak bu çözümün dezavantajları da vardır.

 
prostotrader :

Roboforex AUDNZD'da çalışıyor

 Print (GetForexName( "AUDNZD" ));
 
fxsaber :

Peki ya danışman kesilseydi, pozisyonlar/emirler olduğu anda grafiği kapatsaydı?


Böyle bir şeyin Forex için neden işe yaramadığını tam olarak anlamadım

Çünkü önce ne koyacağı belli değil.

EURUSD - baz - EUR ve AUDNZD - baz NZD

 
//+------------------------------------------------------------------+
//|                                                    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);
  string a_prof = SymbolInfoString(Symbol(), SYMBOL_CURRENCY_PROFIT);
  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 != "")
  { 
    Print("in_str = ", 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);
}
//+------------------------------------------------------------------+
2018.08.25 15:29:02.174 Magic_test (AUDNZD,M1)  in_str = AUDNZD
2018.08.25 15:29:02.384 Magic_test (AUDNZD,M1)  FOREX done.
int OnInit()
  {

  ulong a_magic = GetMagic(Symbol());
  if(a_magic != 0)
  {
    a_magic+=25;
    if(IsMyMagic(a_magic, ChartID()) == true)
    {
      Print("FOREX done.");
    }
  }
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
 

Büyüyü TERMINAL'in global değişkenine kaydetmenin bir yolu var, o zaman hiçbir şey kaybolmaz

hemen yazacağım

 
prostotrader :

Büyüyü TERMINAL'in global değişkenine kaydetmenin bir yolu var, o zaman hiçbir şey kaybolmaz

hemen yazacağım

Düştüğünde öldürülür.

 
prostotrader :

Çünkü önce ne koyacağı belli değil.

EURUSD - baz - EUR ve AUDNZD - baz NZD

Her zamanki gibi

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

FOREX'te sembol adının maksimum uzunluğu

fxsaber , 2018.08.25 14:12

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

"Evrensel olmayan hash işlevi" adlı bir bisiklet buldunuz. İşte sizinkiyle aynı işlevselliğe sahip basit bir sürüm

 #include <crc64.mqh> // https://www.mql5.com/en/blogs/post/683577

string GetMagicString()
{
   return ( MQLInfoString ( MQL_PROGRAM_PATH /*MQL_PROGRAM_NAME*/ ) + _Symbol + ( string ) ChartID () /* + (string)_Period*/ );
}

ulong GetMagic()
{
   uchar Bytes[];
  
   return (crc64( 0 , Bytes, StringToCharArray (GetMagicString(), Bytes)));
}
  
void OnStart ()
{
   Print (GetMagic());
}
 
fxsaber :

Her zamanki gibi


"Evrensel olmayan hash işlevi" adlı bir bisiklet buldunuz. İşte sizinkiyle aynı işlevselliğe sahip basit bir sürüm

Son iki bayt, bu çizelgede ek sihirbazlar için ayrılmıştır.

Ama CRC'yi MQL'de olduğunu unuttum :) teşekkürler

O zaman hiç sorun olmayacak.

fxsaber : teşekkürler

 
Vitaly Muzichenko :

Düştüğünde öldürülür.

Terminalin global değişkenleri "öldürülmemek" için yaratılmıştır.


 
fxsaber :

Her zamanki gibi


"Evrensel olmayan hash işlevi" adlı bir bisiklet buldunuz. İşte sizinkiyle aynı işlevselliğe sahip basit bir sürüm

Aynı danışmanı aynı sembol üzerinde çalıştırabileceğiniz için seçeneğiniz çalışmayacaktır.

Neden: