Características úteis da KimIV - página 8

 

Há muitas perguntas...
Eles vêm sempre à tona, mas caso a caso.

Para aquelas funções que são publicadas agora não há dúvidas, porque eu apenas olho sem "sentir" na unidade.
Além deles, há também perguntas sobre códigos anteriores, em particular sobre o rastreamento, que tem algo a ver com
com escrito acima: como, por que passar para as funções, por exemplo, esta seção de trilha me intrigou:

//+------------------------------------------------------------------+
//| Перенос уровня StopLoss                                          |
//| Параметры:                                                       |
//|   ldStopLoss - уровень StopLoss                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
  bool fm;
  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
  if (fm) PlaySound("expert.wav");
}
O papel da ldStopLoss não é claro ...
 

oooh... :-) é uma função tão antiga. Ele foi projetado para mudar o nível de parada de uma posição aberta ou uma ordem definida. Havia também uma função semelhante para obter lucro. Ambos foram substituídos por um ModifyOrder() melhor e mais funcional.

kombat:
O papel da ldStopLoss não é claro ...

Esta é uma variável local, por meio da qual o nível de preço, no qual o StopLoss deve ser definido, é passado para a função ModifyStopLoss. Por exemplo, vamos chamar assim a função ModifyStopLoss:

ModifyStopLoss(1,5662);

Então a variável local ldStopLoss assumirá o valor 1,5662. Você pode verificar desta forma:

//+------------------------------------------------------------------+
//| Перенос уровня StopLoss                                          |
//| Параметры:                                                       |
//|   ldStopLoss - уровень StopLoss                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
  bool fm;
 
  Print("ldStopLoss=",ldStopLoss);
 
  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
  if (fm) PlaySound("expert.wav");
}

No registro, haverá este registro:

<Время> <Эксперт> <Инструмент>,<таймфрейм>: ldStopLoss=1.5662
 
KimIV:

oooo... :-) é uma função tão antiga. Ele foi projetado para mudar o nível de parada de uma posição aberta ou uma ordem definida. Havia também uma função semelhante para obter lucro. Ambos foram substituídos por ModifyOrder() mais perfeito e funcional.


Então... antigo ... (meio embaraçado :)))
Eu dei uma olhada nas pastas, o arquivo mais antigo é datado de 22.01.2006.
E parece que nem sequer foi adulterado pelas minhas manivelas.
Desculpe, tenho praticado coisas simples por um longo tempo, por exemplo, mudar um número.
Calculadoras simples, etc...

Tudo isso começou com um pedido para escrever um consultor especializado em um dos fóruns do PRDC, mas...
Meus centavos não são suficientes, mas tenho que usá-los por conta própria, e então preciso de um indicador que exiba informações nos gráficos.
Agora estou viciado nisso... ;) eu? é conveniente... tudo está lá... unitor, etc., compacto, portátil.

Lembro-me da minha primeira e última tentativa na Delphi 6. Eu estremeço.
Ainda tenho alguns desses discos na prateleira... :))) desculpem o offtop.


Então, o que está dentro dos parênteses da função(), é algum tipo de "forma" para passar alguns parâmetros para ela?


Porque eu o tenho na cabeça por alguma razão que é um parâmetro que a função retorna como resultado do processamento.
E é também que a função obtém parâmetros a serem processados dentro de parênteses encaracolados...{}

void TrPos() {
if (OrderType()==OP_BUY) {
    if ( (Bid-OrderOpenPrice())>TrailingStop*Point) {
      if (OrderStopLoss()<Bid-TrailingStop*Point) {
        ModifyStopLoss(Bid-TrailingStop*Point);
        return;
      }
    }
  }
// в качестве примера !!! просто выдраный кусок кода!

Isto é, todos estes Bid, Point e assim por diante são parâmetros de entrada.

Devo ter me enganado muito... E o que está dentro das chaves() permite passar parâmetros para uma função,
enquanto a própria função pode ser localizada em qualquer (ou outro) lugar do código próprio do script...

Certo?

 
A questão é por que, ao contrário do OpenPosition, não há manipulação de erros no ModifyOrder? Também há todo tipo de erros durante a modificação. Gostaria de ter funções separadas para Instalação, Modificação e Fechamento, e uma Unidade de Tratamento de Erros separada para todos - menos código, mais fácil de escrever, e funcionaria mais rápido... Se eu estiver errado, me corrija...
 
Bom dia, Igor! Tenho problemas para usar seus Assessores Especialistas e scripts usando qualquer forma de rede de arrasto em real (Alpari DC). Especialmente estou interessado em e-News-Lucky$ (ideal para meu sistema), e-TFL_v2, Set2StopOrders, e-SotTrailing. Funciona em demonstração (também Alpari). Sem mensagens de erro. O que pode ser? E mais uma pergunta. Como desativar a ligação de tempo no e-News-Lucky$ para entrar e sair a qualquer momento? Obrigado!
 
ag-forex писал (а):
Bom dia, Igor! Tenho problemas para usar seus Assessores Especialistas e scripts usando qualquer forma de rede de arrasto em real (Alpari DC). Especialmente estou interessado em e-News-Lucky$ (ideal para meu sistema), e-TFL_v2, Set2StopOrders, e-SotTrailing. Funciona em demonstração (também Alpari). Sem mensagens de erro. O que pode ser?
O problema foi resolvido muitas vezes entrando em contato com o suporte técnico desta empresa de corretagem.
 
kombat писал (а):
Então, o que está dentro dos parênteses de função() é uma espécie de "forma" para passar alguns parâmetros?

Sim... mais ou menos como um recipiente :-)

