создание магического числа - страница 4

 
7bit:

Нет, они могут быть какими угодно. так же как и комментарий. рассматривайте их как своего рода числовой комментарий. Все ручные сделки, открытые с помощью обычного пользовательского интерфейса MT4, будут иметь магическое число 0, поэтому вы можете, например, просмотреть все ордера и закрыть/удалить все ручные сделки и ордера, оставив все сделки советника нетронутыми.

Для уникальной идентификации только одного определенного ордера существует номер тикета.

Спасибо, что прояснили ситуацию и поделились своим мнением. К слову, я многому научился...

 
7bit:
/**
* Rotate a 32 bit integer value bit-wise 
* the specified number of bits to the right.
* This function is needed for calculations
* in the hash function makeMacicNumber()
*/
int bitRotate(int value, int count){
   int i, tmp, mask;
   mask = MathPow(2, count) - 1;
   tmp = value & mask;
   value = value >> count;
   value = value | (tmp << (32 - count));
   return(value);
}

Мне не нужен MathPow(), почему никто этого не заметил?
/**
* Rotate a 32 bit integer value bit-wise 
* the specified number of bits to the right.
* This function is needed for calculations
* in the hash function makeMacicNumber()
*/
int bitRotate(int value, int count){
   int i, tmp, mask;
   mask = (0x00000001 << count) - 1;
   tmp = value & mask;
   value = value >> count;
   value = value | (tmp << (32 - count));
   return(value);
}
Обновляю первый постинг.
 
7bit:
Мне не нужен MathPow(), почему никто этого не заметил?

На ум приходят три основные причины:

  • Тот, кто уже использует функцию хэширования, вряд ли заменит ее вашим кодом, и поэтому его не будут волновать детали вашего кода.
  • Тот, кто в настоящее время не использует функцию хеширования, но думает, что это может быть хорошей идеей, вероятно, просто примет такой код, как ваш, на веру, и будет заботиться только о том, работает он или нет, а не о том, насколько он элегантен или оптимизирован.
  • Ваша замена MathPow() на побитовую операцию сэкономит существенно меньше миллисекунды на вызов makeMagicNumber(). Вы предполагаете, что makeMagicNumber() вызывается один раз за время жизни эксперта, в init(). Следовательно, ваше изменение экономит менее одной миллисекунды за время жизни эксперта. Это совершенно тривиальное изменение (и, возможно, снижающее ясность кода).
 
jjc: возможно, снижает ясность кода

Я бы не сказал, что это снижает ясность. Моя главная цель - ясность, элегантность и точность, а не производительность.

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

Кроме того, хотя сложение и умножение могут выполняться с целыми числами, функция MathPow() внутри использует логарифмы, пахнет аппроксимацией и невероятно сложна по сравнению с тем, для чего она мне нужна, она использует и возвращает двойное значение, а это не имеет никакого отношения к целочисленной функции, которая должна сдвигать только n бит.

Возможно, мне следовало задать вопрос, почему я не видел этого. Почему я использовал MathPow() в первую очередь? Я не знаю этого. Последний раз я занимался ассемблером 15 лет назад, сегодня я привык думать о проблемах в более высоких абстракциях. Может быть, причина в этом. Где-то в моем мозгу есть сильная связь с тем, что n-й бит - это 2^n, я просто записал это, не задумываясь ни на секунду. Программист на ассемблере никогда бы так не поступил. Сдвиг влево - это умножение на 2, умножение на 2 - это сдвиг влево.

 
Привет, ребята, просто интересно, зачем вам нужно более одного эксперта, работающего с одним и тем же tf и символом с одинаковыми настройками?

Мое решение для постоянства - использовать 32 бита int для хранения tf, которые я использую (их 10), версии эксперта или торгового метода, который открыл ордер (у меня их 4). Остается еще много битов в запасе, если понадобится. Для этого я использую побитовые операции и некоторые функции преобразования. Я знаю, что другие делают это или что-то подобное, но поскольку этого, похоже, недостаточно для ваших ситуаций, я все еще пытаюсь разобраться с вопросом, который я задал.
 
7bit:

Как в вашем примере Symbol() станет частью MN? У вас есть номер эксперта и номер таймфрейма, но как насчет символа?

