скрипт для проверки :
#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 - якобы выставляется, но на самом деле НЕТ
скрипт для проверки :
типичный результат:
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
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-кой :-)
Я проверил, это не совсем так. Просто установить CALC_MODE не достаточно.
Я скопировал настройки из EURUSD, применил все настройки из скрипта +поменял CALC_MODE, и не помогло это, валюта берётся всё равно из названия символа. К тому же там размер пункта пропал и ещё несколько параметрв.
Сделал всё то же на фортсе с ришкой, там всё красиво, без алертов отработало.
Судя по всему нужно менять настройки символа комплексно иначе не работает.
А правильная последовательность сеттеров думается мне прописана в config.json. Не проверял.
пояснительную бригаду! :-)
каким образом SYMBOL_CALC_MODE может взаимоувязаться с SYMBOL_CURRENCY_BASE, SYMBOL_CURRENCY_QUOTE (это просто имена, строки) и воспрепятствывать их изменению ? Если почему-то нельзя, то отчего нет ошибки от CustomSymbolSetString (это вот точно недоделка)...
при том что SYMBOL_CURRENCY_MARGIN можно успешно менять. Хотя как раз CALC_MODE более влияет на "как исчисляется маржа"
PS/ копировать из символа в символ нельзя, потому что оригинала может и не быть на целевом терминале; шаблонный символ тоже надо уметь создавать
Я проверил, это не совсем так. Просто установить CALC_MODE не достаточно.
Я скопировал настройки из EURUSD, применил все настройки из скрипта +поменял CALC_MODE, и не помогло это, валюта берётся всё равно из названия символа. К тому же там размер пункта пропал и ещё несколько параметрв.
Нужен пример отредактированного кода. Там последовательность вызовов важна, т.е. например CALC_MODE нужно сперва установить не форекс, только потом менять валюты.
Нужен пример отредактированного кода. Там последовательность вызовов важна, т.е. например 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"); } } //+------------------------------------------------------------------+
Я там немного лишнего навтыкал, просто хотелось посмотреть меняется или нет. Меняется)
Значит моё предположение, что нужно бы соблюдать такую же последовательность как в файле конфигурации, не верно.- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
решил снова обратится к кастомным символам, но глюки там как были так и остались :-)
при создании символа, непосредственно после CustomSymbolCreate:
не выставятся SYMBOL_CURRENCY_BASE, SYMBOL_CURRENCY_PROFIT - CustomSymbolSetString() говорит ok, ошибок нет, но ничего не меняется, валюты берутся из имени - по 3 символа..
также SYMBOL_VOLUME_MIN
на скриншоте, в зелёным описании символа - параметры которые задавались при создании..красным - что получилось
возможно требуется некая очерёдность при задании свойств ?