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

 
Valeriy Yastremskiy:

如果一天有1440个订单,就应该在分钟开始时进行检查,或者更简单地说,在分钟栏的出现时进行检查。而在这一点上,要打开。你没有,所以EA在每一个tick点开仓,这本身就是一个严格的条件,根据我们符号在当前报价的条件。这一条件可能没有得到满足,因此会漏掉蜱虫。而在某些时候,会发生一个关键的错误。

另外,订单执行 的类型(执行交易的订单,建立一个头寸)全部或没有。

我明白。谢谢你的帮助。

我也认为我的EA很难开出这么多订单。我试着用这个代码来限制订单的数量

MqlDateTime time_now;
TimeCurrent(time_now);
if(time_now.hour==10&&&&time_now.min==0)
{
//открыть ордер
}

也就是说,只在10点开一个订单。但结果是一样的。

2020.10.27 10:25:17.548 Core 1 272 Mb内存的使用,包括36 Mb的历史数据,64 Mb的tick数据


input int      StopLoss=30;      // Stop Loss
input int      TakeProfit=100;   // Take Profit
input double   Lot=0.1;          // Количество лотов для торговли
int A;    //

//+------------------------------------------------------------------+
void OnTick()
  {
//Print( "====================================================",  TimeCurrent() )   ;
//--- Объявляем структуры, которые будут использоваться для торговли
   MqlTick latest_price;       // Будет использоваться для текущих котировок
   MqlTradeRequest mrequest;   // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;     // Будет использоваться для получения результатов выполнения торговых запросов
   MqlDateTime time_now;     // Будет использоваться для
   
 TimeCurrent(time_now);  
 if(!SymbolInfoTick(_Symbol,latest_price))
 if(time_now.hour==10&&time_now.min==0)
   {
         mrequest.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.ask + StopLoss*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask - TakeProfit*_Point,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // символ
         mrequest.volume = Lot;                                                // количество лотов для торговли
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу
         mrequest.type_filling = ORDER_FILLING_RETURN;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=100;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
     OrderSend(mrequest,mresult);
    }   
     return;
  }

我做错了什么?

我把我添加和改变的代码涂上颜色

这是它在日志文件中所说的

FD 0 10:57:05.453 Core 1 agent process started on 127.0.0.1:3000

CS 0 10:57:05.453 Core 1 连接到127.0.0.1:3000。

JD 0 10:57:05.953 Core 1 已连接

OD 0 10:57:05.975 Core 1 authorized (agent build 2650)

JL 0 10:57:05.980 Tester EURUSD,M1 (Alpari-MT5-Demo): 测试 experts\GRAAL.ex5 从 2020.09.01 00:00 到 2020.09.10 00:00

ON 0 10:57:05.997 Core 1 普通同步完成。

CJ 0 10:57:06.223 Tester 分析的历史质量为100%。

LM 0 10:57:06.248 Core 1 MetaTester 5在127.0.0.1:3000启动

EJ 0 10:57:06.248 Core 1 初始化完成。

LS 0 10:57:06.248 Core 1 登录(build 2650)。

KO 0 10:57:06.248 Core 1 4372字节的账户信息被加载

LI 0 10:57:06.248 Core 1 1482字节的测试器参数被加载

FN 0 10:57:06.248 Core 1 1724字节的输入参数被加载

OK 0 10:57:06.248 Core 1 423字节的符号列表被加载(72个符号)。

HO 0 10:57:06.248 Core 1 专家文件添加: Experts\GRAAL.ex5已加载13680字节

CP 0 10:57:06.248 Core 1 4077 Mb可用,50块设置为ticks生成。

DI 0 10:57:06.248 Core 1 以点计算利润,初始存款10000,杠杆1:100

LP 0 10:57:06.248 Core 1 成功初始化。

RI 0 10:57:06.248 Core 1 共收到15 Kb的初始化数据。

DN 0 10:57:06.248 Core 1 Intel Core i5-6400 @ 2.70GHz, 7883 MB

IG 0 10:57:06.248 Core 1 EURUSD:要同步的符号

RS 0 10:57:06.248 Core 1 EURUSD:符号同步,收到3720字节的符号信息

OL 0 10:57:06.248 Core 1 EURUSD: 在0:00:00.003加载27字节的历史数据进行同步

