新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1516

 
MakarFX

谢谢你的回答,这是个不错的解决方案,但就我的想法而言,它的工作方式有点不正确,因为余额是浮动的,可能它不能立即做到这一点,在某些情况下,我的订单由于某种原因开始以负值关闭。但增长是应该的,但与这些减法的缩减也在增加。我放弃了一切,决定手动设置回撤限制,因此我必须每天调整它们。

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

谢谢你的回答,这是个不错的解决方案,但就我的想法而言,它的工作方式有点不正确, 因为余额是浮动的,可能它不能立即做到这一点,在某些情况下,我的订单由于某种原因开始以负值关闭。但增长是应该的,但与这些减法的缩减也在增加。我已经决定放弃,手动设置交易限额,并且要每天调整。

该功能工作正常。

试试这样的方式

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

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);
  }
//+--------------------------------------------------------------------------------------------------------------------+

并在订单关闭功能中添加余额更新

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

捕捉当天的变化,并计算出那一刻的余额值

他们说 "获得正确的指标 "不是没有道理的--这不是几行代码就能解决的。 这是一个相当有容量的算法。

捕捉日期变化很容易,"已知的日数不等于前一天的日数",但它比较复杂


Alg."计算D时间的余额"(不包括提款/补款和一些关于掉期和佣金的错误)

余额:=当前账户余额。这就是AccountBalance()。

对于历史上所有关闭的市场订单。

如果收盘时间在D和当前之间,余额-=OrderProfit()+OrderSwap()+OrderCommision()。

枚举完成后, 余额为所需值......

但是,佣金是在开盘时收取的(即影响到平衡线),我们在收盘时将其考虑在内,掉期是在换日时进行的,我们在收盘时才会再次将其考虑在内。

而在大深度D的情况下,有可能在超额完成任务的情况下无法获得所有需要的订单

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

谢谢你的回答,这是个不错的解决方案,但就我的想法而言,它的工作方式有点不正确,因为余额是浮动的,可能它不能立即做到这一点,在某些情况下,我的订单由于某种原因开始以负值关闭。但增长是应该的,但与这些减法的缩减也在增加。我放弃了,决定手动设置交易限额。 我将不得不每天调整它。

我已经在你的建议和意见中迷失了方向,所以也许我的建议完全是题外话,但对不起......。

我明白我需要在一天的开始时固定余额,并为这一天计算利润/亏损,根据这些我需要做出是否继续交易的决定......

因此,这里的决定是

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

如果专家顾问将在白天重新启动,你应该考虑计算今天订单的利润/亏损,同时考虑掉期和佣金,并在OnInit()中计算一天开始的余额。

我相信Makar的能力,他可以在代码中显示所有这些......。

 

你好。你能告诉我如何从一天的开始确定当前的条数吗?

我如何确定从当天开始的当前条形图的数量?

谢谢你。

 
prom18:

你好。你能告诉我如何从一天的开始确定当前的条数吗?

我如何从一天的开始确定当前的条数?

谢谢你。

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

这是当前栏位,如果上一个栏位关闭,则为-0.5

 
MakarFX:

是当前的条形图,如果上一个条形图关闭,则为-0.5

谢谢你。我会试一试的。

 
MakarFX:

这是当前的酒吧,如果最后一次关闭,则为-0.5

它不会对分钟和异物起作用。

条数 !"= 数目的数量

每次都是跳过小节,15分钟内可能有12分钟的小节。

最好使用iBarShift()。

 
Maxim Kuznetsov:

最好使用内置的iBarShift()。

我不知道如何(

 
MakarFX:

我不知道如何(

职能

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
原因: