5 цифр обнаружения - страница 6

 
cameofx 2010.07.29 10:52

I use below functions now, and it's usable across different brokers & instruments.

double vPoint; 
if(Digits == 2 || Digits == 4) vPoint = Point; else
if(Digits == 3 || Digits == 5) vPoint = Point*10; // I use this for my indies; call once on init() & use where Point supposed to be used in start() 

double Poin() 
{ 
   int d = Digits;
   switch(d){
   case 2 : {return(Point); break;}
   case 4 : {return(Point); break; }
   case 3 : {return(Point*10); break;}
   case 5 : {return(Point*10); break:}
   default : return;
} // I just come up with this. Untested but should be ok/robust. To be used to replace Point for trade parameters calculations. 

cheers, ~ cameo

Вот альтернативное решение проблемы, которое я использую...

int init()
  {
   double SymPoint;
   if (Point == 0.00001) SymPoint = 0.0001; //5 digits
   else if (Point == 0.001) SymPoint = 0.01; //3 digits
   else SymPoint = Point; //Normal
   
   return(0);
  }

Тогда просто используйте переменную SymPoint вместо переменной Point. Очень похоже на Cameo

 

Чтобы еще больше запутать ситуацию, BrocoTrader имеет ценные бумаги с 0 до 5 цифр для своих различных ценных бумаг...

 
kennyhubbard:

Привет 7bit,

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

Достаточно взглянуть на демо-фид для The Collective FX, где они тестируют объединенный независимый фид различных поставщиков ликвидности (в отличие от единого согласованного фида из нескольких источников), каждый со своим собственным суффиксом валютной пары (наконец-то мы нашли применение суффиксу?), чтобы осознать масштаб проблемы. Это означает, что в рамках одной платформы вы сможете выбрать EURUSD_fx, EURUSDm или EURUSD_dbfx. Уже одно это может проделать огромную дыру в вашей стратегии, поскольку некоторые из них имеют 4-значные цены, а другие - 5-значные.

Метод "if (Digits == 3 || Digits == 5)" является настолько всеобъемлющим, насколько вы можете найти, поскольку он работает на простой предпосылке, что у вас есть только 2 вида брокеров, т.е. те, которые имеют целые пункты и те, которые имеют 1/10 пунктов. Этот случай охватывает 2/3/4/5 валютных пар и брокеров.

Для моей же информации, видели ли вы какой-нибудь случай, который был бы исключением? В случае с золотом, это всегда была двузначная котировка, а новые брокеры с котировкой в 1/10 пункта котируют его как трехзначную, так что даже этот случай хорошо охвачен.

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


Когда заходит разговор об этом, я заметил одну вещь: люди говорят о суффиксе, но никогда о префиксе. Можно иметь и префикс. Я встречал брокера, у которого есть префикс.

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

Однако я также обдумывал решение. Одно из моих решений заключалось в том, чтобы пройтись по списку символов и найти EURUSD, используя подстроку, чтобы добраться до него. Затем я получал значение ставки. Как только я получал значение ставки, я мог сделать doubletostr, затем найти способ подсчета символов в строке, например strlen или что-то в этом роде. Заноза в заднице, но это может дать мне 4 или 5 цифр, что было бы достаточно надежно. Исходя из этого, я мог бы создать основу для таких странностей, как Gold.

Это всего лишь теория, я еще не пробовал. Слишком занят, пытаясь разобраться с текущими проектами.

 

В моем советнике я использую этот код для расчета Pip - этот Pip я использую везде, где я имею дело с внешним bool, введенным в пунктах, как SL, TP, TS или я хочу видеть прибыль в пунктах ... проверено на 3 разных брокерах - без проблем на разных парах, DAX 1/2 десятичных чисел ... да, я знаю, что это выглядит похоже, как в постах раньше, но это работает вживую ...


Pip = Point;
if(Digits==2 || Digits==4 || Digits==6) Pip = 100*Point;
else if( Digits==1 || Digits==3 || Digits==5) Pip = 10*Point; 

В других индексах я тоже пытаюсь искать символ JPY... :-)

Tmp_int = StringFind(Symbol(), "JPY", 0);
if(Tmp_int<0) Pip = 10000;
else Pip = 100;
 
seic:

В моем советнике я использую этот код для расчета Pip - этот Pip я использую везде, где я имею дело с внешним bool, введенным в пунктах, как SL, TP, TS или я хочу видеть прибыль в пунктах ... проверено на 3 разных брокерах - без проблем на разных парах, DAX 1/2 десятичных чисел ... да, я знаю, что это выглядит похоже, как в постах раньше, но это работает вживую ...


В других моих индексах я тоже пытаюсь искать символ JPY... :-)

Вместо того, чтобы искать JPY, я хотел бы найти "точку" для каждой валюты. Это то, что я пробовал:

  ObjectSetText("pi_Pair01",MarketInfo(Pair01,MODE_POINT));

Итак, ожидается, что будет выдано соответствующее значение для пары, хранящейся в Pair01. Однако это возвращает только 0. Почему так? Pari01 в моем примере - это "AUDCAD", а индикатор прикреплен к графику EURUSD.

Экспериментируя дальше, я вижу, что это работает для некоторых валют, но не для других. Это сбивает с толку. Похоже, что MODE_DIGITS работает лучше. Как это может быть?

pi

 
seic:

В моем советнике я использую этот код для расчета Pip - этот Pip я использую везде, где я имею дело с внешним bool, введенным в пунктах, как SL, TP, TS или я хочу видеть прибыль в пунктах ... проверено на 3 разных брокерах - без проблем на разных парах, DAX 1/2 десятичных чисел ... да, я знаю, что это выглядит похоже, как в постах раньше, но это работает в реальном времени ...

if(Digits==2 || Digits==4 || Digits==6) Pip = 100*Point;

Только потому, что у вас 5-значный брокер. На 4-х значном брокере PIP и Point - это одно и то же.
Что такое TICK?-MQL4 и MetaTrader 4 - Форум по программированию на MQL4

 

А у InstaForex для USDSEK и USDNOK - 4 цифры, а для EURUSD - 5.


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

Причина обращения: