Roger:
Обычно я проверяю его только один раз в разделе init:
Ваш код не является надежным, есть символы с 1 или 2 (золото) или другим количеством цифр.
Я нашел лучший способ (все еще нужно протестировать его на нескольких брокерах). Он читает symbols.raw в папке history, чтобы найти имя eurusd, а затем использует MarketInfo();
/** * determine the pip multiplier (1 or 10) depending on how many * digits the EURUSD symbol has. This is done by first * finding the exact name of this symbol in the symbols.raw * file (it could be EURUSDm or EURUSDiam or any other stupid name * the broker comes up with only to break other people's code) * and then usig MarketInfo() for determining the digits. */ double pointsPerPip(){ int i; int digits; double ppp = 1; string symbol; int f = FileOpenHistory("symbols.raw", FILE_BIN | FILE_READ); int count = FileSize(f) / 1936; for (i=0; i<count; i++){ symbol = FileReadString(f, 12); if (StringFind(symbol, "EURUSD") != -1){ digits = MarketInfo(symbol, MODE_DIGITS); if (digits == 4){ ppp = 1; }else{ ppp = 10; } break; } FileSeek(f, 1924, SEEK_CUR); } FileClose(f); return (ppp); }
Это был код только для одной валюты. Если вы хотите использовать советника для нескольких валют, вам придется рассчитывать его для каждого случая отдельно.
7bit:
Я нашел лучший способ (все еще нужно протестировать его с некоторыми другими брокерами). Он читает symbols.raw в папке истории, чтобы найти имя eurusd, а затем использует MarketInfo();
Я нашел лучший способ (все еще нужно протестировать его с некоторыми другими брокерами). Он читает symbols.raw в папке истории, чтобы найти имя eurusd, а затем использует MarketInfo();
Это сломается, если они когда-нибудь изменят файл symbols.raw (и может не работать со старыми версиями MT4... хотя это, вероятно, не проблема).
Я использую тот же метод, что и Роджер, и он еще не вызывал у меня проблем.
Это сработает в большинстве случаев. Если в будущем вы обнаружите, что он не подходит, то просто перейдите этот мост, когда найдете его.
CB
Это сработает в большинстве случаев. Если в будущем вы обнаружите, что он не подходит, то просто перейдите этот мост, когда найдете его.
CB
//++++ These are adjusted for 5 digit brokers. double pips2points, // slippage 3 pips 3=points 30=points pips2dbl; // Stoploss 15 pips 0.0015 0.00150 int Digits.pips; // DoubleToStr(dbl/pips2dbl, Digits.pips) int init() { if (Digits == 5 || Digits == 3) { // Adjust for five (5) digit brokers. pips2dbl = Point*10; pips2points = 10; Digits.pips = 1; } else { pips2dbl = Point; pips2points = 1; Digits.pips = 0; }
WHRoeder:
if (Digits == 5 || Digits == 3) { // Adjust for five (5) digit brokers.Вы просто повторяете то же самое, что я уже нашел недостаточным. Использование одной только переменной Digits не помогает решить проблему (проблема определена мной в первом сообщении), так как она не учитывает, на каком символе она в данный момент работает и сколько цифр должно быть у этого символа. В некоторых экзотических парах может быть любое количество цифр от 0 до 5, а не только 5 или 3 против 4 или 2. Если бы все было так просто, я бы не открывал эту тему. Поэтому сейчас я просто использую цифры eurusd, независимо от того, на какой паре он работает. Найти реальное название eurusd было самой большой проблемой, и пока что метод symbols.raw кажется самым простым и самым надежным.
cloudbreaker:
Если в будущем вы обнаружите, что он не подходит, то просто перейдите этот мост, когда найдете его.
Я пытаюсь писать надежный код, который не сломается. Написание (заведомо) ошибочного кода и ожидание, пока он сломается, прежде чем я его исправлю, не соответствует моей философии того, как должна вестись разработка программного обеспечения.
Если в будущем вы обнаружите, что он не подходит, то просто перейдите этот мост, когда найдете его.
7bit wrote >>
Я пытаюсь написать надежный код, который не сломается. Написание (заведомо) ошибочного кода и ожидание, пока он сломается, прежде чем я его исправлю, не соответствует моей философии того, как должна вестись разработка программного обеспечения.
Я пытаюсь написать надежный код, который не сломается. Написание (заведомо) ошибочного кода и ожидание, пока он сломается, прежде чем я его исправлю, не соответствует моей философии того, как должна вестись разработка программного обеспечения.
Красота философии в том, что она может работать асинхронно с практичностью :)
-BB-
Разве это не простой (возможно, не такой простой с точки зрения математики) вопрос, заключающийся в том, чтобы определить, что такое один пункт по отношению к данной цене, а затем решить, в каком разряде он находится по сравнению с цифрами цены?
Простым способом достижения этого может быть взятие цены, добавление пункта и сравнение с вашим множителем + та же цена, если результат не тот же, увеличивайте ваш множитель в цикле, пока они не совпадут.
Простым способом достижения этого может быть взятие цены, добавление пункта и сравнение с вашим множителем + та же цена, если результат не тот же, увеличивайте ваш множитель в цикле, пока они не совпадут.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Есть ли у кого-нибудь еще более сложный алгоритм для поиска правильных цифр? Я думаю, все сводится к тому, что сначала нужно найти точное название символа EURUSD, а потом все остальное будет просто. Есть ли, например, простой способ перечислить все доступные символы, чтобы я мог искать имя, которое содержит или начинается с "EURUSD"?