[ARQUIVO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 4. - página 129

 
Você pode me dizer onde está o erro - não consigo encontrá-lo.
Eu já reescrevi o código de modificação do pedido e o erro permanece.
Sublinho que o erro não é do registro - não há um único erro no registro.
Encontrei o erro nos Resultados enquanto executava um teste.
Exemplo:
Eu abri posição de compra (ordem número 1) com preço 1,4654
então em Resultados diz modificar (ordem número 1) preço 1,4654 e TakeProfit 1,4752
então em Resultados diz fechar (ordem número 1) preço 1,4704 e TakeProfit 1,4752
Lucro = 50,00

Exemplo de posição deficitária embora eu deva fechar somente em TakeProfit porque eu não defini Stop Loss.
Eu abri uma posição de compra (número de ordem 271) a 1.4820
e nos Resultados diz modificar (número de ordem 271) preço 1.4820 e TakeProfit 1.4918
e nos Resultados diz fechar (número de ordem 1) preço 1.4737 e TakeProfit 1.4918
Lucro = - 83.46

Coloquei um TakeProfit de 100 em todos os lugares.

Eu não defini o StopLoss.

Eu não sei como consertá-lo.

Ao compilar este código EA = 0 erros e 0 avisos.

Eu usei este código para Modificar Ordens:

//|  Описание : Модификация ордера. Версия функции для тестов на истории.      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена открытия позиции, установки ордера                            |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    ex - дата истечения                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0){
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er;
  double op=NormalizeDouble(OrderOpenPrice() , dg);
  double os=NormalizeDouble(OrderStopLoss()  , dg);
  double ot=NormalizeDouble(OrderTakeProfit(), dg);
  color  cl;

  if (pp<=0) pp=OrderOpenPrice();
  if (sl<0 ) sl=OrderStopLoss();
  if (tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);

  if (pp!=op || sl!=os || tp!=ot) {
    if (MathMod(OrderType(), 2)==0) cl=clModifyBuy;
    if (!OrderModify(OrderTicket(), pp, sl, tp, ex, cl)) {
      er=GetLastError();
      Print("Error(",er,") modifying order: ",Error(error_code));
      Print("Ask=",Ask," Bid=",Bid," sy=",OrderSymbol(),
            " op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp);
    }
  }
}
 
Esqueci de mencionar que este EA funciona através de uma planilha Excel - o arquivo Orders.csv salvo no arquivo de especialistas
 
alex12:
Você pode me dizer onde está o erro - eu não consigo encontrá-lo.
Eu já reescrevi o código de modificação do pedido e o erro permanece.
Sublinho que o erro não é do registro - não há um único erro no registro.
Encontrei o erro nos resultados durante o teste.
Exemplo:
Eu abri uma posição de compra (número de pedido 1) em 1.4654
Em seguida, nos Resultados diz comprar (pedido número 1) preço 1,4654 e TakeProfit 1,4752.
Em seguida, nos Resultados diz fechar (pedido número 1) preço 1,4704 e TakeProfit 1,4752
Lucro = 50,00

Um exemplo de uma posição perdedora, embora eu deva fechar apenas em Take Profit porque não defini Stop Loss.
Eu abri uma posição de compra (número de pedido 271) a 1.4820
Em seguida, nos Resultados diz modificar (número de pedido 271) preço 1.4820 e TakeProfit 1.4918
em seguida, diz preço de fechamento (pedido número 1) 1,4737 e TakeProfit 1,4918 nos Resultados
Lucro = - 83,46

Eu defini o TakeProfit como 100 em todos os lugares.

Eu não defini o StopLoss.

Eu não sei como consertá-lo.

Ao compilar este código EA = 0 erros e 0 avisos.

Eu usei este código para Modificar Ordens:

Ao fechar negócios no testador é escrito como mostrado aqui, é muito provável que seja o resultado da função de fechamento do pedido (TP e SL não têm nada a ver com isso)
 

Por favor, ajude-me a encontrar os valores de

1 Volatilidade máxima diária (diariamente alta menos baixa) durante os últimos X=5 dias .

2 Volatilidade média diária nos últimos X=130 dias

3 E como esses valores podem ser escritos na condição se a Volatilidade Máxima Diária estiver na faixa A=75 a B=150- Volatilidade Média Diária

double Dmax= 0.0; 
double DAvg= 0.0;
int a = 0; 
int d =d+1;  
while(a < 5) 
  { 
    Dmax = iHigh(Symbol(),PERIOD_D1,d)-iLow(Symbol(),PERIOD_D1,d); 
    a++; 
  } 
//Comment( "T ("+Dmax+")");

while(a < 130) 
   {  
 
DAvg += (iHigh(Symbol(),PERIOD_D1,d-1)-iLow(Symbol(),PERIOD_D1,d-1))/130; 
    a++; 
}
Comment( "T ("+DAvg+")");
 
sergeev:

1. Primeiro você descobre quantas barras você precisa na janela https://docs.mql4.com/ru/windows/WindowBarsPerChart.

2. Em seguida, você receberá a data do primeiro bar https://docs.mql4.com/ru/windows/WindowFirstVisibleBar.

3. Conhecendo esta barra inicial e o número de barras - passe por estas barras e determine o alto e o baixo entre elas

4. lucro


Variante 2

https://docs.mql4.com/ru/windows/WindowPriceMaxтво

https://docs.mql4.com/ru/windows/WindowPriceMinВторой variante

Eu estava inclinado para a primeira opção, mas não sabia como calcular o número de barras na janela. A segunda opção é mais lacônica.

Mas como "pegar" o último máximo e mínimo no bar anterior? Obrigado de antemão!

 
MK07:


Mas como "pegar" o último máximo e mínimo no bar anterior?

Você só precisa memorizar o máximo e mínimo alcançado na barra atual, e quando uma nova barra aparece e se torna a barra anterior, você irá tirar o máximo e mínimo das variáveis memorizadas.

 
sergeev:

Basta lembrar o máximo e o mínimo alcançados na barra atual, e quando uma nova barra aparecer e se tornar a barra anterior, você tirará o máximo e o mínimo das variáveis lembradas.


Mas como? Suponha que atribuímos um valor máximo à variável Z e uma nova barra aparece (que pode ser verificada) e Z é imediatamente atribuído um novo valor, enquanto o valor (Z-1) é "perdido". Provavelmente, deve haver alguma verificação ao atribuir um novo valor a Z (que pode ser uma nova barra aparece), eu confio em seu profissionalismo e paciência! Obrigado por seus esforços.
 

declarar a variável zet como estática, ou declará-la na zona global.

Antes de atribuir-lhe um novo valor, verifique a existência de uma nova barra, e verifique a diferença entre seu valor e o valor atual, e depois atribua-lhe um novo valor.

 
smshev:
Ao fechar negócios no testador é escrito como você listou, é muito provável que seja o resultado da função de fechamento do pedido (TP e SL não têm nada a ver com isso)

Obrigado, mas parece não haver erros no código:

int CloseOrder(int ticket, double lots)
              {
               int err,i1;
               double price;
               OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
               if (lots<MarketInfo(Symbol(),MODE_MINLOT))lots=MarketInfo(Symbol(),MODE_MINLOT);
               while(i1<10)
                   {
                    RefreshRates();
                    if (OrderType()==0)price=Bid;
                    if (OrderType()==1)price=Ask;
                    if (OrderType()>1){OrderDelete(ticket);return(0);}
                    OrderClose(ticket,lots,NormalizeDouble(price,Digits),Slippage,Goldenrod);
                    err = GetLastError();
                    if (err == 0) break;
                    Print(WindowExpertName(),Symbol(),Error(err),"  при закрытии ордера");
                    Sleep(100);
                    i1++;
                   }
               return(0);
              }
 

mas há outro código na EA:

int CloseMarket()
   {
    for (int j=0; j<OrdersTotal(); j++)
      {
       OrderSelect(j,SELECT_BY_POS,MODE_TRADES);
       if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()<2)
         {
          CloseOrder(OrderTicket(),OrderLots());
          j--;
         }
      }
   }