[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 214

 
artmedia70:

Например, функция, которая автоматически присваивает советнику уникальный магик, исходя из названия эксперта, валютной пары и ТФ, на которых он установлен:

Вызов:



А вот еще можно присваивать магик с помощью CRC32, чтоб уж наверняка уникальный был. Или быстро проверить целостность каких-либо данных, ранее сохраненных или полученных от другого терминала, скажем, через интернет. На этот случай дарб всем функцию))) Пользуйтесь с умом).

int crc_table[256];
 
/* Run this function previously */
void make_crc_table() 
{
    for (int i = 0; i < 256; i++) {
        int c = i;
        for (int j = 0; j < 8; j++) {
            if(c & 1 != 0)
               c = 0xEDB88320 ^ (c >> 1);
            else 
               c = c >> 1;
        }
        crc_table[i] = c;
    }
}
 
bool table_filled = false;

int crc32(string buf) 
{
    if(!table_filled)
    {
      make_crc_table();
      table_filled = true;
    }
    
    int len = StringLen(buf);
    
    int c = 0xFFFFFFFF;
    for (int i = 0; i < len; i++) {
        c = crc_table[(c ^ StringGetChar(buf,i)) & 0xFF] ^ (c >> 8);
    }
    return (c ^ 0xFFFFFFFF);
}
 
alsu:

А вот еще можно присваивать магик с помощью CRC32, чтоб уж наверняка уникальный был. Или быстро проверить целостность каких-либо данных, ранее сохраненных или полученных от другого терминала, скажем, через интернет. На этот случай дарб всем функцию))) Пользуйтесь с умом).


 Алексей, Благодарю Вас за интересную и грамотно написанную функцию. Посмотрю. Я как-то сам думаю об подобной идее, и вот на тебе..

 

borilunad:


Виктор, я и в Доке для тебя поискал. Значит, эти коды видел в индикаторах из КодеБэйс, которыми пользовался для ручного трейдинга. Всё это оказалось далеко не панацея. Потому почти все индикаторы выкинул, и сейчас мой эксперт сам себе индикатор, и почти ничего больше не нужно! 

Кстати, многому научился, копаясь в Базе! Чтоб во всё врубиться в Доке, надо уже самому быть докой! В учебнике поподробней, но уже не хватает многого!


Борис, я сам индикаторами по сути не пользуюсь. Разве что машки.. А стринговые функции нужны для других целей. Выше я написал об этом. Вот:

hoz:

 Дабы не читать всяких кривых кодов, как тут https://www.mql5.com/ru/articles/1524

(Там я заметил, пачка косяков. И вообще не понятно о чём думал автор когда писал этот код)

Натолкните меня, пожалуйста, на алгоритм данного варианта. Чтоб отложенный ордер тянулся так сказать по объекту, например, по трендовой линии. Или отложенный ордер стоял за линией...

 Как это вообще реализуется? Что-то я не очень понимаю.

 То что нужно создать объект это понятно. Но нужно как-то указать, что если цена "за" объектом, то.. что-то делать, или если цена на линии то отложенный ордер на ней.. 

 

Друзья, подскажите.

Есть прога которая пишет всё, что делает терминал?

Или как сделать чтобы советник писал логи независимо от сервера?

 
polycomp:
Спасибо за разъяснение! Похоже, что статики лучше не использовать в библиотеках.


И вне их тоже не стоит. В MT4 переменые типа Static не инициализируются повторно НИКОГДА. 
 
herhuman:

как сделать чтобы советник писал логи независимо от сервера?

Он так и делает. 
 
hoz:


Для начала, просто внятно сформулируйте, чего бы Вам хотелось. Приветствуются геометрические подходы. 
 
hoz:


 Алексей, Благодарю Вас за интересную и грамотно написанную функцию. Посмотрю. Я как-то сам думаю об подобной идее, и вот на тебе..

 


Борис, я сам индикаторами по сути не пользуюсь. Разве что машки.. А стринговые функции нужны для других целей. Выше я написал об этом. Вот:

  


Виктор, этим тоже не занимался, много видел этого в Базе. Как я понимаю, пересечения цены с линиями аналогичны с машками. Также засекать перечения линий с параметрами твоих ордеров и позиций и т.п. Раскапывай!
 

Уважаемые господа!Подскажите пожалуйста новичку ответ на такой вопрос

