Вопрос к знатокам по MODE_TICKVALUE

 

Есть следующий скрипт

//+------------------------------------------------------------------+
//|                                                      EURDKKm.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   int n,i;
   string ChartList[];
   n=GetSymbols(ChartList);
   
   for(i=0;i<ArraySize(ChartList);i++)
   {
      Print(ChartList[i]," ",DoubleToStr(MarketInfo(ChartList[i],MODE_TICKVALUE),4));
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+

int GetSymbols(string &SymbolsList[])
{
// Открываем файл  symbols.raw
   
   int hFile = FileOpenHistory("symbols.raw", FILE_BIN|FILE_READ);
   if(hFile < 0) return(-1);

// Определяем количество символов, зарегистрированных в файле
   
   int SymbolsNumber = FileSize(hFile) / 1936;
   ArrayResize(SymbolsList, SymbolsNumber);

// Считываем символы из файла
   
   for(int i = 0; i < SymbolsNumber; i++)
   {
      SymbolsList[i] = FileReadString(hFile, 12);
      FileSeek(hFile, 1924, SEEK_CUR);
   }
   FileClose(hFile);
// Возвращаем общее количество инструментов
   
   return(SymbolsNumber);
}

Есть live account у одного из спонсоров Чемпионата.

При запуске указанного скрипта на нём получаем следующий результат:

21:08:07 EURDKKm_all EURUSDm,M15: loaded successfully
21:08:07 EURDKKm_all EURUSDm,M15: AUDCADm 0.0954
21:08:07 EURDKKm_all EURUSDm,M15: AUDCHFm 0.0967
21:08:07 EURDKKm_all EURUSDm,M15: AUDJPYm 0.1167
21:08:07 EURDKKm_all EURUSDm,M15: AUDNZDm 0.0706
21:08:07 EURDKKm_all EURUSDm,M15: AUDUSDm 0.1000
21:08:07 EURDKKm_all EURUSDm,M15: CADJPYm 0.1167
21:08:07 EURDKKm_all EURUSDm,M15: CHFJPYm 0.1167
21:08:07 EURDKKm_all EURUSDm,M15: EURAUDm 0.0891
21:08:07 EURDKKm_all EURUSDm,M15: EURCADm 0.0954
21:08:07 EURDKKm_all EURUSDm,M15: EURCHFm 0.0967
21:08:07 EURDKKm_all EURUSDm,M15: EURDKKm 0.0000
21:08:07 EURDKKm_all EURUSDm,M15: EURGBPm 0.1554
21:08:07 EURDKKm_all EURUSDm,M15: EURJPYm 0.1167
21:08:07 EURDKKm_all EURUSDm,M15: EURNZDm 0.0706
21:08:07 EURDKKm_all EURUSDm,M15: EURUSDm 0.1000
21:08:07 EURDKKm_all EURUSDm,M15: GBPCADm 0.0954
21:08:07 EURDKKm_all EURUSDm,M15: GBPCHFm 0.0967
21:08:07 EURDKKm_all EURUSDm,M15: GBPJPYm 0.1167
21:08:07 EURDKKm_all EURUSDm,M15: GBPNZDm 0.0706
21:08:07 EURDKKm_all EURUSDm,M15: GBPUSDm 0.1000
21:08:07 EURDKKm_all EURUSDm,M15: NZDCHFm 0.0967
21:08:07 EURDKKm_all EURUSDm,M15: NZDJPYm 0.1167
21:08:07 EURDKKm_all EURUSDm,M15: NZDUSDm 0.1000
21:08:07 EURDKKm_all EURUSDm,M15: USDCADm 0.0954
21:08:07 EURDKKm_all EURUSDm,M15: USDCHFm 0.0967
21:08:07 EURDKKm_all EURUSDm,M15: USDJPYm 0.1167
21:08:07 EURDKKm_all EURUSDm,M15: USDSGDm 0.0184
21:08:07 EURDKKm_all EURUSDm,M15: USDZARm 0.0034

При запуске этого же скрипта на демо счёте значение EURDKKm составляет 0,0171.

Подскажите, пожалуйста, в чёи может быть проблема?

Мои подозрения сводятся к тому, что на live сервере стоят неправильные установки для EURDKKm. А что может быть на самом деле?

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

Возьмите функцию GetTickValue отсюда https://www.mql5.com/ru/forum/351

Заодно и корректное значение этого параметра будете получать всегда и на других валютных парах.

 
hrenfx:

Возьмите функцию GetTickValue отсюда https://www.mql5.com/ru/forum/351

Заодно и корректное значение этого параметра будете получать всегда и на других валютных парах.


Функцию взял. Преобразовал скрипт в следующий вид:

//+------------------------------------------------------------------+
//|                                                      EURDKKm.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
extern string BaseCurrency = "USD";

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   int n,i;
   string ChartList[];
   n=GetSymbols(ChartList);
   
   for(i=0;i<ArraySize(ChartList);i++)
   {
      Print(ChartList[i]," ",DoubleToStr(MarketInfo(ChartList[i],MODE_TICKVALUE),4)," ",DoubleToStr(GetTickValue(ChartList[i]),4));
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+

int GetSymbols(string &SymbolsList[])
{
// Открываем файл  symbols.raw
   
   int hFile = FileOpenHistory("symbols.raw", FILE_BIN|FILE_READ);
   if(hFile < 0) return(-1);

// Определяем количество символов, зарегистрированных в файле
   
   int SymbolsNumber = FileSize(hFile) / 1936;
   ArrayResize(SymbolsList, SymbolsNumber);

// Считываем символы из файла
   
   for(int i = 0; i < SymbolsNumber; i++)
   {
      SymbolsList[i] = FileReadString(hFile, 12);
      FileSeek(hFile, 1924, SEEK_CUR);
   }
   FileClose(hFile);
// Возвращаем общее количество инструментов
   
   return(SymbolsNumber);
}

double GetTickValue( string Symb )
{
  string Str, ProfitCurrency, SymbolPrefix;
  double Res, PriceExchage;
  
  ProfitCurrency = StringSubstr(Symb, 3, 3);
  SymbolPrefix = StringSubstr(Symb, 6);
  
  if (ProfitCurrency == BaseCurrency)
    Res = MarketInfo(Symb, MODE_LOTSIZE) * MarketInfo(Symb, MODE_TICKSIZE);
  else
  {
    Str = BaseCurrency + ProfitCurrency + SymbolPrefix;
    
    if (RealSymbol(Str))
    {
//      PriceExchage = MarketInfo(Str, MODE_BID); // Так считает MetaTrader4 - неправильно
      PriceExchage = MarketInfo(Str, MODE_ASK); // Правильный вариант
        
      Res = MarketInfo(Symb, MODE_LOTSIZE) * MarketInfo(Symb, MODE_TICKSIZE) / PriceExchage;
    }
    else
    {
      Str = ProfitCurrency + BaseCurrency + SymbolPrefix;

      PriceExchage = MarketInfo(Str, MODE_BID);
        
      Res = MarketInfo(Symb, MODE_LOTSIZE) * MarketInfo(Symb, MODE_TICKSIZE) * PriceExchage;
    }
  }
  
  return(Res);
}

bool RealSymbol( string Str )
{
  return(MarketInfo(Str, MODE_BID) != 0);
}

Результат мало что изменил для EURDKKm:

23:14:10 EURDKKm_all_new_function USDJPYm,M15: AUDCADm 0.0954 0.0953
23:14:10 EURDKKm_all_new_function USDJPYm,M15: AUDCHFm 0.0966 0.0965
23:14:10 EURDKKm_all_new_function USDJPYm,M15: AUDJPYm 0.1167 0.1166
23:14:10 EURDKKm_all_new_function USDJPYm,M15: AUDNZDm 0.0706 0.0706
23:14:10 EURDKKm_all_new_function USDJPYm,M15: AUDUSDm 0.1000 0.1000
23:14:10 EURDKKm_all_new_function USDJPYm,M15: CADJPYm 0.1167 0.1166
23:14:10 EURDKKm_all_new_function USDJPYm,M15: CHFJPYm 0.1167 0.1166
23:14:10 EURDKKm_all_new_function USDJPYm,M15: EURAUDm 0.0892 0.0892
23:14:10 EURDKKm_all_new_function USDJPYm,M15: EURCADm 0.0954 0.0953
23:14:10 EURDKKm_all_new_function USDJPYm,M15: EURCHFm 0.0966 0.0965
23:14:10 EURDKKm_all_new_function USDJPYm,M15: EURDKKm 0.0000 0.0000
23:14:10 EURDKKm_all_new_function USDJPYm,M15: EURGBPm 0.1553 0.1553
23:14:10 EURDKKm_all_new_function USDJPYm,M15: EURJPYm 0.1167 0.1166
23:14:10 EURDKKm_all_new_function USDJPYm,M15: EURNZDm 0.0706 0.0706
23:14:10 EURDKKm_all_new_function USDJPYm,M15: EURUSDm 0.1000 0.1000
23:14:10 EURDKKm_all_new_function USDJPYm,M15: GBPCADm 0.0954 0.0953
23:14:10 EURDKKm_all_new_function USDJPYm,M15: GBPCHFm 0.0966 0.0965
23:14:10 EURDKKm_all_new_function USDJPYm,M15: GBPJPYm 0.1167 0.1166
23:14:10 EURDKKm_all_new_function USDJPYm,M15: GBPNZDm 0.0706 0.0706
23:14:10 EURDKKm_all_new_function USDJPYm,M15: GBPUSDm 0.1000 0.1000
23:14:10 EURDKKm_all_new_function USDJPYm,M15: NZDCHFm 0.0966 0.0965
23:14:10 EURDKKm_all_new_function USDJPYm,M15: NZDJPYm 0.1167 0.1166
23:14:10 EURDKKm_all_new_function USDJPYm,M15: NZDUSDm 0.1000 0.1000
23:14:10 EURDKKm_all_new_function USDJPYm,M15: USDCADm 0.0954 0.0953
23:14:10 EURDKKm_all_new_function USDJPYm,M15: USDCHFm 0.0966 0.0965
23:14:10 EURDKKm_all_new_function USDJPYm,M15: USDJPYm 0.1167 0.1166
23:14:10 EURDKKm_all_new_function USDJPYm,M15: USDSGDm 0.0184 0.0184
23:14:10 EURDKKm_all_new_function USDJPYm,M15: USDZARm 0.0034 0.0034

Какие будут ещё предложения?

 
solandr:

Какие будут ещё предложения?

Чтобы разобраться, выведите следующие значения: MODE_TICKSIZE, MODE_LOTSIZE, MODE_BID.

Похоже, что проблема не только в MODE_TICKVALUE... 

 

Вот результат работы следующего Print в приведённом выше скрипте

Print(ChartList[i]," ",DoubleToStr(MarketInfo(ChartList[i],MODE_TICKVALUE),4)," ",DoubleToStr(GetTickValue(ChartList[i]),4)," ",DoubleToStr(MarketInfo(ChartList[i],MODE_TICKSIZE),5)," ",MarketInfo(ChartList[i],MODE_LOTSIZE)," ",DoubleToStr(MarketInfo(ChartList[i],MODE_BID),4));

13:35:52 EURDKKm_all_new_function USDJPYm,M15: AUDCADm 0.0954 0.0953 0.00001 10000 0.9355
13:35:52 EURDKKm_all_new_function USDJPYm,M15: AUDCHFm 0.0966 0.0966 0.00001 10000 0.9235
13:35:52 EURDKKm_all_new_function USDJPYm,M15: AUDJPYm 0.1168 0.1167 0.00100 10000 76.3950
13:35:52 EURDKKm_all_new_function USDJPYm,M15: AUDNZDm 0.0707 0.0707 0.00001 10000 1.2612
13:35:52 EURDKKm_all_new_function USDJPYm,M15: AUDUSDm 0.1000 0.1000 0.00001 10000 0.8921
13:35:52 EURDKKm_all_new_function USDJPYm,M15: CADJPYm 0.1168 0.1167 0.00100 10000 81.6390
13:35:52 EURDKKm_all_new_function USDJPYm,M15: CHFJPYm 0.1168 0.1167 0.00100 10000 82.7050
13:35:52 EURDKKm_all_new_function USDJPYm,M15: EURAUDm 0.0892 0.0892 0.00001 10000 1.4240
13:35:52 EURDKKm_all_new_function USDJPYm,M15: EURCADm 0.0954 0.0953 0.00001 10000 1.3325
13:35:52 EURDKKm_all_new_function USDJPYm,M15: EURCHFm 0.0966 0.0966 0.00001 10000 1.3156
13:35:52 EURDKKm_all_new_function USDJPYm,M15: EURDKKm 0.0000 0.0000 0.00001 10000 7.4498
13:35:52 EURDKKm_all_new_function USDJPYm,M15: EURGBPm 0.1553 0.1553 0.00001 10000 0.8180
13:35:52 EURDKKm_all_new_function USDJPYm,M15: EURJPYm 0.1168 0.1167 0.00100 10000 108.8290
13:35:52 EURDKKm_all_new_function USDJPYm,M15: EURNZDm 0.0707 0.0707 0.00001 10000 1.7964
13:35:52 EURDKKm_all_new_function USDJPYm,M15: EURUSDm 0.1000 0.1000 0.00001 10000 1.2708
13:35:52 EURDKKm_all_new_function USDJPYm,M15: GBPCADm 0.0954 0.0953 0.00001 10000 1.6287
13:35:52 EURDKKm_all_new_function USDJPYm,M15: GBPCHFm 0.0966 0.0966 0.00001 10000 1.6078
13:35:52 EURDKKm_all_new_function USDJPYm,M15: GBPJPYm 0.1168 0.1167 0.00100 10000 133.0050
13:35:52 EURDKKm_all_new_function USDJPYm,M15: GBPNZDm 0.0707 0.0707 0.00001 10000 2.1956
13:35:52 EURDKKm_all_new_function USDJPYm,M15: GBPUSDm 0.1000 0.1000 0.00001 10000 1.5531
13:35:52 EURDKKm_all_new_function USDJPYm,M15: NZDCHFm 0.0966 0.0966 0.00001 10000 0.7319
13:35:52 EURDKKm_all_new_function USDJPYm,M15: NZDJPYm 0.1168 0.1167 0.00100 10000 60.5490
13:35:52 EURDKKm_all_new_function USDJPYm,M15: NZDUSDm 0.1000 0.1000 0.00001 10000 0.7071
13:35:52 EURDKKm_all_new_function USDJPYm,M15: USDCADm 0.0954 0.0953 0.00001 10000 1.0486
13:35:52 EURDKKm_all_new_function USDJPYm,M15: USDCHFm 0.0966 0.0966 0.00001 10000 1.0351
13:35:52 EURDKKm_all_new_function USDJPYm,M15: USDJPYm 0.1168 0.1167 0.00100 10000 85.6360
13:35:52 EURDKKm_all_new_function USDJPYm,M15: USDSGDm 0.0184 0.0184 0.00001 2500 1.3557
13:35:52 EURDKKm_all_new_function USDJPYm,M15: USDZARm 0.0034 0.0034 0.00001 2500 7.3100

То есть дополнительные параметры MODE_TICKSIZE, MODE_LOTSIZE, MODE_BID больше нуля.

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

 
solandr:

То есть дополнительные параметры MODE_TICKSIZE, MODE_LOTSIZE, MODE_BID больше нуля.

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

Проблема понятна, у вас из DKK-пар только EURDKK. Функция бы работала, если бы была еще пара USDDKK. Но ее нет...

Решение универсальное писать не стал, вот решение для всех пар EURXXX c валютой счета в USD:

// AccountCurrency() == "USD"
double GetTickValueEURXXX( string Symb )
{
  string EURUSD = StringSubstr(Symb, 0, 3) + "USD" + StringSubstr(Symb, 6);
  double PriceExchange, Res;
        
  if (Symb == EURUSD)
    PriceExchange = 1;
  else
    PriceExchange = MarketInfo(EURUSD, MODE_BID) / MarketInfo(Symb, MODE_ASK);
    
  Res = MarketInfo(Symb, MODE_LOTSIZE) * MarketInfo(Symb, MODE_TICKSIZE) * PriceExchange;
    
  return(Res);
} 
 

Спасибо! Теперь с помощью функции GetTickValueEURXXX и на Live счёте видно значение EURDKKm = 0,0171.

Вопрос только почему это значение не получается с помощью встроенной функции MarketInfo(ChartList[i],MODE_TICKVALUE)? Хоть она и менее точная, но тем не менее странное расхождение между её показаниями на live (0.0000) и на demo (0.0171).

Ну на этот вопрос может ответить лишь MetaQuotes.

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