CustomSymbolXXX проблемы

 

решил снова обратится к кастомным символам, но глюки там как были так и остались :-)

при создании символа, непосредственно после CustomSymbolCreate:

не выставятся  SYMBOL_CURRENCY_BASE, SYMBOL_CURRENCY_PROFIT - CustomSymbolSetString() говорит ok, ошибок нет, но ничего не меняется, валюты берутся из имени - по 3 символа..

также SYMBOL_VOLUME_MIN

на скриншоте, в зелёным описании символа - параметры которые задавались при создании..красным - что получилось


возможно требуется некая очерёдность при задании свойств ? 

 

скрипт для проверки :

#property copyright "Maxim A.Kuznetsov"
#property link      "https://www.luxtrade.tk"
#property version   "1.00"

string symbolGroup="test";
string symbolName="ETHWUSDT_test";
string symbolBase="ETHW";
string symbolQuote="USDT";
int symbolDigits=3;
double symbolPoint=0.001;

int    symbolLotDigits=2;
double symbolMinLot=0.01;
double symbolMaxLot=37500.0;
double symbolLotStep=0.01;
void OnStart()
{
   bool is_custom=false;
   if (SymbolExist(symbolName,is_custom)) {
      if (!is_custom) {
         Alert("not a custom");
         return;
      }
      SymbolSelect(symbolName,false);
      if (!CustomSymbolDelete(symbolName)) {
         Alert("CustomSymbolDelete()");
      }
      Sleep(1000);   // wait ?
   }
   if (!CustomSymbolCreate(symbolName,symbolGroup)) {
      Alert("unable to create "+IntegerToString(GetLastError()));
      return;
   }
   if (!CustomSymbolSetString(symbolName,SYMBOL_CURRENCY_BASE,symbolBase)) {
      Alert("set SYMBOL_CURRENCY_BASE "+IntegerToString(GetLastError()));
   }
   if (!CustomSymbolSetString(symbolName,SYMBOL_CURRENCY_PROFIT,symbolQuote)) {
      Alert("set SYMBOL_CURRENCY_PROFIT "+IntegerToString(GetLastError()));
   }
   if (!CustomSymbolSetInteger(symbolName,SYMBOL_DIGITS,symbolDigits)) {
      Alert("set SYMBOL_DIGITS "+IntegerToString(GetLastError()));
   }
   if (!CustomSymbolSetDouble(symbolName,SYMBOL_POINT,symbolPoint)) {
      Alert("set SYMBOL_POINT "+IntegerToString(GetLastError()));
   }
   if (!CustomSymbolSetDouble(symbolName,SYMBOL_VOLUME_STEP,NormalizeDouble(symbolLotStep,symbolLotDigits))) {
      Alert("set SYMBOL_VOLUME_STEP "+IntegerToString(GetLastError()));
   }
   if (!CustomSymbolSetDouble(symbolName,SYMBOL_VOLUME_MIN,NormalizeDouble(symbolMinLot,symbolLotDigits))) {
      Alert("set SYMBOL_VOLUME_MIN "+IntegerToString(GetLastError()));
   }
   if (!CustomSymbolSetDouble(symbolName,SYMBOL_VOLUME_MAX,NormalizeDouble(symbolMaxLot,symbolLotDigits))) {
      Alert("set SYMBOL_VOLUME_MAX "+IntegerToString(GetLastError()));
   }
   Sleep(1000);   // Wait
   if (!SymbolSelect(symbolName,true)) {
      Alert("SymbolSelect()");
      return;
   }
   if (SymbolInfoString(symbolName,SYMBOL_CURRENCY_BASE)!=symbolBase) {
      Alert("get SYMBOL_CURRENCY_BASE");
   }
   if (SymbolInfoString(symbolName,SYMBOL_CURRENCY_PROFIT)!=symbolQuote) {
      Alert("get SYMBOL_CURRENCY_PROFIT");
   }
   if (SymbolInfoInteger(symbolName,SYMBOL_DIGITS)!=symbolDigits) {
      Alert("get SYMBOL_DIGITS");
   }
   if (SymbolInfoDouble(symbolName,SYMBOL_POINT)!=symbolPoint) {
      Alert("get SYMBOL_POINT");
   }
   if (SymbolInfoDouble(symbolName,SYMBOL_VOLUME_MIN)!=symbolMinLot) {
      Alert("get SYMBOL_VOLUME_MIN");
   }
   if (SymbolInfoDouble(symbolName,SYMBOL_VOLUME_MAX)!=symbolMaxLot) {
      Alert("get SYMBOL_VOLUME_MAX");
   }
   if (SymbolInfoDouble(symbolName,SYMBOL_VOLUME_STEP)!=symbolLotStep) {
      Alert("get SYMBOL_VOLUME_STEP");
   }
}

 типичный результат:

