Без кода трудно объяснить. Может тот самый пример приведете, в котором мало написано?
какой код вам показать? тот что в примерах есть у всех?
там пока для меня на неизвестном языке написано (((
какой код вам показать? тот что в примерах есть у всех?
там пока для меня на неизвестном языке написано (((
Примеры то есть у всех, но о каком именно примере Вы ведете речь, никто не знает. Его и просят показать. А заодно поясните, что подразумевается под словосочетанием "тикер символа".
Примеры то есть у всех, но о каком именно примере Вы ведете речь, никто не знает. Его и просят показать. А заодно поясните, что подразумевается под словосочетанием "тикер символа".
тикер = имя
EURUSD; GBPUSD; и тд..
моя длл работает сразу с несколькими инструментами, соответственно необходимо добавить функцию проверки с тем ли инструментом работает длл или нет..
сейчас в коде индикатора есть массив со всеми тикерами.. он парсится и забивается в стринг массив
и потом обращение в длл к данным определенного тикера идет по порядковому номеру из этого массива, однако есть необходимость проверять в длл тикер инструмента.
я делал так:
dll
MT4_EXPFUNC void __stdcall SetNameSym(const char idsym, wchar_t *name) { wprintf(L"GetStringValue takes \"%s\"\n", name); vecSymb[idsym].nameS = name; }
в коде индикатора отсылал
SetNameSym(idsym, ArrSym[idsym]);
в результате в длл передается тикер символа.. однако если символов несколько то при получении имен в цикле - везде идет имя последнего тикера...
в коде индикатора отсылал
В DLL нельзя передавать массив строк. Только построчно: https://docs.mql4.com/ru/runtime/imports
Структуры, содержащие динамические массивы, строки, классы, другие сложные структуры, а также статические либо динамические массивы перечисленных объектов, не могут быть переданы в качестве параметра в импортируемую функцию.
вношу тикеры символов:
extern string symbols = "EURUSD;"; // Массив с тикерами символов
инициализирую массив с символами:
//+------------------------------------------------------------------+ //| Инициализирую массив с символами инструментов | //+------------------------------------------------------------------+ void InitArrSym() { int i = 0, nach = 0, kon = 0, lenghtstr = StringLen(symbols); while (i<lenghtstr) { sizeSym++; ArrayResize( arrSym, sizeSym); kon = StringFind(symbols, ";", nach); arrSym[sizeSym-1] = StringSubstr(symbols, nach, kon-nach); nach = kon+1; i= kon+1;} for ( i = 0; i<9; i++) { if (arrTf[i] == Period()) idTf = i; } for ( i = 0; i<sizeSym; i++) { if (arrSym[i] == Symbol()) idSym = i; } }
инициализирую в длл все символы и вношу данные:
//+------------------------------------------------------------------+ //| Инициализирую массив с символами инструментов в dll | //+------------------------------------------------------------------+ void InitDllSym() { //---- SetGeneral(t1, t2, ma, sizeSym); // Устанавливаем глобальные переменные в ДЛЛ for (char i = 0; i < sizeSym; i++) { SetNewSym(); // Создаем объекты символов //SetNameSym(i, arrSym[i]); // Вносим тикер символа for (char y = 0; y < 9; y++) { int ibar = iBars(arrSym[i], arrTf[y]), copiedH=CopyHigh(arrSym[i],arrTf[y],0,ibar,Hg), copiedL=CopyLow(arrSym[i],arrTf[y],0,ibar,Lw), copiedT=CopyTime(arrSym[i],arrTf[y],0,ibar,Tm), arrtm[]; ArrayResize(arrtm, ibar); for (int ii = 0 ; ii<ibar; ii++) arrtm[ii] = Tm[ii]; SetDataFromSymTf(i,y,Hg, Lw, arrtm, ibar, true); // передаем в ДЛЛ все данные } } AllCalculating(); // ДЛЛ делает пересчет }
в длл:
MT4_EXPFUNC void __stdcall SetGeneral(const char _t1, const char _t2, const short _ma, const int _cntSym) { t1 = _t1; t2 = _t2; ma = _ma; cntSym = _cntSym; IsConnect = true; } MT4_EXPFUNC void __stdcall SetNewSym() { if (cnt < cntSym) { s = new sym; vecSymb.push_back(*s); delete s; cnt++; } } MT4_EXPFUNC void __stdcall SetNameSym(const char idsym, wchar_t *name) { wprintf(L"GetStringValue takes \"%s\"\n", name); vecSymb[idsym].nameS = name; }
MT4_EXPFUNC void __stdcall SetDataFromSymTf(const char idSym, const char idtf, const double *Hg, const double *Lw, const unsigned int *Tm, const int bars, const bool All) { for (int i = 0; i < bars; i++) { vecSymb[idSym].tfm[idtf].BH.push_back(Hg[i]); vecSymb[idSym].tfm[idtf].BL.push_back(Lw[i]); vecSymb[idSym].tfm[idtf].TM.push_back(Tm[i]);// Хай, Лой, Время } vecSymb[idSym].tfm[idtf].LastTime = Tm[bars - 1];// Время последнего бара if (All) // первое включение импорт всех данных { vecSymb[idSym].tfm[idtf].Bars = bars; vecSymb[idSym].tfm[idtf].StartTime = Tm[0]; } else // повторный экспорт части данных, после которого необходимо пересчитать таймфреймы и значения МА { vecSymb[idSym].tfm[idtf].BarsBeforeAdd1 = vecSymb[idSym].tfm[idtf].High1.size(); vecSymb[idSym].tfm[idtf].BarsBeforeAdd2 = vecSymb[idSym].tfm[idtf].High2.size(); vecSymb[idSym].tfm[idtf].Bars = vecSymb[idSym].tfm[idtf].Bars + bars; _Mathematick(idSym, idtf, bars); _HistUrInit(idSym, idtf, bars); _Trand(idSym, idtf, bars); } }
По-моему напрасно решили копировать ценовые массивы, создавайте ссылку на существующие данные: https://docs.mql4.com/ru/array/arraycopyrates, первая форма, работает ощутимо быстрее + удобнее.
Объявление в библиотеке:
#pragma pack(push, 1) struct MqlRates { ... ... }; #pragma pack(pop)
По-моему напрасно решили копировать ценовые массивы, создавайте ссылку на существующие данные: https://docs.mql4.com/ru/array/arraycopyrates, первая форма, работает ощутимо быстрее + удобнее.
Объявление в библиотеке:
вполне возможно, поначалу так и делал .. но потом решил что будет лучше так как делаю сейчас. может быть чуть позже вернусь к структуре
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
подскажите пожалуйста как это происходит?
в примерах об этом мало что написано ((