Это не так, но управление капиталом, которое я использую, основывается на MN. Поэтому в данном случае мне нужно, чтобы они все были одинаковыми, чтобы ММ учитывал все открытые сделки. Я всегда помещаю советника, включая версию и настройки приоритета, которые я использую, в поле Комментарий к сделке, чтобы я знал, какую версию и таймфрейм использует советник, который я разрабатываю, и регистрирую в MQL4 Strategy Tester и могу сортировать их с помощью поля Trade#, валютной пары или комментария. Когда я просматриваю журнал, он сообщает мне, для какой валюты совершена сделка. Когда я переношу их в Excel для анализа, я могу сортировать их по любому полю.
Я вижу преимущества вашего подхода и, возможно, воспользуюсь им когда-нибудь в будущем. Но, будучи NuB, я использую MM из кодовой базы MQL4.Com. Так что на данном этапе моего обучения программированию ММ не является моим приоритетом. Хотя, если я найду лучший метод, который я смогу вставить, я сделаю это до тех пор, пока ММ не окажется на вершине моего списка приоритетов, я не против его использования. Нам, НУБам, нужна любая помощь, которую мы можем получить!
Что касается имени и/или номера версии, то в MN разрешены только цифры, но не буквы.
Я не просматривал ваш код, но предполагаю, что ваш алгоритм преобразует имя в часть вашего MN, и в этом случае он не сможет сразу сказать вам, к какой валютной паре вы обращаетесь.
 
FourX:
Ваш алгоритм преобразует имя в часть MN, и в этом случае он не сразу скажет вам, к какой валютной паре вы обращаетесь.

Он надежно преобразует любую строку в уникальное целое число. Это преобразование является односторонним, но мне никогда не нужно преобразовывать его обратно.

Все, что мне нужно знать, это то, что эти сделки с одинаковым номером принадлежат друг другу. Это просто идентификационный номер, позволяющий легко найти все сделки данной конкретной комбинации советника/символа/таймфрейма с помощью одного единственного if() в цикле. Единственное, что нужно знать об этом номере, это то, что он уникален для каждой комбинации советника/символа/таймфрейма и что он детерминирован и не изменится, если мой компьютер сломается.

Все сделки, логически связанные между собой, будут иметь один и тот же MN. Если когда-нибудь позже мне понадобится сказать, на каком символе они были сделаны (например, чтобы сделать статистику в конце месяца), я могу просто использовать OrderSymbol() для этих ордеров.

 
circlesquares wrote >>
Привет, ребята, просто интересно, зачем вам нужно более одного эксперта, работающего с одним и тем же tf, и символом с одинаковыми настройками?

Мое решение для постоянства - использовать 32 бита int для хранения tf, которые я использую (их 10), версии эксперта или торгового метода, который открыл ордер (у меня их 4). Остается еще много битов в запасе, если понадобится. Для этого я использую побитовые операции и некоторые функции преобразования. Я знаю, что другие делают это или что-то подобное, но поскольку этого, похоже, недостаточно для ваших ситуаций, я все еще пытаюсь разобраться с вопросом, который я задал.


Я не могу говорить за других, но у меня есть советник, которому может потребоваться некоторое время, чтобы закрыть ордер, и он пропускает новые точки входа, потому что он все еще не закрыт предыдущим ордером. Я бы хотел, чтобы он обрабатывал каждый вход независимо и следовал каждой сделке в соответствии с правилами каждой сделки (скользящий sl, закрытие половины при первом достижении tp и т.д.).
 
joetrader:


Я не могу говорить за других, но у меня есть советник, который может долго закрывать ордер, и он пропускает новые точки входа, потому что предыдущий ордер еще не закрыт. Я бы хотел, чтобы он обрабатывал каждый вход независимо и следовал каждой сделке в соответствии с правилами каждой сделки (скользящий sl, закрытие половины при первом достижении tp и т.д.).

Понятно. Значит, он завис в ожидании ответа сервера, а вы тем временем могли бы открывать другие ордера?

Но разве занятый торговый контекст не останавливает любые действия, связанные с ордером?

Я думаю, пока он работает, это все, что действительно важно.

 

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