SYMBOL_VOLUME_MIN - просто не ставится, говорит что 0.01 некорректно.

SYMBOL_CURRENCY_BASE - якобы выставляется, но на самом деле НЕТ (CustomSymbolSetString() - успешен, SymbolInfoString() потом возвращает иное)

SYMBOL_CURRENCY_PROFIT - якобы выставляется, но на самом деле НЕТ

 
Maxim Kuznetsov #:

скрипт для проверки :

 типичный результат:

SYMBOL_VOLUME_MIN - просто не ставится, говорит что 0.01 некорректно.

SYMBOL_CURRENCY_BASE - якобы выставляется, но на самом деле НЕТ (CustomSymbolSetString() - успешен, SymbolInfoString() потом возвращает иное)

SYMBOL_CURRENCY_PROFIT - якобы выставляется, но на самом деле НЕТ

https://www.mql5.com/ru/forum/304554/page43#comment_48230020

https://www.mql5.com/ru/forum/170952/page140#comment_12489183

https://www.mql5.com/ru/forum/304554/page49#comment_52295556

Стоит попробовать скопировать настройки с символа оригинала и только после изменять то что нужно.

https://www.mql5.com/ru/forum/304554/page48#comment_52290383

 
Aleksandr Slavskii #:

https://www.mql5.com/ru/forum/304554/page43#comment_48230020

https://www.mql5.com/ru/forum/170952/page140#comment_12489183

https://www.mql5.com/ru/forum/304554/page49#comment_52295556

Стоит попробовать скопировать настройки с символа оригинала и только после изменять то что нужно.

https://www.mql5.com/ru/forum/304554/page48#comment_52290383

SYMBOL_CURRENCY_BASE, _PROFIT чё-то не ставятся вообще ни в какую, не взирая на INDUSTRY, SECTOR.. особо радует одинаковое отсутствие как ошибок, так и результата :-)

SYMBOL_VOLUME_MIN - кричит про некорректное значение. Пробовал изменять последовательность как по ссылкам, всё равно.

Два года не возвращался к СustomSymbol, в надёжде что починят..Сегодня день потерял, чтобы проверить. Всё осталось по прежнему - всё глючит, а что не глючит имеет неочевидное поведение овеянное исключительно в устной традиции. 

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

а ведь CustomSymbol когда-то могло быть киллер-фичей по сравнению с 4-кой :-)

 
Maxim Kuznetsov #:

SYMBOL_CURRENCY_BASE, _PROFIT чё-то не ставятся вообще ни в какую, не взирая на INDUSTRY, SECTOR.. особо радует одинаковое отсутствие как ошибок, так и результата :-)

Устанавливать нужно ENUM_SYMBOL_CALC_MODE, а не сектор.

 
Stanislav Korotky #:

Устанавливать нужно ENUM_SYMBOL_CALC_MODE, а не сектор.

Я проверил, это не совсем так. Просто установить  CALC_MODE не достаточно.

