передача тикера символа в DLL на С++ и вызов в МТ4 обратно

 

подскажите пожалуйста как это происходит? 

в примерах об этом мало что написано (( 

 
Без кода трудно объяснить. Может тот самый пример приведете, в котором мало написано?
 
Zhunko:
Без кода трудно объяснить. Может тот самый пример приведете, в котором мало написано?


какой код вам показать? тот что в примерах есть у всех? 

там пока для меня на неизвестном языке написано (((  

 
imromann:


какой код вам показать? тот что в примерах есть у всех? 

там пока для меня на неизвестном языке написано (((  


Примеры то есть у всех, но о каком именно примере Вы ведете речь, никто не знает. Его и просят показать. А заодно поясните, что подразумевается под словосочетанием "тикер символа".
 
Scriptong:

Примеры то есть у всех, но о каком именно примере Вы ведете речь, никто не знает. Его и просят показать. А заодно поясните, что подразумевается под словосочетанием "тикер символа".


тикер = имя

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]);

 

 в результате в длл передается тикер символа.. однако если символов несколько то при получении  имен в цикле - везде идет имя последнего тикера... 

 
imromann:


 в коде индикатора отсылал

В 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)
 
Pavlick:

По-моему напрасно решили копировать ценовые массивы, создавайте ссылку на существующие данные: https://docs.mql4.com/ru/array/arraycopyrates, первая форма, работает ощутимо быстрее + удобнее.

Объявление в библиотеке:


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