[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 254

 
Desead:
Народ, раньше в эдиторе при наведении курсора на зарезервированное слово и нажатии ф1 открывалось снизу окно с описанием данной функции, сейчас у меня этого не стало. В чём может быть проблема ?
Раньше Вы CTRL+F1 нажимали.
 
Кто подскажет, как сделать результат всегда положительным ? (лоты Бай - лоты Селл)= -0,25, а надо чтоб всегда с плюсом ?
 
mikanit:
Кто подскажет, как сделать результат всегда положительным ? (лоты Бай - лоты Селл)= -0,25, а надо чтоб всегда с плюсом ?
MathAbs().
 

Так и делаю: if (profitbuy+profitsell > SymbProf_magBUY_magSELL* MathAbs((OrdersTotalMagicBuyLots(MagicBuy)-OrdersTotalMagicSellLots(MagicSell))/Lots)()) 

что в скобках?
   

 

if (profitbuy+profitsell > SymbProf_magBUY_magSELL* MathAbs((OrdersTotalMagicBuyLots(MagicBuy)-OrdersTotalMagicSellLots(MagicSell))/Lots)(??????))

там где ???? что? 

 
Спасибо, разобрался.
 

Я открываю позицию объемом = 0,05. Нужен код - как сократить объем позиции на 0,01 при достижении убытка 100 пунктов для 5 знаков ???

Спасибо.

 

 Сколько советников я писал, везде при торговле отложками проверю рыночные условия (стоплевел, спред и тд). Посмотрел я как пишут гридеров, так ни в одном не увидел, чтоб хоть перед посылом какого-н. одного ордера проверялось значение того же стоплевела. В чём причина? 

 
alsu:

На форуме уйма метариалов про тестер, и почему его результаты отличаются от реальной жизни. Поищите в разделе Статьи, там эта тема затрагивалась не раз.

Спасибо.
 

Нашёл альтернативу.

alsu:

Это значит, что в DLL строка передается именно как char*, а не как MqlStr. Но не значит, что в ex4-программе строка не хранится как MqlString. Вообще передача параметров из ex4 в dll - это (по заявлениям разработчиков) довольно сложный процесс, сопровождающийся всевозможными проверками и преобразованиями параметров.

Zhunko:

Справку по MQL4 читали? MQL4-строка это таже с-строка с нультерминатором.

Структура предназначена только для организации массива строк. Чисто придумка Метаквотов для облегчения создания строковых массивов. 

 StrStrA из библиотеки shlwapi.dll. Тест:

#property indicator_chart_window
#import "stdlib.ex4"
string IntegerToHexString(int integer_number);//это для перевода десятичного формата в шестнадцатеричный, используем в print.
#import "StrAddress.dll"
int GetStrAddress(string szStr);//из самописной dll.
#import "shlwapi.dll"
int StrStrA(string pszFirst, string pszSrch);//из WinAPI.
#import

int addr1;//будет выходной переменной для функции из самописной dll.
int addr2;//то же самое для функции из WinAPI.

int init()
  {//тестовый прогон; в init(), это чтобы не повторялось
   string s; strAddress (s);
   s=""; strAddress (s);
   s=s+"something"; strAddress (s);
   s="MyStr"; strAddress (s);
   s="mystr"; strAddress (s);
   return(0);
  }

int start()
  {
   int    counted_bars=IndicatorCounted();//оставляем блок пустым
   
   return(0);
  }

void strAddress (string myStr)//тестовая функция
  {
   addr1=GetStrAddress(myStr);//эта из dll
   addr2=StrStrA(myStr,myStr);//эта из WinAPI
   Print(" строка ", CharToStr(34), myStr, CharToStr(34), " указатель 1: ", IntegerToHexString(addr1), ", указатель 2: ", IntegerToHexString(addr2));//в лог
  }

 Лог:

строка "" указатель 1: 00000000, указатель 2: 00000000
строка "" указатель 1: 043BE440, указатель 2: 00000000
строка "something" указатель 1: 043C8970 указатель 2: 043C8970
строка "MyStr" указатель 1: 043BE450, указатель 2: 043BE450
строка "mystr" указатель 1: 043BE458, указатель 2: 043BE458

строка "" указатель 1: 00000000, указатель 2: 00000000
строка "" указатель 1: 01C980E0, указатель 2: 00000000
строка "something" указатель 1: 01CDD050, указатель 2: 01CDD050
строка "MyStr" указатель 1: 01C980F0, указатель 2: 01C980F0
строка "mystr" указатель 1: 01C980F8, указатель 2: 01C980F8

строка "" указатель 1: 00000000, указатель 2: 00000000
строка "" указатель 1: 01CAFF20, указатель 2: 00000000
строка "something" указатель 1: 01CA7100, указатель 2: 01CA7100
строка "MyStr" указатель 1: 01CAFF30, указатель 2: 01CAFF30
строка "mystr" указатель 1: 01CAFF38, указатель 2: 01CAFF38

 Механизм следующий. shlwapi.dll в /system32. StrStrA это WinAPI-аналог StringSubstr. MQL4 безтиповый язык, и если мы ставим на выходе ловушку не string, а int, то и получаем не строку, а указатель на неё. StrStrA ищет первое вхождение подстроки в строке (с учётом регистра, но т.к. у нас строки одинаковы, нас это не волнует), и поскольку у нас строки одинаковы, возвращает указатель на первый символ строки, т.е. на саму строку.

Поясню для тех, кто будет использовать этот код. В WinAPI нет формата string. Вместо него только формат lpsz (указатель на первый элемент массива символов, заканчивающийся 0х00, он же /0). Указатель на адрес памяти. А поскольку у нас ячейки памяти 32-битные (т.е. 4 байта) и int тоже размером 4 байта, то всё туда аккуратно входит.

Итог: можно спокойно упаковывать строки в интовые массивы, эмулируя тем самым структуры (а на MQL4 структур и классов нет) для передачи их дальше в dll, если там необходимы структура или класс. Самописные dll для перевода типов данных (т.е. конструкции типа "int(const char*)" (си-тип перевода) или аналогичные на C++) теперь можно не использовать.

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