Я скопировал настройки из EURUSD, применил все настройки из скрипта +поменял  CALC_MODE, и не помогло это, валюта берётся всё равно из названия символа. К тому же там размер пункта пропал и ещё несколько параметрв.

Сделал всё то же на фортсе с ришкой, там всё красиво, без алертов отработало.

Судя по всему нужно менять настройки символа комплексно иначе не работает.

А правильная последовательность сеттеров думается мне прописана в config.json.   Не проверял.

 
Stanislav Korotky #:

Устанавливать нужно ENUM_SYMBOL_CALC_MODE, а не сектор.

пояснительную бригаду! :-)

каким образом SYMBOL_CALC_MODE может взаимоувязаться с SYMBOL_CURRENCY_BASE, SYMBOL_CURRENCY_QUOTE (это просто имена, строки) и воспрепятствывать их изменению ? Если почему-то нельзя, то отчего нет ошибки от CustomSymbolSetString (это вот точно недоделка)...

при том что SYMBOL_CURRENCY_MARGIN можно успешно менять. Хотя как раз CALC_MODE более влияет на "как исчисляется маржа"

PS/ копировать из символа в символ нельзя, потому что оригинала может и не быть на целевом терминале; шаблонный символ тоже надо уметь создавать

 
Maxim Kuznetsov #:

пояснительную бригаду! :-)

Это к MQ. Обычно они говорят - "так исторически сложилось и мы менять не будем".

 
Aleksandr Slavskii #:

Я проверил, это не совсем так. Просто установить  CALC_MODE не достаточно.

Я скопировал настройки из EURUSD, применил все настройки из скрипта +поменял  CALC_MODE, и не помогло это, валюта берётся всё равно из названия символа. К тому же там размер пункта пропал и ещё несколько параметрв.

Нужен пример отредактированного кода. Там последовательность вызовов важна, т.е. например CALC_MODE нужно сперва установить не форекс, только потом менять валюты.

 
Stanislav Korotky #:

Это к MQ. Обычно они говорят - "так исторически сложилось и мы менять не будем".

Тут вопрос - "как именно исторически сложилось"...

по шагам - какие свойства и в какой очерёдности задать свежесозданному символу, чтобы они корректно задались. 

 
Stanislav Korotky #:

Нужен пример отредактированного кода. Там последовательность вызовов важна, т.е. например CALC_MODE нужно сперва установить не форекс, только потом менять валюты.

Ух ты, заработало !!!  Если менять сначала CALC_MODE , то да, работает.

#property copyright "Maxim A.Kuznetsov"
#property link      "https://www.luxtrade.tk"
#property version   "1.00"

string symbolGroup = "test";
string symbolName = "ETHWUSDT_test";
string symbolBase = "ETHW";
string symbolQuote = "USDT";
int symbolDigits = 3;
double symbolPoint = 0.001;

