在EA中逆向分析条形图 - 页 2

 
FMIC:

EA中没有OnStart(),但我明白你的意思。然而,OP甚至在回应你的评论时说,我引用。

是的,我是指OnTick()。你仍然对 "在EA运行时 "赋予了太多的意义。它不一定,甚至最合理的意思是,"当EA正在执行OnTick()时",而不是 "当EA连接到图表时,即在其整个生命周期内"。

我们需要来自paranoyakX的更多信息。

 
jjc:

是的,我是指OnTick()。你仍然对 "在EA运行时 "赋予了太多的意义。它不一定,甚至最合理的意思是,"当EA正在执行OnTick()时",而不是 "当EA连接到图表时,即在其整个生命周期内"。

我们需要paranoyakX提供更多信息。

嗨,伙计们。

让我澄清一下。我的代码是在以前的条形图上寻找一个非常基本的模式,并将决定是否打开一个订单,但只有当一个新的条形图出现时,才会检查 打开新的订单。我的意思是,我正在等待最后一个条形图收盘,然后检查模式,如果它是确定的,我将打开订单。

如果我不得不重新运行EA,我想再次找到这些基本信息(模式的开始和结束栏,最高和最低价格等)并再次填充我的全局变量,这就是为什么我需要这个。我将使用开始和结束信息来决定何时关闭我的订单。因此,在EA运行时,如果OnInit时没有出现新的条形就足够了,这不是一个问题。

 
jjc:

是的,我是指OnTick()。你仍然对 "在EA运行时 "赋予了太多的意义。它不一定,甚至最合理的意思是,"当EA正在执行OnTick()时",而不是 "当EA连接到图表时,即在其整个生命周期内"。

我们需要来自paranoyakX的更多信息。

是的!你是正确的。从OP的最新信息来看,他肯定是在OnInit() 而不是OnTick() 中运行一切。我错误地认为OP的做法更正确一些。我从没想过他的所有逻辑都在OnInit() 中。
 
paranoyakX:

嗨,伙计们。

让我澄清一下。我的代码是在以前的条形图上寻找一个非常基本的模式,并决定是否打开订单,但只有在新条形图出现时才会检查打开新订单。我的意思是,我在等待最后一个条形图收盘,然后检查模式,如果它是确定的,我将打开订单。

如果我不得不重新运行EA,我想再次找到这些基本信息(模式的开始和结束栏,最高和最低价格等)并再次填充我的全局变量,这就是为什么我需要这个。我将使用开始和结束信息来决定何时关闭我的订单。因此,在EA运行时,如果OnInit时没有出现新的条形就足够了,这不是一个问题。

你不应该在OnInit() 中做所有的事情。你应该在OnTick() 中完成所有这些逻辑(包括恢复)。这一点很重要。在OnInit() 中做会导致你没有预料到的更多问题,并且会让你的EA在做所有这些逻辑时处于 "初始化 "状态。所以,要做得正确!在OnInit() 中只做你的初始化(如变量、外部参数检查等),其他都在OnTick() 中做。
 
FMIC:
你不应该在OnInit() 中做所有这些事情。你应该在OnTick() 中完成所有这些逻辑(包括恢复)。这一点很重要!在OnInit() 中做会导致你没有预料到的更多问题,并且会让你的EA在做所有这些逻辑时处于 "初始化 "状态。所以,要做得正确!在OnInit() 中只做你的初始化(如变量、外部参数检查等),其他都在OnTick() 中做。

不不不!我无法解释我自己,对不起,我在OnTick中运行所有的东西。但简单地说,我检查了 这个tick是否属于一个新的bar,然后做我的工作人员。我在OnInit中运行的是,重新找到订单和我之前计算的模式,重新计算。我说这是在OnInit运行,找到我的模式,目前打开的订单属于。

我希望我可以解释一下。

 
paranoyakX:

不不不!我无法解释我自己,对不起,我在OnTick中运行所有的东西。但简单地说,我检查了这个tick是否属于一个新的bar,然后做我的工作人员。我在OnInit中运行的是,重新找到订单和我之前计算的模式,重新计算。我说这是在OnInit运行,找到我的模式,目前打开的订单属于。

我希望我可以解释。

