文章 "轻松快捷开发 MetaTrader 程序的函数库(第 二十二部分):交易类 - 基准类,限制验证" - 页 2

 
Artyom Trishkin:

那么,在事件处理 之后,事件类型检查模块结束时,last_event 变量中有什么?这就是你需要在 EA 中重置的内容。而不是强行调用库中重置最后一个事件的方法--库本身会在将事件发送到图表并写入事件列表后调用该方法。

是的,我只是疏忽了,没有在最后加上一行。

last_event = engine.LastTradeEvent();
 
Alexey Viktorov:

是的,我只是漏掉了最后一行。

你可以把它等同于 TRADE_EVENT_NO_EVENT。
 
Artyom Trishkin:
您可以将其等同于 TRADE_EVENT_NO_EVENT。

这不起作用。每个刻度都 会打印。订单在第五个交易日被激活,在日志中打印了 4 次 "1",然后在每个交易日都打印 "20"。

//--- 如果最后一次交易事件发生变化
 if(engine.LastTradeEvent() != last_event)
  {
   last_event=engine.LastTradeEvent();
   switch(last_event)
    {
     case TRADE_EVENT_PENDING_ORDER_PLASED :
     Print(__FUNCTION__, "***", last_event);
     break;
     case TRADE_EVENT_PENDING_ORDER_REMOVED :
     
     break;
     case TRADE_EVENT_PENDING_ORDER_ACTIVATED :
      {
       Print(__FUNCTION__, "***", last_event);
       //OrderActivated();
     break;
      }
     case TRADE_EVENT_POSITION_OPENED :
     
     break;
     case TRADE_EVENT_POSITION_CLOSED :
     
     break;
//---
     
     default :
      break;
    }
   last_event = TRADE_EVENT_NO_EVENT;
  }
 
Alexey Viktorov:

没用。每个刻度线都 会打印。订单在第 5 个刻度处被激活,在日志中打印了 4 次 "1",然后在每个刻度处打印 "20"。

您需要看看您在这里创建了什么。它在测试智能交易系统时有效。
我在手机上。我大约五小时后到。
 
Artyom Trishkin:
我们需要看看你做了什么。测试顾问正在工作
我在用手机我还有五个小时才到

我还没写任何东西。上一篇文章中的代码上面只有这个。

//-- 上次交易事件初始化
 static ENUM_TRADE_EVENT last_event = WRONG_VALUE;
//--- 如果在测试仪中工作
 if(MQLInfoInteger(MQL_TESTER))
  {
   engine.OnTimer();
  }
下面的代码,打开两个订单 OP_SELLLIMIT 和 OP_SELLSTOP
 
Alexey Viktorov:

我还没有创建任何东西。上一篇文章中的代码上面只有这个。

在代码下方,开立了两个订单 OP_SELLLIMIT 和 OP_SELLSTOP。
我需要看到整个代码。如果不是七重封印之后的秘密,请发到私信里,或者在这里。
 
Artyom Trishkin:
我要看整个密码如果不是七重封印的秘密,就发私信给我,或者在这里发。

这里还没有

/********************************************************************\
|Only_BUY_or_only_SELL.mq4 |
|© 2019, Alexey Viktorov |
|https://www.mql5.com/ru/users/alexeyvik/news|
\********************************************************************/
#property copyright "© 2019, Alexey Viktorov"
#property link      "https://www.mql5.com/zh/users/alexeyvik/news"
#property version   "1.00"
#property strict
#define  ndd(A) NormalizeDouble(A, _Digits)
//---
#include <DoEasy\Engine.mqh>
CEngine        engine;
//---
enum MY_ORDER_TYPE
{
 BUY   = OP_BUY,
 SELL  = OP_SELL,
};

struct POZ
{
 double profit;
 ulong  ticket;
 double priceGrid;
 double price;
}poz[];

sinput  MY_ORDER_TYPE   ordType         = SELL;   // 贸易方向
sinput  double          lot             = 0.01;   // 地块面积
 input  int             StepGrid        = 50;     // 网格间距
 input  double          desiredProfit   = 10;     // 期望利润
