Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 19

 
Vitalie Postolache:
Não seja assim ))))
a razão não é mql4
 
Vitalie Postolache:

Não é assim que funciona muito. Os argumentos desta função são 1) a cadeia a ser pesquisada; 2) a combinação de caracteres a ser encontrada; 3) o início da pesquisa (por padrão, a partir do caráter nulo da cadeia de acordo com o ponto 1).

Ele retorna o número de posição na corda, na qual começa o substrato procurado, ou -1 se não for encontrado substrato.

Portanto, deve ser escrito assim:

if(StringFind(OrderComment(),"[tp]",0)>-1) {действие при нахождении признака закрытия по TP}

Obrigado pela resposta... Portanto, a funçãoStringFind com seus parâmetros ( string_value, string match_substring, int start_pos=0 ) é escrita em código comum em uma linha com

argumentos correspondentes aos dados dos parâmetros da função: string OrderComment(), string "[tp]", int 0 e se esta expressão ( entre parênteses) for maior que -1 , oseguinte código {bracketed} é executado

if(StringFind(OrderComment(),"[tp]",0)>-1)

{

duplo OrderTakeProfit();

if(OrderSelect(12, SELECT_BY_POS)==verdadeiro)

Print("Order #",OrderTicket()," lucro: ", OrderTakeProfit());

senão

Imprimir("OrderSelect() erro retornado ",GetLastError()));

bool PlaySound(

pagamento em cadeia // onde "pagamento" éo nome do arquivo na pasta MT4 Sound

);

}

... Este código vai funcionar na MQL4? ...

 
bablusut:

Obrigado pela resposta ... Acontece que a funçãoStringFind com seus parâmetros ( string_value, string match_substring, int start_pos=0 ) é escrita em código comum em uma linha com

argumentos correspondentes aos dados dos parâmetros da função: string OrderComment(), string "[tp]", int 0 e se esta expressão ( entre parênteses) for maior que -1 , oseguinte código {bracketed} é executado

if(StringFind(OrderComment(),"[tp]",0)>-1)

{

duplo OrderTakeProfit();

if(OrderSelect(12, SELECT_BY_POS)==verdadeiro)

Print("Order #",OrderTicket()," lucro: ", OrderTakeProfit());

senão

Imprimir("OrderSelect() erro retornado ",GetLastError()));

bool PlaySound(

pagamento em cadeia // onde "pagamento" éo nome do arquivo na pasta MT4 Sound

);

}

... Este código vai funcionar na MQL4? ...

duplo OrderTakeProfit(); - o código deve ter um erro na compilação.

Até onde eu entendo (ainda estou estudando), OrderTakeProfit(); solicita o lucro da ordem do mercado. Assim, nosso consultor especializado faz 2 pedidos para estas poucas linhas OrderTakeProfit(); parece que esta linha deve ser excluída (duplo OrderTakeProfit(); )

 
bablusut:

Obrigado pela resposta ... Acontece que a funçãoStringFind com seus parâmetros ( string_value, string match_substring, int start_pos=0 ) é escrita em código comum em uma linha com

argumentos correspondentes aos dados dos parâmetros da função: string OrderComment(), string "[tp]", int 0 e se esta expressão ( entre parênteses) for maior que -1 , oseguinte código {bracketed} é executado

if(StringFind(OrderComment(),"[tp]",0)>-1)

{

duplo OrderTakeProfit();

if(OrderSelect(12, SELECT_BY_POS)==verdadeiro)

Print("Order #",OrderTicket()," lucro: ", OrderTakeProfit());

senão

Imprimir("OrderSelect() erro retornado ",GetLastError()));

bool PlaySound(

pagamento em cadeia // onde "pagamento" éo nome do arquivo na pasta MT4 Sound

);

}

... Este código vai funcionar na MQL4? ...

Isto já foi mencionado:duplo OrderTakeProfit() - não faça isso. Esta função é declarada automaticamente e não deve ser re-anunciada. O compilador gerará um erro, uma vez que as funções padrão não precisam ser declaradas de antemão.

if(OrderSelect(12, SELECT_BY_POS)==verdadeiro) - se fizermos isso, então, na melhor das hipóteses, esta será outra ordem, e não aquela para a qual o comentário foi processado acima. A ordem já deve ser selecionada logo no início,se(StringFind(OrderComment(),"[tp]",0)>-1) e o contador de laço deve ser usado como argumento do número da ordem, não como constante, caso contrário, a 12ª ordem será verificada a cada iteração.

 
Vitalie Postolache:

Eles já disseram sobre o assunto:duplo OrderTakeProfit() - não faça isso. Esta função é declarada automaticamente e não deve ser declarada repetidamente. O compilador gerará um erro, uma vez que as funções padrão não precisam ser declaradas de antemão.