kombat escreveu (a):
Porque por alguma razão eu tenho o oposto na minha cabeça: este é o parâmetro que a função retorna como resultado do processamento.

O que a função retorna é o valor de retorno. Aqui está um exemplo simples. Definimos uma função que acrescenta dois números:

int f(int a, int b) {
  int x;
  x=a+b;
  return(x);
}

Agora, se chamamos esta função desta forma:

int y;
y=f(3, 5);

então os números 3 e 5 são os parâmetros da função f. Os parâmetros de uma função podem ser números, variáveis ou expressões. As variáveis a e b são variáveis locais que tomam os valores dos parâmetros e os atribuem à função. A variável x é o valor de retorno da função f, ou seja, após nossa chamada para a função f, a variável y levará o valor passado para ela pela variável x, ou seja, 8.

kombat:

E também o fato de que a função recebe parâmetros a serem tratados dentro de parênteses curvos...{}

void TrPos() {
if (OrderType()==OP_BUY) {
    if ( (Bid-OrderOpenPrice())>TrailingStop*Point) {
      if (OrderStopLoss()<Bid-TrailingStop*Point) {
        ModifyStopLoss(Bid-TrailingStop*Point);
        return;
      }
    }
  }
// в качестве примера !!! просто выдраный кусок кода!

ou seja, todos estes Bid, Point e assim por diante são os parâmetros de entrada.

não... o parâmetro da função ModifyStopLoss será o valor da expressão Bid-TrailingStop*Point.

kombat:

Devo ter cometido um grande erro... e o que está entre parênteses() permite passar parâmetros para serem processados na função,
a própria função pode ser localizada em qualquer (ou outro) lugar do próprio código do script...

Certo?

sim

 
sasa999:
A questão é - por que, ao contrário do OpenPosition, ModifyOrder não tem tratamento de erros?

Ouvi dizer em algum lugar que as regras da estrada foram escritas com sangue. E não há nada de supérfluo neles. Por trás de cada palavra, há quase uma vida perdida em um acidente.

Eu escrevo minhas funções, de acordo com minha experiência, e incluo o processamento de erros que ocorreram em minha prática, e não há como evitá-los. Tento ser o mais "educado" possível (manipulação de erros) ao tentar entrar no mercado. Durante a modificação, a maioria dos erros é eliminada pela normalização dos preços e simples verificações de valores. Se ocorrer algum erro durante a modificação, está OK no próximo tick. O mesmo acontece com o fechamento.

 

Qual é o objetivo de enviar pp - preço de abertura do pedido para esta função?

void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE)

É como se a cor já estivesse definida no início ... test_ModifyOrder.mq4 (12.14 KB) ... porque não usá-lo, mas reenviá-lo para a função

color clModifyBuy = Aqua; // Цвет значка модификации покупки
color clModifySell = Tomato; // Цвет значка модификации продажи
qual é a vantagem de
int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
pp=NormalizeDouble(pp, dg);

antes da forma curta

pp=NormalizeDouble(pp, Digits);

por que você precisa normalizar o OrderOpenPrice()? ele não está no mesmo formato do pedido?

op=NormalizeDouble(OrderOpenPrice() , dg);
Até agora, eu não notei nenhum erro se a mesma coisa for inserida ao modificar. o mesmo com OrderStopLoss(), e OrderTakeProfit()
 
sasa999:

Qual é o objetivo de enviar pp - preço de abertura do pedido para esta função?

void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE)

As ordens OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT e OP_SELSTOP serão movidas.

sasa999:

A cor também já está mais ou menos definida logo no início. test_ModifyOrder.mq4 (12.14 KB) ...porque não usá-lo, e reenviar para a função

color clModifyBuy = Aqua; // Цвет значка модификации покупки
color clModifySell = Tomato; // Цвет значка модификации продажи

Obrigado! Eu vou usá-lo!

sasa999:
qual é a vantagem
int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
pp=NormalizeDouble(pp, dg);

antes de um breve formulário

pp=NormalizeDouble(pp, Digits);

A versatilidade que permite à EA trabalhar com posições e pedidos não apenas para o símbolo atual, mas também para outros símbolos. Por exemplo, a EA trabalha no gráfico EURUSD. Uma variante com Dígitos não permitirá trabalhar com posições abertas em USDJPY.

sasa999:

Por que o OrderOpenPrice() precisa ser normalizado?

op=NormalizeDouble(OrderOpenPrice() , dg);

É para comparar com sucesso valores do tipo duplo. Se não for normalizada, a comparação é impossível ou, ao contrário, inútil.

sasa999:
Não notou um erro se você colocou o mesmo de volta ao modificar. o mesmo com OrderStopLoss(), e OrderTakeProfit()
Sem normalização, a função gera erro 1(OrderModify tenta alterar valores já definidos com os mesmos valores).
Razão: