Em OnTick() controle o apertar do botão. Se funcionar no testador - controle em OnTick(), mas na vida real este bloco de controle não será executado e será controlado em OnChartEvent()
Como assim? Nenhum parâmetro de evento é passado para OnTick().
Como isso pode ser? Nenhum parâmetro de evento é passado para OnTick().
Mas o apertar do botão é monitorado
if(ObjectGetInteger(0, "name", OBJPROP_STATE) == true)
{
// Делаем что надо по нажатию кнопки и возвращаем прежнее её состояниеObjectSetInteger(0, "name", OBJPROP_STATE, false);
}
É exatamente o mesmo controle no OnChartEvent() com a diferença de que ele é verificado somente no momento da pressão, não em cada carrapato.
Exatamente o mesmo controle no OnChartEvent() com a única diferença é que a verificação ocorre excepcionalmente no momento do clique, não em cada tic-tac.
Não está no momento da liberação? Clicar em um objeto só é contado se você pressionar o lançamento dentro do objeto. Se você clicar em um objeto, mover o cursor para longe dele enquanto segura o botão, e depois soltá-lo, o objeto está clicado?
Não está no momento da prensagem? Clicar em um objeto só conta se você pressionar e liberar dentro do objeto. Se você clicar em um objeto, mover o cursor para longe dele enquanto segura o botão, e depois soltá-lo, o objeto está clicado?
No entanto, ainda não experimentei.
Eu também não experimentei, portanto, não posso dizer nada com certeza. Mas parece ser por empurrar. Havia até mesmo um fio em algum lugar discutindo isso. Se a memória me serve corretamente, parece que eles até pediram para separar o evento para pressionar e soltar o botão do mouse.
Por favor, mostre o botão que pode funcionar no testador. Por exemplo, clique sobre qual, a bandeira de comércio = verdadeiro será hasteada; clique novamente? comércio = falso;
Ilya Prozumentov:
Como isso pode ser feito? Nenhum parâmetro de evento é passado para OnTick().
Desmontando o código do indicador EquityChartModeller.
Ela tem 2 funções personalizadas:
///////////////////////////////////////////////////////////////////////////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="";
} // Запоминаем фрагмент в массиве; обнуляем фрагмент для след. итерации цикла
}
}
Não entendo onde está destacado em amarelo. Se a fórmula do portfólio for parecida: "USDSEK-4 USDCAD+9 EURJPY-5 AUDNZD-5 EURAUD-1 GBPJPY+6 USDNOK-2", então como o loop while(p>=0) pode ser anulado para if(p==0) se apenas quebra if(X==="+"||X=="-") quebra; ??
Данный индикатор создан на базе одной из версий известного индикатора Virtual Equity (автор: Xupypr) и был адаптирован для целей портфельного моделирования и парного трейдинга. Индикатор предназначен для быстрого анализа графиков изменения стоимости портфелей/синтетиков непосредственно перед открытием позиций. Есть два основных сценария...
Em OnTick() controle o apertar do botão. Se funcionar no testador - controle em OnTick(), mas na vida real este bloco de controle não será executado e será controlado em OnChartEvent()
Como assim? Nenhum parâmetro de evento é passado para OnTick().
Como isso pode ser? Nenhum parâmetro de evento é passado para OnTick().
Mas o apertar do botão é monitorado
É exatamente o mesmo controle no OnChartEvent() com a diferença de que ele é verificado somente no momento da pressão, não em cada carrapato.Mas o acionamento do botão é controlado
Exatamente o mesmo controle no OnChartEvent() com a única diferença é que a verificação ocorre excepcionalmente no momento do clique, não em cada tic-tac.Não está no momento da liberação? Clicar em um objeto só é contado se você pressionar o lançamento dentro do objeto. Se você clicar em um objeto, mover o cursor para longe dele enquanto segura o botão, e depois soltá-lo, o objeto está clicado?
No entanto, ainda não experimentei.
Não está no momento da prensagem? Clicar em um objeto só conta se você pressionar e liberar dentro do objeto. Se você clicar em um objeto, mover o cursor para longe dele enquanto segura o botão, e depois soltá-lo, o objeto está clicado?
No entanto, ainda não experimentei.
Eu também não experimentei, portanto, não posso dizer nada com certeza. Mas parece ser por empurrar. Havia até mesmo um fio em algum lugar discutindo isso. Se a memória me serve corretamente, parece que eles até pediram para separar o evento para pressionar e soltar o botão do mouse.
OnChartEvent() não funciona no testador.
Por favor, mostre o botão que pode funcionar no testador. Por exemplo, clique sobre qual, a bandeira de comércio = verdadeiro será hasteada; clique novamente? comércio = falso;
Como isso pode ser feito? Nenhum parâmetro de evento é passado para OnTick().
https://www.mql5.com/ru/forum/171668#comment_10574757
Desmontando o código do indicador EquityChartModeller.
Ela tem 2 funções personalizadas:
Não entendo onde está destacado em amarelo. Se a fórmula do portfólio for parecida: "USDSEK-4 USDCAD+9 EURJPY-5 AUDNZD-5 EURAUD-1 GBPJPY+6 USDNOK-2", então como o loop while(p>=0) pode ser anulado para if(p==0) se apenas quebra if(X==="+"||X=="-") quebra; ??
E então abaixo, se(p==0) , por que o lote está definido para 1 -Lotes[Total-1]=1;? ?
Indicador aqui: https://www.mql5.com/ru/code/10962
Desmontando o código do indicador EquityChartModeller.
Ela tem 2 funções personalizadas:
...Indicador aqui: https://www.mql5.com/ru/code/10962
Insira o código corretamente:
Insira o código corretamente:
corrigido
corrigido
Que tal um modelador? Ctrl+, (vírgula em inglês)
Eu não estou me metendo com você. É só que você é que precisa de ajuda, então cabe a você dar as informações de uma forma utilizável, não uma lixeira.