5 цифр обнаружения

 
double pointsPerPip(){
   string suffix = StringSubstr(Symbol(), 6);
   int digits = MarketInfo("EURUSD" + suffix, MODE_DIGITS);
   if (digits == 0){
      digits = MarketInfo("EURUSD", MODE_DIGITS);
   }
   if (digits == 0){
      return(1);
   }else{
      if (digits == 5){
         return(10);
      }
   }
   return(1);
}
В настоящее время я пытаюсь найти наиболее надежный способ определить, что нам нужно - 1 или 10 в качестве множителя пунктов. Есть брокеры, у которых этот символ называется EURUSDm или EURUSDiam или другая забавная ерунда, добавленная брокерами без какой-либо другой причины, кроме как сломать наш код, а также есть названия символов, которые не содержат ровно 6 символов, например, GOLD или GOLDm, и вышеупомянутый способ НЕ может справиться с этим.

Есть ли у кого-нибудь еще более сложный алгоритм для поиска правильных цифр? Я думаю, все сводится к тому, что сначала нужно найти точное название символа EURUSD, а потом все остальное будет просто. Есть ли, например, простой способ перечислить все доступные символы, чтобы я мог искать имя, которое содержит или начинается с "EURUSD"?
 

Обычно я проверяю его только один раз в разделе init:

int mypoint;
int init()
{
if(MarketInfo(Symbol(), MODE_DIGITS)==3||MarketInfo(Symbol(), MODE_DIGITS)==5)
mypoint=10;
else mypoint=1;
}
...
 
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 (и может не работать со старыми версиями MT4... хотя это, вероятно, не проблема).

 
Я использую тот же метод, что и Роджер, и он еще не вызывал у меня проблем.
Это сработает в большинстве случаев. Если в будущем вы обнаружите, что он не подходит, то просто перейдите этот мост, когда найдете его.

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-
 
Разве это не простой (возможно, не такой простой с точки зрения математики) вопрос, заключающийся в том, чтобы определить, что такое один пункт по отношению к данной цене, а затем решить, в каком разряде он находится по сравнению с цифрами цены?
Простым способом достижения этого может быть взятие цены, добавление пункта и сравнение с вашим множителем + та же цена, если результат не тот же, увеличивайте ваш множитель в цикле, пока они не совпадут.