EK 0 10:57:06.248 Core 1 EURUSD: 历史记录从2019.01.02同步到2020.10.23

LK 0 10:57:06.248 Core 1 EURUSD,M1: 历史缓存分配给628432条,包含619175条,从2019.01.02 06:00到2020.08.31 23:59

LH 0 10:57:06.248 Core 1 EURUSD,M1: 历史从2019.01.02 06:00开始

LN 0 10:57:06.248 Core 1 EURUSD,M1 (Alpari-MT5-Demo): OHLC条形状态正在生成仅在条形图开始时执行OnTick

JM 0 10:57:06.248 Core 1 EURUSD,M1: 测试experts\GRAAL.ex5从2020.09.01 00:00到2020.09.10 00:00开始,输入。

LS 0 10:57:06.248 Core 1 StopLoss=30

PL 0 10:57:06.248 Core 1 TakeProfit=100

FJ 0 10:57:06.248 Core 1 Lot=0.1

DP 0 10:57:06.248 Core 1 最终余额 10000.00点

EE 0 10:57:06.248 Core 1 EURUSD,M1: 39553 ticks, 10068 bars generated.环境在0:00:00.031进行同步。测试在0:00:00.247通过(包括ticks预处理0:00:00.016)。

DE 0 10:57:06.248 Core 1 EURUSD,M1: 从登录到停止测试的总时间为0:00:00.278(包括历史数据同步的0:00:00.031)。

NQ 0 10:57:06.248 Core 1 272 Mb内存的使用,包括36 Mb的历史数据,64 Mb的tick数据

KE 0 10:57:06.248 Core 1 日志文件 "C:\Users\a1960\AppData\Roaming\MetaQuotes\Tester\36A64B8C79A6163D85E6173B54096685\Agent-127.0.0.1-3000\logs\20201027.log "写入

OS 0 10:57:06.260 Core 1 连接关闭。


 
Denis Diakonov:

能否请你告诉我!?

为什么当新的刻度出现时,服务器的时间没有更新?

在EA启动的那一刻,一切都按部就班地进行,但时间过去后,当前分钟的新值却没有进入变量。

也就是说,专家顾问的工作取决于变量int M = TimeMinute(TimeCurrent())中获得的数字。

实际上这一行代码来自于参考文献,它不起作用。

例如,我在12点启动它-- 服务器返回的当前时间 与变量中的时间相对应,但随后变量仍停留在12点,尽管时钟上已经有15-20分钟了。

代码完全好了,更准确的是你在哪里创建函数,在哪个函数(OnInit, OnTick, OnTime)获得分钟的值并调用打印函数。如果在OnInit或终端函数字段之外,就应该是这样的。如果在OnTick中,它将在每个tick上打印,并以新的分钟来更新数值。

 

服务器时间和变量值的清晰例子

Valeriy Yastremskiy:

这段代码完全好了,更精确地说明了你在哪里创建函数,在哪个函数(OnInit、OnTick、OnTime)中获得分钟的值并调用打印函数。如果在OnInit或终端函数字段之外,就应该是这样的。如果在OnTick中,它将在每个tick上打印,并以新的分钟来更新数值。

int M = TimeMinute(TimeCurrent());
bool TimeServer()                                                  
{  
   Print(M, " - Tекущее время сервера");
   if((M > 55 || M == 55) && (M < 59 || M == 59))
   {
   return(true);
   }
   else
   {
   return(false);
   }
}

好吧,这里是完整的代码。在void OnTick()函数中,它在一开始就被第一行执行的内容所触发。

它只在重新编译或追加到时间表/删除字段/的时刻被触发。在剩下的时间里,变量M持有EA第一次运行时获得的分钟值。

 
Denis Diakonov:

好吧,这里有一个完整的代码,这就是它的全部内容。空白的OnTick()在一开始就被第一个要执行的行触发了。

它只在重新编译或加入到图/删除字段/的时刻被触发。在剩下的时间里,变量M持有EA第一次运行时获得的分钟值。

//--------------------------------------------------------------------
//
//--------------------------------------------------------------------
int m1,m2;
void OnTick() // Спец. функция start
  {
 // int M = TimeMinute(TimeCurrent());
//if(m1!=M)
 TimeServer();
//--------------------------------------------------------------------
  m1=m2;
   return;                            // Выход из start()
  }