是的,我在你的帖子中理解了这一点。我说的是不要在OnInit()中这样做。你应该在OnTick()中找到你的订单和模式以及所有的计算。

只要在OnTick()中定义一个本地静态变量,并完成所有的检查和 模式定义,然后将该变量设置为false。

void OnTick()
{
   static bool FirstOnTick = true;

   if( FirstOnTick )
   {
      // Check Orders, Patterns, whatever

      FirstOnTick = false;
   }

   // Here you do your normal OnTick handling
}
 
FMIC:

是的,我在你的帖子中理解了这一点。我想说的是,不要在OnInit()中这样做。你应该在OnTick()中找到你的订单和模式以及所有这些计算。

只要在OnTick()中定义一个本地静态变量,并完成所有的检查和模式定义,然后将该变量设置为false。

对不起,我之前误解了你的意思。为什么我不在OnInit上这样做?这不是更方便吗?当我这样做的时候,对于第一个刻度 之后的每一个刻度,我都要运行if语句,而这个语句不会是真的。我认为这对代码来说是不必要的负担。

OnInit的存在不就是为了初始化一些全局变量吗?

 
paranoyakX:

我希望我可以解释一下。

我认为我们需要看到一些代码来确定你在说什么。例如,不清楚你是否在寻找产生现有未平仓交易的历史模式,因为(a)它告诉你如何管理未平仓交易,在哪里/什么时候关闭它等等,或者(b)只是为了在图表上画一些标记,向自己解释为什么现有交易被打开。

我一般同意FMIC的观点,即你应该尽量在OnTick()中做更多的事情,并在全局变量中保持尽可能少的状态。

 
paranoyakX:

对不起,我之前误解了你的意思。为什么我不在OnInit上这么做?这不是更方便吗?当我这样做的时候,对于第一个刻度之后的每一个刻度,我都要运行if语句,而这个语句不会是真的。我认为这对代码来说是不必要的负担。

OnInit的存在不就是为了初始化一些全局变量吗?

不,在OnInit() 中这样做是不对的,因为你会耽误初始化的执行,不,静态变量会保持它的状态,所以你只会做 "一次 "检查,而不是在每个OnTick()。if( FirstOnTick ) "是非常快的,而且负载很小,特别是与你在OnTick() 中运行的所有其他代码相比。
 

谢谢你的建议,这是我的代码的一个非常简单的版本,这不是我真正的代码,但我希望这能更清楚。

正如我所说,这不是真正的代码,寻找模式等只是一个例子。我开这个话题的原因是DetectExistingPattern()函数

//+------------------------------------------------------------------+
//|                                                          Mustafa |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Mustafa"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int MagicNumber= 100;


int OnInit()
  {
//---
   DetectExistingPattern();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+


int LastBar=0;
double HighestValue, LowestValue;

void OnTick()
  {
//---
    MyStart();

  }


void MyStart(){
    
    CloseOpenedOrders();

    if (LastBar == Bars) return;
    LastBar = Bars;

    if (!CheckForExistedOrders()) {       
       
       if (CheckTrendPattern()){
           PlaceOrders();
       };
    };
};

bool CheckForExistedOrders(){
  for(int TradeNumber = OrdersTotal(); TradeNumber >= 0; TradeNumber--){
    if ( (OrderSelect(TradeNumber, SELECT_BY_POS, MODE_TRADES)) && (OrderMagicNumber() == MagicNumber )) return true;
  };
  return false;

};


bool CheckTrendPattern(){
 
  for(int i=10; i>=1; i--) {
    if (High[i]>High[i-1])
      return false;
  };
  HighestValue = High[10];
  LowestValue  = Low[1];
  
  return true;
};



void PlaceOrders(){  
    int OrderResult = OrderSend(Symbol(), OP_BUY, 1, Ask, 5, 0, 0, "", MagicNumber);
}
//+------------------------------------------------------------------+

void CloseOpenedOrders(){
  // I will use HighestValue and LowestValue here, so I need to re calculate them.
};

void DetectExistingPattern() {
  // Find HighestValue and LowestValue again, this part is the reason why I opened the thread!!! I want to run this in OnInıt()
  // I will find opened order and find the previos pattern that cause me to open that order.
};