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

 
d1w4m3:


谢谢你的回答,但我才刚刚开始学习了几个星期,如何在代码中实现这个问题,或者告诉我在哪里可以读到,谢谢。还是根据伊戈尔-金的说法?

而它却会开出一个位置,不按照系统的要求,在刚开始工作的时候,你的条件并不能避免这个问题。

如果你想一想?为什么不避开这个问题?

当他开始工作时,如果他之前没有工作(一般来说是第一次运行),那么还没有他的头寸,逻辑上会显示,最后关闭的头寸 根本还不存在。这意味着它不可能在停止或采取时被关闭,这反过来又允许在信号上开立头寸。

不是吗?

 
Artyom Trishkin:

如果你想一想?为什么不避开这个问题?

当它开始工作时,如果它以前没有工作过(第一次运行根本没有),那么它的位置还没有出现,逻辑上会显示最后关闭的位置 根本还没有出现。这意味着它不可能在停止或采取时被关闭,这反过来又允许在信号上开仓。

不是吗?


这就是事情的真相:通过信号!但这个条件可能不是在第2条(只要指标改变了缓冲区),而是在任何第2条(当然在这之后一切都通过系统运作)满足。问题出在开单的条件上,如何在指标缓冲区变化后的第2条上解决这个问题?

空白的OnTick()

{
uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 0, n), 4)。
dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 1, n), 4);
如果(DN_Trend()==true)
{
如果(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
如果 (ticket > 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits)。
TP = NormalizeDouble(Bid - TakeProfit*Point, Digits)。
如果(OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Sales error");
}

}


 
d1w4m3:


好吧,关键是它是基于信号的!但这个条件可能不是在第二条杠上满足(只要指标改变了缓冲区),而是在任何第二条杠上满足(在那之后,当然一切都在系统中运作)。问题出在开单的条件上,如何在指标缓冲区变化后的第2条上解决这个问题?

空白的OnTick()

{
uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 0, n), 4)。
dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 1, n), 4);
如果(DN_Trend()==true)
{
如果(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
如果 (ticket > 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits)。
TP = NormalizeDouble(Bid - TakeProfit*Point, Digits)。
如果(OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Sales error");
}

}


正确插入代码。在信息编辑器 菜单中,有一个SRC按钮。
我没有从你的解释中明白什么。
 
d1w4m3:


这就是问题的关键!但这个条件可能不是在第2条(只要指标改变了缓冲区),而是在任何第2条(当然在这之后一切都在系统中运作)满足。问题出在开单的条件上,如何在指标缓冲区变化后的第2条上解决这个问题?

void OnTick()
{
  uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 0, n), 4);
  dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 1, n), 4); 
  
if(DN_Trend()==true)
{
  if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
  { 
   ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
      if (ticket > 0)
      {
         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
         if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
           Print("Ошибка на продажу");
      }

  }


1.如果正确插入,这就是代码的样子。开发人员想出这个办法是有原因的......。

2.一个微妙的提示:Open[4]和Close[4]相对于指标值的位置?

 
extern int TakeProfit  = 200;
extern double Lots     = 0.1;
extern int StopLoss    = 52;
extern int Magic       = 1111;
extern int Slippage    = 3;
extern int n           = 3; // На какую свечу открывать ордер
//------------------------------------------------------------------
extern int  LevelWLoss  = 1;      // Уровень безубытка
extern int  LevelProfit = 30;     // Уровень профита
//------------------------------------------------------------------
extern string    Slope  = "Параметры Slope";
extern int       period = 163; 
extern int       method = 3;                         
extern int       price  = 0;    
//------------------------------------------------------------------
double uptr, SL, TP, dntr;
int    ticket, nd;
bool   fm;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   if (Digits == 3 || Digits == 5)
   {
       TakeProfit  *=10;
       StopLoss    *=10;
       Slippage    *=10;
       LevelWLoss  *=10;
       LevelProfit *=10;
   }
   return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 0, n), 4);
  dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 1, n), 4); 
  
if(DN_Trend()==true)
{
  if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
  { 
   ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
      if (ticket > 0)
      {
         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
         if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
           Print("Ошибка на продажу");
      }
  }
}//if(DN_Trend()==true)