int    symbolLotDigits = 2;
double symbolMinLot = 0.01;
double symbolMaxLot = 37500.0;
double symbolLotStep = 0.01;
//+------------------------------------------------------------------+
void OnStart()
  {
   bool is_custom = false;
   if(SymbolExist(symbolName, is_custom))
     {
      if(!is_custom)
        {
         Alert("not a custom");
         return;
        }
      SymbolSelect(symbolName, false);
      if(!CustomSymbolDelete(symbolName))
        {
         Alert("CustomSymbolDelete()");
        }
      Sleep(1000);   // wait ?
     }
   if(!CustomSymbolCreate(symbolName, "\\" + symbolName, _Symbol))
     {
      Alert("unable to create " + IntegerToString(GetLastError()));
      return;
     }
   if(!CustomSymbolSetInteger(symbolName, SYMBOL_TRADE_CALC_MODE, SYMBOL_CALC_MODE_FUTURES))
     {
      Alert("set SYMBOL_TRADE_CALC_MODE " + IntegerToString(GetLastError()));
     }

   if(!CustomSymbolSetString(symbolName, SYMBOL_BASIS, symbolBase))
     {
      Alert("set SYMBOL_CURRENCY_BASE " + IntegerToString(GetLastError()));
     }

   if(!CustomSymbolSetString(symbolName, SYMBOL_CURRENCY_MARGIN, symbolBase))
     {
      Alert("set SYMBOL_CURRENCY_BASE " + IntegerToString(GetLastError()));
     }

   if(!CustomSymbolSetString(symbolName, SYMBOL_CURRENCY_BASE, symbolBase))
     {
      Alert("set SYMBOL_CURRENCY_BASE " + IntegerToString(GetLastError()));
     }
   if(!CustomSymbolSetString(symbolName, SYMBOL_CURRENCY_PROFIT, symbolQuote))
     {
      Alert("set SYMBOL_CURRENCY_PROFIT " + IntegerToString(GetLastError()));
     }
   if(!CustomSymbolSetInteger(symbolName, SYMBOL_DIGITS, symbolDigits))
     {
      Alert("set SYMBOL_DIGITS " + IntegerToString(GetLastError()));
     }
   if(!CustomSymbolSetDouble(symbolName, SYMBOL_POINT, symbolPoint))
     {
      Alert("set SYMBOL_POINT " + IntegerToString(GetLastError()));
     }
   if(!CustomSymbolSetDouble(symbolName, SYMBOL_VOLUME_STEP, NormalizeDouble(symbolLotStep, symbolLotDigits)))
     {
      Alert("set SYMBOL_VOLUME_STEP " + IntegerToString(GetLastError()));
     }
   if(!CustomSymbolSetDouble(symbolName, SYMBOL_VOLUME_MIN, NormalizeDouble(symbolMinLot, symbolLotDigits)))
     {
      Alert("set SYMBOL_VOLUME_MIN " + IntegerToString(GetLastError()));
     }
   if(!CustomSymbolSetDouble(symbolName, SYMBOL_VOLUME_MAX, NormalizeDouble(symbolMaxLot, symbolLotDigits)))
     {
      Alert("set SYMBOL_VOLUME_MAX " + IntegerToString(GetLastError()));
     }
   Sleep(1000);   // Wait
   if(!SymbolSelect(symbolName, true))
     {
      Alert("SymbolSelect()");
      return;
     }

   if(SymbolInfoString(symbolName, SYMBOL_CURRENCY_BASE) != symbolBase)
     {
      Alert("get SYMBOL_CURRENCY_BASE");
     }
   if(SymbolInfoString(symbolName, SYMBOL_CURRENCY_PROFIT) != symbolQuote)
     {
      Alert("get SYMBOL_CURRENCY_PROFIT");
     }
   if(SymbolInfoInteger(symbolName, SYMBOL_DIGITS) != symbolDigits)
     {
      Alert("get SYMBOL_DIGITS");
     }
   if(SymbolInfoDouble(symbolName, SYMBOL_POINT) != symbolPoint)
     {
      Alert("get SYMBOL_POINT");
     }
   if(SymbolInfoDouble(symbolName, SYMBOL_VOLUME_MIN) != symbolMinLot)
     {
      Alert("get SYMBOL_VOLUME_MIN");
     }
   if(SymbolInfoDouble(symbolName, SYMBOL_VOLUME_MAX) != symbolMaxLot)
     {
      Alert("get SYMBOL_VOLUME_MAX");
     }
   if(SymbolInfoDouble(symbolName, SYMBOL_VOLUME_STEP) != symbolLotStep)
     {
      Alert("get SYMBOL_VOLUME_STEP");
     }
  }
//+------------------------------------------------------------------+


Я там немного лишнего навтыкал, просто хотелось посмотреть меняется или нет. Меняется)

Значит моё предположение, что нужно бы соблюдать такую же последовательность как в файле конфигурации, не верно.