if (((((Bid>1.2153)&&(Bid<1.2160) || (Bid>1.2173)&&(Bid<1.2180))) || ((Bid>1.2100)&&(Bid<1.2107) || (Bid>1.2094)&&(Bid<1.2101)) || (((Bid>1.2092)&&(Bid<1.2099) || (Bid>1.2091)&&(Bid<1.2098))||((Bid>1.2073)&&(Bid<1.2080)||(Bid>1.2005)&&(Bid<1.2012)))))  // если цена соответствует  одному из перечисленных в заголовке if  условий 

int Ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,SL,TP,"jfh",123 )  // открыть ордер.

Данных не повторяющихся  условий у меня около 3000.Поэтому я поместил их всех в одномерный массив

double  masiv [3000];

if ((Bid==masiv[5]) // если цена соответствует значению элемента массива с индексом 5

int Ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,SL,TP,"jfh",123 )  // открыть ордер.

ВОПРОС: Каким кодом можно написать следующую команду

Если цена соответствует значению одного любого из 3000 не повторяющихся значений массива  double  masiv [3000]

Открыть ордер.

Самый простой вариант - поместить 3000 условий в заголовок  if(.....).

Но наверное есть какие то более компактные варианты кода.

Спасибо за помощь.


 
solnce600:

Уважаемые господа!Подскажите пожалуйста новичку ответ на такой вопрос

if (((((Bid>1.2153)&&(Bid<1.2160) || (Bid>1.2173)&&(Bid<1.2180))) || ((Bid>1.2100)&&(Bid<1.2107) || (Bid>1.2094)&&(Bid<1.2101)) || (((Bid>1.2092)&&(Bid<1.2099) || (Bid>1.2091)&&(Bid<1.2098))||((Bid>1.2073)&&(Bid<1.2080)||(Bid>1.2005)&&(Bid<1.2012)))))  // если цена соответствует  одному из перечисленных в заголовке if  условий 

int Ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,SL,TP,"jfh",123 )  // открыть ордер.

Данных не повторяющихся  условий у меня около 3000.Поэтому я поместил их всех в одномерный массив

double  masiv [3000];

if ((Bid==masiv[5]) // если цена соответствует значению элемента массива с индексом 5

int Ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,SL,TP,"jfh",123 )  // открыть ордер.

ВОПРОС: Каким кодом можно написать следующую команду

Если цена соответствует значению одного любого из 3000 не повторяющихся значений массива  double  masiv [3000]

Открыть ордер.

Самый простой вариант - поместить 3000 условий в заголовок  if(.....).

Но наверное есть какие то более компактные варианты кода.

Спасибо за помощь.




При необходимости решение найти можно. Например перейти к целочисленному упорядоченному массиву. Искать в нем нужное значение. 
 
solnce600:

Уважаемые господа!Подскажите пожалуйста новичку ответ на такой вопрос

if (((((Bid>1.2153)&&(Bid<1.2160) || (Bid>1.2173)&&(Bid<1.2180))) || ((Bid>1.2100)&&(Bid<1.2107) || (Bid>1.2094)&&(Bid<1.2101)) || (((Bid>1.2092)&&(Bid<1.2099) || (Bid>1.2091)&&(Bid<1.2098))||((Bid>1.2073)&&(Bid<1.2080)||(Bid>1.2005)&&(Bid<1.2012)))))  // если цена соответствует  одному из перечисленных в заголовке if  условий 

int Ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,SL,TP,"jfh",123 )  // открыть ордер.

Данных не повторяющихся  условий у меня около 3000.Поэтому я поместил их всех в одномерный массив

double  masiv [3000];

if ((Bid==masiv[5]) // если цена соответствует значению элемента массива с индексом 5

int Ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,SL,TP,"jfh",123 )  // открыть ордер.

ВОПРОС: Каким кодом можно написать следующую команду

Если цена соответствует значению одного любого из 3000 не повторяющихся значений массива  double  masiv [3000]

Открыть ордер.

Самый простой вариант - поместить 3000 условий в заголовок  if(.....).

Но наверное есть какие то более компактные варианты кода.

Спасибо за помощь.



Цикл:

   double massiv[];  
//----------------------------------------------------------------------
   for (int i=0; i<ArrayRange(massiv,0); i++) {
      if (MathAbs(NormalizeDouble(Bid-massiv[i],Digits))<=0.5*Point) {
         // цена примерно совпадает со значением в massiv[i]
         // ... обрабатываем совпадение
         }
      }
//----------------------------------------------------------------------
Причина обращения: