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

 
无法访问网站
 

嗨,开发人员。

用自定义日期或任何日期选项查看任何策略测试器

见图片。

策略测试员

我想在我的程序中通过OnInit()函数获得开始和结束日期的值。

我怎样才能得到它呢?

 
Artyom Trishkin:

将整个循环形成一个函数,如果找到,则返回酒吧号码,如果没有找到则返回WRONG_VALUE。


下午好。我想我已经完成了对昨天有问题的iCustom的工作。我把它全部做成了一个函数的形式,用"评论"和 "打印 "来控制。

这个试用专家顾问的想法是捕捉iCrossAD指标的上/下箭头形式的信号,并将其转换为买入或卖出指令,以便在未来的程序中使用。

我有一点经验,所以请不要评头论足,但希望有理有据的批评和建议。

事实上,为了这个而写了一个帖子。附上EA和指标文件,代码如下。

//+------------------------------------------------------------------+
//|                                                  Test_iCusom.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property description ""
#property strict
//--- includes
#include <DoEasy\Engine.mqh>
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>
//---
enum Indicator_Direction
   {
   Direction_BUY,
   Direction_SELL,
   Direction_FLAT
   };
//---
input string   Inp_param_indi_iCrossAD = "Input parameters indicator iCrossAD";//----- "Внешние параметры индикатора iCrossAD" -----
input uint     InpPeriodFind           = 400;                 // Bars for calculate
input uint     InpUnheckedBars         = 2;                   // Unchecked bars
input uint     InpPeriodIND            = 21;                  // CCI period

//--- global variables

CEngine        engine;
CTrade         trade;
CPositionInfo  apos;
CSymbolInfo    asymbol;

int            CrossAD;                           //Хэндл индикатора iCrossAD

double         Buf_Arrow_Sell[],                  //Массив буфера для приема значений последних стрелок ВНИЗ из индикатора iCrossAD
               Last_Arrow_Sell_volume,            //Переменная для записи значения цены последней стрелки ВНИЗ индикатора iCrossAD
               Last_Arrow_Sell_index;             //Переменная для записи значения индекса свечи последней стрелки ВНИЗ индикатора iCrossAD
datetime       Last_Arrow_Buy_time;               //Переменная для записи времени стрелки
               
double         Buf_Arrow_Buy[], Last_Arrow_Buy_volume, Last_Arrow_Buy_index;
datetime       Last_Arrow_Sell_time;
   
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArraySetAsSeries(Buf_Arrow_Buy, true);
   ArraySetAsSeries(Buf_Arrow_Sell, true);
//---
   CrossAD = iCustom(asymbol.Name(), _Period, "iCrossAD",InpPeriodFind,InpUnheckedBars,InpPeriodIND);
   if (CrossAD == INVALID_HANDLE)
   {
      Print("Не удалось создать описатель индикатора iCrossAD!");
      return(INIT_FAILED);
   }
      else Print("Хендл iCrossAD = ",CrossAD);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- delete objects
   ObjectsDeleteAll(0,"",-1);
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  
   string direction = "no information";
   switch(iCustom_iCrossAD(InpPeriodFind))
      {
      case Direction_BUY: direction = "BUY";
         break;
      case Direction_SELL: direction = "SELL";
         break;
      case Direction_FLAT: direction = "FLAT";
         break;
      case WRONG_VALUE: direction = "no information";
         break;   
      }
   Comment("-------------------------", 
            "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
            "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
            "\n Last_Arrow_Buy_time         = ",Last_Arrow_Buy_time,
            "\n ---------------------- ",
            "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
            "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index,
            "\n Last_Arrow_Sell_time         = ",Last_Arrow_Sell_time,
            "\n ---------------------- ",
            "\n Indicator_Direction             = ",direction
            ); 
  }
//+------------------------------------------------------------------+
int iCustom_iCrossAD(uint PeriodFind) 
  { 
   Indicator_Direction direct = Direction_FLAT;
   
   if (CopyBuffer(CrossAD, 1, 0, PeriodFind, Buf_Arrow_Buy) != PeriodFind)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return(WRONG_VALUE);
      }
         for(int n=0; n<(int)PeriodFind; n++)
            {
               if(n==0)
                  Print("Last_Arrow_Buy_index n==",n," Last_Arrow_Buy_time = ",iTime(_Symbol,0,n));
               if(Buf_Arrow_Buy[n]==EMPTY_VALUE)
                  Print("Last_Arrow_Buy_index n==",n," Last_Arrow_Buy_time = ",iTime(_Symbol,0,n));
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Buy_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Buy_time   = iTime(_Symbol,0,n);
                  Last_Arrow_Buy_index  = n;
                  Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index,", Last_Arrow_Buy_time = ",Last_Arrow_Buy_time);
                  break;
               }   
            }
         
   if (CopyBuffer(CrossAD, 2, 0, PeriodFind, Buf_Arrow_Sell) != PeriodFind)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return(WRONG_VALUE);
      }
         for(int n=0; n<(int)PeriodFind; n++)
            {
               if(n==0)
                  Print("Last_Arrow_Sell_index n==",n," Last_Arrow_Sell_time = ",iTime(_Symbol,0,n));
               if(Buf_Arrow_Sell[n]==EMPTY_VALUE)
                  Print("Last_Arrow_Sell_index n==",n," Last_Arrow_Sell_time = ",iTime(_Symbol,0,n));
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Sell_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Sell_time   = iTime(_Symbol,0,n);
                  Last_Arrow_Sell_index  = n;
                  Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index,", Last_Arrow_Sell_time = ",Last_Arrow_Sell_time);
                  break;
               }
            }
   if(Last_Arrow_Buy_index < Last_Arrow_Sell_index)direct = Direction_BUY;
      else if(Last_Arrow_Buy_index > Last_Arrow_Sell_index)direct = Direction_SELL;
         else direct = Direction_FLAT;         
   return(direct); 
      //return(WRONG_VALUE); 
  }