if(OrderSelect(12, SELECT_BY_POS)==verdadeiro) - se fizermos isso, então, na melhor das hipóteses, esta será outra ordem, e não aquela para a qual o comentário foi processado acima. A ordem já deve ter sido selecionada logo no início, antes dese(StringFind(OrderComment(),"[tp]",0)>-1).

A1exPit:

Double OrderTakeProfit(); - supõe-se que ele caia aqui quando da compilação.

Até onde eu entendo (eu mesmo ainda entendo), OrderTakeProfit(); faz pedido de lucro da ordem do mercado. Assim, nosso consultor especializado faz 2 pedidos para estas poucas linhas OrderTakeProfit(); parece que esta linha deve ser excluída (duplo OrderTakeProfit(); )

Obrigado pelo comentário - você se mostrou certo.
 
"Vitalie Postolache:

Eles já disseram sobre isso:duplo OrderTakeProfit() - você não deveria fazer isso. Esta função é declarada automaticamente e não deve ser declarada repetidamente. O compilador gerará um erro, uma vez que as funções padrão não precisam ser declaradas de antemão.

if(OrderSelect(12, SELECT_BY_POS)==verdadeiro) - se fizermos isso, então, na melhor das hipóteses, esta será outra ordem, e não aquela para a qual o comentário foi processado acima. A ordem já deve ser selecionada no início, antes deif(StringFind(OrderComment(),"[tp]",0)>-1) e devemos definir o contador de laço como um argumento do número da ordem, não uma constante, caso contrário veremos a 12ª ordem a cada iteração.

Obrigado pela resposta ... A declaração de funçãodupla OrderTakeProfit() é compreensível, vamos apagá-la.

"Se tivermos apenas um contador de loop no código anterior, na funçãoOrderHistoryTotal, o loop do operador com o corpo(i=0;i<accTotal;i++) deve serusado como argumento do número do pedido, o que significa que devemos substituir o corpo do operador com o corpo da funçãoOrderSelect e o obteremos

if(StringFind(OrderComment(),"[tp]",0)>-1)

{

if(OrderSelect(i=0;i<accTotal;i++)==verdadeiro)

Print("Order #",OrderTicket()," lucro: ", OrderTakeProfit());

senão

Imprimir("OrderSelect() erro retornado ",GetLastError()));

bool PlaySound(

pagamento em cadeia // onde"pagamento" éo nome do arquivo na pasta MT4 Sound

);

}

... Este código vai funcionar na MQL4? ...




 
bablusut:

Obrigado pela resposta ... A declaração de funçãodupla OrderTakeProfit() é clara, vamos apagá-la.

"Contador de laço deve ser usado como argumento do número do pedido" - no código anterior, temos apenas um contador de laço, o laço para operadorna funçãoOrderHistoryTotal com o corpo(i=0;i<accTotal;i++), significa que devemos substituir o corpo do operador pelo corpo da funçãoOrderSelect e o obteremos:

Novamente. No trabalho com o pedido, o primeiro lugar deve ser OrderSelect. E depois tudo mais.

Se estivermos trabalhando em loop em torno da ordem, a ordem de operações é a seguinte

1. Verificando se(OrderSelect())

2. Verificando se é a ordem correta, normalmente verificamos o símbolo e o número mágico, e então verificamos o tipo se(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2) - neste caso apenas ordens de mercado colocadas para o símbolo atual e com o número mágico especificado são processadas

Processamento de outros dados como OrderComment(), OrderProfit(), etc.

Seria algo parecido com isto

for(int i=OrdersHistoryTotal()-1; i>=0; i--) //перебираем историю торгов
{
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) //если ордер выбран то работаем дальше, иначе смысла нет
      {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2) //Если ордер тот, что нам нужен (эту проверку можно и опустить, если нужно обработать все ордера в истории)
         {
            if(StringFind(OrderComment(),"[tp]",0)>-1) //если найден признак закрытия профитом
            Print("Order #",OrderTicket()," profit: ", OrderTakeProfit());
            if(StringFind(OrderComment(),"[sl]",0)>-1) //если найден признак закрытия стоплосс
            Print("Order #",OrderTicket()," loss: "OrderTakeProfit());
         }
      }
}
 
Como posso verificar se existe um valor de sinal em um buffer ou no outro do indicador iCustom?
 
Vitalie Postolache:
Mais uma vez. OrderSelect deve estar em primeiro lugar quando se trabalha com uma ordem. Depois, tudo o resto.

Eles decidiram por tentativa e erro aparentemente, mas é caro, eu mesmo já estive lá...

Meus ouvidos estão zumbindo para ser honesto...

 
atik441:
como você verifica se existe um valor de sinal no buffer do indicador iCustom?
Siga o link, ele é destacado em seu post.