if(UP_Trend()==true)
{
   if( CountBuy() == 0  && Ask > uptr && Open[3] > uptr && Close[3] > uptr  )
  {
   ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "Sloper", Magic, 0, Blue);
      if (ticket>0)
      {
         TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
         SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
            if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
               Print("Ошибка на покупку");
       }
    }
}//if(UP_Trend()==true)

      if ( CountSell()>0  && Open[3] > uptr && Close[3] > uptr && UP_Trend()==true)
      {
      for(int i = OrdersTotal() -1; i>=0; i--)
          {
            if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
            if (OrderMagicNumber() == Magic && OrderType() == OP_SELL)
            if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))
            Print("Ошибка");
            }
          }
      }
      if ( CountBuy()>0 && Open[3] < dntr && Close[3] < dntr && DN_Trend()==true)
      {
      for(int i = OrdersTotal() -1; i>=0; i--)
          {
            if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
            if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)
            if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))
            Print("Ошибка");
            }
          }
      }
      //+переход в безубыток+
   for( int i=0; i<OrdersTotal(); i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
        if(OrderSymbol()== Symbol() && OrderMagicNumber()==Magic)
          {
            if(OrderType()==OP_BUY) 
              {
                if(OrderStopLoss()-OrderOpenPrice()<LevelWLoss*Point) 
                 {
                   if(Bid-OrderOpenPrice()>LevelProfit*Point) 
                 {
                  fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+LevelWLoss*Point,OrderTakeProfit(),CLR_NONE);
                 }
              }
            }
           }
         if(OrderType()==OP_SELL) 
           {
            if(OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss()<LevelWLoss*Point) 
              {
               if(OrderOpenPrice()-Ask>LevelProfit*Point) 
                 {
                  fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-LevelWLoss*Point,OrderTakeProfit(),CLR_NONE);
                 }
              }
           }
       
        }
     }
     
//------------  комментарии -----------------+     
  if(UP_Trend()) Comment("Восходящий тренд ", uptr);
  if(DN_Trend()) Comment("Нисходящий тренд ", dntr);
 
 }
//+------------------------------------------------------------------+
int CountSell()
{
   int count = 0;
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
        if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
    {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
                    count++;   
    }
   }
     return(count);
}
//+------------------------------------------------------------------+
int CountBuy()
{
   int count = 0;
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
        if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
    {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
                    count++;   
    }
   }
     return(count);
}
//+------------------------------------------------------------------+
bool UP_Trend()
{
  if(uptr > 0 && uptr != 2147483647.0) return(true);
  return(false);
}
//+------------------------------------------------------------------+
bool DN_Trend()
{
  if(dntr > 0 && dntr != 2147483647.0) return(true);
  return(false);
}
//+------------------------------------------------------------------+
 

如果我们插入你的条件" 这意味着它无法在停止或采取的时候关闭,这反过来又允许在信号上开仓。"

我的信号是"if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)"(连同指标n=3的转变)。

事实证明,如果它被立即放在图表上,它将在下降趋势 中打开,从第3根蜡烛开始的那一刻起,然后,如果有一个信号,它将根据需要打开。

 
d1w4m3:

如果我们插入你的条件" 这意味着它无法在停止或采取的时候关闭,这反过来又允许在信号上开仓。"

我的信号是"if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)"(连同指标n=3的转变)。

事实证明,如果它被立即放在图表上,它将在第三根蜡烛开始的时刻在下降趋势 中打开,然后,如果有一个信号,它将根据需要打开。

我什么都不明白。你有什么不明白的地方?你不能确定最后一个头寸是在停止或采取时关闭的?你不能在你的代码中找到检查这个条件的地方?

或者你不能做什么?

它怎么能在第三根蜡烛上打开呢? 或者解释一下"它将在第三根蜡烛上打开 " 是什么意思?这到底是什么意思?
 

每次在某个指标信号上开盘,我如何在一个变量中存储这个信号的类型?

有一个错误(当我运行EA时),订单没有在趋势开始时打开(不是根据指标颜色的变化),因为我的条件没有提到具体的蜡烛,而是说如果趋势是向上或向下,在3根蜡烛的开始时打开。


 

大家下午好。

我想知道如何在EXCEl中分析工作统计数据。

谁能告诉我什么可以通过DDE从mt4拉出来,以及我在哪里可以得到所有允许的函数来转移到excel中?

将非常感谢您的帮助

 
Maxim Shershnev:

大家下午好。

我想知道如何在EXCEl中分析工作统计数据。

谁能告诉我什么可以通过DDE从mt4中提取,以及我在哪里可以得到所有允许的函数来转移到excel中?

将非常感谢您的帮助

你所需要的一切都在这里 。.csv记录格式可写到excel中
Файловые операции - Справочник MQL4
Файловые операции - Справочник MQL4
  • docs.mql4.com
Файловые операции - Справочник MQL4