sinput  bool            Should_I_open   = false;  // 我应该开设一个新的职位系列吗?
sinput  int             magick          = 1;      // 魔法编号
//---
int slip = 100;
double contract, stepGrid, priceGrid;
int totalPositions, levelNumb;//, levelBUY, levelSELL;

/*******************Expert initialization function*******************/
int OnInit()
{
 stepGrid = StepGrid*_Point;
 return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
{
//-- 上次交易事件初始化
 static ENUM_TRADE_EVENT last_event = WRONG_VALUE;
//--- 如果在测试仪中工作
 if(MQLInfoInteger(MQL_TESTER))
  {
   engine.OnTimer();
  }
//--- 如果最后一次交易事件发生变化
 if(engine.LastTradeEvent() != last_event)
  {
 //Print(__FUNCTION__, "***", last_event);
   last_event=engine.LastTradeEvent();
   switch(last_event)
    {
     case TRADE_EVENT_PENDING_ORDER_PLASED :
     Print(__FUNCTION__, "***", last_event);
     break;
     case TRADE_EVENT_PENDING_ORDER_REMOVED :
     
     break;
     case TRADE_EVENT_PENDING_ORDER_ACTIVATED :
      {
       Print(__FUNCTION__, "***", last_event);
       //OrderActivated();
     break;
      }
     case TRADE_EVENT_POSITION_OPENED :
     
     break;
     case TRADE_EVENT_POSITION_CLOSED :
     
     break;
     
     default :
      break;
    }
   last_event = TRADE_EVENT_NO_EVENT;
  }
 
 if(Should_I_open && OrdersTotal() == 0)
  {
   priceGrid = ndd(ordType == SELL ? Bid+stepGrid/2 : Bid-stepGrid/2);
   ENUM_ORDER_TYPE type = ENUM_ORDER_TYPE(ordType == OP_SELL ? OP_SELLLIMIT : OP_BUYSTOP);
   if(OrderSend(_Symbol, type, lot, priceGrid, slip, 0.0, 0.0, (string)priceGrid, magick) <= 0)
    Print(__FUNCTION__, GetLastError());
   priceGrid = ndd(ordType == SELL ? Bid-stepGrid/2 : Bid+stepGrid/2);
   type = ENUM_ORDER_TYPE(ordType == OP_SELL ? OP_SELLSTOP : OP_BUYLIMIT);
   if(OrderSend(_Symbol, type, lot, priceGrid, slip, 0.0, 0.0, (string)priceGrid, magick) <= 0)
    Print(__FUNCTION__, GetLastError());
  }
  return;
}/*******************************************************************/

void OrderActivated()
{
 Print(__FUNCTION__, "***", ENUM_TRADE_EVENT(engine.LastTradeEvent()));
 
}/*******************************************************************/

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
//-- 上次交易事件初始化
 static ENUM_TRADE_EVENT last_event=WRONG_VALUE;
//--- 如果在测试仪中工作
 if(MQLInfoInteger(MQL_TESTER))
  {
   engine.OnTimer();
  }
//--- 如果最后一次交易事件发生变化
 if(engine.LastTradeEvent()!=last_event)
  {
   last_event=engine.LastTradeEvent();
  }
}/*******************************************************************/

/***************************Timer function***************************/
void OnTimer()
{
 if(!MQLInfoInteger(MQL_TESTER))
  engine.OnTimer();
}/*******************************************************************/

void OnDeinit(const int reason)
{
 Comment("");
}/*******************************************************************/
 
Alexey Viktorov:

好吧,现在还什么都没有

我必须运行你的代码才能得到答案。到时候我会给你答复的。
 
Artyom Trishkin:
我必须运行你的代码才能得到答案。我会去的,我会给你回复的。

我知道你不在家,我也不催你。

 
Alexey Viktorov:

我知道你不在家,我也没催你。

不,恰恰相反,我不是在工作,而是在家里;)