//+------------------------------------------------------------------+
附加的文件:
iCrossAD.mq5  49 kb
 
你好,我的专家顾问有一个功能 当另一个订单触发时,删除待定订单。我怎样才能在外部参数中规定能够禁用这一功能?事先非常感谢。
附加的文件:
ths42o20.txt  1 kb
 

你好!

我已将该指标从MT4转换到MT5。我想把该指标作为一个额外的过滤器。

我只研究MT5。但我找不到这个错误。我的МТ4和МТ5的反思是不同的。

我有一个请求,请专家帮助我找到*.mql5文件中的错误。

我在此附上源代码。

我非常、非常感谢你的帮助。

附加的文件:
ReVoIn.mq4  4 kb
ReVoIn.mq5  11 kb
 
Priffekt:
你好,我在我的EA中有一个功能 当另一个订单触发时删除挂单。我怎样才能在外部参数中规定能够禁用这一功能?事先非常感谢。
DeleteOppositeOrders();
void DeleteOppositeOrders() {
  bool fd, fep1, fep2;

  fep1=ExistPosition(1);
  fep2=ExistPosition(2);

  for (int i=OrdersTotal()-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol()) {
        fd=False;
        if (OrderType()==OP_BUYSTOP && OrderMagicNumber()== Magik) {
          if (fep2) fd=OrderDelete(OrderTicket());
        }
        if (OrderType()==OP_SELLSTOP && OrderMagicNumber()== Magik) {
          if (fep1) fd=OrderDelete(OrderTicket());
        }
        if (fd && UseSound) PlaySound(NameFileSound);
      }
    }
  }
}
bool ExistPosition(int mn) {
  bool Exist=False;
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()== Magik) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          Exist=True; break;
        }
      }
    }
  }
  return(Exist);
}

这是你的代码,最好这样附加。

 

当然,我不太适合担任顾问的角色,但这个任务似乎并不困难。

请注意,我没有进入你的代码本身,有很多争议,甚至对我来说(傻瓜),首先是你的函数是void类型。 这种类型用来表示函数不返回值,或者作为函数的一个参数表示没有参数。而你在代码的结尾处有return(Exist)。

声明一个输入变量,把它写成你的函数的一个参数,如果你把'这个变量设置为False,就退出这个函数。

 
input bool On_Off = true;
DeleteOppositeOrders(On_Off);
void DeleteOppositeOrders(bool on_off) {

  if(on_off==false)return;

  bool fd, fep1, fep2;

  fep1=ExistPosition(1);
  fep2=ExistPosition(2);

  for (int i=OrdersTotal()-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol()) {
        fd=False;
        if (OrderType()==OP_BUYSTOP && OrderMagicNumber()== Magik) {
          if (fep2) fd=OrderDelete(OrderTicket());
        }
        if (OrderType()==OP_SELLSTOP && OrderMagicNumber()== Magik) {
          if (fep1) fd=OrderDelete(OrderTicket());
        }
        if (fd && UseSound) PlaySound(NameFileSound);
      }
    }
  }
}
bool ExistPosition(int mn) {
  bool Exist=False;
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()== Magik) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          Exist=True; break;
        }
      }
    }
  }
  return(Exist);
}
 
Priffekt:
你好,在我的EA中,当另一个订单触发时,我有删除挂单的 功能。我怎样才能在外部参数中规定这个功能可以被禁用。事先非常感谢。

在你的代码文本中找到所有的False和True。用false和true代替它们。这种语言是区分大小写的。

 
Sergey Voytsekhovsky:

在你的代码文本中找到所有的False和True。用false和true代替它们。这种语言是区分大小写的。

下午好,我已经改变了所有的数值,但我对在专家顾问设置 中禁用该功能本身的可能性感兴趣。
DeleteOppositeOrders(); void DeleteOppositeOrders() { bool fd, fep1, fep2; fep1=ExistPosition(1); fep2=ExistPosition(2); for (int i=OrdersTotal()-1; i>=0; i-){ 如果(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){ 如果(OrderSymbol()==Symbol()){ fd=false; if (OrderType()==OP_BUYSTOP && OrderMagicNumber()==Magik) { if (fep2) fd=OrderDelete(OrderTicket()); } if (OrderType() ==OP_SELLSTOP &&OrderMagicNumber()==Magik) { if (fep1) fd=OrderDelete(OrderTicket()); } if (fd && UseSound) PlaySound(NameFileSound); } } bool ExistPosition(int mn) { bool Exist=false; for (int i=0; i<OrdersTotal(); i++){ 如果(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){ 如果(OrderSymbol()==Symbol() && OrderMagicNumber()==Magik) { 如果(OrderType()==OP_BUY || OrderType()==OP_SELL) { Exist=true; break; } } return(Exist); } }
原因: