В OnTick() контролируйте нажатие кнопки. Можно сделать по условию, если работает в тестере - контроль в OnTick(), а в реале блок этого контроля выполняться не будет и будет контроль в OnChartEvent()
Это как так? В OnTick() не передаются никакие параметры событий.
Это как так? В OnTick() не передаются никакие параметры событий.
Но нажатие кнопки контролируется
if(ObjectGetInteger(0, "name", OBJPROP_STATE) == true)
{
// Делаем что надо по нажатию кнопки и возвращаем прежнее её состояниеObjectSetInteger(0, "name", OBJPROP_STATE, false);
}
Точно такой контроль в OnChartEvent() с той лишь разницей, что проверка идёт исключительно в момент нажатия, а не на каждом тике.
Точно такой контроль в OnChartEvent() с той лишь разницей, что проверка идёт исключительно в момент нажатия, а не на каждом тике.
Разве не в момент отжатия? Щелчок по объекту засчитан только если нажал-отжал в пределах объекта. Если нажать на объекте, сместить с него курсор, удерживая кнопку нажатой, и потом отжать, разве будет зафиксирован щелчок на объекте?
Разве не в момент отжатия? Щелчок по объекту засчитан только если нажал-отжал в пределах объекта. Если нажать на объекте, сместить с него курсор, удерживая кнопку нажатой, и потом отжать, разве будет зафиксирован щелчок на объекте?
Впрочем - не экспериментировал ещё.
Я тоже не экспериментировал, потому и утверждать ничего не могу. Но вроде-бы по нажатию. Даже где-то тема была с обсуждением этого. Если мне не совсем память изменила, то кажется даже просили разделить событие на нажатие и отжатие кнопки мыши.
Покажите, пожалуйста, кнопку которая может работать в тестере. Например, нажать на которую, будет поднят флаг trade = true; ещё раз нажать? trade = false;
Ilya Prozumentov:
Это как так? В OnTick() не передаются никакие параметры событий.
///////////////////////////////////////////////////////////////////////////void SetPositions(string name,int number) // 69 SetPositions(Portfolio_Formula_A,1)
{
BlocksLastN=BlocksTotal; //
SeparateBlocks(name); // Разбиваем строку на блокиfor(int i=BlocksLastN;i<BlocksTotal;i++) // Перебираем блоки формулы
{
Total++; // Увеличиваем кол-во инструментов ++;ArrayResize(Lots,Total); // Устанавливаем размер массива Lots размером Total;ArrayResize(Instrument,Total); // Устанавливаем размер массива Instrument размером Total;ArrayResize(OpenPrice,Total); // Устанавливаем размер массива OpenPrice размером Total;ArrayResize(ClosePrice,Total); // Устанавливаем размер массива ClosePrice размером Total;ArrayResize(Index,Total); // Устанавливаем размер массива Index размером Total;int length=StringLen(Block[i]); // Определяем кол-во символов в блоке;int p=length-1; // Для перебора создаем переменную меньше на единицу;while(p>=0) // До тех пор пока есть символ
{
string X=StringSubstr(Block[i],p,1); // определяем символ;if(X=="+"||X=="-") break; // если дошли до знака то прекращаем;if(p==0) break; // Если дошли до первого символа то прекращаем;else p--; // Иначе переходим к следующему символу
}
Index[Total-1]=number;
Instrument[Total-1]=StringSubstr(Block[i],0,p); // Запоминаем элемент массива Instrument - название инструмента;if(p==0) Lots[Total-1]=1;else Lots[Total-1]=StrToDouble(StringSubstr(Block[i],p,length-p)); // Запоминаем элемент массива Lots - направление и размер лота;if(MarketInfo(Instrument[Total-1],MODE_POINT)==0) // Если размера пункта инструмента нет
{Missing=StringConcatenate(Missing," ",Instrument[Total-1]);Error=true;} // Запоминаем потерявшийся инструмент "Название инструмента ERROR"
}
}
/////////////////////////////////////////////////////////////////////////// // Функция разбиения строки формулы на блокиvoid SeparateBlocks(string text) // 218 SeparateBlocks(name);
{
string fragment=""; // инструмент с направлением и лотом (до порбела)int length=StringLen(text); // Возвращает число символов в строке (Portfolio_Formula_A)for(int position=0;position<length;position++) // Перебор символов строки
{
int sym=StringGetChar(text,position); // Возвращает значение символа, расположенного в указанной позиции строкиif(sym!=32&&sym!=9&&sym!=10&&sym!=13) fragment=fragment+StringSubstr(text,position,1); // Если не пробел, не таб, не перевод строки, не возврат каретки - добавляем символ фрагментуif(sym==32||sym==9||sym==10||sym==13||position==length-1) // Если пробел или таб или перевод строки или возврат каретки или последний символ строки формулыif(StringLen(fragment)>0) // Если у фрагмента есть символы
{
BlocksTotal++;ArrayResize(Block,BlocksTotal); // Кол-во блоков++; Изменяем размер массива Block;
Block[BlocksTotal-1]=fragment;fragment="";
} // Запоминаем фрагмент в массиве; обнуляем фрагмент для след. итерации цикла
}
}
Не понял там где желтым выделено. Если формула портфеля выглядит как: "USDSEK-4 USDCAD+9 EURJPY-5 AUDNZD-5 EURAUD-1 GBPJPY+6 USDNOK-2", то как перебор цикла while(p>=0) может дойти до if(p==0) если он прервется дойдя только до знака if(X=="+"||X=="-") break; ??
И далее ниже, если все таки if(p==0) то почему лот устанавливается равным 1 -Lots[Total-1]=1; ?? Индикатор тут: https://www.mql5.com/ru/code/10962
Данный индикатор создан на базе одной из версий известного индикатора Virtual Equity (автор: Xupypr) и был адаптирован для целей портфельного моделирования и парного трейдинга. Индикатор предназначен для быстрого анализа графиков изменения стоимости портфелей/синтетиков непосредственно перед открытием позиций. Есть два основных сценария...
В OnTick() контролируйте нажатие кнопки. Можно сделать по условию, если работает в тестере - контроль в OnTick(), а в реале блок этого контроля выполняться не будет и будет контроль в OnChartEvent()
Это как так? В OnTick() не передаются никакие параметры событий.
Это как так? В OnTick() не передаются никакие параметры событий.
Но нажатие кнопки контролируется
Точно такой контроль в OnChartEvent() с той лишь разницей, что проверка идёт исключительно в момент нажатия, а не на каждом тике.Но нажатие кнопки контролируется
Точно такой контроль в OnChartEvent() с той лишь разницей, что проверка идёт исключительно в момент нажатия, а не на каждом тике.Разве не в момент отжатия? Щелчок по объекту засчитан только если нажал-отжал в пределах объекта. Если нажать на объекте, сместить с него курсор, удерживая кнопку нажатой, и потом отжать, разве будет зафиксирован щелчок на объекте?
Впрочем - не экспериментировал ещё.
Разве не в момент отжатия? Щелчок по объекту засчитан только если нажал-отжал в пределах объекта. Если нажать на объекте, сместить с него курсор, удерживая кнопку нажатой, и потом отжать, разве будет зафиксирован щелчок на объекте?
Впрочем - не экспериментировал ещё.
Я тоже не экспериментировал, потому и утверждать ничего не могу. Но вроде-бы по нажатию. Даже где-то тема была с обсуждением этого. Если мне не совсем память изменила, то кажется даже просили разделить событие на нажатие и отжатие кнопки мыши.
OnChartEvent() не работает в тестере.
Покажите, пожалуйста, кнопку которая может работать в тестере. Например, нажать на которую, будет поднят флаг trade = true; ещё раз нажать? trade = false;
Это как так? В OnTick() не передаются никакие параметры событий.
https://www.mql5.com/ru/forum/171668#comment_10574757
Разбираю код индикатора EquityChartModeller.
В нем 2 пользовательские функции:
Не понял там где желтым выделено. Если формула портфеля выглядит как: "USDSEK-4 USDCAD+9 EURJPY-5 AUDNZD-5 EURAUD-1 GBPJPY+6 USDNOK-2", то как перебор цикла while(p>=0) может дойти до if(p==0) если он прервется дойдя только до знака if(X=="+"||X=="-") break; ??
И далее ниже, если все таки if(p==0) то почему лот устанавливается равным 1 - Lots[Total-1]=1; ??
Индикатор тут: https://www.mql5.com/ru/code/10962
Разбираю код индикатора EquityChartModeller.
В нем 2 пользовательские функции:
...Индикатор тут: https://www.mql5.com/ru/code/10962
Вставляйте код правильно:
Вставляйте код правильно:
поправил
поправил
А стилизатором обработать? Ctrl+, (запятая в анг.раскладке)
Я не придираюсь. Просто это же вам нужна помощь, значит - вам и дать информацию в удобном виде, а не свалкой.