Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1516

 
MakarFX

Obrigado pela resposta, muleta e não uma má solução, mas em termos de minha idéia funciona um pouco incorretamente, porque o equilíbrio está flutuando, provavelmente não o faz instantaneamente e em alguns casos meus pedidos começaram a fechar com menos por alguma razão. Mas o crescimento foi como deveria ter sido, mas o saque com esses "minus" também aumentou. Eu desisti de tudo e decidi ajustar manualmente os limites de recuo, então eu teria que ajustá-los diariamente.

 
Порт-моне тв:

Obrigado pela resposta, muleta e não uma má solução, mas em termos de minha idéia funciona um pouco incorretamente, porque o equilíbrio está flutuando, provavelmente não o faz instantaneamente e em alguns casos meus pedidos começaram a fechar com menos por alguma razão. Mas o crescimento foi como deveria ter sido, mas o saque com esses "minus" também aumentou. Decidi desistir e estabelecer limites comerciais manualmente e tenho que ajustá-los diariamente.

A função funciona corretamente.

Tente assim

//+--------------------------------------------------------------------------------------------------------------------+

sb1 = StartBalance();
................

//+--------------------------------------------------------------------------------------------------------------------+
//|  Баланс на начало периода                                                                                          |
//+--------------------------------------------------------------------------------------------------------------------+
double StartBalance()
  { double b = 0;
   if(AccountBalance()>0) {b = AccountBalance()-DayProfit();}
   return(b);
  }
//+--------------------------------------------------------------------------------------------------------------------+
//|  Суммарный профит на начало периода                                                                                |
//+--------------------------------------------------------------------------------------------------------------------+
double DayProfit()
  { double p = 0; datetime st=iTime(_Symbol,PERIOD_D1,0);
   for(int pos=OrdersHistoryTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_HISTORY)==true)
        {
         if(OrderSymbol() == _Symbol)
           { 
            if(OrderCloseTime()>=st){p+=OrderProfit()+OrderSwap()+OrderCommission();}
           }
        }
     }
   return(p);
  }
//+--------------------------------------------------------------------------------------------------------------------+

e adicionar atualização de saldo à função de fechamento de pedidos

   if(OrderClose(бла бла бла))
     {
      StartBalance(); Print("Order Close");
     }
 
Maxim Kuznetsov:

pegar a mudança do dia e calcular o valor do saldo naquele momento.

Não foi por nada que eles disseram "pegue o indicador certo" - não caberá em um par de linhas de código. É um algoritmo bastante capcioso.

pegar a mudança do dia é fácil, "o número conhecido do dia não é igual ao número do dia anterior", mas, além disso, é difícil


Alg. "calcular saldo no tempo D" (excluindo retiradas/recuperações e alguns erros sobre trocas e comissões)

Saldo:=balanço da conta corrente. Isto é AccountBalance().

Para todas as ordens de mercado fechadas da história:

se o tempo de fechamento cair entre D e corrente, Saldo -= OrderProfit()+OrderSwap()+OrderCommision();

ao completar a enumeração, o Saldo é o valor desejado.

MAS, a comissão é cobrada (isto é, afeta a linha de saldo) na abertura, e nós a levamos em conta no fechamento e as trocas são feitas na mudança do dia, e nós a levaremos novamente em conta somente no fechamento

e em caso de grande profundidade D, há uma chance de não receber todas as ordens necessárias em um excesso

 
Порт-моне тв:

Obrigado pela resposta, muleta e não uma má solução, mas em termos de minha idéia funciona um pouco incorretamente, porque o equilíbrio está flutuando, provavelmente não o faz instantaneamente e em alguns casos meus pedidos começaram a fechar com menos por alguma razão. Mas o crescimento foi como deveria ter sido, mas o saque com esses "minus" também aumentou. Eu desisti e decidi estabelecer manualmente os limites comerciais e tive que ajustá-los diariamente.

Já estou perdido em suas sugestões e conselhos, então talvez meu conselho esteja completamente fora de questão, mas desculpe...

Entendo o que preciso no início do dia para fixar o saldo e para que o dia conte o lucro/perda de acordo com o qual preciso tomar uma decisão sobre se devo continuar negociando ...

Portanto, aqui está a decisão

datetime dayTime;
double dayBalance;
// Дальше в функции OnTick()
if(dayTime != iTime(_Symbol, PERIOD_D1, 0);
 {
  dayBalance = AccountInfoDouble(ACCOUNT_BALANCE));
  dayTime = iTime(_Symbol, PERIOD_D1, 0);
 }
// Дальше текущий баланс можно сравнивать с балансом на начало дня…
// В начале следующего дня в переменной dayBalance будет другое значение баланса…

Se o Expert Advisor for reiniciado durante o dia, você deve considerar o cálculo de lucros/perdas das ordens de hoje levando em conta swaps e comissões e calcular o saldo para o início do dia no OnInit().

Acredito nas habilidades de Makar, ele pode mostrar tudo isso já no código...

 

Olá. Você pode me dizer como determinar o número atual da barra desde o início do dia?

Como posso determinar o número da barra atual desde o início do dia?

Obrigado.

 
prom18:

Olá. Você pode me dizer como determinar o número atual da barra desde o início do dia?

Como posso determinar o número da barra atual desde o início do dia?

Obrigado.

      double BarNumber=NormalizeDouble((TimeCurrent()-iTime(_Symbol,PERIOD_D1,0))/60/Period()+0.5,0);

esta é a barra atual, se a última barra fechar, então -0,5

 
MakarFX:

é a barra atual, se a última barra fechar, então -0,5

Obrigado. Vou tentar.

 
MakarFX:

esta é a barra atual, se última fechada, -0,5

não funcionará em minutos e exóticos.

número de barras != número de_contas

as barras são puladas de cada vez, em 15 minutos pode haver barras de 12 minutos

melhor para usar iBarShift()

 
Maxim Kuznetsov:

é melhor usar o iBarShift nativo()

Eu não sei como(

 
MakarFX:

Eu não sei como(

Função

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает реальный номер бара от начала суток.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    dt - дата и время открытия бара (          0 - текущее время)           |
//+----------------------------------------------------------------------------+
int iBarOfDayReal(string sy="", int tf=0, datetime dt=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  if (tf<=0) tf=Period();
  if (dt<=0) dt=TimeCurrent();
  if (tf>PERIOD_D1) {
    Print("iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }

  int cd=TimeDay(dt);                       // текущий день месяца
  int nb=iBarShift(sy, tf, dt, False);      // номер текущего бара
  int bd=0;                                 // номер бара от начала суток

  while(TimeDay(iTime(sy, tf, nb))==cd) {
    nb++;
    bd++;
  }

  return(bd);
}
Razão: