[Arquivo!] Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por ela. Não poderia ir a lugar algum sem você - 2. - página 294
CreAndr: Eu tenho uma pergunta sobre a rede de arrasto, quem pode me dizer. Parece ser a rede de arrasto certa para se romper o gelo, mas não funciona.
CreAndr: Tenho uma pergunta sobre a rede de arrasto, quem pode me dizer. Parece ser uma rede de arrasto correta para quebrar o equilíbrio, mas não funciona.
Lista de razões em ordem decrescente de importância:
Listagem das razões em ordem decrescente de importância:
1. O computador não está ligado
2. O Metatrader não está ligado.
3. o roteiro na tabela não está instalado
4. Conselheiros especializados não habilitados
5. Nada para arrasto.
6. Algo no código está errado.
Grande resposta, Roger, mas o computador está ligado, assim como o Metatrader, o EA está anexado ao gráfico, os EAs estão habilitados, as negociações estão se abrindo e, portanto, há algo para arrasto! Mas o que há de errado com o código, essa era a questão.
artmedia70: Use OrderOpenTime() Para - por que precisamos dele então?
Portanto, sim, mas pelo número do pedido eu fiquei muito curto, mas com o OrderOpenTime não entendo o que fazer, preciso colocar o tempo aberto em algum lugar, comparar com o próximo pedido da lista, se o tempo for maior, reescrever a variável, etc. Eu ainda não entendo o algoritmo.
CreAndr: Grande resposta, Roger, mas o computador está habilitado, assim como o MetaTrader, a EA está anexada ao gráfico, as EAs estão habilitadas, as negociações estão abertas e, portanto, há algo para arrasto! Mas o que há de errado com o código, essa era a questão.
No início não havia código, você o anexou depois.
Provavelmente porque você colocou um rastro na função de abertura do pedido, ou seja, as condições para a abertura de um pedido vêm, o pedido é aberto, mas pode não chegar mais longe.
Portanto, sim, mas pelo número do pedido eu fiquei muito curto, mas com o OrderOpenTime não entendo o que fazer, preciso colocar o tempo aberto em algum lugar, comparar com o próximo pedido da lista, se o tempo for maior, reescrever a variável, etc. Eu ainda não entendo o algoritmo.
O número de série não é confiável, nada é garantido nesta numeração, apenas para o testador. Um par de páginas antes, eu tinha escrito o código para procurar a última ordem fechada. É muito simples, nós examinamos o bilhete, depois escolhemos a ordem ou posição de acordo com o bilhete, e pronto:
int lastclosetime=-1;
int lastcloseticket=-1;
int lastdealtype=0;
for (int i=0; i<OrdersHistoryTotal(); i++)
{
if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
if (OrderSymbol()==symbol || OrderMagicNumber()==magic)
{
if (lastclosetime<OrderCloseTime())
{
lastclosetime=OrderCloseTime();
lastcloseticket=OrderTicket();
}
}
}
if (OrderSelect(lastcloseticket, SELECT_BY_TICKET, MODE_HISTORY))
{
if (OrderType()==OP_BUY) lastdealtype=1;
if (OrderType()==OP_SELL) lastdealtype=-1;
}
O número do pedido não é confiável, ninguém garante nada nesta numeração, apenas para o testador. Um par de páginas antes eu escrevi código para encontrar a última ordem fechada, o mesmo para as abertas. Tudo é simples, passamos por isso, lembramos do bilhete, depois escolhemos a ordem ou posição de acordo com o bilhete, e pronto:
No início não havia código, você o acrescentou mais tarde.
Provavelmente porque você colocou um rastro na função de abertura do pedido, ou seja, as condições para a abertura do pedido ocorrem, o pedido é aberto, mas pode não chegar mais longe.
O número do pedido não é confiável, ninguém garante nada nesta numeração, apenas para o testador. Um par de páginas antes eu escrevi código para encontrar a última ordem fechada, o mesmo para as abertas. É muito simples, nós examinamos o bilhete, depois escolhemos uma ordem ou uma posição pelo bilhete e pronto:
O código está errado.
Antes de mais nada, eis o seguinte:
if (OrderSymbol()==symbol|| OrderMagicNumber()==magic)
Se o símbolo de ordem for igual ao símbolo dado na variável símbolo ou, a magia da ordem é igual à magia... Portanto, se qualquer ordem com o símbolo for selecionada e o magik for diferente ou estiver faltando, a condição será satisfeita. Porque ou é isto ou aquilo. De forma correspondente, devemos substituir porou, melhor ainda, separar as verificações em cadeias separadas - o laço será mais rápido, o que é crucial para a otimização.
Além disso... Escolha por bilhete: O parâmetro do pool é ignorado, ou seja, não há sentido em escrevê-lo aqui.
if (OrderSelect(lastcloseticket, SELECT_BY_TICKET, MODE_HISTORY))
Após a ordem ter sido selecionada com sucesso por bilhete, devemos verificar de qual lista de ordens foi selecionada - as do mercado ou as fechadas. Para isso, precisamos verificar o tempo de fechamento do pedido, e se for maior que zero, então o pedido foi definitivamente fechado. Este parâmetro é sempre igual a zero para posições abertas. IMHO, após a escolha do último pedido, devemos verificar seu tipo imediatamente e escrevê-lo na variável.
A função agora será parecida com esta:
int GetTypeLastClosePos(int symbol, int magic) // Функция возвращает 0 если последний закрытый Бай, 1 - если Селл и -1 при ошибке
{
int i, lastclosetime=0,
lastdealtype=-1;
for (i=0; i<OrdersHistoryTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Если выбрали ордер в историиif (OrderSymbol()!=symbol) continue; // Если его символ не равен переданному в функцию - идём к следующемуif (OrderMagicNumber()!=magic) continue; // Если его магик не равен переданному в функцию - идём к следующемуif (OrderType()>1) continue; // Если ищем только Бай и Селл, значит если больше единицы - к следующему// ... теперь выбранный ордер соответствует критериям поиска по символу, магику и типуif (lastclosetime<OrderCloseTime()) { // Посмотрим время его закрытия и если оно больше предыдущего, то...
lastclosetime=OrderCloseTime(); // ... запишем его как предыдущее
lastdealtype=OrderType(); // Тип текущего закрытого ордера: 0 для Бай, 1 для Селл
}
}
elseif (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Иначе, если не удалось выбрать ордер в историиPrint ("Func: GetTypeLastClosePos, Ошибка выбора ордера - ",GetLastError()); // Посмотрим номер ошибкиbreak; // Выходим из цикла перебора ордеров
}
}
return(lastdealtype);
}
Agora, se quisermos verificar apenas a compra ou venda do gráfico atual e qual deles foi o último fechado, devemos chamar esta função desta forma:
int LastPoseType=GetTypeLastClosePos(Symbol(), Magic);
if (LastPoseType==OP_BUY) {
// ... код, если последний закрытый Buy ...
}
if (LastPoseType==OP_SELL) {
// ... код, если последний закрытый Sell ...
}
else {// ... код обработки ошибки ... }
Para o tratamento de erros podemos, em princípio, criar uma variável global, por exemplo, int err; e no próprio corpo da função armazenar o número de erro nesta variável:
elseif (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Иначе, если не удалось выбрать ордер в истории
err=GetLastError(); // Посмотрим номер ошибкиPrint ("Func: GetTypeLastClosePos, Ошибка выбора ордера - ",err); // Сообщим об ошибке и в какой ф-ции она произошлаbreak; // Выходим из цикла перебора ордеров
}
Em seguida, para processar o erro após chamar a função ...
GetTypeLastClosePos(Symbol(), Magic);
... e ocorrer erro, seu número será armazenado em erro variável e no bloco de processamento este número será processado.
else {
if (err==???) {
// обработка этой ошибки
}
if (err==???) {
// обработка этой ошибки
}
// ... и т.д. ...
}
Eu tenho uma pergunta sobre a rede de arrasto, quem pode me dizer. Parece ser a rede de arrasto certa para se romper o gelo, mas não funciona.
Aqui está uma rede de arrasto: https://www.mql5.com/ru/forum/131859
Para inserir o código no texto, pressione o botão SRC acima do campo de entrada de texto.
Aqui está uma rede de arrasto: https://www.mql5.com/ru/forum/131859
Para inserir o código no texto, pressione o botão SRC acima do campo de entrada de texto.
Obrigado.
Tenho uma pergunta sobre a rede de arrasto, quem pode me dizer. Parece ser uma rede de arrasto correta para quebrar o equilíbrio, mas não funciona.
Lista de razões em ordem decrescente de importância:
1. O computador não está ligado
2. O Metatrader não está ligado.
3. o roteiro na tabela não está instalado
4. Conselheiros especializados não habilitados
5. Nada para arrasto.
6. Algo no código está errado.
Listagem das razões em ordem decrescente de importância:
1. O computador não está ligado
2. O Metatrader não está ligado.
3. o roteiro na tabela não está instalado
4. Conselheiros especializados não habilitados
5. Nada para arrasto.
6. Algo no código está errado.
Use OrderOpenTime()
Para - por que precisamos dele então?
Portanto, sim, mas pelo número do pedido eu fiquei muito curto, mas com o OrderOpenTime não entendo o que fazer, preciso colocar o tempo aberto em algum lugar, comparar com o próximo pedido da lista, se o tempo for maior, reescrever a variável, etc. Eu ainda não entendo o algoritmo.
Grande resposta, Roger, mas o computador está habilitado, assim como o MetaTrader, a EA está anexada ao gráfico, as EAs estão habilitadas, as negociações estão abertas e, portanto, há algo para arrasto! Mas o que há de errado com o código, essa era a questão.
No início não havia código, você o anexou depois.
Provavelmente porque você colocou um rastro na função de abertura do pedido, ou seja, as condições para a abertura de um pedido vêm, o pedido é aberto, mas pode não chegar mais longe.
Portanto, sim, mas pelo número do pedido eu fiquei muito curto, mas com o OrderOpenTime não entendo o que fazer, preciso colocar o tempo aberto em algum lugar, comparar com o próximo pedido da lista, se o tempo for maior, reescrever a variável, etc. Eu ainda não entendo o algoritmo.
O número de série não é confiável, nada é garantido nesta numeração, apenas para o testador. Um par de páginas antes, eu tinha escrito o código para procurar a última ordem fechada. É muito simples, nós examinamos o bilhete, depois escolhemos a ordem ou posição de acordo com o bilhete, e pronto:
O número do pedido não é confiável, ninguém garante nada nesta numeração, apenas para o testador. Um par de páginas antes eu escrevi código para encontrar a última ordem fechada, o mesmo para as abertas. Tudo é simples, passamos por isso, lembramos do bilhete, depois escolhemos a ordem ou posição de acordo com o bilhete, e pronto:
No início não havia código, você o acrescentou mais tarde.
Provavelmente porque você colocou um rastro na função de abertura do pedido, ou seja, as condições para a abertura do pedido ocorrem, o pedido é aberto, mas pode não chegar mais longe.
O número do pedido não é confiável, ninguém garante nada nesta numeração, apenas para o testador. Um par de páginas antes eu escrevi código para encontrar a última ordem fechada, o mesmo para as abertas. É muito simples, nós examinamos o bilhete, depois escolhemos uma ordem ou uma posição pelo bilhete e pronto:
O código está errado.
Antes de mais nada, eis o seguinte:
Se o símbolo de ordem for igual ao símbolo dado na variável símbolo ou , a magia da ordem é igual à magia... Portanto, se qualquer ordem com o símbolo for selecionada e o magik for diferente ou estiver faltando, a condição será satisfeita. Porque ou é isto ou aquilo. De forma correspondente, devemos substituir por ou, melhor ainda, separar as verificações em cadeias separadas - o laço será mais rápido, o que é crucial para a otimização.
Além disso... Escolha por bilhete: O parâmetro do pool é ignorado, ou seja, não há sentido em escrevê-lo aqui.
Após a ordem ter sido selecionada com sucesso por bilhete, devemos verificar de qual lista de ordens foi selecionada - as do mercado ou as fechadas. Para isso, precisamos verificar o tempo de fechamento do pedido, e se for maior que zero, então o pedido foi definitivamente fechado. Este parâmetro é sempre igual a zero para posições abertas. IMHO, após a escolha do último pedido, devemos verificar seu tipo imediatamente e escrevê-lo na variável.
A função agora será parecida com esta:
Agora, se quisermos verificar apenas a compra ou venda do gráfico atual e qual deles foi o último fechado, devemos chamar esta função desta forma:
Para o tratamento de erros podemos, em princípio, criar uma variável global, por exemplo, int err; e no próprio corpo da função armazenar o número de erro nesta variável:
Em seguida, para processar o erro após chamar a função ...
GetTypeLastClosePos(Symbol(), Magic);... e ocorrer erro, seu número será armazenado em erro variável e no bloco de processamento este número será processado.
Melhor ainda, use o interruptor