//--------------------------------------------------------------------
bool TimeServer()                                                  
{  
int M = TimeMinute(TimeCurrent());
m2=M;
if(m1!=M)
   Alert (M, " - Tекущее время сервера");
   Print(M, " - Tекущее время сервера");
    if((M >= 55) && (M <= 59))
   {
   return(true);
   }
   else
   {
   return(false);
   }
}
 
Valeriy Yastremskiy:

明白了,谢谢!

我应该

int M = TimeMinute(TimeCurrent());

把它放在函数的主体 中,而不是在它之前赋值给M

 
Denis Diakonov:

明白了,谢谢!

我应该

把它放在函数的主体 中,而不是在它之前分配M值。

你可以用不同的方式来做。读取全局和局部变量以及它们的可见性。

 

下午。试图从角度得到趋势线的角度。以下是代码。

void DrawLine(string name,
              datetime time1,
              double price1,
              datetime time2,
              double price2,
              double &angle)
  {
   CChartObjectTrendByAngle *line=new CChartObjectTrendByAngle();
   if(!line.Create(ChartID(),name,0,time1,price1,time2,price2))
     {
      Print(__FUNCTION__+": object line create failed. Last error: ",GetLastError());
      delete line;
      return;
     }
   
   line.Color(InpColorZoneUp);
   line.Background(false);
   line.RayLeft(false);
   line.RayRight(false);
   angle=line.Angle();
   
   /*ObjectCreate(name,OBJ_TRENDBYANGLE,0,time1,price1,time2,price2);
   double W = ObjectGet(name,OBJPROP_ANGLE);
   angle=W;*/
   lines.Add(line);
  }

角度始终为0。不管是使用标准库 方法还是内置函数。同时,也划定了界限。有什么问题吗?如何获得这个角度?

 
leonerd:

下午。试图从角度得到趋势线的角度。以下是代码。

角度始终为0。不管是使用标准库 方法还是内置函数。同时,也划定了界限。有什么问题吗?我怎样才能得到这个角度呢?

https://www.mql5.com/ru/forum/103591

我明白了,但你是如何计算角度的?

Вопрос: TRENDBYANGLE, а где ANGLE?
Вопрос: TRENDBYANGLE, а где ANGLE?
  • 2007.06.07
  • www.mql5.com
Добрый день...
 
leonerd:

https://www.mql5.com/ru/forum/103591

我明白了,但你是如何计算角度的?

你是一个喜剧演员。

我在骗谁呢?

关于交易、自动交易系统和策略测试的论坛

新手对MQL4和MQL5的任何问题,对算法和代码的任何帮助和讨论

Nikolai Semko, 2020.10.26 00:34

你不应该害怕速度。这只是类型转换的一个条件性。
作为角度定义函数的一个变体。

struct PointPriceTime
  {
   double            price;
   datetime          time;
                     PointPriceTime(double p, datetime t) { price=p; time=t; };
   void              Set(double p, datetime t){ price=p; time=t;};
                     PointPriceTime(PointPriceTime &p){ price=p.price; time=p.time; };
                     PointPriceTime() { price=0.0; time=0; };
  };

double Angle(PointPriceTime &p1,PointPriceTime &p2) // возвращает угол в градусах в приведенной системе координат price-price, где по оси X 
  {                                                 // расстояние между x1 и  x2  = N*_Point, где N - количество минутных баров во временном промежутке отрезка. 
   static int tf[9]= {PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
   int i=0;
   while(i<9 && SeriesInfoInteger(_Symbol,tf[i],SERIES_FIRSTDATE)>p1.time)
      i++;
   if(i==9)
     {
      Print("Время левой границы вне диапазона исторических данных");
      return DBL_MAX;
     }
   int bar1 = iBarShift(_Symbol,tf[i],p1.time);
   int bar2 = iBarShift(_Symbol,tf[i],p2.time);
   if(bar1==bar2)
      return 0.0;
   return atan((p2.price-p1.price)/((bar1-bar2)*PeriodSeconds(tf[i])*_Point/60))*180/M_PI;
  }

在MT5之后,MT4的感觉实在是太糟糕了。对历史的访问在某种程度上被阉割了。我甚至不是在说虱子。




 

你能告诉我,这种字体选择在指标中是否可行?


原因: